zoukankan      html  css  js  c++  java
  • Verilog堵塞赋值与非堵塞赋值

    verilog设计进阶

    时间:2014年5月6日星期二

    主要收获:

    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

    仿真波形图:

  • 相关阅读:
    mysql 系统表的作用
    从事务隔离级别谈到Hibernate乐观锁,悲观锁
    python 模拟登陆,请求包含cookie信息
    Python入门介绍
    mysql中设置小数
    分割png图片
    ubuntu 14.04 安装win7虚拟机
    rwx
    获取文件名称 basename 用法
    like tp
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6866759.html
Copyright © 2011-2022 走看看