FPGA之阻塞赋值与非阻塞赋值

Verilog语言中讲的阻塞赋值与非阻塞赋值,但从字面意思来看,阻塞就是执行的时候在某个地方卡住了,等这个操作执行完在继续执行下面的语句,而非阻塞就是不管执行完没有,我不管执行的结果是什么,反正我继续下面的事情。而Verilog中的阻塞赋值与非阻塞赋值正好也是这个意思,通过执行一个例子,就可以简单地明白了:
1、阻塞赋值可以理解为语句的顺序执行,因此语句的执行顺序很重要
2、非阻塞赋值可以理解为语句的并行执行,所以语句的执行不考虑顺序
3、在assign的结构中,必须使用的是阻塞赋值


//阻塞
module blocking(clk,a,b,c
);
input[3:0] a;
output[3:0] b,c;
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


//非阻塞
module non_blocking(clk,a,b,c
);
input[3:0] a;
output[3:0] b,c;
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


//测试
module 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‘h5;
$display("__________________");
#100 a=4‘hf;
$display("__________________");
#100 a=4‘ha;
$display("__________________");
#100 a=4‘h6;
$display("__________________");
#100 a=4‘h2;
$display("__________________");
#100 $display("__________________");
$stop;
end

blocking blocking(clk,a,b1,c1);
non_blocking non_blocking(clk,a,b2,c2);

endmodule

结果:

仿真波形:

时间: 2024-08-01 18:20:59

FPGA之阻塞赋值与非阻塞赋值的相关文章

07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线--普利斯队长精心奉献 ? 实验目的:掌握阻塞赋值与非阻塞赋值的区别 实验平台:无 实验原理: ????阻塞赋值,操作符为"=","阻塞"是指在进程语句(initial和always)中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的赋值语句执行完毕才能执行.而且阻塞赋值可以看成是一步完成的,即:计算等号右边的值并同时赋给左边变量. ????非阻塞赋值,操作符为"<=","非阻塞"是指在进程语句(

阻塞赋值与非阻塞赋值

     过程赋值:用于对reg型变量赋值,改变寄存器的值或为以后排定改变.      语法 {阻塞性(blocking)赋值} RegisterLValue = [ TimingControl] Expression; {非阻塞性(non-blocking)赋值} RegisterLValue <= [ TimingControl] Expression; 阻塞:在本语句中"右式计算"和"左式更新"完全完成之后,才开始执行下一条语句: 非阻塞:当前语句的执行

Verilog阻塞赋值与非阻塞赋值

今天又个兄弟求助,数据库里一个表有数据如下: no  name 1    a 2    b 3    c 4    d 如何用一个sql显示如下结果: ab ac ad bc bd cd 对于这种构造数据,是分析函数的强项,下面来做个试验: create table t (no number,name varchar(2)); insert into t values(1,'a'); insert into t values(2,'b'); insert into t values(3,'c')

阻塞赋值与非阻塞赋值(转载)

 前言:阻塞与非阻塞赋值是Verilog语言中最基本的部分,也是让大部分Verilog新手最困惑的地方.关于阻塞与非阻塞的著作文章可谓汗牛充栋,这些文章对阻塞与非阻塞赋值的原理进行了非常详细的讲解,但新手读了之后依然有种似懂非懂的感觉,编码过程中一如既往的犯错.所以,本文的目的立足于提供一种实用化的解决方案,用最简单的语言和形象的类比让新手能够一目了然的明白正确的编码方式以及相应的电路行为逻辑,关于仿真细节的讲解不是本文重点,需要了解更多细节的朋友可以参考文后列举的参考文献. 本文共分为三部分,

关于verilog阻塞赋值与非阻塞赋值的一些浅见

最近学到了关于verilog的阻塞赋值与非阻塞赋值的一些区别,经过网上查阅与仿真实验,有了一些理解.希望能够记下来. 说到verilog的阻塞与非阻塞赋值,不得不说的就是verilog的事件表,如下: 阻塞赋值,属于活跃事件,计算完RHS(Right Hand Side)立即更新左值.期间同一块内其他语句不能执行,即阻塞其他语句执行. 而非阻塞右值计算属于活跃事件,非阻塞左值更新属于非活跃事件,即计算完RHS,不能立即更新左值,而要等所有活跃事件完成,才能完成左值更新,出事件队列.   然后说说

用一个例子来学习阻塞赋值和非阻塞赋值

阻塞赋值与非阻塞赋值 阻塞赋值的一般表达式为:目标变量名=驱动表达式  阻塞赋值是一种理想化的数据传输,赋值立即发生,不存在延时行为 非阻塞赋值一般表达式为:目标变量名<=驱动表达式   非阻塞赋值比较接近真实的电路工作状态,应为他从综合的角度考虑到了延时和并行性. 在过程启动中,非阻塞赋值使三条语句同时运行,而阻塞赋值是按顺序方式完成更新的数据的. 新建工程,编写示例代码 module block_nonblock(clk,rst_n,a,b,c,out ); input clk,rst_n,

阻塞赋值和非阻塞赋值

2017-12-01 在Verilog语言中,赋值语句经常使用,阻塞赋值和非阻塞赋值经常带给我们很多困扰.在此讨论两种赋值方式的差异性. 首先根据表面含义深刻理解阻塞和非阻塞: 阻塞:在进程语句块中(initial或者always或者其他),当前赋值语句的执行阻塞了后面语句的执行.即后面语句的赋值需要等到当前赋值过程完成才能得以执行,即可认为执行过程是顺序执行的(我们要明白Verilog中,大多数情况模块都是并发执行的). 非阻塞:当前赋值语句的执行不会阻塞后续语句的执行,即可以认为当前赋值语句

Verilog HDL中阻塞语句和非阻塞语句的区别

Verilog语言中讲的阻塞赋值与非阻塞赋值,但从字面意思来看,阻塞就是执行的时候在某个地方卡住了,等这个操作执行完在继续执行下面的语句,而非阻塞就是不管执行完没有,我不管执行的结果是什么,反正我继续下面的事情.而Verilog中的阻塞赋值与非阻塞赋值正好也是这个意思,通过执行一个例子,就可以简单地明白了:1.阻塞赋值可以理解为语句的顺序执行,因此语句的执行顺序很重要2.非阻塞赋值可以理解为语句的并行执行,所以语句的执行不考虑顺序3.在assign的结构中,必须使用的是阻塞赋值 下面给出实例来说

阻塞IO、非阻塞IO的区别

1.类与类之间的关系:依赖,实现,泛化(继承),关联,组合,聚合. 1)依赖(虚线):一个类是 另一个类的函数参数 或者 函数返回值. 2)实现(实线加小圆):对纯虚函数类(抽象类)的实现. 3)继承 即 泛化(实线加空心三角形,从子类指向父类):表示一个类与另一个类之间的继承关系: 4)关联(实线):一个类是另一个类的成员变量. 5)聚合(菱形加实线):整体和部分的关系.不太紧密的(如:汽车与发动机,汽车可以选择各种型号的发动机) 6)组合(实心菱形加实线):生命体整体与部分的关系.紧密的关系