FPGA--数字时钟(verilog)
更新时间:2023-09-15 18:35:01 阅读量: 资格考试认证 文档下载
因为本人也是刚学习fpga的菜鸟,所以这个程序漏洞很多,仅供参考。。。。。。。。。
//分频子模块
module fenpin (clk,rst_n,en_1s,en_1ms); //产生1s,1ms的分频 input clk; input rst_n; output en_1s; output en_1ms;
reg[31:0] jishu_1s; reg[15:0] jishu_1ms;
parameter cnt_1s =49999999; parameter cnt_1ms =49999;
always@(posedge clk or negedge rst_n) begin if(!rst_n) jishu_1s<=32'b0; else if(jishu_1s jishu_1s<=32'b0; end always@(posedge clk or negedge rst_n) begin if(!rst_n) jishu_1ms<=16'b0; else if(jishu_1ms jishu_1ms<=16'b0; end assign en_1s=(jishu_1s==cnt_1s)? 1'b1 : 1'b0; assign en_1ms=(jishu_1ms==cnt_1ms)? 1'b1 : 1'b0; endmodule //1s //1ms //按键控制部分 module anjian(clk,rst_n,key1,key2,key1_low,key2_low); input clk; input rst_n; input key1; // 分加 input key2; // 分减 output key1_low; //按键按下消抖后的标志位 output key2_low; reg reg0_key; //key1消抖 reg reg1_key; reg reg2_key; //key2消抖 reg reg3_key; always @(posedge clk or negedge rst_n) begin if(!rst_n) begin reg0_key <= 1'b1; reg1_key <= 1'b1; end else begin reg0_key <= key1; reg1_key <= reg0_key; //根据非阻塞赋值的原理,reg1_key 存储的值是reg0_key 上一个时钟的值 end end //脉冲边沿检测法,当寄存器 key1 由 1 变为 0 时,key1_an 的值变为高,维持一个时钟周期 wire key1_an; assign key1_an = reg1_key & ( ~reg0_key); always @(posedge clk or negedge rst_n) begin if(!rst_n) begin reg2_key <= 1'b1; reg3_key <= 1'b1; end else begin reg2_key <= key2; reg3_key <= reg2_key; end end //脉冲边沿检测法,当寄存器 key2 由 1 变为 0 时,key2_an 的值变为高,维持一个时钟周期 wire key2_an; assign key2_an = reg3_key & ( ~reg2_key); reg[19:0] cnt_key1; //计数寄存器 always @ (posedge clk or negedge rst_n) begin if (!rst_n) cnt_key1 <= 20'd0; //异步复位 else if(key1_an) cnt_key1 <=20'd0; //led1_an=1,按键确认按下,cnt_key1从0开始计数 else cnt_key1 <= cnt_key1 + 1'b1; end reg[19:0] cnt_key2; //计数寄存器 always @ (posedge clk or negedge rst_n) begin if (!rst_n) cnt_key2 <= 20'd0; else if(key2_an) cnt_key2 <=20'd0; else cnt_key2 <= cnt_key2 + 1'b1; end //以下为消抖程序 reg reg_low; reg reg1_low; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin reg_low <= 1'b1; end else if(cnt_key1 == 20'hfffff) //时钟50mhz的话大约计时是20ms begin reg_low <= key1; //led_an=1,按键确认按下,cnt_key从0开始计数,这时候还有消抖动,计数20ms后抖动滤除了此时再锁存一下key1的值 end //这时key1的值就稳定了 end always @(posedge clk or negedge rst_n) begin if (!rst_n) reg1_low <= 1'b1; else reg1_low <= reg_low; end assign key1_low = reg1_low & ( ~reg_low); //当寄存器 reg_low 由 1 变为 0 时,key_low 的值变为高,维持一个时钟周期 reg reg2_low; reg reg3_low; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin reg2_low <= 1'b1; end else if(cnt_key2 == 20'hfffff) begin reg2_low <= key2; end end always @(posedge clk or negedge rst_n) begin if (!rst_n) reg3_low <= 1'b1; else reg3_low <= reg2_low; end assign key2_low = reg3_low & ( ~reg2_low); endmodule //时、分、秒 module shijian(clk,rst_n,en_1s,key1_low,key2_low,shi,fen,miao); input clk; input rst_n; input en_1s; input key1_low; input key2_low; output[5:0] shi; output[5:0] fen; output[5:0] miao; reg [5:0] shi; reg [5:0] fen; reg [5:0] miao; always@(posedge clk or negedge rst_n) begin if(!rst_n) begin shi<=6'b0; fen<=6'b0; miao<=6'b0; end else if(en_1s) begin miao=miao+1'b1; if(miao==60) begin miao=0; fen=fen+1'b1; if(fen==60) begin fen=0; shi=shi+1'b1; if(shi==24) shi=0; end end end else if(key1_low) begin fen=fen+1'b1; if(fen==60) begin fen=0; shi=shi+1'b1; if(shi==24) shi=0; end end else if(key2_low) begin fen=fen-1'b1; if(fen==0) begin shi=shi-1'b1; fen=59; end end else begin shi<=shi; fen<=fen; miao<=miao; end end endmodule //显示部分 module xianshi(clk,rst_n,en_1ms,shi,fen,miao,led_bit,dataout); input clk; input rst_n; input en_1ms; input[5:0] shi; input[5:0] fen; input[5:0] miao; output[7:0] led_bit; //位选 output[7:0] dataout; //段选 //数码管显示 0~9 对应段选输出 parameter num0 = 8'b11000000, num1 = 8'b11111001, num2 = 8'b10100100, num3 = 8'b10110000, num4 = 8'b10011001, num5 = 8'b10010010, num6 = 8'b10000010, num7 = 8'b11111000, num8 = 8'b10000000, num9 = 8'b10010000; reg[3:0] shi1,shi2,fen1,fen2,miao1,miao2; reg[7:0] led_bit; //位选 reg[7:0] dataout; //段选 reg[2:0] state; //状态寄存器 always@(posedge clk or negedge rst_n) if(!rst_n) begin led_bit<=8'b1; state<=3'b0; end else if(en_1ms) begin state<=state+1'b1; shi1=shi/10; shi2=shi; fen1=fen/10; fen2=fen; miao1=miao/10; miao2=miao; if(state==3'b000) begin led_bit=8'b11111110; case(miao2) 0: dataout<=num0; 1: dataout<=num1; 2: dataout<=num2; 3: dataout<=num3; 4: dataout<=num4; 5: dataout<=num5; 6: dataout<=num6; 7: dataout<=num7; 8: dataout<=num8; 9: dataout<=num9; default :dataout<=num0; endcase end else if(state==3'b001) begin led_bit=8'b11111101; case(miao1) 0: dataout<=num0; 1: dataout<=num1; 2: dataout<=num2; 3: dataout<=num3; 4: dataout<=num4; 5: dataout<=num5; default :dataout<=num0; endcase end else if(state==3'b010) begin led_bit=8'b11110111; case(fen2) 0: dataout<=num0; 1: dataout<=num1; 2: dataout<=num2; 3: dataout<=num3; 4: dataout<=num4; 5: dataout<=num5; 6: dataout<=num6; 7: dataout<=num7; 8: dataout<=num8; 9: dataout<=num9; default :dataout<=num0; endcase end else if(state==3'b011) begin led_bit=8'b11101111; case(fen1) 0: dataout<=num0; 1: dataout<=num1; 2: dataout<=num2; 3: dataout<=num3; 4: dataout<=num4; 5: dataout<=num5; endcase end else if(state==3'b100) begin led_bit=8'b10111111; case(shi2) 0: dataout<=num0; 1: dataout<=num1; 2: dataout<=num2; 3: dataout<=num3; 4: dataout<=num4; default :dataout<=num0; endcase end else if(state==3'b101) begin led_bit=8'b01111111; case(shi1) 0: dataout<=num0; 1: dataout<=num1; 2: dataout<=num2; endcase end else if(state==3'b110) begin led_bit=8'b11011011; dataout<=8'b10111111; end end else begin dataout<=dataout; led_bit<=led_bit; end endmodule //顶层模块 module Shizhong(clk,rst_n,key1,key2,led_bit,dataout); input clk; input rst_n; input key1; input key2; output[7:0] led_bit; output[7:0] dataout; wire en_1s; wire en_1ms; wire[5:0] shi; wire[5:0] fen; wire[5:0] miao; wire key1_low,key2_low; fenpin fenpin_int(.clk(clk), .rst_n(rst_n), .en_1s(en_1s), .en_1ms(en_1ms) ); anjian anjian_int(.clk(clk), .rst_n(rst_n), .key1(key1), .key2(key2), .key1_low(key1_low), .key2_low(key2_low) ); shijian shijian_int(.clk(clk), .rst_n(rst_n), .en_1s(en_1s), .key1_low(key1_low), .key2_low(key2_low), .shi(shi), .fen(fen), .miao(miao) ); xianshi xianshi_int(.clk(clk), .rst_n(rst_n), .en_1ms(en_1ms), .shi(shi), .fen(fen), .miao(miao), .led_bit(led_bit), .dataout(dataout) ); endmodule
正在阅读:
FPGA--数字时钟(verilog)09-15
《汉字王国中的“人”》导学案(教师)11-28
大连理工大学 生物化学 - 修志龙 - 综合习题测试二03-16
测量方案交底记录03-19
2015长春版八年级上语文月考试卷 定稿04-20
如何做好企业培训01-23
区政府办公室述职述廉报告(精选多篇)09-26
输电线路设计论文毕业论文12-05
最好的生活方式就是做自己08-02
- 梳理《史记》素材,为作文添彩
- 2012呼和浩特驾照模拟考试B2车型试题
- 关于全面推进施工现场标准化管理实施的通知(红头文件)
- 江西省房屋建筑和市政基础设施工程施工招标文件范本
- 律师与公证制度第2阶段练习题
- 2019-2020年最新人教版PEP初三英语九年级上册精编单元练习unit6训练测试卷内含听力文件及听力原文
- 小升初数学模拟试卷(十四) 北京版 Word版,含答案
- 认识创新思维特点 探讨创新教育方法-精选教育文档
- 00266 自考 社会心理学一(复习题大全)
- 多媒体在语文教学中的运用效果
- 派出所派出所教导员述职报告
- 低压电工作业考试B
- 18秋福建师范大学《管理心理学》在线作业一4
- 中国铝业公司职工违规违纪处分暂行规定
- 13建筑力学复习题(答案)
- 2008年新密市师德征文获奖名单 - 图文
- 保安员培训考试题库(附答案)
- 银川市贺兰一中一模试卷
- 2011—2017年新课标全国卷2文科数学试题分类汇编 - 1.集合
- 湖北省襄阳市第五中学届高三生物五月模拟考试试题一
- 时钟
- verilog
- 数字
- FPGA
- 采矿认识实习报告模板 - 图文
- 天津市国土资源和房屋管理局关于印发天津市国土资源和房屋管理201
- 中国电脑风机行业市场前景分析预测年度报告(目录) - 图文
- 梭戛乡沙子小学学校安全应急预案
- 高考英语语法专项复习学案-名词性从句
- 最新整理--新课标高一化学同步测试 第一节 化学实验基本方法(B)
- 2011前三季度国民经济保持平稳较快发展
- 中国古代铜器鉴赏
- Sendmail配置方法 - 图文
- 2013年土建工程师给水排水专业初中级技术职务任职资格考试专业与实务备课
- 2008年无锡市初中毕业暨高级中等学校招生考试数学试题含参考答案及评分说明
- 2015CPA审计 第11章 生产与存货循环的审计(下载版)
- 2018-2019年初中语文鲁教版《八年级下》《21.隆中对》同步练习试卷含答案考点及解析
- 配套K122019届高考化学一轮复习 选考 物质结构与性质 第2节 化学键与分子间作用力课后达标
- 《就业、利息和货币通论》读书笔记
- 磁盘分区的几个问题
- 11材料力学试题及答案要点
- 2017年第一次模拟语文试题
- 2015高考历史必会知识点精练:第4练伟大的抗日战争
- 工行业务运营题库