FPGA学习日记(7) 阻塞赋值与非阻塞赋值

本文探讨了在Verilog设计中,阻塞和非阻塞赋值的区别,以及它们如何影响寄存器之间的延迟。通过实例展示了阻塞赋值导致的延迟为一拍,而非阻塞赋值则延迟两拍,强调了在实时系统中的同步作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

补发 

阻塞赋值  =

非阻塞赋值 <= 只能用于寄存器类型变量进行赋值

module blocking

module blocking
(    
    input  wire sys_clk,
    input  wire sys_rst,
    input  wire [1:0] in,
    output reg [1:0] out
);

reg [1:0] in_reg;  //方便在波形上观察延迟一拍效果

always@(posedge sys_clk or negedge sys_rst)
    if(sys_rst == 1'b0)
        begin
            in_reg=1'b0;
            out=1'b0;
    else
        begin
            in_reg = in;
            out =in_reg;

endmodule

tb_blocking

`timescale 1ns/1ns
module tb_blcoking();

reg sys_clk;
reg sys_rst;
reg in;
wire out;

initial 
    begin
        sys_clk <= 1'b1;
        sys_rst <= 1'b0;
        #10
        sys_rst <= 1'b1;
        #210
        sys_rst <= 1'b0;
        #40
        sys_rst <= 1'b1;
    end

always #10 sys_clk <= ~sys_clk;
always #10 on <= {$random}%4;

blockong blocking_inst   
(
    .sys_clk(sys_clk),
    .sys_rst(sys_rst),
    .in(in),
    .out(out)
);
endmodule     

RTL视图

out与in一个寄存器 延迟一拍

 

 非阻塞赋值

module blocking
(    
    input  wire sys_clk,
    input  wire sys_rst,
    input  wire [1:0] in,
    output reg [1:0] out
);

reg [1:0] in_reg;  //方便在波形上观察延迟一拍效果

always@(posedge sys_clk or negedge sys_rst)
    if(sys_rst == 1'b0)
        begin
            in_reg=1'b0;
            out=1'b0;
    else
        begin
            in_reg <= in;
            out <=in_reg;

endmodule

RTL视图

out延迟in两拍,非阻塞赋值,in_reg延迟in一拍,out延迟in_reg一拍

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值