Verilog设计理解练习十例及答案解析
Verilog设计练习十例及答案

设计练习进阶前言:在前面九章学习的基础上,通过本章的练习,一定能逐步掌握Verilog HDL设计的要点。
我们可以先理解样板模块中每一条语句的作用,然后对样板模块进行综合前和综合后仿真,再独立完成每一阶段规定的练习。
当十个阶段的练习做完后,便可以开始设计一些简单的逻辑电路和系统。
很快我们就能过渡到设计相当复杂的数字逻辑系统。
当然,复杂的数字逻辑系统的设计和验证,不但需要系统结构的知识和经验的积累,还需要了解更多的语法现象和掌握高级的Verilog HDL系统任务,以及与C语言模块接口的方法(即PLI),这些已超出的本书的范围。
有兴趣的同学可以阅读Verilog语法参考资料和有关文献,自己学习,我们将在下一本书中介绍Verilog较高级的用法。
练习一.简单的组合逻辑设计目的: 掌握基本组合逻辑电路的实现方法。
这是一个可综合的数据比较器,很容易看出它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。
在Verilog HDL中,描述组合逻辑时常使用assign 结构。
注意equal=(a==b)1:0,这是一种在组合逻辑实现分支判断时常使用的格式。
模块源代码:" qual(equal),.a(a),.b(b)); 简单时序逻辑电路的设计目的:掌握基本时序逻辑电路的实现。
在Verilog HDL中,相对于组合逻辑电路,时序逻辑电路也有规定的表述方式。
在可综合的Verilog HDL模型,我们通常使用always块和@(posedge clk)或@(negedge clk)的结构来表述时序逻辑。
下面是一个1/2分频器的可综合模型。
eset(reset),.clk_in(clk),.clk_out(clk_out));endmodule仿真波形:练习:依然作clk_in的二分频clk_out,要求输出与上例的输出正好反相。
编写测试模块,给出仿真波形。
练习三. 利用条件语句实现较复杂的时序逻辑电路目的:掌握条件语句在Verilog HDL中的使用。
(完整版)VerilogHDL数字设计与综合(第二版)第七章课后习题答案

1.声明一个名为oscillate的寄存器变量并将它初始化为0。
使其每30个时间单位进行一次取反操作。
不要使用always语句。
提示:使用forever循环。
答:代码如下:reg oscillate;initialbeginoscillate<=0;forever #30 oscillate<=~oscillate;end2.设计一个周期为40个时间单位的时钟信号,其占空比为25%。
使用always和initial块进行设计。
将其在仿真0时刻的值初始化为0。
答:代码如下:reg clock;initialclock<=0;alwaysbegin#30 clock<=1;#10 clock<=0;end3.给定下面含有阻塞过程赋值语句的initial块。
每条语句在什么仿真时刻开始执行?a,b,c 和d在仿真过程中的中间值和仿真结束时的值是什么?答:仿真输出结果:4.在第3题中,如果initial块中包括的是非阻塞过程赋值语句,那么各个问题的答案是什么?答:第7章行为级建模79最终d没有输出,因为d<= #20 {a,b,c};语句执行的是先将a,b,c取值存储,在20个时间单位后将存储的值赋给d,因为b,c在初始时刻没有值,所以d值也是不确定的。
5.指出在下面的Verilog代码中各条语句的执行顺序。
其中是否含有不确定的执行顺序?a,b,c和d的最终值是什么?答:先执行a=1’b0,b=1’b1,然后执行#0 c=b,#0 d=a,执行顺序不确定,最终输出结果a=0,b=1,c=1,d=0. 6.在下面的例子中,d的最终值是什么?答:仿真输出波形如下,最终输出结果d=1。
0时刻b|c的值是1,在25个时间刻度后赋给d。
7.使用带有同步清零端的D触发器(清零端高电平有效,在时钟下降沿执行清零操作)设计一个下降沿触发的D触发器,只能使用行为语句。
提示:D触发器的输出q应当声明为寄存器变量。
verilog数字系统设计教程习题答案

verilog数字系统设计教程习题答案第二章1.Verilog HDL 既是一种行为描述语言,也是一种结构描述语言。
如果按照一定的规则和风格编写代码,就可以将功能行为模块通过工具自动转化为门级互联的结构模块。
这意味着利用Verilog语言所提供的功能,就可以构造一个模块间的清晰结构来描述复杂的大型设计,并对所需的逻辑电路进行严格的设计。
2.模块的基本结构由关键词module和endmodule构成。
3.一个复杂电路系统的完整Verilog HDL模型是由若干个Verilog HDL模块构成的,每一个模块又可以由若干个子模块构成。
其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块交互的现存电路或激励信号源。
利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证。
4.Verilog HDL和VHDL作为描述硬件电路设计的语言,其共同的特点在于:能形式化地抽象表示电路的结构和行为、支持逻辑设计中层次与领域的描述、可借用高级语言的精巧结构来简化电路的描述、具有电路仿真与验证机制以保证设计的正确性、支持电路描述由高层到低层的综合转换、硬件描述与实现工艺无关(有关工艺参数可通过语言提供的属性包括进去)、便于文档管理、易于理解和设计重用。
5.不是6.将用行为和功能层次表达的电子系统转换为低层次的便于具体实现的模块组合装配的过程。
7.综合工具可以把HDL变成门级网表。
这方面Synopsys工具占有较大的优势,它的Design Compile是作为一个综合的工业标准,它还有另外一个产品叫Behavior Compiler,可以提供更高级的综合。
另外最近美国又出了一个软件叫Ambit,据说比Synopsys的软件更有效,可以综合50万门的电路,速度更快。
今年初Ambit被Cadence公司收购,为此Cadence 放弃了它原来的综合软件Synergy。
数字系统设计与veriloghdl课后答案

数字系统设计与veriloghdl课后答案数字系统设计与veriloghdl课后答案【篇一:数字逻辑与数字系统设计习题参考答案】>第1章习题解答1.3 (1)86(2)219(3)106.25(4)0.6875 (4)0.1011.4 (1)101111(2)1001000(3)100001l.111.5 (1)(117)10=(165)8=(1110101)2=(75)16(2)(3452)10=(6574)8=(110101111100)2=(d7c)16(3)(23768.6875)10=(56330.54)8=(101110011011000.1011)2 =(5cd 8.b)16 (4)(0.625)10=(0.5)8=(0.101)2=(0.a)16 1.6(1)(117)8=(1001111)2=(79)10(2)(7456)8=(111100101110)2=(3886)10(3)(23765.64)8=(10 0111 1111 0101.1101)2=(10229.8125)10(4)(0.746)8=(0.11111)2=(0.96875)10 1.7 (1)(9a)16=(10011010)2=(154)10(2) (3cf6)16=(11110011110110)2=(15606)10(3) (7ffe.6)16=(111111*********.011)2=(32766.375)10 (4)(0.c4)16=(0.110001)2=(0.765625)10 1-8(1)(125)10=(000100100101)8421bcd(2)(7342)10=(0111001101000010)8421bcd(3)(2018.49)10=(0010000000011000.01001001)8421bcd(4)(0.785)10=(0.011110000101)8421bcd1.9(1)(106)10=(1101010)2 原码=反码=补码=01101010 (2)(-98)10=(-1100010)2原码=11100010反码=10011101 补码=11100011(3)(-123)10=(-1111011)2 原码=11111011反码=10000101 补码=11111011(4)(-0.8125)10=(-0.1101)2 原码=1.1101000反码=1.0010111 补码=1.00110001.10(1)(104)10=(1101000)2 [1101000]补=01101000(-97)10=(-1100001)2 [-1100001]补=1001111101101000 + 10011111 0000011110000011 + 01001111 11010010[104-97]补=01101000+10011111=00000111, 104-97=(00000111)2=7 (2) (-125)10=(-1111101)2(79)10=(01001111)2[-1111101]补=10000011 [01001111]补=0100111101111000 [-125+79]补=10000011+01001111=11010010,- 125+79=(-0101110)2=-46 (3) (120)10=(1111000)2[01111000]补=01111000(-67)10=(-1000011)2[-1000011]补=10111101[120-67]补=10000011+01001111=00110101,-125+79=(00110101)2=53 (4) (-87)10=(-1010111)2[-1010111]补=10101001(12)10=(1100)2[1100]补=00001100[-87+12]补=10101001+00001100=10110101,-125+79=(-1001011)2=-75+ 10111101 0011010110101001+ 00001100 10110101第2章习题解答2.3 解:根据逻辑图可直接写出逻辑表达式:(a) f=ab?bc;(b)f=abbcac解:设3个输入变量分别为a、b、c,输出为f,按题意,其中有奇数个为1,则输出f=1,因此可写出其逻辑表达式为f=abc?abc?abc?abc。
veriloghdl数字设计与综合答案

veriloghdl数字设计与综合答案【篇一:verilog习题选答】txt>答:fpga中,由程序来转换为可烧录的二进制码。
ic设计中,主要是由design-compiler来实现。
2.能否说模块相当于电路图中的功能模块,端口相当于功能模块的 3.assign声明语句,实例元件,always块,这三类描述中哪一种直接与电路结构有关?4.由连续赋值语句(assign)赋值的变量能否是reg型的?答:赋值运算分为连续赋值和过程赋值两种。
(1)连续赋值连续赋值语句只能对线网型变量进行赋值,而不能对寄存器型变量进行赋值,基本的语法结构为:assign #(延时量) 线网型变量名 = 赋值表达式; 一个线网型变量一旦被连续赋值语句赋值后,赋值语句右端赋值表达式的值将持续对赋值变量产生连续驱动,只要右端表达式任一操作数的值发生变化,就会立即触发对赋值变量的更新操作。
(2)过程赋值过程赋值主要用于两种结构化模块(initial和always)中的赋值语句。
在过程块中只能使用过程赋值语句,不能在过程块中出现连续赋值语句,同时过程赋值语句也只能用在过程赋值模块中。
基本的语法结构为:被赋值变量赋值操作符赋值表达式,其中,赋值操作符是“=”或“=”,它分别代表了阻塞赋值和非阻塞赋值类型。
过程赋值语句只能对寄存器类型的变量进行赋值,经过赋值后,上面这些变量的值将保持不变,直到另一条赋值语句对变量重新赋值为止。
5.如果都不带时间延迟、阻塞和非阻塞赋值有何不同?说明它们的不同点?答:代码1:module test(a,b,c,d,y); //两个与逻辑,1个或逻辑input a,b,c,d;output y;reg y,tmp1,tmp2;always @(a or b or c or d)// y的值并不等于当前的tmp1,tmp2相或的值,而是等于上 begin一次运算时tmp1,tmp2相或的值。
相当于一个延迟,在第2 tmp1 = ab; 次always模块运行完后得到想要的y值tmp2 = cd;y = tmp1|tmp2;endendmodule代码2:基本与代码1一样,只是在always的敏感列表中加入了temp1,temp2module test(a,b,c,d,y);input a,b,c,d;output y;reg y,tmp1,tmp2;always @(a or b or c or d or tmp1 or tmp2)//与代码一不同,begintmp1 = ab;tmp2 = cd;y = tmp1|tmp2;endendmodule代码3:在代码2中加进参数j,来帮助判断always模块的运行次数:module test(a,b,c,d,y);input a,b,c,d;output y;reg y,tmp1,tmp2;reg [8:0]j=0;always @(a or b or c or d or tmp1 or tmp2)beginj = j + 1;#5 //这里加了一个延时,方便分析tmp1 = ab;延迟消失了。
《verilog_数字系统设计课程》(第二版)思考题答案

《verilog_数字系统设计课程》(第⼆版)思考题答案绪论1.什么是信号处理电路?它通常由哪两⼤部分组成?信号处理电路是进⾏⼀些复杂的数字运算和数据处理,并且⼜有实时响应要求的电路。
它通常有⾼速数据通道接⼝和⾼速算法电路两⼤部分组成。
2.为什么要设计专⽤的信号处理电路?因为有的数字信号处理对时间的要求⾮常苛刻,以⾄于⽤⾼速的通⽤处理器也⽆法在规定的时间内完成必要的运算。
通⽤微处理器芯⽚是为⼀般⽬的⽽设计的,运算的步骤必须通过程序编译后⽣成的机器码指令加载到存储器中,然后在微处理器芯⽚控制下,按时钟的节拍,逐条取出指令分析指令和执⾏指令,直到程序的结束。
微处理器芯⽚中的内部总线和运算部件也是为通⽤⽬的⽽设计,即使是专为信号处理⽽设计的通⽤微处理器,因为它的通⽤性也不可能为某⼀特殊的算法来设计⼀系列的专⽤的运算电路⽽且其内部总线的宽度也不能随便的改变,只有通过改变程序,才能实现这个特殊的算法,因⽽其算法速度也受到限制所以要设计专⽤的信号处理电路。
3.什么是实时处理系统?实时处理系统是具有实时响应的处理系统。
4.为什么要⽤硬件描述语⾔来设计复杂的算法逻辑电路?因为现代复杂数字逻辑系统的设计都是借助于EDA⼯具完成的,⽆论电路系统的仿真和综合都需要掌握硬件描述语⾔。
5.能不能完全⽤C语⾔来代替硬件描述语⾔进⾏算法逻辑电路的设计?不能,因为基础算法的描述和验证通常⽤C语⾔来做。
如果要设计⼀个专⽤的电路来进⾏这种对速度有要求的实时数据处理,除了以上C语⾔外,还须编写硬件描述语⾔程序进⾏仿真以便从电路结构上保证算法能在规定的时间内完成,并能通过与前端和后端的设备接⼝正确⽆误地交换数据。
6.为什么在算法逻辑电路的设计中需要⽤C语⾔和硬件描述语⾔配合使⽤来提⾼设计效率?⾸先C语⾔很灵活,查错功能强,还可以通过PLI编写⾃⼰的系统任务,并直接与硬件仿真器结合使⽤。
C语⾔是⽬前世界上应⽤最为⼴泛的⼀种编程语⾔,因⽽C程序的设计环境⽐Verilog HDL更完整,此外,C语⾔有可靠地编译环境,语法完备,缺陷缺少,应⽤于许多的领域。
veriloghdl数字设计与综合答案

veriloghdl数字设计与综合答案【篇一:verilog习题选答】txt>答:fpga中,由程序来转换为可烧录的二进制码。
ic设计中,主要是由design-compiler来实现。
2.能否说模块相当于电路图中的功能模块,端口相当于功能模块的 3.assign声明语句,实例元件,always块,这三类描述中哪一种直接与电路结构有关?4.由连续赋值语句(assign)赋值的变量能否是reg型的?答:赋值运算分为连续赋值和过程赋值两种。
(1)连续赋值连续赋值语句只能对线网型变量进行赋值,而不能对寄存器型变量进行赋值,基本的语法结构为:assign #(延时量) 线网型变量名 = 赋值表达式; 一个线网型变量一旦被连续赋值语句赋值后,赋值语句右端赋值表达式的值将持续对赋值变量产生连续驱动,只要右端表达式任一操作数的值发生变化,就会立即触发对赋值变量的更新操作。
(2)过程赋值过程赋值主要用于两种结构化模块(initial和always)中的赋值语句。
在过程块中只能使用过程赋值语句,不能在过程块中出现连续赋值语句,同时过程赋值语句也只能用在过程赋值模块中。
基本的语法结构为:被赋值变量赋值操作符赋值表达式,其中,赋值操作符是“=”或“=”,它分别代表了阻塞赋值和非阻塞赋值类型。
过程赋值语句只能对寄存器类型的变量进行赋值,经过赋值后,上面这些变量的值将保持不变,直到另一条赋值语句对变量重新赋值为止。
5.如果都不带时间延迟、阻塞和非阻塞赋值有何不同?说明它们的不同点?答:代码1:module test(a,b,c,d,y); //两个与逻辑,1个或逻辑input a,b,c,d;output y;reg y,tmp1,tmp2;always @(a or b or c or d)// y的值并不等于当前的tmp1,tmp2相或的值,而是等于上 begin一次运算时tmp1,tmp2相或的值。
相当于一个延迟,在第2 tmp1 = ab; 次always模块运行完后得到想要的y值tmp2 = cd;y = tmp1|tmp2;endendmodule代码2:基本与代码1一样,只是在always的敏感列表中加入了temp1,temp2module test(a,b,c,d,y);input a,b,c,d;output y;reg y,tmp1,tmp2;always @(a or b or c or d or tmp1 or tmp2)//与代码一不同,begintmp1 = ab;tmp2 = cd;y = tmp1|tmp2;endendmodule代码3:在代码2中加进参数j,来帮助判断always模块的运行次数:module test(a,b,c,d,y);input a,b,c,d;output y;reg y,tmp1,tmp2;reg [8:0]j=0;always @(a or b or c or d or tmp1 or tmp2)beginj = j + 1;#5 //这里加了一个延时,方便分析tmp1 = ab;延迟消失了。
eda试题及答案verilog

eda试题及答案verilog1. 请解释Verilog中的阻塞赋值和非阻塞赋值的区别。
答案:在Verilog中,阻塞赋值使用`=`操作符,表示在赋值时会立即执行,并且赋值操作会阻塞后续语句的执行,直到当前赋值完成。
而非阻塞赋值使用`<=`操作符,表示赋值操作会在当前时间单位的末尾执行,不会阻塞后续语句的执行,允许并行执行。
2. 描述Verilog中模块的实例化过程。
答案:在Verilog中,模块的实例化是通过使用模块名后跟实例名和连接端口的列表来完成的。
实例化过程包括指定模块名、实例名以及将端口连接到适当的信号或参数上。
例如:```verilogmodule my_module(a, b, c);output a, c;input b;// ...endmodule// 实例化my_module instance_name(.out1(a), .out2(c), .in(b));```3. 列出Verilog中的基本数据类型。
答案:Verilog中的基本数据类型包括:- 线网类型(wire)- 寄存器类型(reg)- 实数类型(real)- 整型(integer)- 时间类型(time)- 字符串类型(string)4. 说明Verilog中如何使用条件语句。
答案:在Verilog中,可以使用`if`、`case`和`if-else`等条件语句来实现条件控制。
例如,使用`if`语句:```verilogif (condition) begin// 条件为真时执行的代码end else begin// 条件为假时执行的代码end```5. 解释Verilog中的always块的作用。
答案:Verilog中的always块用于描述硬件的时序逻辑和组合逻辑。
always块可以是时序的(使用时钟信号触发),也可以是非时序的(不依赖于时钟信号)。
时序always块通常用于描述寄存器行为,而非时序always块用于描述组合逻辑。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计练习进阶前言:在前面九章学习的基础上,通过本章的练习,一定能逐步掌握Verilog HDL设计的要点。
我们可以先理解样板模块中每一条语句的作用,然后对样板模块进行综合前和综合后仿真,再独立完成每一阶段规定的练习。
当十个阶段的练习做完后,便可以开始设计一些简单的逻辑电路和系统。
很快我们就能过渡到设计相当复杂的数字逻辑系统。
当然,复杂的数字逻辑系统的设计和验证,不但需要系统结构的知识和经验的积累,还需要了解更多的语法现象和掌握高级的Verilog HDL系统任务,以及与C语言模块接口的方法(即PLI),这些已超出的本书的范围。
有兴趣的同学可以阅读Verilog语法参考资料和有关文献,自己学习,我们将在下一本书中介绍Verilog较高级的用法。
练习一.简单的组合逻辑设计目的: 掌握基本组合逻辑电路的实现方法。
这是一个可综合的数据比较器,很容易看出它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。
在Verilog HDL中,描述组合逻辑时常使用assign 结构。
注意equal=(a==b)?1:0,这是一种在组合逻辑实现分支判断时常使用的格式。
模块源代码://--------------- compare.v -----------------module compare(equal,a,b);input a,b;output equal;assign equal=(a==b)?1:0; //a等于b时,equal输出为1;a不等于b时,//equal输出为0。
endmodule测试模块用于检测模块设计得正确与否,它给出模块的输入信号,观察模块的内部信号和输出信号,如果发现结果与预期的有所偏差,则要对设计模块进行修改。
测试模块源代码:`timescale 1ns/1ns //定义时间单位。
`include "./compare.v" //包含模块文件。
在有的仿真调试环境中并不需要此语句。
//而需要从调试环境的菜单中键入有关模块文件的路径和名称module comparetest;reg a,b;wire equal;initial //initial常用于仿真时信号的给出。
begina=0;b=0;#100 a=0; b=1;#100 a=1; b=1;#100 a=1; b=0;#100 $stop; //系统任务,暂停仿真以便观察仿真波形。
endcompare compare1(.equal(equal),.a(a),.b(b)); //调用模块。
endmodule仿真波形(部分):练习:设计一个字节(8位)比较器。
要求:比较两个字节的大小,如a[7:0]大于b[7:0]输出高电平,否则输出低电平,改写测试模型,使其能进行比较全面的测试。
练习二. 简单时序逻辑电路的设计目的:掌握基本时序逻辑电路的实现。
在Verilog HDL中,相对于组合逻辑电路,时序逻辑电路也有规定的表述方式。
在可综合的Verilog HDL模型,我们通常使用always块和@(posedge clk)或@(negedge clk)的结构来表述时序逻辑。
下面是一个1/2分频器的可综合模型。
// half_clk.v:module half_clk(reset,clk_in,clk_out);input clk_in,reset;output clk_out;reg clk_out;always @(posedge clk_in)beginif(!reset) clk_out=0;else clk_out=~clk_out;endendmodule在always块中,被赋值的信号都必须定义为reg型,这是由时序逻辑电路的特点所决定的。
对于reg型数据,如果未对它进行赋值,仿真工具会认为它是不定态。
为了能正确地观察到仿真结果,在可综合风格的模块中我们通常定义一个复位信号reset,当reset为低电平时,对电路中的寄存器进行复位。
测试模块的源代码://------------------- clk_Top.v -----------------------------`timescale 1ns/100ps`define clk_cycle 50module clk_Top.vreg clk,reset;wire clk_out;always #`clk_cycle clk = ~clk;initialbeginclk = 0;reset = 1;#100 reset = 0;#100 reset = 1;#10000 $stop;endhalf_clk half_clk(.reset(reset),.clk_in(clk),.clk_out(clk_out));endmodule仿真波形:练习:依然作clk_in的二分频clk_out,要求输出与上例的输出正好反相。
编写测试模块,给出仿真波形。
练习三. 利用条件语句实现较复杂的时序逻辑电路目的:掌握条件语句在Verilog HDL中的使用。
与常用的高级程序语言一样,为了描述较为复杂的时序关系,Verilog HDL提供了条件语句供分支判断时使用。
在可综合风格的Verilog HDL模型中常用的条件语句有if…else和case…endcase两种结构,用法和C程序语言中类似。
两者相较,if…else用于不很复杂的分支关系,实际编写可综合风格的模块、特别是用状态机构成的模块时,更常用的是case…endcase风格的代码。
这一节我们给的是有关if…else的范例,有关case…endcase结构的代码已后会经常用到。
下面给出的范例也是一个可综合风格的分频器,是将10M的时钟分频为500K的时钟。
基本原理与1/2分频器是一样的,但是需要定义一个计数器,以便准确获得1/20分频模块源代码:// --------------- fdivision.v -----------------------------module fdivision(RESET,F10M,F500K);input F10M,RESET;output F500K;reg F500K;reg [7:0]j;always @(posedge F10M)if(!RESET) //低电平复位。
beginF500K <= 0;j <= 0;endelsebeginif(j==19) //对计数器进行判断,以确定F500K信号是否反转。
beginj <= 0;F500K <= ~F500K;endelsej <= j+1;endendmodule测试模块源代码://--------------- fdivision_Top.v ------------------------`timescale 1ns/100ps`define clk_cycle 50module division_Top;reg F10M_clk,RESET;wire F500K_clk;always #`clk_cycle F10M_clk = ~ F10M_clk;initialbeginRESET=1;F10M=0;#100 RESET=0;#100 RESET=1;#10000 $stop;endfdivision fdivision (.RESET(RESET),.F10M(F10M_clk),.F500K(F500K_clk)); endmodule仿真波形:练习:利用10M 的时钟,设计一个单周期形状如下的周期波形。
练习四. 设计时序逻辑时采用阻塞赋值与非阻塞赋值的区别目的:1.明确掌握阻塞赋值与非阻塞赋值的概念和区别; 2.了解阻塞赋值的使用情况。
阻塞赋值与非阻塞赋值,在教材中我们已经了解了它们之间在语法上的区别以及综合后所得到的电路结构上的区别。
在always 块中,阻塞赋值可以理解为赋值语句是顺序执行的,而非阻塞赋值可以理解为赋值语句是并发执行的。
实际的时序逻辑设计中,一般的情况下非阻塞赋值语句被更多地使用,有时为了在同一周期实现相互关联的操作,也使用了阻塞赋值语句。
(注意:在实现组合逻辑的assign 结构中,无一例外地都必须采用阻塞赋值语句。
下例通过分别采用阻塞赋值语句和非阻塞赋值语句的两个看上去非常相似的两个模块blocking.v 和non_blocking.v 来阐明两者之间的区别。
0 T模块源代码:// ------------- blocking.v ---------------module blocking(clk,a,b,c);output [3:0] b,c;input [3:0] a;input clk;reg [3:0] b,c;always @(posedge clk)beginb = a;c = b;$display("Blocking: a = %d, b = %d, c = %d.",a,b,c);endendmodule//------------- non_blocking.v ------------------- module non_blocking(clk,a,b,c);output [3:0] b,c;input [3:0] a;input clk;reg [3:0] b,c;always @(posedge clk)beginb <= a;c <= b;$display("Non_Blocking: a = %d, b = %d, c = %d.",a,b,c); endendmodule测试模块源代码://------------- compareTop.v -----------------------------`timescale 1ns/100ps`include "./blocking.v"`include "./non_blocking.v"module compareTop;wire [3:0] b1,c1,b2,c2;reg [3:0] a;reg clk;initialbeginclk = 0;forever #50 clk = ~clk;endinitialbegina = 4'h3;$display("____________________________"); # 100 a = 4'h7;$display("____________________________"); # 100 a = 4'hf;$display("____________________________"); # 100 a = 4'ha;$display("____________________________"); # 100 a = 4'h2;$display("____________________________");# 100 $display("____________________________");$stop;endnon_blocking non_blocking(clk,a,b2,c2);blocking blocking(clk,a,b1,c1);endmodule仿真波形(部分):思考:在blocking模块中按如下写法,仿真与综合的结果会有什么样的变化?作出仿真波形,分析综合结果。