FPGA学习一:阻塞赋值和非阻塞赋值的理解

赋值语句共有两种,即非阻塞赋值,和阻塞赋值。
(1)非阻塞赋值
   非阻塞赋值方式所赋值的变量不能立即就为下面语句所用,只有当块结束后才能得到上一次所附的值,这种赋值方式是编写可综合的时序逻辑时常用的赋值方式。例如

实际上,上面的非阻塞赋值的RTL是一个移位寄存器

如果开始时,a=1,b=2,c=x;那么,当一个clk上升沿到达后,a=1,b=1,c=2,实际从12x变成了112,即向后移了一位,最后,输出会变成a=1,b=1,c=1。

也可以直接理解非阻塞赋值时并行执行语句,即begin里面的两个非阻塞赋值语句是同时执行的,当clk上升沿到达后,a的值赋值给b,在a赋值给b的同时,b的值赋值给c,于是,a=1,b=1,c=2。

非阻塞赋值方式所赋值的变量不能立即就为下面语句所用,我的理解就是当时赋值的语句被锁存了,必须等下一个上升沿触发后才能赋值给下个语句。

(2)阻塞赋值
与非阻塞赋值不同,赋值语句执行完后块才结束,b 的值在赋值语句结束后立刻改变,但是在时序逻辑电路中可能会出问题。
always @(clk or clr);
    begin
        b=a;
        c=b;
    end

阻塞赋值就是顺序执行语句,类似于C语言结构化编程一样,语句是按顺序执行的,该语句的RTL如下图:

如果开始a=1,b=2,c=2;当上升沿到达后,a=1,b=1,c=1.

学习到的重点: 
1)时序电路建模时,用非阻塞赋值; 
2)锁存器电路建模时,用非阻塞赋值; 
3)用always块建立组合逻辑模型时,用阻塞赋值; 
4)在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值; 
5)在同一个alway块中,不要即用非阻塞又用阻塞赋值; 
6)不要在一个以上的always块中为同一个变量赋值; 
7)用$strobe系统任务来显示用非阻塞赋值的变量值; 
8)在赋值时不要使用#0延迟。

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值