FPGA学习:理解阻塞赋值与非阻塞赋值

本文详细介绍了Verilog HDL中阻塞赋值(Blocking)与非阻塞赋值(Non-Blocking)的原理和区别。通过实例分析了两者在时序逻辑和组合逻辑中的应用,强调了在不同场景下选择合适赋值方式的重要性,并给出了设计时序逻辑电路的原则。
摘要由CSDN通过智能技术生成

一、初步理解阻塞赋值与非阻塞赋值

在Verilog HDL语言中,信号有两种赋值方式:

(1).非阻塞(Non_Blocking)赋值方式( 如 b <= a; )

  • 块结束后才完成赋值操作。
  • b的值并不是立刻就改变的。
  • 这是一种比较常用的赋值方法。(特别在编写可综合模块时)

(2).阻塞(Blocking)赋值方式( 如 b = a; )

  • 赋值语句执行完后,块才结束。
  • b的值在赋值语句执行完后立刻就改变的。
  • 可能会产生意想不到的结果。

非阻塞赋值方式和阻塞赋值方式的区别常给设计人员带来问题。问题主要是给"always"块内的reg型信号的赋值方式不易把握。

到目前为止,前面所举的例子中的"always"模块内的reg型信号都是采用下面的这种赋值方式:

b <= a; 

这种方式的赋值并不是马上执行的,也就是说"always"块内的下一条语句执行后,b并不等于a,而是保持原来的值。"always"块结束后,才进行赋值。而另一种赋值方式阻塞赋值方式,如下所示:

 b = a;

这种赋值方式是马上执行的。也就是说执行下一条语句时,b已等于a。尽管这种方式看起来很直观,但是可能引起麻烦。下面举例说明:

[例1]:

always @( posedge clk )
begin
    b<=a;
    c<=b;
end

[例1] 中的"always"块中用了非阻塞赋值方式,定义了两个reg型信号b和c,clk信号的上升沿到来时,b就等于a,c就等于b,这里应该用到了两个触发器。请注意:赋值是在"always"块结束后执行的,c应为原来b的值。这个"always"块实际描述的电路功能如下图所示:

[例2]:

always @(posedge clk)
begin
    b=a;
    c=b;
end

[例2]中的 "always"块用了阻塞赋值方式。clk信号的上升沿到来时,将发生如下的变化:b马上取a的

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值