概述
在写组合逻辑电路的代码时,我发现书上例子大都用的"=";而在写时序逻辑电路代码时,我发现书上例子大都用的"<="。之前就知道在Verilog HDL中阻塞赋值"="和非阻塞赋值"<="有着很大的不同,但一直没有搞清楚究竟有什么不同,现在来慢慢的琢磨它。
关键是组合逻辑中是实时变化的,而时序逻辑中一个cycle才变化一次 比如: always @(a or b) begin c = a + b; end always @(posedge clk) begin if(rst) c <= 0; else c <= a + b; end 在组合逻辑的always block中,a和b的变化都会引起c值的变化; 而时序逻辑中c至少会维持一个clock cycle,也就是说如果a和b的变化导致c变化的时间是在下一个clock的上升沿,而不会让c立刻改变 -------------------------------------------------------------------------------------------------------------------- 好,说正题 阻塞赋值“=”与非阻塞赋值“<=”的本质区别在于: 非阻塞赋值语句右端表达式计算完后并不立即赋值给左端,而是同时启动下一条语句继续执行,可以将其理解为所有的右端表达式RHS1、RHS2等在进程开始时同时计算,计算完后 ,等进程结束时同时分别赋给左端变量LHS1、LHS2等; 而阻塞赋值语句在每个右端表达式计算完后立即赋给左端变量,即赋值语句LHS1=RHS1执行完后LHS1是立即更新的,同时只有LHS1=RHS1执行完后才可执行语句LHS1=RHS2,依次类推。前一条语句的执行结果直接影响到后面语句的执行结果。
代码
1 `timescale 1 ps / 1 ps
2 module blocking_vlg_tst();
3
4 reg clk;
5 reg iD;
6 // wires
7 wire oQA;
8 wire oQB;
9
10 // assign statements (if any)
11 blocking i1 (
12 // port map - connection between master ports and signals/registers
13 .clk(clk),
14 .iD(iD),
15 .oQA(oQA),
16 .oQB(oQB)
17 );
18 initial
19 begin
20 clk = 1 ' b0;
21 iD = 1 ' b0;
22 end
23
24 always # 10 clk = ( ~ clk);
25
26 always
27 begin
28 # 8 iD = ( ~ iD);
29 end
30 endmodule
31
最后
以上就是大气心情为你收集整理的阻塞(=)赋值和非阻塞(<=)赋值的全部内容,希望文章能够帮你解决阻塞(=)赋值和非阻塞(<=)赋值所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复