Verilog基本语法之阻塞赋值和非阻塞赋值

1.阻塞赋值(Blocking)

       阻塞赋值,顾名思义即在一个 always 块中,后面的语句会受到前语句的影响,具体来说就是在同一个always 中,一条阻塞赋值语句如果没有执行结束,那么该语句后面的语句就不能被执行,即被“阻塞”。也就是说 always 块内的语句是一种顺序关系,这里和 C 语言很类似。

       符号“=”用于阻塞的赋值(如:b = a;)阻塞赋值“=”在 begin 和 end 之间的语句是顺序执行,属于串行语句。

        在时序逻辑下使用阻塞赋值为例来说明
 

图1 阻塞赋值代码

图2 波形 

      代码中使用的是阻塞赋值语句,从波形图中可以看到,在复位的时候(rst_n=0), a=1, b=2,c=3;而结束复位之后(波形图中的 0 时刻),当 clk 的上升沿到来时(波形图中的 2 时刻),a=0, b=0, c=0。这是因为阻塞赋值是在当前语句执行完成之后,才会执行后面的赋值语句,因此首先执行的是 a=0,赋值完成后将 a 的值赋值给 b,由于此时 a 的值已经为 0,所以 b=a=0,最后执行的是将 b 的值赋值给 c,而 b 的值已经赋值为 0,所以 c 的值同样等于 0。

2.非阻塞赋值(Non-Blocking)

       符号“<=”用于非阻塞赋值(如:b <= a;),非阻塞赋值是由时钟节拍决定,在时钟上升到来时,执行赋值语句右边,然后将 begin-end 之间的所有赋值语句同时赋值到赋值语句的左边,注意:是 begin—end 之间的所有语句,一起执行,且一个时钟只执行一次,属于并行执行语句。这个是和 C 语言最大的一个差异点。

图3 非阻塞赋值代码 

图4 波形 

       代码中使用的是非阻塞赋值语句,从波形图中可以看到,在复位的时候rst_n=0, a=1,b=2, c=3;而结束复位之后(波形图中的 0 时刻),当 clk 的上升沿到来时(波形图中的 2 时刻), a=0, b=1, c=2。这是因为非阻塞赋值在计算 RHS 和更新 LHS 期间,允许其它的非阻塞赋值语句同时计算 RHS 和更新 LHS。在波形图中的 2 时刻, RHS 的表达是 0、 a、 b,分别等于 0、 1、 2,这三条语句是同时更新 LHS,所以 a、b、 c 的值分别等于 0、 1、 2。

说明:

        RHS:赋值等号右边的表达式或变量

        LHS:赋值等号左边的表达式或变量

3.什么时候使用阻塞赋值,什么时候使用非阻塞赋值

        ①在描述组合逻辑电路的时候,使用阻塞赋值,比如 assign 赋值语句和不带时钟的 always 赋值语句,这种电路结构只与输入电平的变化有关系。

Demo1: assign赋值语句
assign data = (data_en == 1'b1) ? 8'd255 : 8'd0;
Demo2:不带时钟的always语句
always @(*) begin
  if (en) begin
    a = a0;
    b = b0;
  end
  else begin
    a = a1;
    b = b1;
  end
end

        在描述时序逻辑的时候,使用非阻塞赋值,综合成时序逻辑的电路结构,比如带时钟的 always 语句;这种电路结构往往与触发沿有关系,只有在触发沿时才可能发生赋值的变化。

Demo3:
always @(posedge sys_clk or negedge sys_rst_n) begin
  if (!sys_rst_n) begin
    a <= 1'b0;
    b <= 1'b0;
  end
  else begin
    a <= c;
    b <= d;
  end
end

本文说明:参考正点原子FPGA开发指南,仅用作学习记录,如有侵权请告知!!!



 

  • 44
    点赞
  • 185
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Verilog中,for循环通常用来迭代执行一系列的语句块。对于for循环中的非阻塞赋值,可以使用以下语法进行实现: ``` for (initialization; condition; increment) begin // 非阻塞赋值语句 end ``` 在这个语法中,`initialization`是一个初始条件,用来设置循环的起始值。`condition`是一个循环条件,只有在满足条件的情况下,循环中的语句块才会被执行。`increment`是一个用于更新循环变量的语句,它会在每次循环迭代之后执行。 在循环的语句块中,可以使用非阻塞赋值语句来对信号进行赋值操作。非阻塞赋值使用`<=`符号来表示,例如: ``` signal <= value; ``` 这样,每次循环迭代时,信号都会根据赋值语句来更新。请注意,如果在for循环中使用非阻塞赋值,应该确保赋值语句不会产生综合不可预测的结果,否则可能会导致错误的行为。因此,在使用for循环进行赋值时,需要仔细考虑每个赋值语句的执行顺序和依赖关系,以确保正确的行为。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Verilog语法之阻塞赋值非阻塞赋值](https://blog.csdn.net/yijiancmy/article/details/104208518)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Verilog中的阻塞非阻塞赋值](https://blog.csdn.net/qq_44933149/article/details/121926211)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值