Verilog阻塞赋值与非阻塞赋值

主要收获:

1.阻塞赋值与非阻塞赋值;

2.代码测试;

3.组合逻辑电路和时序逻辑电路。

 

阻塞赋值与非阻塞赋值:

1.阻塞赋值“=(组合逻辑电路),非阻塞赋值“<=(时序逻辑电路);

2.Verilog模块编程的8个原则:

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

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

(3)  用always块建立组合逻辑模型时,用阻塞赋值。

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

(5)  在同一个always块中不要既用非阻塞赋值又用阻塞赋值。

(6)  不要在一个以上的always块中为同一个变量赋值。

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

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

在编写时牢记这八个要点可以为绝大多数的Verilog用户解决在综合后仿真中出现的90-100% 的冒险竞争问题。

3.所谓阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上是在前一条赋值语句结束后开始赋值的。

4.非阻塞语句的执行过程是:首先计算语句块内部所有右边表达式(RHS)的值,然后完成对左边寄存器变量的赋值操作。

5.在代码上的区别:

 

begin

    B=A;

    C=B+1;

end

上述代码先将A的值赋值给B,C的值是A+1

 

begin

    B<=A;

    C<=B+1;

end

上述代码的最终结果是:将A赋值给了B,但是C的值是B原来的值+1。因为最先计是的是右边的表达式。

 

组合逻辑电路与时序逻辑电路:

1.数字电路根据逻辑功能的不同特点,可以分成两大类,一类叫组合逻辑电路(简称组合电路),另一类叫做时序逻辑电路(简称时序电路)。

2.组合逻辑电路在逻辑功能上的特点是任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关。

3.时序逻辑电路在逻辑功能上的特点是任意时刻的输出不仅取决于当时的输入信号,而且还取决于电路原来的状态,或者说,还与以前的输入有关。

 

Verilog代码:

moduleblocking(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

对应原理图:


 

modulenon_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

对应原理图:


 

测试代码:

`timescale1ns/1ns

 

moduleblocking_test;

       wire [3:0] b1, c1, b2, c2;

       reg [3:0] a;

       reg clk;

      

       initial begin

              clk = 0;

              forever #50 clk = ~clk;

       end

      

       initial begin

              a = 4'h3;

              $display("______________________");

              #100 a = 4'h7;

              $display("______________________");

              #100 a = 4'hf;

              $display("______________________");

              #100 a = 4'ha;

              $display("______________________");

              #100 a = 4'h2;

              $display("______________________");

              #100$display("______________________");

              $stop;

       end

      

       non_blocking        u1(clk, a, b2, c2);

       blocking               u2(clk,a, b1, c1);

      

endmodule

 

仿真波形图:

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值