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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

Verilog实验报告.docx

1、Verilog实验报告 2014-2015-2-G02A3050-1电子电路设计训练(数字EDA部分)实验报告( 2015 年5 月 20 日)教学班学号组长签名成绩自动化科学与电气工程学院实验一、简单组合逻辑和简单时序逻辑1.1 实验任务1简单组合逻辑1.1.1 实验要求(1)设计一个两位数据比较器,比较两个数据a和b。若两数据相同,则给出结果1,否则给出结果0。(2)设计一个字节(8位)的比较器,比较两个字节a7:0和b7:0的大小。若a大于b,则输出高电平,否则输出低电平。1.1.2 模块的核心逻辑设计(1)两位数据比较器assign equal=(a=b)?1:0; /用连续赋值语句a

2、ssign对结果equal赋值,a=b时,equal输出为1,否则为0(2)字节数据比较器assign res=(ab)?1:0; /用连续语句assign对结果equal赋值,ab时equal输出为1,否则输出为01.1.3 测试程序的核心逻辑设计(1)两位数据比较器always #50 clock=clock; /产生周期性跳变的时钟,50个时间单位跳变一次always(negedge clock) /always后的语句表示时序控制,每次时钟下降沿时刻产生不同的a和b begin a=$random%2; b=$random%2; /每次随机产生a和b endinitialbegin #

3、100000000 $stop; end /系统任务,暂停仿真以观察波形(2)字节数据比较器a=$random%256;b=$random%256; /a和b从0255共256个数中随机产生,即可生成8位字节数据1.1.4 仿真实验关键结果及其解释(1)两位数据比较器图 1两位数据比较器波形图如图1所示,a和b相同时equal输出为高电平,否则输出低电平。(2)字节数据比较器图 2 字节数据比较器波形图如图2所示,ab时,res输出高电平,否则res输出低电平。1.2 实验任务2简单时序逻辑1.2.1 实验要求设计一个分频器,将时钟波形二分频。1.2.2 模块的核心逻辑设计always(pos

4、edge clk_in) /always语句后表示时序控制,每次clk_in时钟上升沿时刻进行动作 begin if(! reset) clk_out=0; /reset信号为低电平时,输出清零 else clk_out=clk_out; /reset为高电平时,输出时钟clk_out在输入时钟clk_in的上升沿时刻翻转 end1.2.3 测试程序的核心逻辑设计always #clk_cycle clk=clk; /产生输入时钟 initial begin clk=0; reset=1; #10 reset=0; /reset给低电平,输出清零 #110 reset=1; /reset复位

5、#100000 $stop; /系统任务,暂停仿真以便观察波形 end1.2.4 仿真实验关键结果及其解释图 3 二分频器的波形图如图3所示,输入时钟clk被二分频输出。1.3 实验小结通过实验一,我掌握了如下容:1)assign连续赋值语句的使用。2)always, initial块的使用。3)reg, wire等数据类型的适用围4)调用被测试模块的方法实验二、条件语句和always过程块2.1 实验任务1利用条件语句实现计数分频时序电路2.1.1 实验要求 (1)设计20分频计数器,将10MHz的时钟分频为500kHz的时钟。 (2)利用10MHz的时钟,设计一个给定单周期形状的周期波形。

6、2.1.2 模块的核心逻辑设计 (1)20分频计数器 begin if(j=9) /对计数器进行判断,计十个数翻转一次,则一个周期计20个数,即实现20分频 begin j=0; /输出时钟翻转的同时计数器置零 F500K=F500K; end else j=j+1; /若还没计到十个数,继续计数 end (2)给定单周期形状的波形 begin if(j=20) begin FDIV=0; j20)&(j=30) begin FDIV=1; j30)&(j=50) begin FDIV=0; j=j+1; /后20个时钟周期输出跳变成低电平,保持计数 end else j=0; /计数器清零

7、end2.1.3 测试程序的核心逻辑设计 (1)20分频计数器 always #clk_cycle F10M_clk=F10M_clk; /产生输入的10MHz时钟 initial begin RESET=1; F10M_clk=0; #100 RESET=0; /reset给低电平,输出清零 #100 RESET=1; /reset复位 #10000 $stop; /系统任务,暂停仿真以便观察波形 end (2)给定单周期形状的波形 begin RESET=1; F10M_clk=0; #100 RESET=0; #100 RESET=1; #100000 $stop; end /与(1)一

8、致2.1.4 仿真实验关键结果及其解释 (1)20分频计数器图 4 20分频计数器波形图 如图4所示,10MHz的时钟F10M被20分频成500kHz的时钟F500k。 (2)给定单周期形状的波形 图 5 给定单周期形状的波形图 如图5所示,生成了题目要求形状的周期波形图。2.2 实验任务2用always块实现较复杂的组合逻辑电路2.2.1 实验要求 (1)设计一个指令译码电路,对输入数据执行相应的操作,包括加、减、与、或和求反。 (2)运用always块设计一个8路数据选择器。要求:每路输入数据与输出数据均为4位2进制数,当选择开关(至少3位)或输入数据发生变化时,输出数据也相应变化。2.2

9、.2 模块的核心逻辑设计 (1)指令译码电路 always(opcode or a or b) /电平敏感的always块,当输入数据a,b或控制信号opcode变化时,输出发生变化 begin case(opcode) plus: out=a+b; /控制信号为plus时,输出等于a+b minus: out=a-b; /控制信号为minus时,输出等于a-b band: out=a&b; /控制信号为band时,输出等于a&b bor: out=a|b; /控制信号为bor时,输出等于a|b unegate:out=a; /控制信号为unegate时,输出等于a default: out=

10、8hx; /未收到指令时,输出任意态 endcase (2)8路数据选择器always(ctl or a0 or a1 or a2 or a3 or a4 or a5 or a6 or a7) /电平敏感模块,控制信号ctl或输入a0a7变化时,输出发生变化 begin case(ctl) ctl0: out=a0; ctl1: out=a1; ctl2: out=a2; ctl3: out=a3; ctl4: out=a4; ctl5: out=a5; ctl6: out=a6; ctl7: out=a7; /控制端为ctl0ctl7对应输出a0a7 default: out=4dx; /未

11、收到指令时,输出任意态 endcase2.2.3 测试程序的核心逻辑设计 (1)指令译码电路 begin a=$random%256; /从0255共256个数中随机生成一个数作为输入a b=$random%256; /从0255共256个数中随机生成一个数作为输入b opcode=3h0; /控制信号设为初值0,即plus,求和 repeat(times) /repeat循环语句使控制及输入信号重复变化 begin #100 a=$random%256; b=$random%256; opcode=opcode+1; /每一时钟到来时,输入a,b改变一随机数,控制信号+1 end #100

12、$stop; /系统任务,暂停仿真以观察输出波形 end(2)8路数据选择器begin a0=$random%16; a1=$random%16; a2=$random%16; a3=$random%16; a4=$random%16; a5=$random%16; a6=$random%16; a7=$random%16; /从015中随机生成输入a0a7 ctl=3d0; /控制端置ctl0 repeat(times) /repeat语句重复改变输入 begin #100 a0=$random%16; a1=$random%16; a2=$random%16; a3=$random%16;

13、 a4=$random%16; a5=$random%16; a6=$random%16; a7=$random%16; /随机生成a0a7 ctl=ctl+1; /控制端每次加1 end #100 $stop;end2.2.4 仿真实验关键结果及其解释(1)指令译码电路图 6 指令译码电路波形指令译码电路输出波形如图所示。控制信号opcode为0时,输出为a+b;控制信号opcode为1时,输出为a-b;.以此类推。(2)8路数据选择器图 7 8选1数据选择器波形图8路数据选择器输出波形如图7所示,控制端ctl为07时对应输出a0a7。2.3 实验小结 通过实验二,我掌握了如下容: 1)if

14、.else条件语句的使用。 2)case条件语句的使用实验三、赋值、函数和任务3.1 实验任务1阻塞赋值与非阻塞赋值的区别3.1.1 实验要求本实验中两个模块blocking和non_blocking分别采用阻塞赋值和非阻塞赋值语句,从实验结果比较他们的区别。3.1.2 模块的核心逻辑设计(1)阻塞赋值always(posedge clk) begin b=a; c=b; /阻塞赋值,a赋给b,b赋给c $display(Blocking: a=%d, b=%d, c=%d.,a,b,c); /在Transcript窗口中显示赋值后a,b,c的值 end(2)非阻塞赋值always(posed

15、ge clk) begin b=a; c=b; /非阻塞赋值,a赋给b,b赋给c $display(Non_Blocking:a=%d, b=%d, c=%d.,a,b,c); /在Transcript窗口中显示赋值后a,b,c的值 end(3)改变阻塞赋值程序的写法,再比较二者的区别(测试程序仅改变调用的阻塞赋值模块)always(posedge clk) begin c=b; b=a; /改变阻塞赋值的顺序,b赋给c,a赋给b $display(Blocking: a=%d, b=%d, c=%d.,a,b,c); end(3)再改变阻塞赋值程序的写法,比较二者的区别(测试程序仅改变调用的

16、阻塞赋值模块)always(posedge clk) b=a;always(posedge clk) c=b;3.1.3 测试程序的核心逻辑设计将阻塞与非阻塞赋值模块用同一测试程序测试,比较其输出的不同。begin a=4h3; $display(_); #100 a=4h7; $display(_); #100 a=4hf; $display(_); #100 a=4ha; $display(_); #100 a=4h2; $display(_); #100 $display(_); /每隔100个时间单位改变一次输入a的值,并显示输出 $stop; end blocking blockin

17、g(clk,a,b1,c1); /阻塞赋值输出用b1,c1表示 non_blocking non_blocking(clk,a,b2,c2); /非阻塞赋值输出用b2,c2表示3.1.4 仿真实验关键结果及其解释(1)阻塞赋值写法1图 8 阻塞与非阻塞赋值比较波形图图 9 阻塞与非阻塞赋值输出结果如图8所示,b1,c1为阻塞赋值输出,输入a的值改变时,输出b的值随之改变,同时b的值赋给c,即赋值语句执行完后输出b, c值立即改变,然后块才结束。b2,c2为非阻塞赋值输出,赋值语句之后输出b, c的值并不立即改变,而是在块结束后才进行赋值操作,当下一时钟上升沿到来时,上一个a值才赋给b,同时上一

18、b值赋给c。以上即阻塞与非阻塞赋值的区别。a和b的输出结果如图9所示。(2)阻塞赋值写法2图 10 阻塞赋值程序变形1波形图图 11 阻塞赋值程序变形1输出结果改变阻塞赋值程序后的波形图如图10所示,可见将b=a, c=b的顺序调换之后,阻塞赋值程序先将上一次时钟上升沿时b的值赋给c,再将这一次时钟上升沿时a的值赋给b,即b与a同时变化但c的值是上一个b值。在波形图上看,由于输入a的变化时刻对应的是时钟下降沿,而输出要在下一时钟上升沿才能显示,故阻塞与非阻塞输出c在波形图上看是一致的,实际上在时钟下降沿a发生变化时,阻塞输出c的值已经发生变化。输出结果如图11(3)阻塞赋值写法3图 12 阻塞

19、赋值程序变形2波形图图 13 阻塞赋值程序变形2输出结果阻塞赋值程序变形2的输出波形与结果如图12、图13所示。由于两个阻塞操作用同一个时钟沿触发,执行顺序是不确定的。3.2 实验任务2在Verilog HDL中使用函数3.2.1 实验要求(1)设计程序实现函数调用(2)设计一个带控制端的逻辑运算电路,分别完成正整数的平方、立方和最大数为5的阶乘运算。3.2.2 模块的核心逻辑设计(1)设计程序实现函数调用always(posedge clk) /clk上升沿触发同步运算 begin if(!reset) result=0; /reset为低时复位 else begin result=n*fa

20、ctorial(n)/(n*2)+1); /调用factorial函数,verilog在整数除法运算结果中不考虑余数 end endfunction31:0 factorial; /函数定义,返回一个32位的数 input3:0 operand; /输入一个4位操作数 reg3:0 index; /函数部计数用中间变量 begin factorial=operand?1:0; /操作数为0时函数输出为0,否则为1 for(index=2;index=operand;index=index+1) factorial=index*factorial; /表示阶乘的迭代运算 endendfuncti

21、on(2)带控制端的逻辑运算电路always(posedge clk) begin if(!reset) result=0; else begin if(sel=0) result=n*n; /控制端输入sel=0时,执行平方操作 else if(sel=1) result=n*n*n; /控制端输入sel=1时,执行立方操作 else if(sel=2&n=5) result=factorial(n); /控制端输入sel=2且输入n小于等于5时,计算n! else result=factorial(5); /否则计算5! end endfunction31:0 factorial; /函数

22、定义,返回一个32位的数 input3:0 operand; /输入一个4位操作数 reg3:0 index; /函数部计数用中间变量 begin factorial=operand?1:0; /操作数为0时函数输出为0,否则为1 for(index=2;index=operand;index=index+1) factorial=index*factorial; /表示阶乘的迭代运算 end3.2.3 测试程序的核心逻辑设计(1)设计程序实现函数调用initial begin clk=0; n=0; reset=1; #100 reset=0; /产生复位信号的负跳变沿 #100 reset

23、=1; /复位信号恢复高电平后输入n for(i=0;i=15;i=i+1) begin #200 n=i; /用循环结构,每隔200个时钟周期改变一次输入n的值 end #100 $stop; end(2)带控制端的逻辑运算电路begin clk=0; n=0; reset=1; #100 reset=0; /产生复位信号的负跳变沿 #100 reset=1; /复位信号恢复高电平后输入n for(i=0;iy) begin tmp=x; x=y; y=tmp; /x与y变量容互换,要求顺序执行,采用阻塞赋值方式 end endtask(实验指导书上采用快速排序算法,我对快速排序不熟悉,故采

24、用选择排序算法)3.2.3 测试程序的核心逻辑设计begin a=0;b=0;c=0;d=0; repeat(50) begin #100 a=$random%15; b=$random%15; c=$random%15; d=$random%15; /随机生成参与排序的数a,b,c,d end3.2.4 仿真实验关键结果及其解释图 16 使用任务进行排序输出波形使用任务进行排序得到的输出波形如图16所示。输出以16进制显示,可见排序功能实现正确。3.3 实验小结通过实验三,我掌握了如下容:(1)深入理解了阻塞与非阻塞赋值的区别。(2)掌握了在Verilog HDL中使用函数的方法,进一步熟悉

25、了if.else和case分支结构的使用。(3)掌握了用repeat语句实现for循环结构的方法。(4)掌握了在Verilog HDL中使用任务的方法,回顾了排序算法。实验四、有限状态机4.1 实验任务1基于状态机的串行数据检测器4.1.1 实验要求设计一个串行数据监测器。要:连续4个或4个以上为1时输出1,其他情况下输出0。4.1.2 模块的核心逻辑设计always(posedge clk) if(!rst) state=Q0; else state=nextstate; /复位端为0时输出状态置零,复位端为1时输出状态始终向下一状态变化 always(state or x) case(state) Q0: if(x=1) nextstate=Q1; else nextstate=Q0; Q1: if(x=1) nextstate=Q2; else nextstate=Q0; Q2: if(x=1) nextstate=Q3; else nextstate=Q0; Q3: if(x=1) nextstate=Q4; else nextstate=Q0; Q4: if(x=1) nextstate=Q4; else nextstat

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

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