资讯详情

Verilog数字系统设计教程第三部分练习四

提示:文章完成后,目录可以自动生成,如何生成可以参考右边的帮助文档

前言

一、模块源代码

1.1 程序语句:

1.2 testbench语句:

二、模拟波形

编辑

三、思考题3

(1)模拟波形如下:

(2)模拟波形如下:

总结


前言

通过使用阻塞赋值语句和非阻塞赋值语句来编写两个模块实例,并比较它们之间的区别。

一、模块源代码

1.1 程序语句:

//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 endmodule

1.2 testbench语句:

`timescale 1 ns/ 100 ps `include "blocking.v" `include "non_blocking.v"  module blocking_vlg_tst();  reg [3:0] a; reg clk;                                               wire [3:0]  b1, c1, b2, c2;  non_blocking non_blocking(clk,a,b2,c2); blocking blocking(clk,a,b1,c1);                            initial                                                  begin                                                     clk = 0;   forever #50 clk = ~clk;  end initial  begin   a = 4'h3;   $display("blocking: a = %d, b1 = %d, c1 = %d, b2 = %d, c2 = %d." ,a,b1,c1,b2,c2);   #100 a = 4'h7;   $display("blocking: a = %d, b1 = %d, c1 = %d, b2 = %d, c2 = %d." ,a,b1,c1,b2,c2);   #100 a = 4'hf;   $display("blocking: a = %d, b1 = %d, c1 = %d, b2 = %d, c2 = %d." ,a,b1,c1,b2,c2);   #100 a = 4'ha;   $display("blocking: a = %d, b1 = %d, c1 = %d, b2 = %d, c2 = %d." ,a,b1,c1,b2,c2);   #100 a = 4'h2;   $display("blocking: a = %d, b1 = %d, c1 = %d, b2 = %d, c2 = %d." ,a,b1,c1,b2,c2);   #100   $display("blocking: a = %d, b1 = %d, c1 = %d, b2 = %d, c2 = %d." ,a,b1,c1,b2,c2);   $stop;  end endmodule

二、模拟波形

三、思考题3

(1)模拟波形如下:

与non_blocking模块相同,相当于非阻塞赋值。

(2)模拟波形如下:

与blocking相同的模块相当于阻塞赋值。

总结

阻塞赋值和非阻塞赋值的使用原则如下:

(1)时序电路建模时,用非阻塞赋值;

(2)建模存器电路时,用非阻塞赋值;

(3)用always写组合逻辑时,使用阻塞赋值;

(4)在同一个always在块中同时建立时序和组合逻辑电路时,使用非阻塞赋值;

(5)在同一个always非阻塞赋值和阻塞赋值不得同时用于块中;

(6)不要在多个always块中赋值相同的变量;

(7)用$strobe用非阻塞赋值显示系统任务的变量值;

(8)赋值时不要使用 #0 延迟。

标签: 接近开关移位传感器vlg10

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台