微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > verilog for语句使用

verilog for语句使用

时间:10-02 整理:3721RD 点击:
请教各位:
1、FPGA程序设计时,for语句什么情况下使用?
2、形如
always @(posedge clk)
begin
for(i = 0;i <= 1023;i = i + 1)
    mem[i] = i;
   end
形式的程序是怎么执行的?一个clk即可完成1024此循环?还是需要1024个clk?还有如果将 mem[i] = i;
改为 mem[i] <= i;会是什么样?对于for的使用一头雾水!
还请各位指点一下!

for就是并行执行,一个clk即可完成。

<= 和=是阻塞赋值和非阻塞赋值的区别。
查查资料就好了



    感谢您的指点,刚才搞了个程序,综合一下看了RTL,发现<=和=占用资源区别很大。那通常什么时候用for?
我一直觉得FPGA设计不能用for(硬件电路怎么能实现循环啊),不知道这个想法是不是正确的?

同问 小编搞明白了要及时分享哈

for在硬件上综合出来就是展开,并行电路。开销是巨大的。


    for语句是可以综合的,只是在RTL级代码中基本不用。一方面因为for语句占硬件资源(特别是循环次数不定的情况下),另一方面是因为设计中往往采用时序逻辑,用for地方不多。
    你所写的代码,不是你所理解的循环,这里只是并行展开,等同于
            mem[0] =0;  mem[1] =1;  mem[2] =2;……   mem[1023] =1023;
    或者说是 mem[0] <=0;  mem[1] <=1;  mem[2] <=2;……   mem[1023] <=1023;
    剩下的就只是阻塞与非阻塞的区别了。
    另外你这是时序逻辑,建议用<=。
    for循环结合非阻塞赋值,你若将<=左边设置为一reg,仿真就可以深刻体会其差别。比如 if( mem) sum <= sum + 1'b1;



    非常感谢,我综合了一下,确实是消耗资源!



非常感谢您的指教!对于for的功能我已能理解,关于这里使用阻塞和非阻塞赋值的区别,前辈能否再讲解一下。
我自己理解的是使用非阻塞赋值的话一个clk完成了一次赋值操作,是不是不能实现1024个逻辑复制功能?使用阻塞的话一个clk就可以完成所有逻辑复制?


这里不管是阻塞还是非阻塞,都是完成1024个赋值,没有差别,因为从硬件上看,就是1024个并行单元。
但是若你赋值左边是同一个变量,则非阻塞只会有最后一次复制有效,因为非阻塞只会在always块结束后才更新左边的变量。
对不同变量阻塞和非阻塞赋值没有区别,对同一变量是有区别的,你可以自己写段代码试验看看。



    哦!我懂你意思了!因为我左边的变量是mem[0],mem[1]等,不同的变量,所以还是1024个赋值,如果是sum <= sum + 1'b1 则只执行了最后一次的赋值,难怪你举了这个例子,真的很感谢!



    再麻烦您一下,我是一个初学者,能否推荐几本FPGA相关的书籍啊?谢谢啊!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top