Verilog HDL设计练习
数字系统设计与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。
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中的使用。
Verilog HDL数字设计与综合(第二版) 第四章课后习题答案
1.模块的基本组成部分有哪些?哪几个部分必须出现?答:模块的基本组成部分包括:关键字module ,模块名、端口列表、端口声明和可选的参数声明,模块内部还有5个基本组成部分是:变量声明、数据流语句、低层模块实例、行为语句块以及任务和函数。
在模块的所有组成部分中,只有module 、模块名和endmodule 必须出现,其他部分都是可选的,用户可以根据设计的需要随意选用。
2.一个不与外部环境交互的模块是否有端口?模块定义中是否有端口列表?答:严格意义上讲,一个模块如果与外界没有任何交互,那么自然是不需要有而且是不可能有端口的。
在没有端口的情况下,端口列表自然也是不存在的。
3.一个4位并行移位寄存器的I/O 引脚如下图所示。
写出模块shift_reg 的定义,只需写出端口列表和端口定义,不必写出模块的内部结构。
答:模块代码如下:module shift_reg(clock,reg_in,reg_out);input clock;input [3:0] reg_in;output [3:0] reg_out;//********XXXXXXX**************endmodule4.定义一个顶层模块stimulus ,在其中声明reg 变量REG_IN (4位)和CLK (1位)以及wire变量REG_OUT (4位)。
在其中调用(实例引用)模块shift_reg ,实例名为sr1,使用顺序端口连接。
答:模块代码如下module stimulus();reg CLOCK;reg [3:0] REG_IN;wire [3:0] REG_OUT;//*******connect in order************shift_reg sr1(CLOCK,REG_IN,REG_OUT);endmodulereg_in [3:0] clockreg_out [3:0]32Verilog HDL数字设计与综合(第二版)5.将上题的端口连接方法改为命名连接。
verilog代码练习题
verilog代码练习题Verilog是一种硬件描述语言,用于描述数字电路的行为和结构。
在学习和掌握Verilog代码编写的过程中,练习题是非常重要的一环。
通过多做一些练习题,可以提高对Verilog语言的理解和运用能力,进而更好地应对实际的电路设计和开发项目。
本文将介绍一些常见的Verilog代码练习题,帮助读者提升自己的编程能力。
具体的练习题如下:练习题一:整数加法器设计一个4位整数加法器,输入两个4位的二进制整数A和B,输出它们的和。
请使用Verilog代码描述该加法器,并给出仿真结果和波形图。
练习题二:时钟分频器设计一个时钟分频器,将输入时钟信号分频为两个输出时钟信号。
其中,输出时钟信号A频率为输入时钟信号的一半,输出时钟信号B 频率为输入时钟信号的四分之一。
请使用Verilog代码描述该时钟分频器,并给出仿真结果和波形图。
练习题三:数字比较器设计一个4位数字比较器,输入两个4位的二进制整数A和B,输出A是否大于B的结果(1表示大于,0表示不大于)。
请使用Verilog代码描述该数字比较器,并给出仿真结果和波形图。
练习题四:有限状态机设计一个简单的有限状态机,实现一个计数器的功能。
输入信号CLK表示时钟信号,每个上升沿计数器加1,输出信号OUT表示计数器的值,初始值为0,最大值为9,超出后回到0。
请使用Verilog代码描述该有限状态机,并给出仿真结果和波形图。
练习题五:位宽可调的加法器设计一个位宽可调的加法器,输入为两个任意位宽的二进制整数A和B,输出为它们的和。
请使用Verilog代码描述该位宽可调的加法器,并给出仿真结果和波形图。
以上是几个常见的Verilog代码练习题,通过多做这些练习题,可以提高对Verilog语言的掌握和运用能力。
在实际的电路设计和开发中,良好的Verilog编程能力是非常重要的。
希望本文对你有所帮助,加油!。
Verilog HDL数字设计与综合(第二版) 第九章课后习题答案
1.使用assign和deassign语句,设计一个带异步clear (q = 0)和preset (q = 1)端口的由上升沿触发的D触发器。
答:代码如下:module my_dff(q,d,clock,clear,preset);output q;input d,clock,clear,preset;reg q;always @(posedge clock)beginq=d;endalways @(clear or preset)if(clear)assign q=1'b0;else if (preset)assign q=1'b1;elsedeassign q;endmodule仿真输出如下:2.使用基本逻辑门设计一个一位全加器FA。
在激励模块中调用这个全加器。
在15至35个时间单位之间强迫输出值sum为a & b & c_in。
答:代码及激励模块见chapter9.v。
仿真输出如下,在15ns时,输出变化,在35ns时,由于和值与强迫输出值相同,故没有变化。
Verilog HDL 数字设计与综合(第二版)126 3.由逻辑门定义的带延迟参数的一位全加器FA ,如下面的模块所示:定义一个如例5.8所示的四位全加器fulladd4,使用本书中讨论的两种方法,传送下表所示的参数值给所引用的实例:实 例 延 迟 值 fa0 d_sum = 1, d_cout = 1 fa1 d_sum = 2, d_cout = 2 fa2 d_sum = 3, d_cout = 3 fa3d_sum = 4, d_cout = 4a .编写fulladd4模块,用defparam 语句改变实例参数的值。
使用例5.9中的激励文件对这个四位全加器进行仿真。
解释全加器的结果延迟,什么时候出现加法器的输出(在该激励文件中使用20作为延迟值,而不是用5)。
b .编写fulladd4模块,把延迟值传送到调用的实例fa0,fa1,fa2和fa3中。
(完整版)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应当声明为寄存器变量。
第6章 Verilog HDL设计进阶习题
1CLK7476N 1K ~1Q ~1CLR 14
U3A 7400N
3
V1 100 Hz 5V J1
10 9 2 7 6 5 4 3
74194N
9 QD QC QB QA 12 13 14 15 11 13 14 15 16 17 18 19 20 21 22 23 1 2 3 4 5 6 7 8 G D C B A
//Verilog设计一个4位4输入最大数值检测电路 module Maximum_value_detection(Mostlarge,a,b,c,d);//4位 4输入最大数值检测电路 output [3:0] Mostlarge; input [3:0] a,b,c,d; wire[3:0]sum1,sum2,sum3;
习
CP 1 2 3 4 5 6 QD(A2) QC(D4、~D5) 0 0 0 1 1 1 1 1 1 0 ~0 0 QB(A1) 0 1 1 0 0 1
题
QA(A0、D7) 1 0 1 0 1 0 D D1 D2 D3 D4 D5 D6 F 0 1 0 0 1 0
7
8 9 10 11
1
1 1 1 1
U1
74150N
Key = Space
XSC1
Ext Trig + _ A + _ + B _
U5A 7404N
E15 E14 E13 E12 E11 E10 E9 E8 E7 E6 E5 E4 E3 E2 E1 E0
0
1 ~1 1 1
1
0 0 1 1
1
0 1 0 1
D7
D4 D5 D6 D7
1
1 0 0 1
VDD 5V U2 U1A 74S04D
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 hdl 习题答案
verilog hdl 习题答案Verilog HDL 习题答案Verilog HDL(Hardware Description Language)是一种硬件描述语言,用于设计和仿真数字电路。
它是一种高级语言,可以用于描述电路的结构和行为,并且可以进行逻辑仿真和综合。
在学习Verilog HDL的过程中,习题是不可或缺的一部分。
下面将提供一些常见Verilog HDL习题的答案,帮助你更好地理解和掌握这门语言。
1. 设计一个4位全加器module full_adder(input a, b, cin, output sum, cout);assign sum = a ^ b ^ cin;assign cout = (a & b) | (a & cin) | (b & cin);endmodule2. 设计一个4位加法器module four_bit_adder(input [3:0] a, b, output [3:0] sum, output carry_out);wire [3:0] carry;assign sum = a + b;assign carry = a + b + 1'b0;assign carry_out = carry[3];endmodule3. 设计一个2输入4输出的多路选择器module mux_2to4(input [1:0] sel, input [3:0] in, output [3:0] out);assign out[0] = (sel[1] & sel[0]) ? in[0] : 1'bz;assign out[1] = (sel[1] & ~sel[0]) ? in[1] : 1'bz;assign out[2] = (~sel[1] & sel[0]) ? in[2] : 1'bz;assign out[3] = (~sel[1] & ~sel[0]) ? in[3] : 1'bz;endmodule4. 设计一个4位移位寄存器module shift_register(input [3:0] in, input clk, input reset, output [3:0] out);reg [3:0] reg_out;always @(posedge clk or posedge reset) beginif (reset)reg_out <= 4'b0000;elsereg_out <= {reg_out[2:0], in[0]};endassign out = reg_out;endmodule这些习题的答案提供了基本的Verilog HDL设计和实现方法。
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;延迟消失了。
VerilogHDL练习题目
练习一.简单的组合逻辑设计目的: 掌握基本组合逻辑电路的实现方法。
这是一个可综合的数据比较器,很容易看出它的功能是比较数据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仿真波形(部分):266练习:设计一个字节(8位)比较器。
要求:比较两个字节的大小,如a[7:0]大于 b[7:0]输出高电平,否则输出低电平,改写测试模型,使其能进行比较全面的测试。
veriloghdl编程举例
设计示范和上机习题练习一.简单的组合逻辑设计" 100 a100 a100 a100 aqual(equal),.a(a),.b(b)); " qual(equal),.a(a),.b(b));简单分频时序逻辑电路的设计eset(reset),.clk_in(clk),.clk_out(clk_out));endmodule练习三. 利用条件语句实现计数分频时序电路10M10M10M10M10MESET(RESET),.F10M(F10M),.F500K(F500K_clk) );endmodule练习四. 阻塞赋值与非阻塞赋值的区别"`include "./"module compareTop;wire [3:0] b1,c1,b2,c2;reg [3:0] a;reg clk;initialbeginclk = 0;forever #50 clk = ~clk; 100 a100 a100 a100 a用always块实现较复杂的组合逻辑电路"module alutest;wire[7:0] out;reg[7:0] a,b;reg[2:0] opcode;parameter times=5;initialbegina={$random}%256; radom b={$random}%256; radom opcode=3'h0;repeat(times)begin#100 a={$random}%256; radom b={$random}%256; radom opcode=opcode+1;end#100 $stop;endalu alu1(out,opcode,a,b);endmodule练习六. 在Verilog HDL中使用函数"`timescale 1ns/100ps`define clk_cycle 50module tryfuctTop;reg[3:0] n,i;reg reset,clk;wire[31:0] result;initialbeginclk=0;n=0;reset=1;#100 reset=0; lk(clk),.n(n),.result(result),.reset(reset)); endmodule练习七. 在Verilog HDL中使用任务(task)100 a(a),.b(b),.c(c),.d(d), .ra(ra),.rb(rb),.rc(rc),.rd(rd)); endmodule练习八. 利用有限状态机进行时序逻辑的设计0码1码1码1码1码"module seqdet_Top;reg clk,rst;reg[23:0] data;wire[2:0] state;wire z,x;assign x=data[23];always #10 clk = ~clk;always @(posedge clk)data={data[22:0],data[23]};用状态机实现比较复杂的接口设计eset(reset),.clk(clk),.data(data),.address(address),.ack(ack),.sda(sda)); endmodule。
VerilogHDL数字设计与综合(第二版)第十章课后习题答案
10.6 习题1.在下列电路中用到了哪种类型的延迟模型?给模块Y 写Verilog 描述。
答:用到了分布延迟。
V erilog 描述如下:module Y(out,m,n,p,q); output out; input m,n,p,q;wire e,f;or #11 a1(e,m,n); and #8 a2(f,p,q); or #4 a3(out,e,f);endmodule2.在模块中用最大延迟把电路转换成集总延迟模型。
用集总延迟模型重写模块Y 的Verilog描述。
答:代码如下:module Y(out,m,n,p,q);output out; input m,n,p,q;wire e,f;or a1(e,m,n); and a2(f,p,q); or #15 a3(out,e,f);endmodule3.计算习题1中的电路的每条输入到输出路径的延迟。
使用路径延迟模型写V erilog 描述。
使用outY第10章时序和延迟145答:代码如下:module Y(out,m,n,p,q);output out;input m,n,p,q;wire e,f;specify(m=>out) =15;(n=>out) =15;(p=>out) =12;(q=>out) =12;endspecifyor a1(e,m,n);and a2(f,p,q);or a3(out,e,f);endmodule4.考虑下图所示的负边沿触发的异步复位D触发器。
写模块D_FF的V erilog描述,只给出输入/输出端口和路径延迟说明。
使用并行连接描述路径延迟。
V erilog HDL 数字设计与综合(第二版)146答:代码如下module D_FF(q,qbar,d,clock,reset); output q,qbar; input d,clock,reset; reg q,qbar;//bit to bit specify(d=>q) =5; (clock=>q) =6; (reset=>q) =2; (d=>qbar) =5; (clock=>qbar) =7; (reset=>qbar) =3; endspecifyendmodule5.假设所有路径延迟是5个单位时间,修改习题4中的D 触发器。
VerilogHDL设计练习
'■匚织川昭1二絶匸AVerilog HDL 设计练习进阶(一)练习一•简单的组合逻辑设计目的:掌握基本组合逻辑电路的实现方法。
这是一个可综合的数据比较器,很容易看出它的功能是比较数据a 与数据b ,如果两个数据相同,则给出结果 1否则给出结果0。
在Verilog HDL 中,描述组合逻辑时常使用 assign 结 构。
注意equal=(a==b)?1:0,这是一种在组合逻辑实现分支判断时常使用的格式。
模块源代码:// -------------- compare.v ----------------- module compare(equal,a,b); in put a,b; output equal;assign equal=(a==b)?1:0; //a等于 b 时,equal 输出为 1 ; a 不等于 b 时,//equal输出为0。
en dmodule测试模块用于检测模块设计得正确与否,它给出模块的输入信号,观察模块的内部信号和 输出信号,如果发现结果与预期的有所偏差,则要对设计模块进行修改。
compare compare1(.equal(equal),.a(a),.b(b)); // en dmodule仿真波形(部分)测试模块源代码:'timescale 1ns/1ns // 'in elude "./compare.v" // //module comparetest; reg a,b;wire equal; in itial //in itial begin a=0; b=0;#100 a=0;b=1; #100 a=1;b=1; #100 a=1;b=0; #100 $stop; // end定义时间单位。
包含模块文件。
在有的仿真调试环境中并不需要此语句。
而需要从调试环境的菜单中键入有关模块文件的路径和名称常用于仿真时信号的给出。
Verilog设计练习十例及答案
设计练习进阶前言:在前面九章学习得基础上, 通过本章得练习,一定能逐步掌握Verilog HDL设计得要点。
我们可以先理解样板模块中每一条语句得作用,然后对样板模块进行综合前与综合后仿真,再独立完成每一阶段规定得练习。
当十个阶段得练习做完后,便可以开始设计一些简单得逻辑电路与系统。
很快我们就能过渡到设计相当复杂得数字逻辑系统。
当然,复杂得数字逻辑系统得设计与验证,不但需要系统结构得知识与经验得积累,还需要了解更多得语法现象与掌握高级得Verilog HDL系统任务,以及与C语言模块接口得方法(即PLI),这些已超出得本书得范围。
有兴趣得同学可以阅读Verilog语法参考资料与有关文献,自己学习,我们将在下一本书中介绍Verilog较高级得用法。
练习一.简单得组合逻辑设计目得: 掌握基本组合逻辑电路得实现方法。
这就是一个可综合得数据比较器,很容易瞧出它得功能就是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。
在Verilog HDL中,描述组合逻辑时常使用assign 结构。
注意equal=(a==b)?1:0,这就是一种在组合逻辑实现分支判断时常使用得格式。
模块源代码:// pare、vmodule pare(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 "、/pare、v" //包含模块文件。
在有得仿真调试环境中并不需要此语句。
//而需要从调试环境得菜单中键入有关模块文件得路径与名称module paretest;reg a,b;wire equal;initial //initial常用于仿真时信号得给出。
第4章_Verilog_HDL设计初步习题
begin
s <= G2 | G3 ; if (G1 == 0) Y <= 8'b1111_1111; else if (s) Y <= 8'b1111_1111;
else begin if (A==3'b000)Y=8'b11111110;
else if (A==3'b001)Y=8'b11111101; else if (A==3'b010)Y=8'b11111011; else if (A==3'b011)Y=8'b11110111; else if (A==3'b100)Y=8'b11101111; else if (A==3'b101)Y=8'b11011111;
x 0 0 y 0 1 diff 0 1 s_out 0 1
0
1 1
1
0 0
1
0 1
0
1 0
1
0 0
1
1
1
1
0
1
0
1
0
1
1
1
0
1
1
0
0
0
module f_suber(x,y,sub_in,diffr,sub_out); //一个二进制全减器顶层设计进行了阐述 output diffr,sub_out; input x,y,sub_in; wire e,d,f; h_suber u1(x,y,e,d); // h_suber u2(.x(e),.diff(diffr),.y(sub_in),.s_out(f));// or2a u3(.a(d),.b(f),.c(sub_out)); endmodule
verilog hdl 作业
一、74LS194A 设计(1)(2)Verilog HDL 代码:`timescale 1ns/1nsmodule shift (S1,S0,D,Dir,Dil,Q,CP,Rd);input S1,S0; //选择模式input Dil,Dir; //串行数据输入input CP,Rd; //时钟和重置input [3:0]D; //并行数据输入output [3:0]Q;reg[3:0]Q; //寄存器输出always @(posedge CP or negedge Rd)if(~Rd) Q <= 4'b0000 ;elsecase ({S1,S0})2'b00:Q<=Q; //保持2'b01:Q<={Dir, Q[3:1]}; //右移2'b10:Q<={ Q[2:0] ,Dil}; //左移2'b11:Q<=D; //并行载入endcaseendmodule(3)testbench:`timescale 1ns/1nsmodule shift_tb;//Internal signals declarations:reg S1;reg S0;reg [3:0]D;reg Dir;reg Dil;wire [3:0]Q;reg CP;reg Rd;// Unit Under Test port mapshift UUT (.S1(S1),.S0(S0),.D(D),.Dir(Dir),.Dil(Dil),.Q(Q),.CP(CP),.Rd(Rd));initialbeginCP=0;Rd=0;S1=0;S0=1;Dil=1;Dir=1;D=4'b0011;#30 S1=1;S0=0;#20 S1=0;#20 S1=1;S0=1;#20 Rd=0;endinitial#10 Rd=1;always#10 CP=~CP;initial$monitor($realtime,,"ps %h %h %h %h %h %h %h %h ",S1,S0,D,Dir,Dil,Q,CP,Rd); Endmodule功能仿真图:二、带有扫描功能的七段显示译码电路设计1、电路的输入时钟clk:1 位宽;二进制数字输入:bin_in;4 位宽;清零信号:Clr,低电平有效;清零时,4 个数码管显示为“8”。
第6章-Verilog-HDL设计进阶习题
endmodule
2021/4/9
6
习题
6-6 从不完整的条件语句产生时序模块的原理看,例6-9和例6-10从表面上看都包含 不完整条件语句,试说明,为什么例6-9的综合结果含锁存器,二例6-10却没有。
答:参见书P137
【例6-9】非阻塞赋初值导致错误
【例6-10】阻塞赋初值正确
module mux4_1(D0,D1,D2,D3,S1,S0,OUT); module mux4_1(DO,D1, D2,D3,S1, SO, OUT);
output OUT ;
output OUT ;
input D0,D1, D2,D3,S1, SO;
input DO,D1, D2,D3,S1, SO;
reg [2:0] T ; reg OUT;
reg [2:0] T ; reg OUT;
always @(D0, D1,D2,D3, S1,S0)
always @(D0, D1,D2,D3, S1,S0)
end endmodule
parameter S=4; output[3:0]sum; input[7:0] A; reg[3:0] sum; reg[2*S:1]TA; integer i; always @(A) begin TA=A; sum=0;
repeat(2*S) begin if(TA[1])sum=sum+1;
1 : OUT= D1;
2 : OUT = D2 ;
ห้องสมุดไป่ตู้
2 : OUT =D2 ;
3 : OUT= D3;
3 : OUT= D3;
default : OUT D0;
default : OUT D0;
Verilog HDL练习要求
基于Verilog HDL和Basys 2的数字电路实验要求
1. 实验内容
(1)参照74HC194的功能,设计一个4-bit的移位寄存器。
该寄存器可以根据输入控制信号的不同,工作在“置数”、“左移”、“右移”和“保持”四种功能,并可以实现同步清零。
(2)参照74LS160的功能,设计一个十进制同步计数器,并可以实现同步置数,异步清零。
(3)完成一个基于数码管的电路设计,功能不限。
2.对于每一项实验内容,需要完成以下几步:
(1)建立一个工程;
(2)编写源文件;
(3)综合;
(4)建立一个测试文件,编写测试文件进行波形仿真;
(5)建立一个约束文件;
(6)实现;
(7)生成编程文件;
(8)下载至Basys 2开发板;
(9)功能测试。
3、实验报告要点
(1)写出各个项目的设计思想或功能介绍。
(2)简述设计步骤和调试过程。
包括总体电路设计、相应模块设计,以及在ISE 上完成的设计和仿真。
相关文档包括:Verilog HDL语言的源代码(程序要有详细的注释和功能说明)、引脚分配的约束文件、验证设计功能等所有文档与调试的结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Verilog HDL设计练习进阶(一)练习一.简单的组合逻辑设计目的:掌握基本组合逻辑电路的实现方法。
这是一个可综合的数据比较器,很容易看出它的功能是比较数据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中,相对于组合逻辑电路,时序逻辑电路也有规定的表述方式。
在可综合的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提供了条件语句供分支判断时使用。
在可综合风格的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的时钟,设计一个单周期形状如下的周期波形。
Verilog HDL设计练习进阶(四)</></></></>练习四. 设计时序逻辑时采用阻塞赋值与非阻塞赋值的区别目的:1.明确掌握阻塞赋值与非阻塞赋值的概念和区别;2.了解阻塞赋值的使用情况。
阻塞赋值与非阻塞赋值,在教材中我们已经了解了它们之间在语法上的区别以及综合后所得到的电路结构上的区别。
在always块中,阻塞赋值可以理解为赋值语句是顺序执行的,而非阻塞赋值可以理解为赋值语句是并发执行的。
实际的时序逻辑设计中,一般的情况下非阻塞赋值语句被更多地使用,有时为了在同一周期实现相互关联的操作,也使用了阻塞赋值语句。
(注意:在实现组合逻辑的assign结构中,无一例外地都必须采用阻塞赋值语句。
下例通过分别采用阻塞赋值语句和非阻塞赋值语句的两个看上去非常相似的两个模块blocking.v和non_blocking.v来阐明两者之间的区别。
模块源代码:// ------------- 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模块中按如下写法,仿真与综合的结果会有什么样的变化?作出仿真波形,分析综合结果。