使用阻塞性赋值符号赋值生成两个并联的电路吗

07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档
时间: 13:12:38
&&&& 阅读:116
&&&& 评论:
&&&& 收藏:0
标签:芯航线——普利斯队长精心奉献
?实验目的:掌握阻塞赋值与非阻塞赋值的区别
实验平台:无
实验原理:
????阻塞赋值,操作符为"=","阻塞"是指在进程语句(initial和always)中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的赋值语句执行完毕才能执行。而且阻塞赋值可以看成是一步完成的,即:计算等号右边的值并同时赋给左边变量。
????非阻塞赋值,操作符为"&=","非阻塞"是指在进程语句(initial和always)中,当前的赋值语句不会阻断其后的语句。
实验步骤:
????为了详细说明阻塞赋值与非阻塞赋值对实际形成电路的影响,以下写了五个设计。其中端口列表均为以下所示,各部分代码不再重复。
module block_nonblock
input Rst_n
input aoutput
?????首先在时序电路中使用阻塞赋值的方式,生成一个加法器。这种方式生成的实际逻辑电路如图7-1所示。
always Clk or
negedge Rst_n
????现在把阻塞赋值的两条语句顺序颠倒一下,再次综合可以得到图7-2所示的逻辑电路。可以在调整顺序后与不调整时生成的逻辑电路不一致。现结合实验原理部分给出详细解释,当执行out 时,d的数据此时并不是更新后a+b的数据,而是上一个Clk上升沿到来时d的数据,这也就解释了为何还有一个D触发器的存在。通俗讲阻塞,out的这条语句阻塞了d的语句执行。对比图7-1的代码,由于d的语句在out的前面,虽然使用了阻塞赋值但是相当于out=a+b+c。
always Clk or
negedge Rst_n
????现在把赋值方式改为非阻塞赋值,进行综合后可以看到如图7-3所示的逻辑电路。
always Clk or
negedge Rst_n
????现在使用非阻塞方式,交换语句执行顺序,综合后实现的逻辑电路如图7-4所示。这里由于采用的非阻塞赋值,因此交换语句前后顺序并不会对最终生成的逻辑电路有实际影响。
always Clk or
negedge Rst_n
?为了在其各自的时序图中更直观的观察效果,新建仿真block_nonblock_tb文件保存到文件夹下,输入以下内容再次进行分析和综合直至没有错误以及警告。本激励文件除产生正常的时钟以及复位信号外,还生成了、、三个信号。这里调用待仿真文件使用的调用方式是显式调用,这种方式要求调用时信号顺序需要与编写的文件顺序一致且不能在一个激励文件中调用两次。可以看出这种方式容易出错,且具有局限性,不推荐使用因此之后的例子均不采用,此处只做介绍。
`timescale
1ns`define clock_period 20
?module block_nonblock_tb
block_nonblock block_nonblock0
initial Clock
always`clock_period
?endmodule
?设置好仿真脚本后进行功能仿真,可以看到如图7-5所示的波形文件,可以看出在复位信号置高之前输出为0。直观看上去没有问题。现在放大细节可以看出如图
变化在第一个时钟沿之后因此第一个时钟沿检测不到,下一个时钟检测到011 直接赋值计算。
????放大细节可以看出,在第一个上升沿out还是0,这是由于虽然是非阻塞赋值并且d已经更新为1,但是实际电路中总会存在延迟,这个时钟沿out已经采不到当前d数据了还是采到0。为了更好的说明进行门级仿真。
????全编译后进行门级后仿,可以在图7-8清晰的看出这种现象。
????再次改为非阻塞赋值,如下所示综合出来如图7-9所示。可以与图7-1比较分析。
always Clk or
negedge Rst_n
本节对比了 Verilog 语法中阻塞赋值和非阻塞赋值的区别,通过证明非阻塞赋值多种赋值顺序生产电路的唯一性,与非阻塞赋值多种赋值书序生成电路的不确定性,来展示使用非阻塞赋值对设计可预测性的重要意义
掌握可综合风格的Verilog模块编程的八个原则会有很大的帮助。在编写时牢记这八个要点可以为绝大多数的Verilog用户解决在综合后仿真中出现的90-100% 的冒险竞争问题。
1) 时序电路建模时,用非阻塞赋值。
2) 锁存器电路建模时,用非阻塞赋值。
3) 用always块建立组合逻辑模型时,用阻塞赋值。
4) 在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值。
5) 在同一个always块中不要既用非阻塞赋值又用阻塞赋值。
6) 不要在一个以上的always块中为同一个变量赋值。
7) 用$strobe系统任务来显示用非阻塞赋值的变量值
8) 在赋值时不要使用 #0 延迟标签:原文地址:http://www.cnblogs.com/xiaomeige/p/5500956.html
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!请完成以下验证码
查看: 2180|回复: 19
显示器电路图中这个电路1117为什么同时用两个?
下载分6190 分
原创币3 点
下载341 次
上传121 次
金币1112 ¥
主题帖子积分
会员等级:
今天看了个显示器的内部电路图里面有的电路不是很明白,问一下是会这样设计,有什么作用?
显示器内 power电路图.jpg (52.95 KB, 下载次数: 0)
16:39 上传
图中U701和U702的作用应该是一样的,都是把5V的电压转换为3.3V 的电压,但为什么这个电路中两同时并联两个1117的稳压管呢?
懂的朋友,帮忙分析一下,这样设计的原理是什么,如是去掉一个有什么影响没有?
下载分13052 分
原创币0 点
金币4798 ¥
主题帖子积分
会员等级:
维修大佬, 积分 1304, 距离下一级还需 96 积分
并联是增加电流,不能去掉。
在主板上一个1117的稳压器,可以通过几十安的电流,显示器真的比主板用到的电流还大吗?&
下载分860 分
原创币1 点
下载209 次
上传477 次
金币4068 ¥
主题帖子积分
会员等级:
你是老手,我说我的看法:1117说穿了,它就是一高精密的稳压器,它的电压低,可它的电流大,负载用电要求又高,并联一棵,的确是能保证稳定,延年。
网:有型的线,纵横全球,盲:看不见的数据满布线.
下载分1657 分
原创币0 点
下载262 次
金币5822 ¥
主题帖子积分
会员等级:
目的应该是提高3.3V 电压本身输出电流值大小以带动显示器开关板负载工作。
性格改变命运,细节决定成败
下载分548 分
原创币0 点
下载313 次
上传174 次
金币706 ¥
主题帖子积分
会员等级:
铜牌维客, 积分 122, 距离下一级还需 78 积分
下面的那个4只脚位,4脚反馈的吧,这两个是同一型号的东西吗
下载分580 分
原创币0 点
下载305 次
主题帖子积分
会员等级:
见习维客, 积分 38, 距离下一级还需 32 积分
并联是增加电流,提高带负载能力。
下载分634 分
原创币0 点
主题帖子积分
会员等级:
见习维客, 积分 64, 距离下一级还需 6 积分
两个封装都不一样,不过并联只是增大功率而已
下载分10 分
原创币0 点
下载5933 次
上传524 次
金币10548 ¥
主题帖子积分
会员等级:
为了提高输出电流。。。。。。。。。
看来电路中的重要参数还是电流!&
下载分40 分
原创币2 点
下载1195 次
上传430 次
金币367 ¥
主题帖子积分
会员等级:
SB专修---------250席技术员
&&这还不简单啊,就是一个的功率不够大,加多一个呗,
不解的是,显示器中有用到这么大的电流吗?&
下载分6190 分
原创币3 点
下载341 次
上传121 次
金币1112 ¥
主题帖子积分
会员等级:
为了提高输出电流。。。。。。。。。
看来电路中的重要参数还是电流!
下载分6190 分
原创币3 点
下载341 次
上传121 次
金币1112 ¥
主题帖子积分
会员等级:
这还不简单啊,就是一个的功率不够大,加多一个呗,
不解的是,显示器中有用到这么大的电流吗?
我觉得你不太了解线性稳压的原理&
下载分6190 分
原创币3 点
下载341 次
上传121 次
金币1112 ¥
主题帖子积分
会员等级:
并联是增加电流,不能去掉。
在主板上一个1117的稳压器,可以通过几十安的电流,显示器真的比主板用到的电流还大吗?
那么小、又是线性稳压的1117有哪么大的电流?&
几十安?你确定? 看下1117的图纸吧,
[attachimg]814563[/attachimg]
国产的驱动板最常见的这个地方一般使用的是 1842,最大5.0A电流
[attachimg]814564[/attachimg]
而A,至于为什么是2个并联,考虑&
这个类线性稳压器最大输出电流只有几安,怎么可能有几十安&
下载分40 分
原创币2 点
下载1195 次
上传430 次
金币367 ¥
主题帖子积分
会员等级:
SB专修---------250席技术员
不解的是,显示器中有用到这么大的电流吗?
我觉得你不太了解线性稳压的原理
下载分40 分
原创币2 点
下载1195 次
上传430 次
金币367 ¥
主题帖子积分
会员等级:
SB专修---------250席技术员
在主板上一个1117的稳压器,可以通过几十安的电流,显示器真的比主板用到的电流还大吗?
& & 这个类线性稳压器最大输出电流只有几安,怎么可能有几十安
下载分1274 分
原创币11 点
下载685 次
上传296 次
主题帖子积分
会员等级:
世代电脑科技 ----LDvie
在主板上一个1117的稳压器,可以通过几十安的电流,显示器真的比主板用到的电流还大吗?
几十安?你确定? 看下1117的图纸吧,
1117.jpg (105.91 KB, 下载次数: 0)
09:36 上传
国产的驱动板最常见的这个地方一般使用的是 1842,最大5.0A电流
1084.jpg (37.67 KB, 下载次数: 0)
09:38 上传
而A,至于为什么是2个并联,考虑的更多的是可靠性和电流范围。
给力,我没有找到这图纸&
下载分13052 分
原创币0 点
金币4798 ¥
主题帖子积分
会员等级:
维修大佬, 积分 1304, 距离下一级还需 96 积分
在主板上一个1117的稳压器,可以通过几十安的电流,显示器真的比主板用到的电流还大吗?
那么小、又是线性稳压的1117有哪么大的电流?
或许吧。没有考虑那么多&
下载分1148 分
原创币0 点
下载151 次
金币3568 ¥
主题帖子积分
会员等级:
铜牌维客, 积分 130, 距离下一级还需 70 积分
本人认为是为了增大电流。
下载分20 分
原创币0 点
下载322 次
上传200 次
主题帖子积分
会员等级:
铜牌维客, 积分 155, 距离下一级还需 45 积分
修显示器都不用图纸
下载分6190 分
原创币3 点
下载341 次
上传121 次
金币1112 ¥
主题帖子积分
会员等级:
那么小、又是线性稳压的1117有哪么大的电流?
或许吧。没有考虑那么多
下载分6190 分
原创币3 点
下载341 次
上传121 次
金币1112 ¥
主题帖子积分
会员等级:
几十安?你确定? 看下1117的图纸吧,
国产的驱动板最常见的这个地方一般使用的是 1842,最大5.0A电流 ...
给力,我没有找到这图纸
实地毕业勋章
迅维实地面授培训学员勋章
Powered by Discuz! X3.4 -ALicensed
& 2017 Comsenz Inc.查看: 1422|回复: 0
FPGA学习-例解阻塞赋值与非阻塞赋值
据说阻塞赋值和非阻塞赋值是Verilog 语言中最难理解的知识点之一,我也觉得,从网上翻阅了资料,也看过一些视频。以下从两个典型的例子以及多个角度去分析得到与验证阻塞赋值与非阻塞赋值的区别,以及各自的特点。&&非阻塞赋值与阻塞赋值特性1、非阻塞赋值的特性:赋值语句的流程:a)计算右边的表达式得到结果b)将结果赋值到左边的变量这个过程中允许来自任何其他Verilog语句的干扰,也就是说其他Verilog语句都可以在这个时候执行。2、阻塞赋值特性:赋值语句的流程:c)计算右边的表达式得到结果d)将结果赋值到左边的变量这个过程中不允许有来自任何其他Verilog语句的干扰,这就导致其他的Verilog语句会等待(阻塞)该赋值语句执行完毕后才能被执行,这就是阻塞的含义。&根据小梅哥视频《07_例解阻塞赋值与非阻塞赋值》去分析一、非阻塞赋值分析1、非阻塞赋值源程序/* 实验名称:非阻塞赋值 */module mytest(clk, rst_n, a, b, c, out);&&&& input clk, rst_n, a, b, c;&&& output reg [1:0]&&& out;&&& &&& reg[1:0] d;&&& &&& always@(posedge clk or negedge rst_n)&&& &&& if(!rst_n)&&& &&& &&& out &= 2'b0;&&& &&& else begin&&& &&& &&& d &= a + b;&&& &&& &&& out &= d + c;&&& &&& end&endmodule&从源码中分析,根据非阻塞语句的特性, 假设 a = 0,b = 1, c = 0;当rst_n为高时,由于d&=a+b、out&=d+c; 是同时执行,所以:1、先右边表达式的结果:a + b = 0 + 1 = 1、d + c = 0 + 0 = 02、再将结果赋值给左边: d = a + 1就等于 1,out = d + c 就等于 0&2、RTL视图&&&& 其实RTL视图中也能看出来,假设a = 0,b = 1, c = 0; d寄存器为0,out寄存器为0 ; 那么当一个时钟周期到来:(以下两步会同时执行,即d与out寄存器会同时从加法器中取值)1、Add0寄存器会将a(0) + b(1) = 1的值给d寄存器,d寄存器由0变为12、Add1寄存器会将d(0) + c(0) = 0的值给out寄存器,out寄存器仍是0&3、仿真测试源程序`timescale 1ns/1ns`define clock_period 20&module mytest_tb;&&&& reg clk, rst_n, a, b, c;&&& wire [1:0] out;&&& &&& mytest u1(clk, rst_n, a, b, c, out);&&& &&& initial clk = 1;&&& always#(`clock_period / 2) clk = ~clk;&&& &&& initial begin&&& &&& rst_n = 1'b0;&&& &&& a = 0;&&& &&& b = 0;&&& &&& c = 0;&&& &&& #(`clock_period * 200 + 1);&&& &&& rst_n = 1'b1;&&& &&& #(`clock_period * 20);&&& &&& &&& &&& a = 0; b = 0; c = 0;&&& &&& #(`clock_period * 200);&&& &&& a = 0; b = 0; c = 1;&&& &&& #(`clock_period * 200);&&& &&& a = 0; b = 1; c = 0;&&& &&& #(`clock_period * 200);&&& &&& a = 0; b = 1; c = 1;&&& &&& #(`clock_period * 200);&&& &&& a = 1; b = 0; c = 0;&&& &&& #(`clock_period * 200);&&& &&& a = 1; b = 0; c = 1;&&& &&& #(`clock_period * 200);&&& &&& a = 1; b = 1; c = 0;&&& &&& #(`clock_period * 200);&&& &&& a = 1; b = 1; c = 1;&&& &&& #(`clock_period * 200);&&& &&& #(`clock_period * 200);&&& &&& $stop;&&& end&endmodule&4、波形图&5、波形分析&这是 out 从 0 变成 1 前一个时钟周期的情况,由上图可以看到,当时钟上升沿,采样得到的 a、b、d、c都是等于0,而c是在时钟上升沿之后才被拉高,所以要在下一个时钟周期的上升沿才能采样到c的状态,如下图:然后我们再往后看看。&首先我们看到 01 与 01 直接夹着 0,那么01对应的应该是如下几行的测试代码,从代码可以看到不应该有00的存在。a = 0; b = 0; c = 1;#(`clock_period * 200);a = 0; b = 1; c = 0;#(`clock_period * 200);因为c变为0,b变为1是在时钟周期的上升沿之后才变化,这里暂时不考虑是在上升沿或下降沿时变化。而out和d的状态因为过程中需要采样和赋值操作,会有一个逻辑延迟的现象,也就是说也是在时钟上升沿之后才会变化。以下为后仿真的波形图,根据接近实际状况。&即图中A上升沿时:(以下两步的采样是在同一个时钟上升沿同时进行)1、d的状态:旧状态是0,经过以下操作新的状态是0同时采样a的状态得到是0,b的状态得到的是0。所以d的状态变为02、out的状态:旧状态是1,经过以下操作新的状态变为1同时到d是0,c的状态得到的是1,所以导致out变为1。&&& 3、在时钟为稳定电平期间c变为0,b变为1,即在上升沿之后。&那么到了B上升沿时:(以下两步的采样是在同一个时钟上升沿同时进行)1、d的状态:旧状态是0,经过以下操作新的状态是1同时采样a的状态得到是0, b的状态得到的是1。所以d的状态变为12、out的状态:旧状态是1,经过以下操作新的状态变为0同时采样到d是0,c的状态得到的是0,所以导致out变为0。&当到C上升沿的时:(以下两步的采样是在同一个时钟上升沿同时进行)1、d的状态:旧状态是1,经过以下操作新的状态是1同时采样a的状态得到是0,b的状态得到的是1。所以d的状态变为12、out的状态:旧状态是0,经过以下操作新的状态变为1同时采样到d是1,c的状态得到的是0,所以导致out变为0。&6、解决出现0的情况。&&& 分析原因:从RTL视图中可以看到是因为多了几个d寄存器导致out寄存器慢了一个时钟。&&& 从波形视图中可以看到也是因为多了d,导致out寄存器出现了0状态。&&& 结论:将d去掉即可,以后写程序过程中尽量不要采用中间变量,避免出现多余的寄存器出现,导致不同步。&&&& 源程序如下:&&& `timescale 1ns/1ns/* 实验名称:非阻塞赋值 */module mytest(clk, rst_n, a, b, c, out);&&&& input clk, rst_n, a, b, c;&&& output reg [1:0]&&& out;&&& &&& //reg[1:0]&&& &&& always@(posedge clk or negedge rst_n)&&& &&& if(!rst_n)&&& &&& &&& out &= 2'b0;&&& &&& else begin&&& &&& &&& //d &= a +&&& &&& &&& //out &= d +&&& &&& &&& out &= a + b + c;&&& &&& end&endmodule&RTL视图:(从下图可以看到,来一个时钟周期,那么out直接就取Add0和Add1的值)&&&& 波形图:(下图比较小,可以对比上面的波形图)&二、阻塞赋值分析1、源程序(为了更加清晰的理解,我修改了视频作者的源码)`timescale 1ns/1ns/* 实验名称:非阻塞赋值 */module mytest(clk, rst_n, a, b, c, out);&&&& input clk, rst_n, a, b, c;&&& output reg [1:0]&&& out;&&&& reg[1:0] d;&&& reg run;&&& &&& // 这个是用来指示当前执行的位置&&& &&& always@(posedge clk or negedge rst_n)&&& &&& if(!rst_n)&&& &&& &&& out = 2'b0;&&& &&& else begin&&& &&& &&& d = a + b;&&& &&& &&& run =#1 1;&&& // 准备执行out赋值时&&& &&& &&& out = d + c;&&& &&& &&& run =#1 0;&&& // 执行out赋值后&&& &&& end&endmodule&从源码中分析,根据阻塞语句的特性, 假设 a = 0,b = 1, c = 0;当rst_n为高时,由于d=a+b、out=d+c; 是顺序执行,所以:1、先执行:d = a + b = 0 + 1 = 12、在执行:out = d + c = 1 + 0 = 1;&2、RTL视图(没看错,就和去掉了d寄存器的非阻塞赋值代码生成的电路一样)&&& 从这里就能看出与非阻塞赋值的不同之处,此处不再解释。&3、仿真测试程序&&& 与非阻塞仿真测试程序一样,略。&4、波形图&5、波形图分析&根据代码我们知道run信号是执行完d = a + b 之后为高电平,执行完 out = d + c 为低电平。通过run信号知道,每次都是在out变化之后才出现低电平。因为如果是同时执行的话,速度非常快,由于run原先就是低电平,变为高电平和变为低电平都是延时1ns,也就是说同时执行1ns之后run依然会是低电平,如下图,同样的延时,改为非阻塞的方式,out一直为低。&A时钟上升沿到来:(以下三个步骤为顺序执行)&&& 1、d的状态:当前状态0,经过采样,新的状态更新为0&&& &&& 同时采样a的状态为0、 b的状态为0,d = a + b = 0 + 0 = 0;&&& 2、run信号:&&& &&& 被拉高&&& 3、out的状态:当前状态0,经过采样,新的状态更新为0&&& &&& 同时采样d的状态0、c的状态为0,out = d + c = 0 + 0 = 0;4、run信号:被拉低&B时钟上升沿到来:(以下三个步骤为顺序执行)&&& 1、d的状态:当前状态0,经过采样,新的状态更新为0&&& &&& 同时采样a的状态为0、 b的状态为0,d = a + b = 0 + 0 = 0;&&& 2、run信号:&&& &&& 被拉高&&& 3、out的状态:当前状态0,经过采样,新的状态更新为1&&& &&& 同时采样d的状态0、c的状态为1,out = d + c = 0 + 1 = 1;4、run信号:被拉低&C时钟上升沿到来:(以下三个步骤为顺序执行)&&& 1、d的状态:当前状态0,经过采样,新的状态更新为0&&& &&& 同时采样a的状态为0、 b的状态为0,d = a + b = 0 + 0 = 0;&&& 2、run信号:&&& &&& 被拉高&&& 3、out的状态:当前状态1,经过采样,新的状态更新为1&&& &&& 同时采样d的状态0、c的状态为1,out = d + c = 0 + 1 = 1;4、run信号:被拉低&通过以上步骤可以发现,执行的时间、采样的时间不一样,会导致不一样的结果。&&另外一个实验:根据网上的一篇文章的例子,然后再通过看波形的方式去验证。http://blog.163.com/xiaoting_hu/blog/static//&&一、非阻塞赋值分析1、非阻塞赋值例程/* 实验名称:阻塞与非阻塞赋值差异实验&* 程序功能:非阻塞赋值 - 观看 RTL-View 以及波形 */module mytest(o_y1, o_y2, i_clk, i_rst);&&&& output reg o_y1, o_y2;&&& input wire i_clk, i_rst;&&& &&& //异步复位 alwaysA&&& always@(posedge i_clk or negedge i_rst)&&& &&& if(!i_rst) &&& o_y1 &= 0;&&& &&& // 低电平复位&&& &&& else &&& &&& o_y1 &= o_y2;&&& &&& //异步复位 alwaysB&&& always@(posedge i_clk or negedge i_rst)&&& &&& if(!i_rst)&&& o_y2 &= 1;&&& &&& // 低电平复位&&& &&& else&&& &&& o_y2 &= o_y1;&&& &&& endmodule&2、RTL 视图&3、仿真源程序`timescale 1ns/1ns`define clock_period 20&module mytest_tb;&&&& reg clk, rst;&&& wire y1, y2;&&&& mytest u1(y1, y2, clk, rst);&&& &&& initial clk = 1'b1;&&& always #(`clock_period / 2) clk = ~clk;&&& &&& initial begin&&& &&& rst = 1'b0;&&& &&& &&& &&& &&& // 复位&&& &&& #(`clock_period * 5);&&& &&& rst = 1'b1;&&& &&& &&& &&& &&& // 开始执行&&& &&& #(`clock_period * 20);&&& &&& &&& &&& rst = 1'b0;&&& &&& #(`clock_period * 5);&&& &&& rst = 1'b1;&&& &&& #(`clock_period * 20);&&& &&& &&& &&& rst = 1'b0;&&& &&& #(`clock_period * 5);&&& &&& rst = 1'b1;&&& &&& #(`clock_period * 20);&&& &&& &&& &&& $stop;&&& end&endmodule&4、波形图&5、波形分析//异步复位 alwaysA&&& always@(posedge i_clk or negedge i_rst)&&& &&& if(!i_rst) &&& o_y1 &= 0;&&& &&& // 低电平复位&&& &&& else &&& &&& o_y1 &= o_y2;&&& //异步复位 alwaysB&&& always@(posedge i_clk or negedge i_rst)&&& &&& if(!i_rst)&&& o_y2 &= 1;&&& &&& // 低电平复位&&& &&& else&&& &&& o_y2 &= o_y1;&当 i_rst == 0 :o_y1 被赋值为 0, o_y2 被赋值为 1,由于非阻塞赋值特性,所以无先后顺序当 i_rst == 1 :由于两个 always 块会被同时执行。即 fpga 会在同一个时钟上升沿进行采样,第一个时钟周期:alwaysA 会对 o_y2 采样得到为高电平,所以给 o_y1 赋值为高电平。alwaysB 会对 o_y1 采样得到为低电平,所以给 o_y2 赋值为低电平。第二个时钟周期:alwaysA 会对 o_y2 采样,因为在第一个周期中 o_y2 因 o_y1 而赋值为低电平,所以采样得到为低电平,所以给 o_y1 赋值为低电平。alwaysB 会对 o_y1 采样,因为在第一个周期中 o_y1 因 o_y2 而赋值为高电平,所以采样得到为高电平,所以给 o_y2 赋值为高电平。之后的时钟周期都是根据这样的规律进行变化,所以我们看到的波形 o_y1、o_y2 是相反状态。&二、阻塞赋值分析1、阻塞赋值源程序/* 实验名称:阻塞与非阻塞赋值差异实验&* 程序功能:阻塞赋值 - 观看 RTL-View 以及波形&*/module mytest(o_y1, o_y2, i_clk, i_rst);&&&& output reg o_y1, o_y2;&&& input wire i_clk, i_rst;&&& &&& //异步复位&&& always@(posedge i_clk or negedge i_rst)&&& &&& if(!i_rst) &&& &&& &&& &&& o_y1 = 0;&&& &&& // 低电平复位&&& &&& else &&& &&& &&& &&& &&& o_y1 = o_y2;&&&& //异步复位&&& always@(posedge i_clk or negedge i_rst)&&& &&& if(!i_rst)&&& &&& &&& &&& o_y2 = 1;&&& &&& // 低电平复位&&& &&& else&&& &&& &&& &&& &&& o_y2 = o_y1;&&& &&& endmodule&2、RTL 视图(居然和阻塞一样的 RTL 视图)3、仿真源程序和非阻塞仿真源程序一样。略3、波形图&4、波形分析//异步复位alwaysA&&& always@(posedge i_clk or negedge i_rst)&&& &&& if(!i_rst) &&& &&& &&& &&& o_y1 = 0;&&& &&& // 低电平复位&&& &&& else &&& &&& &&& &&& &&& o_y1 = o_y2;&&& &&& //异步复位 alwaysB&&& always@(posedge i_clk or negedge i_rst)&&& &&& if(!i_rst)&&& &&& &&& &&& o_y2 = 1;&&& &&& // 低电平复位&&& &&& else&&& &&& &&& &&& &&& o_y2 = o_y1;&当 i_rst == 0 :o_y1 被赋值为 0, o_y2 被赋值为 1, 由于阻塞赋值特性,所以有先后顺序,但无法确定谁先谁后。当 i_rst == 1 :由于阻塞赋值的特性,在执行阻塞赋值语句时其他语句均不能得到执行。由于两个 always 块会被同时执行,而且 o_y1 和 o_y2 的取值是互相影响,所以 o_y1、o_y2 值取决于那个 always 块的赋值语句先执行。从波形来看,明显是 alwaysA 最新得到执行。第一个时钟周期:alwaysA 会对 o_y2 采样得到为高电平,所以给 o_y1 赋值为高电平。alwaysB 会对 o_y1 采样,因在 alwaysA 程序块 o_y1 因 o_y2 而赋值为高电平,所以给 o_y2 赋值为高电平。&第二个时钟周期:alwaysA 会对 o_y2 采样,因为在第一个周期中 o_y2 因 o_y1 而赋值为高电平,所以采样得到为高电平,所以给 o_y1 赋值为高电平。alwaysB 会对 o_y1 采样,因在 alwaysA 程序块 o_y1 因 o_y2 而赋值为高电平,所以给 o_y2 赋值为高电平。&也就是说 o_y1 = o_y2; o_y2 = o_y1; 是顺序执行的,所以我们看到的波形 o_y1、o_y2 都是高电平状态.最后附上非阻塞赋值的一个很有意思的例子。&
Powered byAn error occurred on the server when processing the URL. Please contact the system administrator.
If you are the system administrator please click
to find out more about this error.}

我要回帖

更多关于 阻塞赋值 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信