【FPGA】阻塞和非阻塞赋值

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

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

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

相关文章
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
ModernBERT:英伟达开源的新一代编码器模型,性能超越 SOTA,通过去除填充和序列打包减少计算浪费,提高训练和推理的效率
ModernBERT 是由英伟达和 HuggingFace 等机构联合开源的新一代编码器模型,支持长上下文处理,性能超越 SOTA,适合多种自然语言处理任务。
346 7
ModernBERT:英伟达开源的新一代编码器模型,性能超越 SOTA,通过去除填充和序列打包减少计算浪费,提高训练和推理的效率
|
SQL Dubbo Java
案例分析|线程池相关故障梳理&总结
本文作者梳理和分享了线程池类的故障,分别从故障视角和技术视角两个角度来分析总结,故障视角可以看到现象和教训,而技术视角可以透过现象看到本质更进一步可以看看如何避免。
84917 136
案例分析|线程池相关故障梳理&总结
|
存储 传感器 移动开发
嵌入式系统中详解 Modbus 通信协议(清晰易懂)
嵌入式系统中详解 Modbus 通信协议(清晰易懂)
4000 1
|
监控 安全 网络安全
Windows系统安全深度解析:挑战、策略与全面防护
对敏感数据进行加密是保护数据机密性的重要手段。使用强加密算法对敏感数据进行加密存储和传输,即使数据被窃取也无法被轻易解密。此外,还可以考虑使用全磁盘加密技术来保护整个系统的数据安全性。
|
存储 人工智能 安全
大环境下AI发展迅速,如何保证AI的安全问题?
保障AI安全的关键措施包括:数据隐私保护(加密、访问控制、脱敏、共享协议)、模型安全(验证、鲁棒性、监测、更新)、用户信息保护(透明收集、匿名化、保密协议)、网络安全(实时监测、防护措施)和合规伦理(遵守法规、融入设计)。此外,安全培训和意识提升也是重要一环。多角度策略确保AI技术的安全、健康和可持续发展。
2390 0
|
存储 安全
阿里云无影云电脑免费试用,最长可试用3个月
无影云电脑是阿里云推出的云上的超级电脑,具有高性价比的特点,可满足办公、软件开发、娱乐学习、存储等需求。现在个人和企业用户均可免费申请试用无影云电脑,最长可试用3个月。
18484 3
阿里云无影云电脑免费试用,最长可试用3个月
|
弹性计算 负载均衡 对象存储
阿里云免费3个月云服务器ECS申请
阿里云免费3个月云服务器ECS申请,阿里云免费服务器领取,个人和企业用户均可以申请,个人免费服务器1核2GB 每月750小时,企业u1服务器2核8GB免费使用3个月,阿里云百科分享阿里云免费服务器申请入口、个人和企业免费配置、申请资格条件及云服务器免费使用时长
1038 0
|
JSON 前端开发 JavaScript
layui上传文件弹出请求上传接口出现异常的终极解决方案(v2.68版本、ajax底层逻辑修改、debug快速定位)
layui上传文件弹出请求上传接口出现异常的终极解决方案(v2.68版本、ajax底层逻辑修改、debug快速定位)
2001 0
|
机器学习/深度学习 人工智能 自然语言处理
蛋白质语言模型 ProGen:在实验室合成由 AI 预测的蛋白质
蛋白质语言模型 ProGen:在实验室合成由 AI 预测的蛋白质
1795 0
|
缓存 开发者 Windows
开发这么久,gradle 和 gradlew 啥区别、怎么选?
开发这么久,gradle 和 gradlew 啥区别、怎么选?
开发这么久,gradle 和 gradlew 啥区别、怎么选?