这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » FPGA笔记:for语句的使用(verilog)

共10条 1/1 1 跳转至

FPGA笔记:for语句的使用(verilog)

工程师
2013-03-19 16:40:27     打赏

类似C的环路结构如for-loop可能对学过C语言的人存在陷阱。其原因是在硬件语言中并没有隐含的寄存器这个条件,所以一般这些环路不可以在可综合代码中用来做算法迭代。在Verilog中,for循环一般用作输入多次有一定规律的赋值语句,以提高设计效率。

 

软件设计者可能利用for循环获得X的N次幂,代码可能是这样写的:

PowerX = 1  ;

for( i=0; i<N; i++ ) PowerX = PowerX * X ;

 

这个算法环路利用迭代执行N次乘法操作,每次通过这个环路,更新运行的变量。在软件中,它工作很好,因为每次迭代都将更新一个内部寄存器。

 

而硬件语言并没有任何隐含的寄存器出现,相反,所有的寄存器操作都被清楚地定义。如果设计者仿造上面的方式用verilog写出来,那么有可能写成下面这样的代码:

module forloop(

output reg [7:0] powerx ,

input          [7:0] x,n

);

integer i ;

 

always @ (*)

begin

powerx = 1 ;

for( i=0; i<n; i++ )

powerx =powerx * x ; 

end

 

endmodule

 

程序可以在行为仿真中工作,并可能可以综合到门电路(这与综合工具有关)。Xilinx的XST与Altera都不可以综合没有固定n值的代码。


但是synplify则会基于最坏条件的n值综合这个环路,但是最后结果也往往是综合处运行极其慢的大量逻辑块的环路。

 

而在使用for循环时,往往设计人员是为了减少并行代码段的重复长度。例如,以下的代码:

out[0]  <=  y[0]   ^ x[0] ;

out[1]  <=  y[2]   ^ x[1] ;

out[2]  <=  y[4]   ^ x[2] ;

......

out[31] <= y[62] ^ x[31] ;

 

这些代码需要输入32行,为了压缩代码,提高效率,我们往往会使用for语句:

always @ (posedge clk)

for ( i=0; i<32; i=i+1 ) out[i] = y[i*2] ^ x[i] ;

 

值得注意的是,在环路中并没有出现反馈。


引自:http://blog.csdn.net/teead/article/details/6226833




关键词: for     FPGA     Altera     Xlinx     syn    

工程师
2013-03-19 18:30:35     打赏
2楼
看看学习下

高工
2013-03-24 18:08:15     打赏
3楼
那么verilog怎么写x^n呢?

工程师
2013-03-24 19:11:22     打赏
4楼
^是异或,不是matlab中的乘方

高工
2013-03-24 19:16:00     打赏
5楼
不错的分享

高工
2013-03-25 12:05:52     打赏
6楼
我的意思是用verilog如何实现x的n次方呢?

专家
2013-03-25 14:31:03     打赏
7楼
不错  顶一个

工程师
2013-03-25 15:24:27     打赏
8楼

for循环,累乘,

如果需要综合的话,用for得指定是多少次方了,并且只能由Sysplify综合,太耗资源了;

根据不同的数据形式,选择不同的优化方案吧,可以用上FPGA的DSP核



高工
2013-04-24 22:14:49     打赏
9楼
文章不错,顶一个

菜鸟
2013-07-01 20:56:17     打赏
10楼

受教了。


共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]