ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:129.65KB ,
资源ID:6721239      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6721239.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VerilogHDL设计练习.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

VerilogHDL设计练习.docx

1、VerilogHDL设计练习Verilog 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

2、 时,equal 输出为 1 ; a 不等于 b 时,/equal 输出为0。en dmodule测试模块用于检测模块设计得正确与否,它给出模块的输入信号,观察模块的内部信号和 输出信号,如果发现结果与预期的有所偏差,则要对设计模块进行修改。compare compare1(.equal(equal),.a(a),.b(b); / en dmodule仿真波形(部分)练习: 设计一个字节( 8位)比较器。 要求:比较两个字节的大小,如 a7:0 大于 b7:0 输出高电平 , 否则输出低电平 , 改写测试模 型, 使其能进行比较全面的测试。Verilog HDL 设计练习进阶(二) 练习二、简

3、单时序逻辑电路的设计 目的:掌握基本时序逻辑电路的实现 在 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(!r

4、eset) clk_out=0;else clk_out=clk_out;endendmodule在 always 块中,被赋值的信号都必须定义为 reg 型,这是由时序逻辑电路的特点所决定的。 对于 reg 型数据,如果未对它进行赋值,仿真工具会认为它是不定态。为了能正确地观察到仿 真结果,在可综合风格的模块中我们通常定义一个复位信号 reset ,当 reset 为低电平时,对 电路中的寄存器进行复位。测试模块的源代码:/ clk_Top.v timescale 1n s/100ps defi ne clk_cycle 50 module clk_Top.v reg clk,reset;w

5、ire 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_i n(clk),.clk_out(clk_out); en dmodule仿真波形:1 i忙 lk_T.dk.T1练习:依然作clk_in的二分频clk_out ,要求输出与上例的输出正好反相。编写测试模块, 给出仿真波形Verilog HDL 设计练习进阶(三)练习三.利用条件语句实现较

6、复杂的时序逻辑电路目的:掌握条件语句在 Verilog HDL中的使用。与常用的高级程序语言一样 ,为了描述较为复杂的时序关系, Verilog HDL提供了条件语句供分支判断时使用。在可综合风格的 Verilog HDL模型中常用的条件语句有 if - else和caseendcase两种结构,用法和 C程序语言中类似。两者相较, ifelse用于不很复杂的分支关系,实际编写可综合风格的模块、特别是用状态机构成的模块时,更常用的是caseendcase风格的代码。这一节我们给的是有关 ifelse的范例,有关 caseendcase结构的代码已后会经常用到。下面给出的范例也是一个可综合风格的

7、分频器,是将 10M的时钟分频为500K的时钟。基本原理与1/2分频器是一样的,但是需要定义一个计数器,以便准确获得 1/20分频模块源代码:/ fdivisi on.v module fdivisio n(RESET,F10M,F500K);in put F10M,RESET;output F500K;reg F500K;reg 7:0j;always (posedge F10M)if(!RESET) / 低电平复位。beginF500K = 0;j = 0;endelsebeginif(j=19) / 对计数器进行判断,以确定 F500K信号是否反转。beginj = 0;F500K =

8、F500K;endelsej =j+1;enden dmodule测试模块源代码:/ fdivision_Top.v timescale 1n s/100psdefi ne clk_cycle 50module division_Top;reg F10M_clk,RESET;wire F500K_clk;always #clk_cycle F10M_clk = F10M_clk;in itialbeginRESET=1;F10M=0;#100 RESET=0;#100 RESET=1;#10000 $stop;endfdivisio n fdivisio n (. RESET(RESET),.

9、F10M(F10M_clk),.F500K(F500K_clk);en dmodule仿真波形:练习:利用10M的时钟,设计一个单周期形状如下的周期波形。Verilog HDL设计练习进阶(四) 练习四.设计时序逻辑时采用阻塞赋值与非阻塞赋值的区别 目的:1.明确掌握阻塞赋值与非阻塞赋值的概念和区别; 2. 了解阻塞赋值的使用情况。阻塞赋值与非阻塞赋值,在教材中我们已经了解了它们之间在语法上的区别以及综合后所得到 的电路结构上的区别。在 always块中,阻塞赋值可以理解为赋值语句是顺序执行的,而非阻塞赋值可以理解为赋值语句是并发执行的。实际的时序逻辑设计中,一般的情况下非阻塞赋值 语句被更多

10、地使用,有时为了在同一周期实现相互关联的操作,也使用了阻塞赋值语句。(注 意:在实现组合逻辑的 assig n结构中,无一例外地都必须采用阻塞赋值语句。下例通过分别采用阻塞赋值语句和非阻塞赋值语句的两个看上去非常相似的两个模块 blocking.v 和non_blocking.v 来阐明两者之间的区别。模块源代码:/ blocki ng.v module blocki ng(clk,a,b,c);output 3:0 b,c;in put 3:0 a;in put clk;reg 3:0 b,c;always (posedge clk)beginb = a;c = b;$display(Blo

11、cking: a = %d, b = %d, c = %d.,a,b,c); enden dmodule/ no n_blocki ng.v module non _block in g(clk,a,b,c);output 3:0 b,c;in put 3:0 a;in put 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); end endmodule测试模块源代码:/ compareTop.v timescale 1n s/

12、100psin elude ./blocki ng.vinclude ./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 = 4h3;$display( );#100 a = 4h7;$display( );#100 a = 4hf;$display( );#100 a = 4ha;$display( );#100 a = 4h2;$display( );#100 $display(

13、 );$stop;endnon_blocking non_blocking(clk,a,b2,c2); blocking blocking(clk,a,b1,c1);endmodule仿真波形(部分)仲川:1H1MHJillfemnonOTtltill把 ismpaiwTtjpSlh厂思考:在blocking模块中按如下写法,仿真与综合的结果会有什么样的变化?作出仿真 波形,分析综合结果。1 . always (posedge clk)beginc = b;b = a;end2. always (posedge clk) b=a; always (posedge clk) c=b;Verilo

14、g HDL 设计练习进阶(五)练习五.用always块实现较复杂的组合逻辑电路目的:1.掌握用always实现组合逻辑电路的方法;2. 了解assign与always两种组合逻辑电路实现方法之间的区别。仅使用assign结构来实现组合逻辑电路,在设计中会发现很多地方会显得冗长且效率低 下。而适当地采用 always来设计组合逻辑,往往会更具实效。已进行的范例和练习中,我们 仅在实现时序逻辑电路时使用 always块。从现在开始,我们对它的看法要稍稍改变。下面是一个简单的指令译码电路的设计示例。该电路通过对指令的判断,对输入数据执行相应 的操作,包括加、减、与、或和求反,并且无论是指令作用的数据

15、还是指令本身发生变化,结 果都要作出及时的反应。显然,这是一个较为复杂的组合逻辑电路,如果采用 assign语句,表达起来非常复杂。示例中使用了电平敏感的 always块,所谓电平敏感的触发条件是指在 寥的括号内电平列表中的任何一个电平发生变化,(与时序逻辑不同,它在 朗的括号内没有沿敏感关键词,如 posedge或negedge )就能触发always块的动作,并且运用了 case结构来进行分支判断,不但设计思想得到直观的体现,而且代码看起来非常整齐、便于理解。/ alu.v defi ne plus 3dOdefi ne minus 3d1defi ne band 3d2defi ne b

16、or 3d3同一组合逻辑电路分别用 always 块和连续赋值语句 assign 描述时,代码的形式大相径庭,但 是在always中适当运用default (在case结构中)和else (在ifelse结构中),通常可 以综合为纯组合逻辑,尽管被赋值的变量一定要定义为 reg 型。不过,如果不使用 default 或 else 对缺省项进行说明,则易生成意想不到的锁存器,这一点一定要加以注意。指令译码器的测试模块源代码:/ alu_Top.v timescale 1ns/1nsinclude ./alu.v module alutest;wire7:0 out;reg7:0 a,b;reg2

17、:0 opcode;parameter times=5;initialbegina=$random%256; /Give a radom number blongs to 0,255 . b=$random%256; /Give a radom number blongs to 0,255. opcode=3h0;repeat(times)begin#100 a=$random%256; /Give a radom number.b=$random%256; /Give a radom number. opcode=opcode+1;end#100 $stop;endalu alu1(out,

18、opcode,a,b); en dmodule练习:运用always块设计一个八路数据选择器。要求:每路输入数据与输出数据均为 4位2进制数,当选择开关(至少3位)或输入数据发生变化时,输出数据也相应地变化。Verilog HDL设计练习进阶(六)练习六.在Verilog HDL中使用函数目的:掌握函数在模块设计中的使用。与一般的程序设计语言一样, Veirlog HDL也可使用函数以适应对不同变量采取同一运算的操作。Veirlog HDL函数在综合时被理解成具有独立运算功能的电路,每调用一次函数相当于改 变这部分电路的输入以得到相应的计算结果。下例是函数调用的一个简单示范,采用同步时钟触发运

19、算的执行,每个 clk时钟周期都会执行一次运算。并且在测试模块中,通过调用系统任务 $display在时钟的下降沿显示每次计算的结果。模块源代码:module tryfu nct(clk ,n, result,reset);output31:0 result;in put3:0 n;in put reset,clk;reg31:0 result;always (posedge clk) /clk 的上沿触发同步运算。beginif(!reset) /reset 为低时复位。result=0;elsebeginresult = n * factorial(n)/(n*2)+1);endend函数

20、定义。fun ctio n 31:0 factorial; / in put 3:0 opera nd;reg 3:0 in dex;beginfactorial = opera nd ? 1 : 0;for(i ndex = 2; in dex = opera nd; in dex = in dex + 1) factorial = in dex * factorial;endendfunctionen dmodule测试模块源代码:in clude ./step6.vtimescale 1n s/100psdefi ne clk_cycle 50module tryfuctTop;reg3

21、:0 n,i;reg reset,clk;wire31:0 result;in itialbeginn=0;reset=1;clk=0;#100 reset=0;#100 reset=1;for(i=0;i=15;i=i+1)begin#200 n=i;end#100 $stop;endalways #clk_cycle clk=clk;tryfunct tryfu nct(.clk(clk),. n(n ),.result(result),.reset(reset);en dmodule上例中函数factorial(n) 实际上就是阶乘运算。必须提醒大家注意的是,在实际的设计中,我们不希望设

22、计中的运算过于复杂,以免在综合后带来不可预测的后果。经常的情况是, 我们把复杂的运算分成几个步骤,分别在不同的时钟周期完成。仿真波形(部分):帕曲 iTopJn 1 ;5fl-巾y亦旳咔、a j r 1 1 1 J-1 Js1 IrvluCfFixi 沃:0加:r练习: 设计一个带控制端的逻辑运算电路,分别完成正整数的平方、立方和阶乘的运算。编写 测试模块,并给出仿真波形。Verilog HDL 设计练习进阶(七)练习七 . 在 Verilog HDL 中使用任务( task ) 目的:掌握任务在结构化 Verilog HDL 设计中的应用。仅有函数并不能完全满足 Veirlog HDL 中的

23、运算需求。当我们希望能够将一些信号进行运算并 输出多个结果时,采用函数结构就显得非常不方便,而任务结构在这方面的优势则十分突出。 任务本身并不返回计算值,但是它通过类似 C 语言中形参与实参的数据交换,非常快捷地实现 运算结果的调用。此外,我们还常常利用任务来帮助我们实现结构化的模块设计,将批量的操 作以任务的形式独立出来,这样设计的目的通常一眼看过去就很明了。下面是一个利用 task 和电平敏感的 always 块设计比较后重组信号的组合逻辑的实例。可以看 到,利用 task 非常方便地实现了数据之间的交换,如果要用函数实现相同的功能是非常复杂 的;另外, task 也避免了直接用一般语句来

24、描述所引起的不易理解和综合时产生冗余逻辑等 问题。模块源代码:/ sort4.v module sort4(ra,rb,rc,rd,a,b,c,d);output3:0 ra,rb,rc,rd;input3:0 a,b,c,d;reg3:0 ra,rb,rc,rd;reg3:0 va,vb,vc,vd;always (a or b or c or d)beginva,vb,vc,vd=a,b,c,d;sort2(va,vc);/va与 vc 互换。sort2(vb,vd);/vb与 vd 互换。sort2(va,vb);/va与 vb 互换。sort2(vc,vd);/vc与 vd 互换。so

25、rt2(vb,vc);/vb与 vc 互换。ra,rb,rc,rd=va,vb,vc,vd;endtask sort2;inout3:0 x,y;reg3:0 tmp;if(xy)begintmp=x; /x 与 y 变量的内容互换,要求顺序执行,所以采用阻塞赋值方式。 x=y;y=tmp;enden dtask en dmodule值得注意的是task中的变量定义与模块中的变量定义不尽相同,它们并不受输入输出类型的 限制。如此例,x与y对于task sort2 来说虽然是in out型,但实际上它们对应的是 always块中变量,都是reg型变量。测试模块源代码:timescale 1n s

26、/100psin clude sort4.vmodule task_Top;reg3:0 a,b,c,d;wire3:0 ra,rb,rc,rd;in itialbegina=0;b=0;c=0;d=0;repeat(5)begin#100 a =$random%15;b =$ra ndom%15;c =$ra ndom%15;d =$ra ndom%15;end#100 $stop;sort4 sort4 (.a(a),.b(b),.c(c),.d(d), .ra(ra),.rb(rb),.rc(rc),.rd(rd); en dmodule仿真波形(部分) r MM110&01 TO/可

27、ilT7 V:i丿口韭TaplbinoQ團10piOa: 一 l: ,woa011 f.1ni3BoFi-+OTOO1fiti-呢坨 -oaooOQW4aicjoan41山汕1 冲乂 rcp/rtfOOQOJ110r练习:设计一个模块,通过任务完成 3个8位2进制输入数据的冒泡排序。要求:时钟触发任务 的执行,每个时钟周期完成一次数据交换的操作。Verilog HDL设计练习进阶(八)练习八.利用有限状态机进行复杂时序逻辑的设计目的:掌握利用有限状态机实现复杂时序逻辑的方法; 在数字电路中我们已经学习过通过建立有限状态机来进行数字逻辑的设计,而在 Verilog HDL 硬件描述语言中,这种设

28、计方法得到进一步的发展。通过 Verilog HDL 提供的语句,我们可以 直观地设计出适合更为复杂的时序逻辑的电路。关于有限状态机的设计方法在教材中已经作了 较为详细的阐述,在此就不赘述了。下例是一个简单的状态机设计,功能是检测一个 5位二进制序列“ 10010”。考虑到序列重叠的可能,有限状态机共提供 8个状态(包括初始状态 IDLE )。模块源代码:seqdet.vmodule seqdet(x,z,clk,rst,state);input x,clk,rst;output z;output2:0 state;reg2:0 state;wire z;parameter IDLE=d0, A=d1, B=d2,C=d3, D=d4,E=d5, F=d6,G=d7

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1