收藏 分销(赏)

verilog八位十进制计数器实验报告(附源代码).docx

上传人:Fis****915 文档编号:554610 上传时间:2023-12-08 格式:DOCX 页数:10 大小:172.48KB
下载 相关 举报
verilog八位十进制计数器实验报告(附源代码).docx_第1页
第1页 / 共10页
verilog八位十进制计数器实验报告(附源代码).docx_第2页
第2页 / 共10页
verilog八位十进制计数器实验报告(附源代码).docx_第3页
第3页 / 共10页
verilog八位十进制计数器实验报告(附源代码).docx_第4页
第4页 / 共10页
verilog八位十进制计数器实验报告(附源代码).docx_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、8位10进制计数器实验报告一、 实验目的l 学习时序逻辑电路l 学会用verilog语言设计时序逻辑电路l 掌握计数器的电路结构l 掌握数码管动态扫描显示原理二、 实验内容实现一个8bit十进制(BCD码)计数器端口设置:用拨动开关实现复位和使能LED灯来表示8位数据用数码管显示16进制的八位数据1. 复位时计数值为8h02. 复位后,计数器实现累加操作,步长为1,逢9进1,,计数值达到8h99后,从0开始继续计数3. 使能信号为1时正常计数,为0时暂停计数,为1时可继续计数。4. 每0.5s计数值加15. 8位的结果显示在LED灯上,其中LED灯亮表示对应的位为1,LED灯灭表示对应的灯为0

2、6. 用isim进行仿真,用forever语句模拟时钟信号输入,并给变量赋值仿真initial语句。7. 用7段数码管的后两位显示16进制下8位结果。三、 实验结果烧写结果:拨动reset开关到1时,LED灯显示10010000,7段数码管显示“90”。之后拨动WE开关呢,开始计数,LED开始变化并且7段数码管开始计数。从99后到达00,LED重新开始从00000000开始亮,且数码管重新从00开始计数。之后拨动WE开关,暂停计数,LED暂停亮灭,七段数码管暂停变化,WE拨回1,继续计数。拨动复位信号时,无视WE信号,直接复位。仿真结果:当输入reset信号时波形变化如下当达到一个扫描信号的周

3、期时的波形如下当达到一个以上计数信号的周期时的波形实验分析:实验总体结构和模块间关系如图所示:(其中还需要补上使能信号)实验原理:由于要求实现数码管和LED灯的显示,先考虑LED灯,可以直接由8位输出信号控制,而数码管需要同时显示两个不同的数字,需要时分复用,即快速的交替显示十位和个位,利用人眼的视觉暂留来达到同时显示。这样就需要两种不同的频率信号。一种是每0.5s一次,作为计数信号,用脉冲生成器生成,另一种是1ms一次的扫描信号,用降频器生成,将计数信号输入计数器来计数,并将计数的值和扫描信号同时输入扫描显示模块。在扫描显示模块里用一个变量值在0和1间交替来指导选择信号选择数码管的不位数。交

4、替的条件是收到扫描信号。7段数码管和LED灯都与计数值的变量相连即可实现。实现细节1. 首先写一个脉冲生成器(div.v),每0.5s输出一次计数脉冲cnt2. 写一个计数器(cnt.v)设置一个8位计数变量,分成两个4位变量dnum(十位)和num (个位)。如果接受到rst信号,则将计数变量置成x90.否则每次接受到计数信号,将计数变量的值增1,(同时考虑进位和回到x00的情况)3. 写一个扫描信号生成器(scan.v),每1ms生成一次扫描信号4. 写一个显示器(display.v),设置对数码管位数的4位选择信号sel和led灯的控制变量dnum(高4位)和num(低四位)。设置seg

5、作为7段数码管的控制变量。设置一个中间变量a(初值0),如果接受到scan信号,将a 0变1或1变0.如果a为0,sel为x1101,显示数码管十位,如果a为1,sel为x1110,显示数码管个位。5. 以上各个模块均由时钟信号控制。6. 写一个top模块综合以上模块。附录(源代码):Div.v模块:module div( input clk, input rst, output reg cnt ); reg 25:0 cnt_div;always(posedge clk or posedge rst)beginif(rst)cnt_div=26b0;else if(cnt_div=26d49

6、_999_999)cnt_div=26b0;elsecnt_div=cnt_div+26b1;endalways(posedge clk or posedge rst)beginif(rst)cnt=1b0;else if(cnt_div=26d49_999_999)cnt=1b1;elsecnt=1b0;endendmodulecnt.v模块:module cnt( input clk, input WE, input rst, input cnt, output reg 3:0 dnum, output reg 3:0 num );always(posedge clk)beginif(rs

7、t)begindnum=4h9;num=4h0;endelse if(WE & cnt)beginif(num=4h9)beginnum=4h0;if(dnum=4h9)dnum=4h0;elsednum=dnum+4h1;endelsenum=num+4h1;endendendmodulescan.v模块:module scan( input clk, output reg scan_sgn );reg 16:0 scan_cnt;initial scan_sgn=0;initial scan_cnt=0;always(posedge clk)beginif(scan_cnt=17d99_9

8、99)scan_cnt=17d0;elsescan_cnt=scan_cnt+17b1;endalways(posedge clk)beginif(scan_cnt=17d99_999)scan_sgn=1b1;elsescan_sgn=1b0;endendmoduledisplay.v模块:module display( input clk, input scan_sgn, input 3:0 num, input 3:0 dnum, output reg 7:0 seg, output reg 3:0 sel ); reg a=0;/initial a =0;always(posedge

9、scan_sgn)beginif(a=1b0)a=1b1;elsea=1b0;endalways(posedge clk)beginif(a=1b0)beginsel=4b1101;case(dnum)4h0:seg=8b0000_0011;4h1: seg=8b1001_1111; 4h2: seg=8b0010_0101;4h3: seg=8b0000_1101;4h4: seg=8b1001_1001;4h5: seg=8b0100_1001;4h6: seg=8b0100_0001;4h7:seg=8b0001_1111;4h8: seg=8b0000_0001;default: se

10、g=8b0000_1001;endcaseendelsebeginsel=4b1110;case(num)4h0:seg=8b0000_0011;4h1: seg=8b1001_1111;4h2: seg=8b0010_0101;4h3: seg=8b0000_1101;4h4: seg=8b1001_1001;4h5: seg=8b0100_1001;4h6: seg=8b0100_0001;4h7:seg=8b0001_1111;4h8: seg=8b0000_0001;default: seg=8b0000_1001;endcaseendendendmoduletop模块:module

11、top( input clk, input rst, input WE, output 7:0 seg, output 3:0 sel, output 3:0 dnum, output 3:0 num ); wire3:0 dnum; wire 3:0 num; wire cnt; wire scan_sgn;divu_div(.clk(clk),.rst(rst),.cnt(cnt);cntu_cnt(.clk(clk),.rst(rst),.WE(WE),.cnt(cnt),.dnum(dnum),.num(num);scanu_scan(.clk(clk),.scan_sgn(scan_

12、sgn);displayu_display(.clk(clk),.sel(sel),.seg(seg),.dnum(dnum),.num(num),.scan_sgn(scan_sgn);endmoduleucf文件:Net seg LOC = T17;Net seg LOC = T18;Net seg LOC = U17 ;Net seg LOC = U18 ;Net seg LOC = M14 ;Net seg LOC = N14;Net seg LOC = L14;Net seg LOC = M13;Net sel LOC = N16;Net sel LOC = N15;Net sel

13、LOC = P18;Net sel LOC = P17;NET WE LOC=T9;NET rst LOC=T10;NET clk LOC=V10;Net num LOC = U16;Net num LOC = V16;Net num LOC = U15;Net num LOC = V15;Net dnum LOC = M11;Net dnum LOC = N11;Net dnum LOC = R11;Net dnum LOC = T11;仿真代码:module test5;/ Inputsreg clk;reg rst;reg WE;/ Outputswire 7:0 seg;wire 3:

14、0 sel;wire 3:0 dnum;wire 3:0 num;/ Instantiate the Unit Under Test (UUT)top uut (.clk(clk), .rst(rst), .WE(WE), .seg(seg), .sel(sel), .dnum(dnum), .num(num);initial beginclk = 0;#100;WE = 1;rst = 1;#10;rst=0; end always #1 clk=clk; endmodule対本实验的总结和体会;1、 要仿真正确是烧写的前提,先仿真正确再烧写2、 要给每个模块定义的变量一个initial语句

15、,否则在仿真中会出现变量的值未定义的xxxx的情形3、 实验时仿真一直出现的一个问题是没有写initial语句,导致各个模块的中间变量没有初值,而很多输出变量的变化条件都是根据中间变量的上升沿河下降沿来触发的,这样中间变量即使有值也不会产生电平变化,导致仿真时输出没有变化(虽然烧写到板子上没有问题)4、 理解了仿真的原理是将整个project当成一个黑匣子,在isim的仿真程序中需要写语句模拟整个project的输入信号比如clk(用forever语句),rst和WE变量(在程序中赋值)5、 为了能使仿真时各个变量异步的变化,比如在时钟变化的过程中使rst等其他输入变量变化,但是initial语句又是顺序执行的,此时可以写多个initial语句来并行得是变量变化。

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 行业资料 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服