正在加载图片...
第十章.设计练习进阶 目的:1.明确掌握阻塞赋值与非阻塞赋值的概念和区别 2.了解阻塞赋值的使用情况 阻塞赋值与非阻塞赋值,在教材中我们已经了解了它们之间在语法上的区别以及综合后 所得到的电路结构上的区别。在 always块中,阻塞赋值可以理解为赋值语句是顺序执行的, 而非阻塞赋值可以理解为赋值语句是并发执行的。实际的时序逻辑设计中,一般的情况下非 阻塞赋值语句被更多地使用,有时为了在同一周期实现相互关联的操作,也使用了阻塞赋值 语句。(注意:在实现组合逻辑的 assign结构中,无一例外地都必须采用阻塞赋值语句。 下例通过分别采用阻塞赋值语句和非阻塞赋值语句的两个看上去非常相似的两个模块 blocking.v和non_ blocking.v来阐明两者之间的区别。 模块源代码 blockingv module blocking(clk, a, b, c) output [3: 0] b,c: input [3: 0] a: clk reg [3: 0] b,c always @(posedge clk) b Sdisplay( blocking: a =%d, b= %d, c=%d",a, b, c) endmodule non blocking v module non blocking(clk, a, b,c) output [3: 0]b,c: [3:0] t clk reg [3: 0]b, c l ways @(posedge clk begin b <e Sdisplay non blocking: a =%d, b=%d, c=%d", a, b, c)第十章.设计练习进阶 目的:1.明确掌握阻塞赋值与非阻塞赋值的概念和区别; 2.了解阻塞赋值的使用情况。 阻塞赋值与非阻塞赋值,在教材中我们已经了解了它们之间在语法上的区别以及综合后 所得到的电路结构上的区别。在 always 块中,阻塞赋值可以理解为赋值语句是顺序执行的, 而非阻塞赋值可以理解为赋值语句是并发执行的。实际的时序逻辑设计中,一般的情况下非 阻塞赋值语句被更多地使用,有时为了在同一周期实现相互关联的操作,也使用了阻塞赋值 语句。(注意:在实现组合逻辑的 assign 结构中,无一例外地都必须采用阻塞赋值语句。 下例通过分别采用阻塞赋值语句和非阻塞赋值语句的两个看上去非常相似的两个模块 blocking.v 和 non_blocking.v 来阐明两者之间的区别。 模块源代码: // ------------- blocking.v --------------- module blocking(clk,a,b,c); output [3:0] b,c; input [3:0] a; input clk; reg [3:0] b,c; always @(posedge clk) begin b = a; c = b; $display("Blocking: a = %d, b = %d, c = %d.",a,b,c); end endmodule //------------- non_blocking.v ------------------- module non_blocking(clk,a,b,c); output [3:0] b,c; input [3:0] a; input clk; reg [3:0] b,c; always @(posedge clk) begin b <= a; c <= b; $display("Non_Blocking: a = %d, b = %d, c = %d.",a,b,c); end 271
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有