因为在图像处理的时候需要用到很多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是设计电路而不是程序。
参考的资料是:SystemVerilog and verilog gotcha 101 和 http://billauer.co.il/blog/2009/07/verilog-standard-short-port-declaration-output-reg-autoarg/
看到了对于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
SystemVerilog/Verilog 实现浮点数运算:Cordic vs. 不可综合的C表达式
本文探讨了在图像处理中使用SystemVerilog/Verilog进行浮点数运算,特别是涉及指数函数如Gaussian filter时的挑战。正规方法是利用Cordic算法或厂商提供的数学库,但Cordic核主要针对以e为底的指数计算。为快速验证设计,有时会采用不可综合的C表达式。在定义输入输出时,应注意输入实数应声明为`var real 2.718`,输出则只需`real 3.14`。参考资源包括SystemVerilog和Verilog的陷阱以及相关博客文章。
311

被折叠的 条评论
为什么被折叠?



