线网形变量和桶形移位寄存器器变量都能到阻塞型和非阻塞类型的吗

verilog中的阻塞和非阻塞 - FPGA|CPLD|ASIC论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
verilog中的阻塞和非阻塞
15:55:05  
这个是非阻塞赋值,b的值为0,仿真结果也是0module TOP(
input clk,
input rst,
output reg b
always@(posedge clk or negedge rst)
& & & & if(~rst)
& & & & & & & & begin
& & & & & & & & & & & & a &=0;
& & & & & & & & end
& & & & else
& & & & begin
& & & & & & & & a &=a+1;
& & & & & & & & b &=a-c;
& & & & end
always@(posedge clk or negedge rst)
& & & & if(~rst)
& & & & begin
& & & & & & & & c &= 0;
& & & & end
& & & & else
& && &c &=
这个是阻塞赋值的话,阻塞赋值是有先后顺序的,先计算a= a+1;计算完了再计算b= a-c;所以按照理论上来分析应该b= 1但是实际
仿真结果为0;
module TOP(
input clk,
input rst,
output reg b
always@(posedge clk or negedge rst)
& & & & if(~rst)
& & & & & & & & begin
& & & & & & & & & & & & a =0;
& & & & & & & & end
& & & & else
& & & & begin
& & & & & & & & a =a+1;
& & & & & & & & b =a-c;
& & & & end
always@(posedge clk or negedge rst)
& & & & if(~rst)
& & & & begin
& & & & & & & & c = 0;
& & & & end
& & & & else
但是实际仿真结果是b依旧等于0
所以按照下边的理论来分析的话,就与仿真结果矛盾了,这是怎么回事呢??
阻塞与非阻塞赋值的语言结构是Verilog语言中最难理解的概念之一。
& && &有这样的两个要点:
& &&&(1)在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构;
& &&&(2)在描述时序逻辑的always块中用非阻塞赋值,则综合成时序逻辑的电路结构。
这样做的原因是:
& && &这是因为要使综合前仿真和综合后仿真一致的缘故。
& &&&为了更好地理解上述要点,我们需要对Verilog语言中的阻塞赋值和非阻塞赋值的功能和执行时间上的差别有深入的理解。我们定义下面的两个关键字:
RHS——方程式右手方向的表达式或变量可分别缩写成 RHS表达式或RHS变量;
LHS ——方程式左手方向的表达式或变量可分别缩写成LHS 表达式或LHS变量。
& && &&& Verilog标准定义了有些语句有确定的执行时间,有些语句没有确定的执行时间。若有两条或两条以上的语句准备在同一时间执行,但由于语句的排列顺序不同,却产生了不同的输出结果。这就是造成Verilog模块冒险和竞争的原因。为了避免产生竞争,理解阻塞和非阻塞赋值在执行时间上的差别是至关重要的。
& && &1、阻塞赋值
& && &&&阻塞赋值用等号(=)表示。为什么称这种赋值为阻塞赋值呢?因为在赋值时先计算RHS部分的值,这是不允许任何别的Verilog语言的干扰,直到现行的赋值完成时刻,即把RHS赋值给LHS的时刻,它才允许别的的执行。
& && &&&一般可综合的赋值操作在RHS不能设定延时(即使是0延时也不允许)。从理论上讲,它与后面的只有概念上的先后,而无实质的延迟。若在RHS上加延迟,则在会阻止赋值语句的执行,延迟后才进行赋值,这种赋值语句是不可综合的,在需要综合的模块设计中不可使用这种风格的代码。
& && & 所谓阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上是在前一句赋值语句结束之后再开始赋值的。
& && & 2、非阻塞赋值
& && & 非阻塞赋值用小于等于号(&=)表示。为什么称这种赋值为非阻塞赋值呢?因为在赋值开始时计算RHS表达式,赋值操作时刻结束时更新LHS。在计算非阻塞赋值的RHS表达式和更新LHS期间,其他的Verilog语句,包括其他的非阻塞赋值语句都可能计算RHS表达式和更新LHS。非阻塞赋值允许其他的Verilog语句同时进行操作。非阻塞赋值可以看作两个步骤的过程:
(1)在赋值开始时,计算非阻塞赋值RHS表达式;
(2)在赋值结束时,更新非阻塞赋值LHS表达式。
& && &非阻塞赋值操作只能用于对寄存器类型变量进行赋值,因此只能用在“initial”块和“always”块等过程块中,而非阻塞赋值不允许用于连续赋值。
高级工程师
09:13:14  
学习了 希望有更多好的资料分享给大家
09:30:41  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
我仿真怎么b=1呢?
14:52:31  
我仿真怎么b=1呢?
确实,阻塞赋值为b=1,上次好像弄错了,那这样就对了,符合理论上的分析
Powered by
供应链服务
商务及广告合作
Jeffery Guo
关注我们的微信
供应链服务 PCB/IC/PCBA
下载发烧友APP
版权所有 (C) 深圳华强聚丰电子科技有限公司Verilog 初级入门概念讲解(wire 和 reg 类型的区别, always 和 assign 的区别,“阻塞”赋值 和 “非阻塞赋值”的区别 ) - CSDN博客
Verilog 初级入门概念讲解(wire 和 reg 类型的区别, always 和 assign 的区别,“阻塞”赋值 和 “非阻塞赋值”的区别 )
&& &很多刚学Verilog HDL (硬件描述语言)的朋友肯定会对阻塞赋值和非阻塞赋值比较疑惑,那我们就一起来抛开这层迷雾吧。
&& &首先我们要理解两种变量类型&Net Type(连线型)和&Register Type (寄存器型)。(有些参考书上有分为3种类型,这个无关紧要)
&& &Net Type(连线型),从名字上理解就是“导线”呗,导线的这头和导线的另一头始终是直接连通的,这头是什么值,那头就是什么值,所以输出随着输入随时变化的。连线型中&wire&最常见。
&& &Register Type(寄存器型),寄存器就不像普通导线了,它可以把值给存住,你只要给它赋一次值,它都会存住那个值,直到你给它赋一个新的值它才会改变。寄存器型中&reg&最常见。
&& &最常用到的是&wire&和&reg&这两种类型,其他的对我们初学者来说一般很少用到,可以暂时跳过,以后慢慢学下去自然会理解。
&& &注意:wire型变量如果没有赋予初始值,默认初始值为高阻态“Z”。
&& & & & & & & reg &型变量如果没有赋予初始值,默认初始值为不定态“X”。
&& &在理解这两种基本的数据类型之后,我们来看看verilog语言中的赋值语句。verilog语言中的赋值语句有两种,一种是持续赋值语句(assign语句),另一种是过程赋值语句(always语句)。
&& &&持续赋值语句(assign语句)主要用于对wire型变量的赋值,因为wire(线型)的值不能存住,需要一直给值,所以需要用持续赋值。
&& & & & &例如:assign c = a + & &只要a和b有任意变化,都可以立即反映到c上,也就是说c的值是根据a,b的值随时变化的。
&& &&过程赋值语句(always语句)主要用于reg 型变量的赋值&,因为always语句被执行是需要满足触发条件的,所以always过程块里面的内容不是每时每刻都被执行,因此需要将被赋值的对象定义成寄存器类型,以便这个值能被保持住。
&& &过程赋值又分为&阻塞赋值 “=”&&和&非阻塞赋值 “&=” 两种。这里的非阻塞赋值符号 “&=” 与 “小于等于”
符号相同,他们在不同的语境下表示不同含义,要注意区分,例如在“if-else”等判断语句中,一般都表示为“小于等于”。
&& &接下来对这两种赋值作具体讲解...
&& & ①&阻塞赋值 “=“&。 阻塞赋值和我们平时理解的赋值差不多,不用太多解释,就是按照语句的顺序,一句句往下顺序执行。一个赋值语句执行完,然后执行下一个赋值语句。
&& & ②&非阻塞赋值 “&=”&。非阻塞赋值就比较特别了,在同一个always过程块中,非阻塞赋值语句都是同时并发执行的,并且在过程块结束时才执行赋值操作。也就是说,在同一个always过程块中,非阻塞赋值语句被执行没有先后顺序,在过程快结束时,大家一起被赋值。
&& & 给大家举一个具体的例子:
&module&test (clk, a1, a2, b1, b2, c1, c2);&// test为module名称,括号内的是端口列表,包含所有输入输出的变量名称
&input&clk, a1, a2; & & & & &&// 定义输入变量,这里没有定义位宽,默认为1位宽度
&output&b1, b2, c1, c2; & &// 定义输出变量,这里没有定义位宽,默认为1位宽度
&reg&b1 = 0 , b2 = 0, c1 = 0 , c2 = 0; &&// 注意!因为这些变量将会在always过程块中被赋值,所以必须定义成
reg 型&& &
// 注意!这里省略了对输入信号clk, a1, a2 的类型定义,它们默认为1位的wire 型(因为输入信号是随时要变化,所以必须用wire型)&& & & & & & &
always @&(posedge&clk) &&//
always 用 clk 上升沿触发
&& & & &b1 = a1; & & &&// 这里采用的是阻塞赋值
&& & & &c1 = b1;
always @&(posedge&clk)
&// always 用 clk 上升沿触发
&& & & &b2 &= a2; & &// 这里采用的是非阻塞赋值
&& & & &c2 &= b2;
&& &end&&&
endmodule&& &&// endmodule 别忘了,与 module 成对使用
仿真输入值设置图如下:
&我们只需给输入信号赋值,输出信号根据输入信号的变化而变化。
下面请看用quartus 2 软件仿真的波形图
首先请看这两张图的区别,第一张是时序仿真波形图(timing),黄色标记部分因为延时而产生,第二张图为功能仿真波形图(function),不考虑器件的延时。
&&在①时刻,第一个时钟上升沿到来(posedge clk),&两个always过程块同时被触发(这就是PFGA器件强大的一点,可以并发执行)
&& & a1,b1,c1采用的是阻塞赋值。阻塞赋值语句顺序执行,先执行 b1 = a1; 由于 a1 此刻的值为 1,所以b1 变为 1,然后执行 c1 = b1;由于b1的值刚才已经变成 1 了,所以c1也变成了 1 。
&& & a2,b2,c2采用的是非阻塞赋值。非阻塞赋值语句并发执行,也就是说 b2 &= a2; c2 &= b2; 这两句同时执行。由于a2 此刻的值为1,所以 b2 变为1,与此同时,b2 的当前值也将赋值给 c2 , b2 的当前值是是多少呢? 这里一定要分清楚了,b2 的当前值是 0,并不是 1 ,因为在
b2 还没有变为 1 之前,b2 的值就要赋值给 c2 了,所以 c2 的值仍然是 0 。&
&& 直到在②时刻,第二个时钟上升沿到来,两个always再一次被同时触发,这次在执行 c2 &= b2; 这条赋值语句时,b2 的当前值为 1 ,所以 c2 才被赋值为 1 。
&& &大家可以根据上面的分析方法,自己分析一下在③、④时刻&b1,b2,c1,c2 应该分别为什么值,与波形图对照着理解一下。
其实verilog语言和 c语言大同小异,比较着来学习,会比较容易......
&& &希望这篇文章对初学者会有帮助,其实我也是初学者,希望各位高手提出批评指点..... O(∩_∩)O~
本文已收录于以下专栏:
相关文章推荐
wire 和reg是Verilog程序里的常见的两种变量类型,他们都是构成verilog程序逻辑最基本的元素。正确掌握两者的使用方法是写好verilog程序的前提。但同时,因为他们在大多数编程语言中不...
1. 信号的产生及always块使用注意事项
    1.1 不要在不同的always块内为同一个变量赋值。即某个信号出现在
          所以注意,在产生一个信号时,所有产...
在Verilog中有两种类型的赋值语句 连续赋值和过程赋值 赋值表达式由三个部分组成 左
值赋值运算符=或
赋值 左值必须是net类型的数据 而过程赋值 左值必须是register类型的数据 下面将作...
       赋值分为“连续赋值语句”、“过程赋值语句”和“过程连续赋值语句”。
1 连续赋值语句
       语法上,必须有assign关键字标识;
用于对线...
1、学verilog 一个月了,在开发板上面写了很多代码,但是始终对一些问题理解的不够透彻,这里我们来写几个例子仿真出阻塞和非阻塞的区别,我们先上代码
module LED  
verilog设计进阶
时间:日星期二
主要收获:
1.阻塞赋值与非阻塞赋值;
2.代码测试;
3.组合逻辑电路和时序逻辑电路。
阻塞赋值与非阻塞赋值:
Verilog中阻塞、非阻塞赋值几点理解,详细说明这两种赋值语句的区别,以及在具体写代码时应该注意的问题
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)后使用快捷导航没有帐号?
请完成以下验证码
查看: 1392|回复: 3
verilog语法总结
在线时间490 小时
威望9087分
芯币12383枚
TA的帖子TA的资源
五彩晶圆(高级), 积分 9087, 距离下一级还需 913 积分
五彩晶圆(高级), 积分 9087, 距离下一级还需 913 积分
一:基本Verilog中的变量有线网类型和寄存器类型。线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器。二:verilog语句结构到门级的映射1、连续性赋值:assign连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因些连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。Assign语句中的延时综合时都将忽视。2、过程性赋值:过程性赋值只出现在always语句中。阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。过程性赋值的赋值对象有可能综合成wire,latch,和flip-flop,取决于具体状况。如,时钟控制下的非阻塞赋值综合成flip-flop。过程性赋值语句中的任何延时在综合时都将忽略。建议同一个变量单一地使用阻塞或者非阻塞赋值。3、逻辑操作符:逻辑操作符对应于硬件中已有的逻辑门4、算术操作符:Verilog中将reg视为有符号数,而integer视为有符号数。因此,进行有符号操作时使用integer,使用无符号操作时使用reg。5、进位:通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。如:Wire [3:0] A,B;Wire [4:0] C;Assign C=A+B;C的最高位用来存放进位。6、关系运算符:关系运算符:&,&,&=,&=和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是reg ,net还是integer。7、相等运算符:==,!=注意:===和!==是不可综合的。可以进行有符号或无符号操作,取决于数据类型8、移位运算符:左移,右移,右边操作数可以是常数或者是变量,二者综合出来的结果不同。9、部分选择:部分选择索引必须是常量。10、BIT选择:BIT选择中的索引可以用变量,这样将综合成多路(复用)器。11、敏感表:Always过程中,所有被读取的数据,即等号右边的变量都要应放在敏感表中,不然,综合时不能正确地映射到所用的门。12、IF:如果变量没有在IF语句的每个分支中进行赋值,将会产生latch。如果IF语句中产生了latch,则IF的条件中最好不要用到算术操作。Case语句类似。Case的条款可以是变量。如果一个变量在同一个IF条件分支中先赎值然后读取,则不会产生latch。如果先读取,后赎值,则会产生latch。13、循环:只有for-loop语句是可以综合的。14、设计时序电路时,建议变量在always语句中赋值,而在该always语句外使用,使综合时能准确地匹配。建议不要使用局部变量。15、不能在多个always块中对同一个变量赎值16、函数函数代表一个组合逻辑,所有内部定义的变量都是临时的,这些变量综合后为wire。17、任务:任务可能是组合逻辑或者时序逻辑,取决于何种情况下调用任务。18、Z:Z会综合成一个三态门,必须在条件语句中赋值19、参数化设计:优点:参数可重载,不需要多次定义模块四:模块优化1、资源共享:当进程涉及到共用ALU时,要考虑资源分配问题。可以共享的操作符主要有:关系操作符、加减乘除操作符。通常乘和加不共用ALU,乘除通常在其内部共用。2、共用表达式:如:C=A+B;D=G+(A+B);两者虽然有共用的A+B,但是有些综合工具不能识别.可以将第二句改为:D=G+C;这样只需两个加法器.3、转移代码:如循环语句中没有发生变化的语句移出循环.4、避免latch:两种方法:1、在每一个IF分支中对变量赋值。2、在每一个IF语句中都对变量赋初值。5:模块:综合生成的存储器如ROM或RAM不是一种好方法。最好用库自带的存储器模块。五、验证:1、敏感表:在always语句中,如果敏感表不含时钟,最好将所有的被读取的信号都放在敏感表中。2、异步复位:建议不要在异步时对变量读取,即异步复位时,对信号赎以常数值
在线时间2 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
好样的楼主。。
在线时间490 小时
威望9087分
芯币12383枚
TA的帖子TA的资源
五彩晶圆(高级), 积分 9087, 距离下一级还需 913 积分
五彩晶圆(高级), 积分 9087, 距离下一级还需 913 积分
不客气!欢迎你常来论坛!
一个为理想不懈前进的人,一个永不言败人!
欢迎光临网上店铺!
在线时间12 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 30, 距离下一级还需 170 积分
一粒金砂(中级), 积分 30, 距离下一级还需 170 积分
& &不错的 分享
EEWORLD 官方微信
Powered by

我要回帖

更多关于 寄存器变量有什么用 的文章

 

随机推荐