数字钟

数字钟是数电实验最后一个用verilog写的实验,稍微有些难度,现在再回来看之前写的代码还是有很多不足和问题,但在当时并没有注意到。

计数模块

1.60进制计数
在计数模块中就考虑到修改时间时的计数修改,便于修改时间
60进制需要考虑到进位,为了能保证同时进位,需要在计数58时就将下一个计数器的计数使能开启,计数59时计数使能关闭

module count60(input clk,input jinwei,input changen,input reset,input [1:0]button,output reg [7:0]q,output reg s);reg [5:0]count;always@(posedge clk) beginif(reset==0||(count>(6'd59))) begin count<=0;s<=0; endelse if(changen!=0)case(button)2'b10:begin count<=(count==6'd59)?0:(count+1);s<=s; end2'b01:begin count<=(count==0)?(6'd58):(count-1);s<=s; endendcaseelse if(jinwei==0) begin count<=count;s<=s; endelse if(count==6'd58) begin count<=count+1;s<=1; endelse if(count==6'd59) begin count<=0;s<=0; endelse begin count<=count+1;s<=0; endq[3:0]<=count%(4'd10);q[7:4]<=count/(4'd10);endendmodule

2.24进制计数模块
changen为修改计数使能,当其值不为0时,根据按键情况进行计数加减,每个时钟有效沿来时加减一次
输出为q[7:0],高4位为计数十位,低4位为计数个位

module count24(input clk,input jinwei,input changen,input reset,input [1:0]button,output reg [7:0]q);reg [4:0]count;always@(posedge clk) beginif(reset==0||(count>(5'd23))) count<=0;else if(changen!=0)case(button)2'b10:count<=(count==5'd23)?0:(count+1);2'b01:count<=(count==0)?(5'd23):(count-1);endcaseelse if(jinwei==0) count<=count;else if(count==5'd23) count<=0;else count<=count+1;q[3:0]<=count%(4'd10);q[7:4]<=count/(4'd10);endendmodule

时钟修改模块

采用两个标志位chg1,chg2。五向按键中键进行修改使能与修改结束,chg1为其标志位。
再由左右按键选择需要修改的时钟

module timechange(input clk,input [2:0]button ,output reg[2:0]changen);reg chg1=0;reg chg2=0;always@(posedge button[2]) beginif (chg1==0)chg1<=1;elsechg1<=0;endalways@(posedge clk) beginif(chg1==1&&chg2==0) beginchangen<=3'b100;chg2<=1;endelse if(chg1==1&&chg2==1)case(button[1:0])2'b10:changen<={changen[1:0],changen[2]};2'b01:changen<={changen[0],changen[2:1]};endcaseelse if(chg1==0) beginchangen<=3'b000;chg2<=0;endendendmodule

数码管显示模块

这个模块挺折磨人的,分频没做好的话显示的就是一塌糊涂的东西,我当时搞了好久
当修改使能时,对应的计数器会闪烁。再由count_t轮流计数,分别亮灯显示各计数器的各位

module print(input clk,input [7:0]s,input [7:0]m,input [7:0]h,input [2:0]changen,output reg [5:0]led1,output reg [6:0]led2);reg [3:0] num;reg [26:0] temp;//分频率器的中间变量    reg [25:0] tempc=0;reg clk_t;reg [2:0]count_t=0;wire clk_tc;wire count;assign count=count_t;assign clk_tc=tempc[25];parameter S0=7'b0000001,S1=7'b1111001,S2=7'b0010010,S3=7'b0000110,S4=7'b1001100,S5=7'b0100100,S6=7'b0100000,S7=7'b0001111,S8=7'b0000000,S9=7'b0000100;always@(posedge clk)//时钟的分频模块beginif(temp<27'd1000)//clk_t频率100KHZtemp<=temp+1;elsebegintemp<=0;clk_t<=~clk_t;endendalways@(posedge clk)//修改时间的闪烁模块beginif(tempc<26'd50000000)tempc<=tempc+1;elsetempc<=0;endalways@(posedge clk_t)begin if(count_t==3'b101)count_t<=0;elsecount_t<=count_t+1;end always@(count_t) begincase(count_t)3'b000:num<=s[3:0];3'b001:num<=s[7:4];3'b010:num<=m[3:0];3'b011:num<=m[7:4];3'b100:num<=h[3:0];3'b101:num<=h[7:4];endcaseendalways@(posedge clk_t) begincase(count_t) 3'b000:begin if(changen==(3'b001)&&clk_tc==1) led1<=6'b111111;else led1<=6'b111110; end3'b001:begin if(changen==(3'b001)&&clk_tc==1) led1<=6'b111111;else led1<=6'b111101; end3'b010:begin if(changen==(3'b010)&&clk_tc==1) led1<=6'b111111;else led1<=6'b111011; end3'b011:begin if(changen==(3'b010)&&clk_tc==1) led1<=6'b111111;else led1<=6'b110111; end3'b100:begin if(changen==(3'b100)&&clk_tc==1) led1<=6'b111111;else led1<=6'b101111; end3'b101:begin if(changen==(3'b100)&&clk_tc==1) led1<=6'b111111;else led1<=6'b011111; endendcasecase(num) 5'd0:led2<=S0;5'd1:led2<=S1;5'd2:led2<=S2;5'd3:led2<=S3;5'd4:led2<=S4;5'd5:led2<=S5;5'd6:led2<=S6;5'd7:led2<=S7;5'd8:led2<=S8;5'd9:led2<=S9;endcaseendendmodule

顶层模块

module topclock(input clk,input reset,input [4:0]button,output [7:0]led1,output [6:0]led2);reg [25:0]inclk;//1s分频reg inclklk;always @(posedge clk) beginif(inclk<26'd50000000)inclk <= inclk + 1;else begininclk <=0;inclklk<=~inclklk;endendassign led1[1:0]=2'b11;wire [7:0]sec;//时钟计数和进位中间变量wire [7:0]min;wire [7:0]hour;wire sjin,mjin,hjin;wire [2:0]changen;//调时间使能和中间变量wire [2:0]changen1;wire [2:0]changen2;assign changen2=changen;assign changen1=changen;assign sjin=inclklk;//button[1:0]上下键调时间数字,button[3:2]左右键改数字位,button[4]确定和开始改时间timechange tc(clk,button[4:2],changen);count60 s(sjin,1,changen1[0],reset,button[1:0],sec,mjin);//时钟计数和进位count60 m(sjin,mjin,changen1[1],reset,button[1:0],min,hjin);count24 h(sjin,(hjin&&mjin),changen1[2],reset,button[1:0],hour);print tp(clk,sec,min,hour,changen2,led1[7:2],led2);endmodule

引脚约束(ise可用)

由于五向按键中键同时是板子的一个时钟,所以需要在文件中额外加一句NET “button<4>” CLOCK_DEDICATED_ROUTE = FALSE;用来取消时钟的使用。

# PlanAhead Generated IO constraints NET "button[4]" IOSTANDARD = LVCMOS33;
NET "button[3]" IOSTANDARD = LVCMOS33;
NET "button[2]" IOSTANDARD = LVCMOS33;
NET "button[1]" IOSTANDARD = LVCMOS33;
NET "button[0]" IOSTANDARD = LVCMOS33;
NET "led1[7]" IOSTANDARD = LVCMOS33;
NET "led1[6]" IOSTANDARD = LVCMOS33;
NET "led1[5]" IOSTANDARD = LVCMOS33;
NET "led1[4]" IOSTANDARD = LVCMOS33;
NET "led1[3]" IOSTANDARD = LVCMOS33;
NET "led1[2]" IOSTANDARD = LVCMOS33;
NET "led1[1]" IOSTANDARD = LVCMOS33;
NET "led1[0]" IOSTANDARD = LVCMOS33;
NET "led2[6]" IOSTANDARD = LVCMOS33;
NET "led2[5]" IOSTANDARD = LVCMOS33;
NET "led2[4]" IOSTANDARD = LVCMOS33;
NET "led2[3]" IOSTANDARD = LVCMOS33;
NET "led2[2]" IOSTANDARD = LVCMOS33;
NET "led2[1]" IOSTANDARD = LVCMOS33;
NET "led2[0]" IOSTANDARD = LVCMOS33;# PlanAhead Generated physical constraints NET "button[4]" LOC = E16;
NET "button[3]" LOC = T16;
NET "button[2]" LOC = R10;
NET "button[1]" LOC = F15;
NET "button[0]" LOC = V10;
NET "led1[7]" LOC = M1;
NET "led1[6]" LOC = L1;
NET "led1[5]" LOC = N4;
NET "led1[4]" LOC = N2;
NET "led1[3]" LOC = N5;
NET "led1[2]" LOC = M3;
NET "led1[1]" LOC = M6;
NET "led1[0]" LOC = N6;
NET "led2[6]" LOC = L3;
NET "led2[5]" LOC = N1;
NET "led2[4]" LOC = L5;
NET "led2[3]" LOC = L4;
NET "led2[2]" LOC = K3;
NET "led2[1]" LOC = M2;
NET "led2[0]" LOC = L6;# PlanAhead Generated IO constraints NET "clk" IOSTANDARD = LVCMOS33;
NET "reset" IOSTANDARD = LVCMOS33;# PlanAhead Generated physical constraints NET "clk" LOC = E3;
NET "reset" LOC = P3;
NET "button<4>" CLOCK_DEDICATED_ROUTE = FALSE;

最明显的不足之处就是没有按键消抖,当时还不会。。。。
修改时间的时候还得一直按着五向按键一秒钟变一次挺累的。。。
分频做的也不好搞得我自己当时都晕了,好不容易做出来赶紧给老师验收qwq
这个数字钟修改了三个大版本才最终成功到板子上,之前有点想放弃了找来一个人帮我看哪里出错了结果他找不出来qwq只能靠自己了
不保证这些模块写上去能直接用,因为有可能我在仿真的时候改了某些模块always@里面的东西,太久远了我自己也不记得了。。。
不过大部分是对的

数电实验Verilog-数字钟相关推荐

  1. 数电实验:数字时钟设计 (经验分享,仅供参考)

    实 验 目 的 一.独立完成一个数字小系统的设计 二.基于实验箱对设计进行验证 实验内容: 能够显示时.分.秒共6位数字: 考虑使用实验箱时钟(频率包括1M.500K. 250K.100K.10K.1 ...

  2. 数电课设数字钟设计(基于quartus)

    前言 数字钟是一种利用数字电路技术实现时.分.秒计时的钟表.与机械钟相比具有更高的准确性和直观性,具有更长的使用寿命,已得到广泛的使用.数字钟的综合性较强,将数字钟作为数电实验大作业的选题不仅可以加深 ...

  3. 【数电实验7】Verilog—外星萤火虫

    [2022.05西南交大数电实验] [本代码及波形已通过老师验收.仅供参考.] [参考博客:[数电实验]外星萤火虫设计_难凉oh的博客-CSDN博客] [建议:有些口语化的注释看完删掉比较好哈,怕老师 ...

  4. 【全套资料.zip下载】数电课设-多功能电子钟数字钟Multisim仿真设计【Multisim仿真+报告+讲解视频.zip下载】

    文章目录 数电课设-多功能电子钟数字钟Multisim仿真设计[Multisim仿真+报告+演示视频.zip] 一.Multisim仿真源文件 二.仿真视频原理讲解 三.原理文档报告 资料下载[Mul ...

  5. 数电实验报告实验一_大二下学期的两三事之数电实验amp;课设

    数电实验&课设 叮 写在前面 这学期的数电实验老师是陈W老师.上学期的模电,选过一次他的课,线下教学,老师讲课游刃自如,点到为止,但又醍醐灌顶:这学期线上教学,可能是软件运用不熟练,他多少有些 ...

  6. c语言离散卷积编程,数电实验一 离散卷积的C语言编程.ppt

    数电实验一 离散卷积的C语言编程.ppt 实验一 离散卷积的C语言编程实验,DSP实验室,实验性质,综合设计性实验,实验目的,1 了解和认识常用的各种信号: 2 掌握卷积的定义和计算方法: 3 掌握在 ...

  7. 数电实验4:彩灯控制器设计

    数电实验4:彩灯控制器设计 一.实验目的 二.实验内容 三.预习要求 四.实验报告要求 五.Verilog代码.RTL视图及仿真波形 1.Verilog代码 2.RTL视图 3.仿真波形 西南交大数电 ...

  8. 北邮数电实验三接球小游戏

    文章目录 前言 一.实验要求 二.设计思路 三.设计系统框图 四.源代码 五.遇到的问题和解决办法 六.总结 前言 北邮数电实验三"接球小游戏" 数电实验验收已经结束了,实验报告也 ...

  9. 数电实验6:可控分频器设计

    数电实验6:可控分频器设计 一.实验目的 二.基本实验内容 三.提高性实验内容(选做) 四.预习实验 五.实验报告要求 六.内容讲解(基础实验内容) 七.testbench及仿真结果 1.testbe ...

  10. 数电实验三 数据选择器及其应用 任务一:用74151芯片采用降维的方法实现F=ABC+ABD+ACD+BCD; 任务二:用74151芯片采用降维方式实现F=BCD反+BC反+A反D;

    数电实验三 数据选择器及其应用 任务一:用74151芯片采用降维的方法实现F=ABC+ABD+ACD+BCD; 任务二:用74151芯片采用降维方式实现F=BCD反+BC反+A反D: 实验数据单

最新文章

  1. java 异常的分类并举例_Java异常处理中的一些特殊情况举例
  2. python - paramiko模块 修改logging提示为静默
  3. linux系统下pid的取值范围了解一下
  4. gantt project 使用
  5. 后台获取html控件的值
  6. Java中的代码块标记
  7. 纯前端实现人脸识别-提取-合成
  8. 主角有智能芯片的种田小说_5本搞笑玩梗的良品小说,文风轻松幽默,一本正经地逗你笑...
  9. java构造方法不允许调用重载方法
  10. linux 下载文件 rz,linux rz/sz上传下载文件命令
  11. 比“花书”更合适入门者的“鱼书”
  12. 【webView】webView和原生Android交互
  13. 运行Springboot项目时报错WhiteLabel Error Page
  14. 马云:如何组建自己的技术团队
  15. MNN实践[C++版本]
  16. 生死狙击2等待服务器响应,《生死狙击2》劫掠测试结束:热爱不止 来日再战!...
  17. 9-5日度小满金融Java研发工程师笔试
  18. 微信小程序之模版的使用(template)
  19. tp5.1微信支付开发系列(一)
  20. Rockey 4加密狗介绍

热门文章

  1. (一)机器学习入门与经典算法之KNN算法(第一期)
  2. 朴素贝叶斯算法实现新闻分类(Sklearn实现)
  3. 数论-------数的倍数
  4. 十二月英语——加入了新元素
  5. 阿里云服务器使用宝塔面板管理以及项目部署
  6. 计算机英特尔显卡在哪找,Win10英特尔显卡设置图标不见了该怎么办 - 系统之家...
  7. mysql什么时候产生临时表_什么时候会用到临时表?MySQL临时表的使用总结
  8. 2018 06 01 第一次博客 自然语言处理
  9. credential provider filter注意
  10. r7000屏幕亮度linux,联想legion R7000笔记本linux使用体验