精华内容
下载资源
问答
  • 阻塞与非阻塞赋值
    2019-12-12 13:16:56

    https://blog.csdn.net/fzr_en/article/details/89552323 侵删

    阻塞赋值:前面语句执行完,才可执行下一条语句;即:前面语句的执行(b=a)阻塞了后面语句的执行(c=b)。即:always块内,2条语句顺序执行。

    always @(posedge i_clk)

    begin

             b = a;

             c = b;

    end

    注意:a的值赋给b,b的值赋给c,是在同一个时钟上升沿完成,如下图仿真结果。

    非阻塞赋值:always块内,2条语句同时执行。即:前面语句的执行(b=a)不会阻塞后面语句的执行(c=b)。

    always @(posedge i_clk)

    begin

             b <= a;

             c <= b;

    end

    注意:第1个clk上升沿a的值赋给b,此时b的值还没有更新;第2个clk上升沿,b的值赋给c,此时c才能获得b更新后的值。所以c获得a的值,需要2个clk完成。如下图仿真结果。

    总结:

    1:组合逻辑,使用 “阻塞赋值”。

    2:时序逻辑,使用“非阻塞赋值”。
     

    更多相关内容
  • 阻塞与非阻塞赋值

    2021-01-19 22:56:02
     稍微接触过Verilog HDL的都对阻塞与非阻塞赋值略知一二,也是我们经常强调的重点之一,在课堂上还是有学员问什么不一样呢,为什么我用阻塞赋值也能得出正确的结果呢?  在编写可综合代码的时候,建议大家不要忘...
  •  稍微接触过Verilog HDL的都对阻塞与非阻塞赋值略知一二,也是我们经常强调的重点之一,在课堂上还是有学员问什么不一样呢,为什么我用阻塞赋值也能得出正确的结果呢?  在编写可综合代码的时候,建议大家不要忘...
  • 本文介绍了Verilog阻塞与非阻塞赋值的区别
  • 阻塞与非阻塞

    一、阻塞与非阻塞赋值(非常重要的问题!)

    在进行Verilog模块编程时使用赋值操作要注意8个要点来编写代码就可以避免Verilog仿真时出现冒险和竞争的现象。**

    首先注意2个要点(不在8个要点内):

    1) 在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构;
    2) 在描述时序逻辑的always块中用非阻塞赋值,则综合成时序逻辑的电路结构。

    这是因为综合前仿真和综合后仿真一致的缘故。如果不按照这两个要点来编写Verilog代码,也有可能综合出正确的逻辑,但前后仿真的结果就会不一致。

    RHS:赋值等号右边的变量或表达式;RLS:赋值等号左边的变量或表达式。

    Verilog标准定义了有些语句有明确的执行时间,有些语句没有,若有多条语句准备在同一时刻执行,但由于语句的执行顺序不同(但符合Verilog标准的语法),却会产生不同输出结果。这就造成了冒险和竞争的现象。常出现在阻塞赋值语句中。

    1, 阻塞赋值的执行是只有一个步骤的操作,即计算RHS并更新LHS,此时不能允许来自任何其他Verilog语句的干扰。

    阻塞的概念就是串行操作,可在多个always块中进行。但是可综合的阻塞在RHS不能设定有延迟(零延迟也不可)。理论上,阻塞语句,前面的语句和后面的只有概念的先后,无实质的延迟。
    在这里插入图片描述

    2,非阻塞赋值的执行有两个步骤:

    1) 在赋值开始时刻,计算非阻塞赋值RHS表达式;
    2) 在赋值结束时刻,更新非阻塞赋值RLS表达式。

    非阻塞赋值操作指用对于寄存器类型变量进行赋值,只在always和initial块中。非阻塞赋值语句若是处在时钟的正跳变或负跳变的边沿脉冲触发中,一般可避免冒险与竞争问题。

    在这里插入图片描述

    8个要点:牢记,编程中可避免很多问题。

    1) 时序电路建模时,用非阻塞赋值;
    2) 锁存器电路建模时,用非阻塞赋值;
    3) 用always块建立组合逻辑模型时,用阻塞赋值;
    4) 在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值;
    5) 在同一个always块中不要既用阻塞赋值又用非阻塞赋值;
    6) 不要在一个以上的always块中为同一个变量赋值;
    7) 用$strobe系统任务来显示用非阻塞赋值的变量值;
    8) 在赋值时不要使用#0延迟。

    展开全文
  • 阻塞赋值的执行可以认为是只有一个步骤的操作,即计算RHS并更新LHS,且不允许其他语句的干扰。
  • Verilog中的延时、阻塞与非阻塞赋值仿真设计.doc
  • 阻塞赋值与非阻塞赋值详解 注意 阻塞赋值 1.设计文件 2.激励文件 3.原理图 4.仿真图 非阻塞赋值 1.设计文件 2.激励文件 3.原理图 4.仿真图 注意 阻塞赋值与非阻塞赋值,只有在时序逻辑中才有 //不是阻塞赋值,也不是...

    注意

    阻塞赋值与非阻塞赋值,只有在时序逻辑中才有

    //不是阻塞赋值,也不是非阻塞赋值,因为是组合电路
    always@(a,b,c)begin //相当于always@(*)
            case({a,b,c})//位拼接,{a,b,c}三位信号
                3'b000:out = 8'b0000_0001;
                3'b001:out = 8'b0000_0010;
                3'b010:out = 8'b0000_0100;
                3'b011:out = 8'b0000_1000;
                3'b100:out = 8'b0001_0000;
                3'b101:out = 8'b0010_0000;//3'd5 :out = 8'b0010_0000
                3'b110:out = 8'b0100_0000;
                3'b111:out = 8'b1000_0000;           
            endcase
    

    阻塞赋值

    1.阻塞赋值属于顺序执行,即下一条语句执行前,当前语句一定会执行完毕。
    2.阻塞赋值语句使用等号 = 作为赋值符。
    3.前面的仿真中,initial 里面的赋值语句都是用的阻塞赋值。

    1.设计文件

    module block_nonblock(clk,reset_n,a,b,c,out
        );
        input clk;
        input reset_n;
        input a,b,c;
        output reg [1:0] out;
        reg [1:0] d;
    //阻塞赋值
        always@(posedge clk or negedge reset_n)
        if(!reset_n)begin
            out =2'b0;
            d =0;    
        end
        else begin
            d =a+b;
            out =d+c;
        end
        
    endmodule
    
    

    2.激励文件

    `timescale 1ns / 1ns //时间刻度 时间的单位/ 1ns精度
    `define clk_period 20
    module block_nonblock_tb( );
    
        reg clk;
        reg reset_n;
        reg a,b,c;
        wire [1:0] out;
        
        
        block_nonblock block_nonblock(
         .clk(clk),
         .reset_n(reset_n),
         .a(a),
         .b(b),
         .c(c),
         .out(out)
        );
        initial clk=1;
        always#(`clk_period/2) clk=~clk;
        
        initial begin
            reset_n=1'b0;
            a=0;b=0;c=0;
            
            #(`clk_period*200+1);
            reset_n=1'b1;
            #(`clk_period*200);
            a=0;b=0;c=0;
            #(`clk_period*200);
            a=0;b=0;c=1;
            #(`clk_period*200);
            a=0;b=1;c=0;
            #(`clk_period*200);
            a=0;b=1;c=1;
            #(`clk_period*200);
            a=1;b=0;c=0;
            #(`clk_period*200);
            a=1;b=0;c=1;
            #(`clk_period*200);
            a=1;b=1;c=0;
            #(`clk_period*200);
            a=1;b=1;c=1;
            #(`clk_period*200);
            $stop;  
        end
    endmodule
    

    3.原理图

    在这里插入图片描述

    4.仿真图

    在这里插入图片描述

    非阻塞赋值

    1.非阻塞赋值属于并行执行语句,即下一条语句的执行和当前语句的执行是同时进行的,它不会阻塞位于同一个语句块中后面语句的执行。
    2.非阻塞赋值语句使用小于等于号 <= 作为赋值符。

    1.设计文件

    第一种方法

    module block_nonblock(clk,reset_n,a,b,c,out
        );
        input clk;
        input reset_n;
        input a,b,c;
        output reg [1:0] out;
        reg [1:0] d;
        
    //非阻塞赋值
        always@(posedge clk or negedge reset_n)
        if(!reset_n)begin
            out <=2'd0;
            d<=0;    
        end
        else begin
            d<=a+b;
            out<=d+c;
            
    //        d<= #2 a+b;//延迟2s,没有实际的电路,综合的时候会忽略,模拟传输延迟方便仿真使用,调试更加方便
    //        out<= #2 d+c;
            
    //        out<=a+b+c;//(数学上相等,电路上不相等)
        end
    endmodule
    
    

    第二种方法

    module block_nonblock(clk,reset_n,a,b,c,out
        );
        input clk;
        input reset_n;
        input a,b,c;
        output reg [1:0] out;
        reg [1:0] d;
        
    //两个always将out与d分开写    
        always@(posedge clk or negedge reset_n)
        if(!reset_n)begin
            out <=2'd0;  
        end
        else begin
            out<=d+c;
        end
    
        always@(posedge clk or negedge reset_n)
        if(!reset_n)begin
            d<=0;   
        end
        else begin
            d<=a+b;
        end
    
    endmodule
    

    2.激励文件

    //同阻塞赋值的testbench
    

    3.原理图

    生成了d[1:0]和out[1:0]两个寄存器
    在这里插入图片描述

    4.仿真图

    在这里插入图片描述
    对上图中的红色部分放大如下
    在这里插入图片描述
    在非阻塞赋值的情况下,在16,020ns时刻,out[1:0]的值是计算前一个时刻16,000ns的d[1:0]和c值;
    16,000ns时刻的d[1:0]等于15,980ns的a+b的值;
    非阻塞赋值,均是上一时钟的赋值。

    后记:事常与人违,事总在人为。

    展开全文
  • 阻塞赋值与非阻塞赋值

    FPGA学习篇之阻塞赋值与非阻塞赋值


    前言

      学习Verilog时区分阻塞赋值与非阻塞赋值一直是个绕不过去的坎,小白在刚接触这两个概念时也是一头雾水,一般在组合逻辑中使用阻塞赋值,在时序逻辑中使用非阻塞赋值,这与组合逻辑和时序逻辑的特性有关。有时仿真代码时与我们预想的时序不太一样,可能就是没区分阻塞赋值与非阻塞赋值的使用,只有写过大量的代码才能真正理解这两者的区别,从而设计出符合我们意愿的代码。


    一、阻塞赋值(=)

      要理解阻塞赋值与非阻塞赋值,首先要区分它们(小白经常将它们的名字搞混)。在Verilog中阻塞赋值用“=”来表示,在过程块中,阻塞赋值是顺序执行的,只有执行完前一条语句才会执行下一条,执行前一条语句时,下一条语句等待执行,也就是被“阻塞”了。阻塞赋值的执行过程可以归纳为一个步骤:计算表达式右边的值并立即更新给表达式左边的变量,在这个过程中不允许有其他verilog语句的干扰。同时要注意阻塞赋值往往应用于组合逻辑电路中,其对应的电路结构往往与电平触发有关。

    module blocking(
        input clk_100m,
        input rst_n,
        input      [7:0] in2,
        output reg [7:0] out2
        );
    // 阻塞赋值
    reg [7:0] reg_in2;
    always @(posedge clk_100m or negedge  rst_n) begin
        if(!rst_n) begin
            reg_in2 = 8'b0;
            out2 = 8'b0;
        end
        else begin
            reg_in2 = in2;
            out2 = reg_in2;
         end
    end
    endmodule
    

    在这里插入图片描述
      图中reg_in2延迟in2一拍,是因为只有时钟的上升沿到来时才会将in2锁存进reg_in2,由于采用的阻塞赋值,out2的值直接跟随reg_in2,也就是reg_in2改变会立刻更新out2。

    二、非阻塞赋值(<=)

      在Verilog中非阻塞赋值用“<=”来表示,非阻塞赋值往往应用于时序逻辑电路中,其对应的电路结构往往与边沿触发有关。非阻塞赋值语句的执行过程是并行的,在时序逻辑电路的代码块中,所有的非阻塞赋值表达式同时执行,代码也就没有先后顺序之分。非阻塞赋值语句的执行可以分为两个步骤:首先是赋值开始时刻计算表达式右边的值 ,第二是在赋值结束时刻将表达式右边的值更新给左边的变量。其次要注意非阻塞赋值只能对reg型变量进程操作,不能对wire型变量进行赋值。也就是非阻塞赋值能用在initial 和always块中,不能再assign语句中使用。

    module non_blocking(
        input clk_100m,
        input rst_n,
        input      [7:0] in1,
        output reg [7:0] out1
        );
    // 非阻塞赋值
    reg [7:0] reg_in1;
    always @(posedge clk_100m or negedge  rst_n) begin
        if(!rst_n) begin
            reg_in1 <= 8'b0;
            out1 <= 8'b0;
         end
        else begin
            reg_in1 <= in1;
            out1 <= reg_in1;
         end
    end
    endmodule
    

    在这里插入图片描述
      图中reg_in1延迟in1一拍,是因为只有时钟的上升沿到来时才会将in1锁存进reg_in1,由于采用的非阻塞赋值,reg_in1要等到时钟的上升沿到来才会把前一时刻的值锁存进out1,所以out1会延迟reg_in1一拍。

    总结

      要充分理解阻塞赋值与非阻塞赋值的区别与应用场合,才能在今后设计出符合要求的电路。

    展开全文
  • Verilog中的阻塞与非阻塞赋值

    千次阅读 2021-12-14 14:15:09
    在Verilog HDL语言中,信号有两种赋值方式,即阻塞赋值和非阻塞赋值。 1、阻塞(Blocking)赋值(如 b = a) 阻塞赋值,顾名思义,即在一个always块中,后面的语句会受到前语句的影响,具体来说,在同一个always中...
  • 非阻塞赋值与阻塞赋值实验验证
  • 阻塞赋值&非阻塞赋值

    2022-05-25 19:24:51
    非阻塞(Non_blocking)赋值方式(如 b<=a) ①语句执行到此时,先计算“<=”右侧a的值,但不立即赋值给b; ②always块结束后才完成此次赋值操作; ③这是时序逻辑模块最常用的赋值方法。 对于组合逻辑电路: ...
  • 最近学到了关于verilog的阻塞赋值与非阻塞赋值的一些区别,经过网上查阅与仿真实验,有了一些理解。希望能够记下来。
  • 在Verilog HDL中,有两种过程性赋值方式,即阻塞式(blocking)和非阻塞式(non-blocking)。这两种赋值方式看似差不多,其实在某些情况下却有着根本的区别,如果...本文主要介绍Verilog阻塞式赋值与非阻塞式赋值的分析
  • FPGA中阻塞赋值与非阻塞赋值原理实验
  • 文章主要介绍Verilog中阻塞赋值和非阻塞赋值的正确使用方法。
  • 1、时序电路建模,用非阻塞赋值; 2、锁存器电路建模时,用非阻塞赋值; 3、用always块描述组合逻辑时,采用阻塞赋值; 4、同一个always块中描述时序和组合逻辑混合电路时,用非阻塞赋值; 5、不要在同一个...
  • 阻塞赋值和非阻塞赋值的深度理解

    千次阅读 多人点赞 2021-05-10 22:55:14
    1.1简单叙述阻塞赋值和非阻塞赋值的区别: (1)阻塞赋值(=)必须是阻塞赋值完成后,才进行下一条语句的执行;赋值一旦完成,等号左边的变量值立即变化。在同一个块中,非阻塞赋值表达式的书写顺序不影响赋值的结果。...
  • 本文转自romme426,原文链接:... 阻塞赋值:前面语句执行完,才可执行下一条语句;即:前面语句的执行(b=a)阻塞了后面语句的执行(c=b)。即:always块内,2条语句顺序执行。 always @(posedge i_clk) begin
  • 文章目录1: 非阻塞赋值语句2:阻塞赋值语句总结 1: 非阻塞赋值语句 非阻塞(Non_Blocking)赋值方式块结束后才完成赋值操作。b的值并不是立刻就改变的。对于时序电路中的always块的reg信号,一般采用非阻塞语句赋值。...
  • Verilog HDL 对于变量赋值的时候,有阻塞和非阻塞两种方式: 1、阻塞: 用 "=" 2、非阻塞 : 用 "<=" 这两种赋值方式如果用得不对的话,...而非阻塞赋值的情况,它代表当前的复制并不是马上成功,下面语句...
  • FPGA中阻塞赋值与非阻塞赋值原理实验 fpga开发.pdf
  • verilog中阻塞赋值和非阻塞赋值的区别
  • 1.连续赋值 组合b=a;c=b; === c=b=a === a->b->c导线 / c=b;b=a; === b->c a->b移位器(不推荐!) 时序b<=a;c<=b; === b1=a0;c1=b0; === a->b b->c移位器 2.生效时刻 详见 组合: 当场有效 ...
  • Verilog initial块中阻塞与非阻塞赋值问题 问题描述 在testbench的编写中经常要做的就是在initial块中对一些信号变化进行描述。 比如希望信号start在仿真开始后第10个周期上升沿置为高电平。 对于仿真时钟一般都会...
  • 非阻塞赋值与阻塞赋值

    万次阅读 多人点赞 2019-06-17 16:13:11
    即使是非常有经验的Verilog设计人员也不能完全理解在IEEE兼容的Verilog模拟器中如何安排非阻塞分配,并且不了解应该何时以及为何应该使用非阻塞赋值。 本文详细介绍了如何安排Verilog阻塞和非阻塞赋值,提供重要的...
  • Verilog中阻塞赋值与非阻塞赋值的区别

    万次阅读 多人点赞 2019-10-12 17:31:38
    简介: IEEE Verilog标准中提供了阻塞赋值和非阻塞赋值方式,二者在应用中存在区别。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 72,105
精华内容 28,842
关键字:

阻塞与非阻塞赋值

友情链接: cuter.rar