在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 8462|回复: 11

[求助] verilog for语句使用

[复制链接]
发表于 2013-8-14 12:42:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
请教各位:
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的使用一头雾水!
还请各位指点一下!
发表于 2013-8-14 13:31:59 | 显示全部楼层
for就是并行执行,一个clk即可完成。
发表于 2013-8-14 13:33:32 | 显示全部楼层
<= 和=是阻塞赋值和非阻塞赋值的区别。
查查资料就好了
 楼主| 发表于 2013-8-14 13:52:48 | 显示全部楼层
回复 3# wls501


    感谢您的指点,刚才搞了个程序,综合一下看了RTL,发现<=和=占用资源区别很大。那通常什么时候用for?
我一直觉得FPGA设计不能用for(硬件电路怎么能实现循环啊),不知道这个想法是不是正确的?
发表于 2013-8-14 15:32:05 | 显示全部楼层
同问 楼主搞明白了要及时分享哈
发表于 2013-8-14 19:50:52 | 显示全部楼层
for在硬件上综合出来就是展开,并行电路。。。开销是巨大的。
发表于 2013-8-14 23:41:19 | 显示全部楼层
回复 1# linyuanfei
    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;
 楼主| 发表于 2013-8-15 09:50:52 | 显示全部楼层
回复 6# chen.terry


    非常感谢,我综合了一下,确实是消耗资源!
 楼主| 发表于 2013-8-15 10:02:27 | 显示全部楼层
回复 7# lwukang


非常感谢您的指教!对于for的功能我已能理解,关于这里使用阻塞和非阻塞赋值的区别,前辈能否再讲解一下。
我自己理解的是使用非阻塞赋值的话一个clk完成了一次赋值操作,是不是不能实现1024个逻辑复制功能?使用阻塞的话一个clk就可以完成所有逻辑复制?
发表于 2013-8-15 10:17:33 | 显示全部楼层
回复 9# linyuanfei

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

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-24 14:15 , Processed in 0.021584 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表