怎么重新设置wordpress,seo交流群,郑州小程序,安平县哪个做网站的好目录 2.非阻塞赋值举例3.阻塞赋值举例4.总结 微信公众号获取更多FPGA相关源码#xff1a; # 1.阻塞赋值和非阻塞赋值的区别#xff1a; (1)阻塞赋值#xff0c;必须是阻塞赋值完成后#xff0c;才进行下一条语句的执行#xff1b;赋值一旦完成#xff0c;等号… 目录 2.非阻塞赋值举例3.阻塞赋值举例4.总结 微信公众号获取更多FPGA相关源码 # 1.阻塞赋值和非阻塞赋值的区别 (1)阻塞赋值必须是阻塞赋值完成后才进行下一条语句的执行赋值一旦完成等号左边的变量值立即变化。在同一个块中非阻塞赋值表达式的书写顺序不影响赋值的结果。硬件没有对应的电路。 要点为串行从上到下顺序执行立即生效
2非阻塞赋值在赋值开始时计算表达式右边的值在本次仿真周期时钟的下降沿时才更新被赋值变量即赋值不是立即生效的非阻塞赋值允许块中其他语句同时执行。在同一个块中阻塞赋值表达式的书写顺序会影响赋值的结果。硬件有对应的电路。 要点并行不是立即生效同时执行
2.非阻塞赋值举例
相信刚入门的读者看完上面的理论是一脸懵逼实践出真知来看下面一个简单的例子
module test(input clk,input din,output dout);reg r1,r2,r3;always (posedge clk) beginr1 din;r2 r1;r3 r2; end assign dout r3;
endmodule话不多说写个简单的仿真来看结果设置输入din为0123一直循环。
timescale 1ns / 1psmodule test_tb;
parameter T 20 ;
reg clk ;
reg [1:0] din ;
wire [1:0] dout ;always #(T/2) clk ~clk;test u_test(
.clk (clk ),
.din (din ),
.dout (dout )
);initial beginclk 1b0;din 2b0;for(;;) begin#Tdin din 1b1;end
endendmodule可以看到第一个时钟周期r1被赋值为din的’0’,但是由于上个周期r1为未知此时r2的值为未知同理r3的值也应该被赋予的是上个周期的值也是未知。从第三个周期开始dout才开始输出din的值相当于din被延迟了三个周期输出。由于非阻塞赋值的特性常常用来对信号打拍在消除亚稳态和边沿检测时经常用到。
3.阻塞赋值举例
还是使用上面的例子只是把“改为”。
timescale 1ns / 1psmodule test(input clk ,input [1:0] din ,output [1:0] dout);reg [1:0] r1,r2,r3;always (posedge clk) beginr1 din;r2 r1;r3 r2;end assign dout r3;endmodule还是仿真看下结果 可以看到r1,r2,r3在一个时钟上升沿都赋值为输入din的值。
4.总结
阻塞赋值对应的电路结构往往与触发沿没有关系只与输入的电平变化有关系非阻塞赋值对应的电路结构往往与触发沿有关系只有在触发沿时才有可能发生赋值的情况。
8个要点
时序电路建模时用非阻塞赋值。锁存器电路建模时用非阻塞赋值()。用always块建立组合逻辑时用阻塞赋值()。在同一个always块中建立时序和组合逻辑电路时用非阻塞赋值。在同一个always块中不要既用非阻塞赋值又用阻塞赋值。不要在一个以上的always块中为同一个变量赋值。用$strobe系统任务来显示用非阻塞赋值的变量值。在赋值时不要使用#0延迟。
微信公众号获取更多FPGA相关源码