用Verilog HDL设计数字跑表&数码管显示

  用Verilog HDL设计一个数字跑表,具有复位、暂停、秒表等功能,同时为了便于显示,百分秒、秒、分钟信号均采用BCD码计数方式,并直接输出到6个数码管中

  首先我们需要通过读题来理清思路,那么这里的话,很明显,我们可以通过模块之间的调用组合来实现。
  我也同步发到我自己的博客啦!戳这里 还有搭建个人博客的教程哦,毫不夸张地说这是我见过最快搭好博客的方法。

设计数字跑表

  我们通过直观的想象将这个跑表平面铺开,其实可以分为五个部分:百分秒、秒、分钟、暂停以及置位。理一理其中的逻辑哈,百分秒计数满100向秒进一位,自己清零;秒计数满60向分钟进一位,而自己同样清零;分钟则是满60就清零,并无进位;同时当暂停信号为1时暂停计数,为0时正常计数;而置位信号为1时开始置位,为0时正常计数。
  因此其实逻辑已经很清楚了,下面附上代码:

module stop_watch(input CLK,CLR,PAUSE,output [3:0] MSH,MSL,SH,SL,MH,ML);
reg [3:0] MSH,MSL,SH,SL,MH,ML;
//count_ms_s为百分秒向秒进位,count_s_m为秒向分进位
reg count_ms_s,count_s_m;//百分秒,每计满100,count_ma_s产生一个进位
always @(posedge CLK or posedge CLR)begin//复位if(CLR)beginMSH<=0;MSL<=0;count_ms_s<=0;end//正常计数else if(!PAUSE)//当PAUSE为1时暂停计数,为0时正常计数beginif(MSL==9)begin MSL<=0;if(MSH==9)begin MSH<=0;count_ms_s<=1;endelseMSH<=MSH+1;endelsebeginMSL<=MSL+1;count_ms_s<=0;endendend
//秒计数进程,每计满60,产生一个进位
always @(posedge count_ms_s or posedge CLR)begin//复位if(CLR)beginSH<=0;SL<=0;count_s_m<=0;endelse if(!PAUSE)//当PAUSE为1时暂停计数,为0时正常计数beginif(SL==9)begin SL<=0;if(SH==5)begin SH<=0;count_s_m<=1;endelseSH<=SH+1;endelsebeginSL<=SL+1;count_s_m<=0;endendend
//分钟计数进程,每计满60,系统自动清零
always @(posedge count_s_m or posedge CLR)begin if(CLR)beginMH<=0;ML<=0;endelse if(ML==9)beginML<=0;if(MH==5)MH<=0;elseMH<=MH+1;endelseML<=ML+1;end
endmodule

  激励文件我觉得其实把逻辑理清楚就很好写,为了能很好的凸显出功能,因此第一次写激励的时候先不考虑时间,先看一下产生进位是到什么时间段,然后再返回去根据这个时间来写激励,我觉得这样比较好,当然,大佬就别嘲讽我了啊哈哈哈啊哈哈啊哈哈~

initial begin// Initialize InputsCLK = 0;CLR = 1;PAUSE = 1;#5 PAUSE=0;CLR=0;//开始计数,不清零#1000 PAUSE=1;//暂停一下,这个时候是有一个进位的#10 PAUSE=0;//继续计数#10 CLR=1;//清零#10 CLR=0;//取消清零  如果这个时候不取消清零的话,之后的波形一直都是零endalways #5 CLK=~CLK;//信息打印initial begin$monitor ($time,"CLR=%d,PAUSE=%d,MSH=%d,MSL=%d",CLR,PAUSE,MSH,MSL);#1200 $stop;//$finish;end

  核心的部分就是这个了,通过标识符将信息打印出来还是比较方便的,然后由于我使用的是ISE14.7版本,因此在仿真阶段默认是只取用到1000ns,这个时候可以在仿真设置里面更改 (我没找到) 或者按F5运行全部,当然界面也有按钮可以操作。

设计数码管驱动

  先附上一张我们实验指导书上的图,这其实也就是一个二进制转BCD码了,只不过有分共阴共阳的数码管,但这无伤大雅,这部分就怎么说呢,可以将这部分代码用一个文本装起来放好,省的以后要用了还要去写,这就很nice,难道不是吗?

  下面直接贴代码吧,也没啥好说的,看代码一看就明白了,这里需要注意就是case语句最后后面加上default,这个是上课老师讲过的哦~

module led(input[3:0] in,output reg[6:0] out);always@(in)begincase(in)4'd0:out=7'h3f;4'd1:out=7'h06;4'd2:out=7'h5b;4'd3:out=7'h4f;4'd4:out=7'h66;4'd5:out=7'h6d;4'd6:out=7'h7d;4'd7:out=7'h07;4'd8:out=7'h7f;4'd9:out=7'h6f;default out=7'h0;endcaseend
endmodule

激励文件

initial begin#10 in=0;#10 in=1;#10 in=2;#10 in=3;#10 in=4;#10 in=5;#10 in=6;#10 in=7;#10 in=8;#10 in=9;endinitial begin#100 $stop;//$monitor ();end

  然后这里可能就会有小朋友问为什么他仿真的波形不太对呢,数字好像是反的或者是乱的,这个的话,那组数字你试试从右向左看是不是对的,如果还是有问题,就要检查一下是不是进制转错了。

顶层设计模块组合

  这部分就更简单了,将两个具有独立功能的模块通过代码格式调用起来组合成一个新的模块,逻辑就在于将数码管驱动模块衔接到跑表的后面,以跑表的输出输出作为数码管驱动的输入,然后再生成新的输出。

module stop_watch_led_top(input CLK,CLR,PAUSE,output wire[6:0] out1,out2,out3,out4,out5,out6);
//模块的输出不能是reg型,reg型只能作为模块内部输出或者????
wire [3:0] MSH,MSL,SH,SL,MH,ML;
//这里通过调用六次驱动模块来实现
//注意模块调用的格式以及变量stop_watch stop_watch_demo(CLK,CLR,PAUSE,MSH,MSL,SH,SL,MH,ML);led led_demo1(MSH,out1);led led_demo2(MSL,out2);led led_demo3(SH,out3);led led_demo4(SL,out4);led led_demo5(MH,out5);led led_demo6(ML,out6);
endmodule

  然后这里的激励和之前跑表的激励一样的就可以,你想一下是不是。然后这里有一个问题,我还在写这个的时候别人问我的,她遇到的问题就是在一个设计里面emmmmmmm她没写完,她最后的设计里面是分了两个模块,虽然我不知道我想的对不对啊,但是就目前我们学习到的,或者说我们接触到的这种格式,最后基本上都是一个工程最后会综合设计成一个完整的项目。因此,假如说现在这里剩一个按键消抖的模块和一个巴拉巴拉的模块,将他们连接起来,那么,该如何下手去写这个top文件呢?
  我的想法是思路理清晰,脑海里将两个模块连接一起,然后就想想现在这个top_module的输入输出是什么,然后就直接

module top_module(input 巴拉巴拉,output 巴拉巴拉)
endmodule

  然后就是考虑中间的连接问题,定义一些变量来作为寄存器什么什么的,视情况而定,最后就直接调用模块,直接整合成一个项目。


//调用模块是不是需要一个类似于代号的东西,有点像Java的创建对象
模块名字  X (按照你调用的模块的变量!顺序!来书写,但是注意变量是什么?)

  好的,感谢各位看官老爷耐心的看完了这部分文章,点赞~yeah

Verilog HDL设计数字跑表数码管显示相关推荐

  1. 基于Verilog HDL的数字秒表、波形发送器等设计

    基于Verilog HDL的数字秒表设计 一.EDA 二.基于Verilog HDL的数字秒表设计 1. 用Verilog HDL设计一个数字跑表,所需引脚和功能如下所示: 2.代码示例 3. 结果: ...

  2. 如何用Verilog HDL设计显示译码器

    Verilog HDL 设计显示译码器 逻辑原理: 7 段数码是纯组合电路,通常的小规模专用 IC,如 74 或 4000 系列的器件只能作十进制 BCD 码译码,然而数字系统中的数据处理和运算都是 ...

  3. 精通开关电源设计第二版pdf_11、秋招年35月准备期——Verilog HDL高级数字设计(第二版)...

    <Verilog HDL高级数字设计>(第二版) 一.目录如下:         虽然有些粗糙,但为显真实,此处就贴带笔记的照片了,后面设计到具体内容,我也尽量把带笔记的照片贴上. 课后习 ...

  4. Verilog HDL高级数字设计 从零学习(一)

    Verilog HDL高级数字设计 从零学习(一) 3.4 时序机设计 3.5 状态转移图 利用D触发器实现FSM的步骤

  5. 1-1、秋招年3-5月准备期——《Verilog HDL高级数字设计》(第二版)

                           <Verilog HDL高级数字设计>(第二版) 一.目录如下:

  6. 移位寄存器专题(verilog HDL设计)

    目录 移位寄存器简介 分类 4位右移位寄存器工作原理 1. 16位右移位寄存器 2. 16位左移寄存器 3. 串行输入并行输出寄存器 4. 并行输入串行输出移位寄存器 移位寄存器简介 移位寄存器内的数 ...

  7. FIR滤波器设计(包括Verilog HDL设计以及MATLAB设计)

    FIR滤波器设计 滤波器原理:滤波器就是对特定的频率或者特定频率以外的频率进行消除的电路,被广泛用于通信系统和信号处理系统中.从功能角度,数字滤波器对输入离散信号的数字代码进行运算处理,以达到滤除频带 ...

  8. Verilog HDL设计方法

    Verilog HDL设计方法 一.采用Verilog HDL设计复杂数字电路的优点 1.1.传统设计方法--电路原理图输入法 1.2.Verilog HDL的标准化与软核的重用 1.3.软核.固核和 ...

  9. 为什么在 Verilog HDL 设计中一定要用同步而不能用异步时序逻辑?

    本博文内容来源于:<从算法设计到硬件逻辑的实现>,仅供学习交流使用! 同步时序逻辑是指表示状态的寄存器组的值只可能在唯一确定的触发条件发生时刻改变.只能由时钟的正跳沿或负跳沿触发的状态机就 ...

最新文章

  1. Hive中数据的加载和导出
  2. 暂时无法登陆GOOGLE,却依然可以用GOOGLE搜索--更多GOOGLE入口
  3. python考证书-python能考证么
  4. 性能测试(01)-jmeter元件-线程组、调试取样器
  5. android style 中一些颜色的定义
  6. C++的深拷贝与浅拷贝
  7. Java Web 前端高性能优化(二) 1
  8. Android recyclerView/listview的点击变色、点击换背景颜色
  9. 小白学数据分析-----留存率分析_I[次日留存率突然下降了50%?]
  10. 【ESSD技术解读-04】ESSD Auto PL规格,引领IO性能弹性新方向
  11. Apache Flink 在汽车之家的应用与实践
  12. 【TensorFlow】Windows10 64位下安装TensorFlow - 官方原生GPU版安装
  13. .NET 6 Preview 4 已发布,这些新功能值得关注!
  14. xcopy和robocopy
  15. Mac安装MySQL8碰到的问题
  16. 多边形Polygon
  17. 【bzoj2242】计算器 离散对数
  18. spring-security-oauth2(五) 记住我
  19. 2048的C语言实现
  20. D. Little Girl and Maximum XOR(贪心)

热门文章

  1. 语音识别MFCC 一阶差分与二阶的含义
  2. html作业 百度网盘,百度学院任务一:零基础HTML编码 作业.html
  3. 金仓数据库KingbaseES使用ksql连接时,密码含有特殊字符时报错认证失败
  4. 小匕首-dotnet cli使用nuget指令
  5. Flowable 快速入门教程:前端展示流程图
  6. Excel转PDF工具(支持多sheet)
  7. 《《《翻译》》》Complex-YOLO
  8. 2021,码上归来(内有红包)
  9. mysql获取当月最后一天_mysql中获取本月第一天、本月最后一天、上月第一天、上月最后一天
  10. 2012年图灵技术图书大盘点