【FPGA】阻塞和非阻塞赋值

简介: but once in a while you find someone who's iridescent, and when you do, nothing will ever compare....

@TOC

学习新语法,争做新青年!咱就是说太上头了!!希望我坠得慢一点哈哈哈

verilog基础语法与应用 —— 阻塞 =和非阻塞 <=赋值

本节课通过实例来理解~~

所谓阻塞=和非阻塞<=赋值,都是在时序逻辑的语境中。umm话说,在操作系统中,我学过进程的阻塞和非阻塞等待,让我来探索一下它们之间有没有相通之处吧~
啊哦,感觉还是有点意思,其实写代码时候直接用结论就好了,但是~~ 大概知道为什么安心一些吗

1. 引入实验

block_nonblock.v

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

那如果我们把它拆开写,这是一样的~~

    reg [1:0] d;
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        d <= 0;
    else 
        d <= a+b;
    
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n) 
        out <= 2'b0;
    else 
        out <= d+c;

它对应的电路图①如图所示 ——

image-20220923092555945

这是否等价于如下代码呢?

    out <= a + b + c;

它对应的电路图②如图所示 ——

image-20220923093049053

思考在这两种情况下 ——

若此时,a = 1; b = 1; c = 1; 则d是多少?out是多少?

若此时,a = 0; b = 0; c = 1; 则d是多少?out是多少?

block_nonblock1.v

将非阻塞赋值<=变为阻塞赋值=

module block_nonblock1(
    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 = 0;
        d = 0;
        end
    else begin
        out = d + c; 
        d = a+b;
    end
    
endmodule

我们把这个工程右键选做top,然后run synthesis ——

image-20220923162606180

打开新世界,等价于① ——

image-20220923163838643

2. 对比实验

block_nonblock2.v

我们只是调换两个语句的位置:

module block_nonblock2(
    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 <= 0;
        d <= 0;
        end
    else begin
        d = a+b; //调换顺序
        out = d + c; 
    end
    
endmodule

我们再把这个文件设置为顶层,分析综合,查看RTL图,就很不一样~

等价于②

image-20220923170040762

所以,=阻塞赋值时,代码顺序不同,会导致电路不一样,结果就会不同~

block_nonblock_tb.v

我们写仿真文件block_nonblock2_tb.v

`timescale 1ns/1ns

`define Clk_period 20

module block_nonblock2_tb();
    reg Clk;
    reg Reset_n;
    reg a,b,c;
    
    wire[1:0] out;
    
 block_nonblock2  block_nonblock2_inst(
    .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;
        //每延迟一段时间,abc发生变化
        #(`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

我们分别对两个版本进行仿真,仔细观察 ——

非阻塞:

image-20220926212416792

阻塞:

image-20220926212439700

这主要和D触发器的电路有关。

3. 总结

阻塞赋值=:调换代码,电路会发生变化;

非阻塞赋值<=:无论怎样写怎样调换,电路完全一样;因此在时序逻辑中,我们一律使用非阻塞赋值。

把我们LED实验中,把

counter <= counter + 1'd1;

改成

counter = counter + 1

会有没有区别?若N = 24999

那么前者周期大概在500us;后者周期在500us-20ns

相关文章
|
8月前
|
C语言 异构计算
【FPGA】Verilog 基础速览 | 数据类型 | HDL常数声明 | Timescale | 操作符 | 阻塞语句 | 非阻塞语句
【FPGA】Verilog 基础速览 | 数据类型 | HDL常数声明 | Timescale | 操作符 | 阻塞语句 | 非阻塞语句
33 0
|
2月前
|
机器学习/深度学习 算法 异构计算
m基于FPGA的多通道FIR滤波器verilog实现,包含testbench测试文件
本文介绍了使用VIVADO 2019.2仿真的多通道FIR滤波器设计。展示了系统RTL结构图,并简述了FIR滤波器的基本理论,包括单通道和多通道的概念、常见结构及设计方法,如窗函数法、频率采样法、优化算法和机器学习方法。此外,还提供了Verilog核心程序代码,用于实现4通道滤波器模块,包含时钟、复位信号及输入输出接口的定义。
75 7
|
2月前
|
算法 异构计算
基于FPGA的ECG信号滤波与心率计算verilog实现,包含testbench
基于FPGA的ECG信号滤波与心率计算verilog实现,包含testbench
|
2月前
|
算法 异构计算
m基于FPGA的电子钟verilog实现,可设置闹钟,包含testbench测试文件
该文介绍了基于FPGA的电子钟设计,利用Vivado2019.2平台进行开发并展示测试结果。电子钟设计采用Verilog硬件描述语言,核心包括振荡器、分频器和计数器。时间显示为2个十进制格式,闹钟功能通过存储器和比较器实现,当当前时间等于设定时间时触发。文中给出了Verilog核心程序示例,展示了时钟信号、设置信号及输出的交互。
124 2
|
2月前
|
算法 5G 数据处理
m基于FPGA的PPM光学脉位调制解调系统verilog实现,包含testbench
m基于FPGA的PPM光学脉位调制解调系统verilog实现,包含testbench
65 0
|
2月前
|
算法 异构计算 索引
m基于FPGA的Hamming汉明编译码verilog实现,包含testbench测试文件,不使用IP核
m基于FPGA的Hamming汉明编译码verilog实现,包含testbench测试文件,不使用IP核
73 1
|
2月前
|
编解码 算法 异构计算
基于FPGA的NC图像质量评估verilog实现,包含testbench和MATLAB辅助验证程序
在Vivado 2019.2和Matlab 2022a中测试的图像质量评估算法展示了效果。该算法基于NC指标,衡量图像与原始图像的相似度,关注分辨率、色彩深度和失真。提供的Verilog代码段用于读取并比较两个BMP文件,计算NC值。
|
2月前
|
算法 异构计算
m基于FPGA的MPPT最大功率跟踪算法verilog实现,包含testbench
该内容包括三部分:1) 展示了Vivado 2019.2和Matlab中关于某种算法的仿真结果图像,可能与太阳能光伏系统的最大功率点跟踪(MPPT)相关。2) 简述了MPPT中的爬山法原理,通过调整光伏电池工作点以找到最大功率输出。3) 提供了一个Verilog程序模块`MPPT_test_tops`,用于测试MPPT算法,其中包含`UI_test`和`MPPT_module_U`两个子模块,处理光伏电流和电压信号。
26 1
|
2天前
|
算法 计算机视觉 异构计算
基于FPGA的图像一维FFT变换IFFT逆变换verilog实现,包含tb测试文件和MATLAB辅助验证
```markdown ## FPGA 仿真与 MATLAB 显示 - 图像处理的 FFT/IFFT FPGA 实现在 Vivado 2019.2 中仿真,结果通过 MATLAB 2022a 展示 - 核心代码片段:`Ddddddddddddddd` - 理论:FPGA 实现的一维 FFT/IFFT,加速数字信号处理,适用于高计算需求的图像应用,如压缩、滤波和识别 ```
|
2月前
|
算法 异构计算
m基于FPGA的RS+卷积级联编译码实现,RS用IP核实现,卷积用verilog实现,包含testbench测试文件
m基于FPGA的RS+卷积级联编译码实现,RS用IP核实现,卷积用verilog实现,包含testbench测试文件
28 0

热门文章

最新文章