SystemVerilog/Verilog的實數輸入輸出和常數:Cordic或者直接unsynthesizable的C表達
阿新 • • 發佈:2019-02-07
因為在影象處理的時候需要用到很多filter,其中Gaussian filter是一個是exponential function,所以要用到e和**。
正規的做法是用Cordic或者xilinx/altera的math lib。
cordic核貌似只能對以e為底的數計算,e^x=coshx+sinhx,選擇雙曲計算sinh and cosh選項,然後把兩個輸出相加就是e^x結果.
可以參考http://verilog.openhpsdr.org/。上面有Cordic的分析和test,用的modelsim。路徑是:E:\verilog\thesis_2014\Apr6_Conv\cordic\CORDIC Test
但為了快速檢驗設計,看看neural network對不對,所以暫時先不考慮cordic的設計。當然,要記住RTL是設計電路而不是程式。
看到了對於input的實數要定義成:var real 2.718,而output只要real 3.14就行。
//`define ee = 2.718281828; module exp(input clk, input var real in, output real out); parameter ee = 2.718281828; always @ (posedge clk) begin out <= (ee)**(in); end endmodule module exp_tb; reg clock; //reg [15:0] d; //wire [15:0] q; real d; real q; initial begin $dumpfile ("exp_tb.vcd"); $dumpvars (0, exp_tb); //$monitor ("clock=%b, d=%b, q=%b", clock, d, q); clock = 0; d = 16'd0; #10 d = 1; #10 d = -1; #10 d = 10; #20 $finish; end always begin #5 clock = !clock; end exp d0( .clk (clock), .in (d), .out (q) ); endmodule