FPGA小脚丫开发板实现数字时钟,具备调时、整点报时、闹钟功能(含verilog代码)
一、实现功能
1. 能正常完成时钟的时、分、秒走时;
2. 使用LED闪烁或者改变颜色等方式实现秒的指示,要求闪烁频率或者颜色切换频率为1Hz;
3. 使用两位七段数码管显示时和分,其切换方式为:默认显示“分钟”,按住K4键显示“小时”,按下K3显示秒针;
4. 关上开关sw2,使用K1和K2键调整时间,分别为“+”和“-”,则K1和K2调整“分钟”,当K4按下,则K1和K2调整“小时”,当K3按下,则K1和K2调整“秒针”;
5. 整点报时:当时间到达每个整点,则全彩LED以某种固定颜色按1Hz频率闪烁相应次数(按24小时制);
6. 闹钟设置,将sw3开关设置为1,开始设置固定时钟和分钟,当时间计时到达时,八个led灯闪烁一分钟;
二、实验
1.整体结构
2.主函数
// Module Function:时钟设计module time_clock (clk,rst,seg_led_1,seg_led_2,led,key,sw2,sw3,led_rgb1,led_rgb2);input clk,rst;input [3:0]key;input sw2,sw3;output reg [8:0] seg_led_1;output reg [8:0] seg_led_2; output reg [7:0] led;output reg [2:0] led_rgb1=3'b 111;output reg [2:0] led_rgb2=3'b 111;reg [3:0] cnt1 ; //定义了一个4位的计数器reg [3:0] count1;reg [3:0] count_set_1;reg [3:0] cnt2 ;reg [3:0] count2;reg [3:0] count_set_2;reg [3:0] cnt3 ; //定义了一个4位的计数器reg [3:0] count3;reg [3:0] count_set_3;reg [3:0] cnt4 ;reg [3:0] count4;reg [3:0] count_set_4;reg [3:0] cnt5 ; //定义了一个4位的计数器reg [3:0] count5;reg [3:0] count_set_5;reg [3:0] cnt6 ;reg [3:0] count6;reg [3:0] count_set_6;reg [30:0]count_1s;reg [30:0]count_05s;reg [15 : 0] count;reg [15 : 0] count0;reg [8:0] seg [9:0]; wire clk1s; //定义一个中间变量,表示分频得到的时钟,用作计数器的触发 //间隔脉冲模块,产生一个 秒针 时钟信号parameter N1 = 12000000;always@(posedge clk) beginif(!rst) count_1s <= 0;else if(count_1s == N1-1)count_1s<=0;elsecount_1s<= count_1s + 1;end//间隔脉冲模块,产生一个调整 间隔 信号时钟信号parameter N2 = 1500000;always@(posedge clk) beginif(!rst) count_05s <= 0;else if(count_05s == N2-1)count_05s<= 0;elsecount_05s<= count_05s + 1;enddivide #(.WIDTH(32),.N(12000000)) u2 ( //传递参数.clk(clk),.rst_n(rst), //例化的端口信号都连接到定义好的信号.clkout(clk1s)); always @(posedge clk or negedge rst)
beginif (!rst) //---------------------------------------------异步清零begincnt1 <= 0;cnt2<=0;cnt3 <= 0;cnt4<=0;cnt5 <= 0;cnt6<=0;end//----------------------------------------开始计时elsebeginif(sw2==1)//sw2调整时间的开关 1:开始计时 0:调整时间 sw3为闹钟设置开关 设置闹钟模式sw3:1 退出设置闹钟模式sw3:0 beginif(count_1s==N1-1 )begin//秒if((cnt2==5)&&(cnt1==9))begincnt1<=0;cnt2<=0;//分钟if((cnt4==5)&&(cnt3==9))begincnt3<=0;cnt4<=0;//小时if((cnt6==2)&&(cnt5==3))begincnt5<=0;cnt6<=0;endelse if(cnt5==9)begincnt5<=0;cnt6<=cnt6+1;endelsebegincnt5<=cnt5+1;end//小时endelse if(cnt3==9)begincnt3<=0;cnt4<=cnt4+1;endelsebegincnt3<=cnt3+1;endend//分钟else if(cnt1==9)begincnt1<=0;cnt2<=cnt2+1;endelsebegincnt1<=cnt1+1;end//秒endend//-------------------------------------------------------------------暂停调整时间if(sw2==0 && sw3==0)beginif(key[2]==1 && key[3]==1)//-----------------------------------------------调整分针beginif( key[0]==0 )beginif(count_05s==N2-1)beginif((cnt4==5)&&(cnt3==9))begincnt3<=0;cnt4<=0;endelse if(cnt3==9 )begincnt3<=0;cnt4<=cnt4+1;endelsebegincnt3<=cnt3+1;endendendelse if(key[1]==0)beginif(count_05s==N2-1)beginif(cnt3==0 && cnt4==0)begincnt3<=9;cnt4<=5;endelse if(cnt3==0)begincnt3<=9;cnt4<=cnt4-1;endelsecnt3<=cnt3-1;endendelsebegincnt3<=cnt3;cnt4<=cnt4;endendelse if(key[2]==1 && key[3]==0)//-----------------------------------------------调整时针beginif( key[0]==0 )beginif(count_05s==N2-1)beginif((cnt6==2)&&(cnt5==3))begincnt5<=0;cnt6<=0;endelse if(cnt5==9)begincnt5<=0;cnt6<=cnt6+1;endelsebegincnt5<=cnt5+1;endendendelse if(key[1]==0)beginif(count_05s==N2-1)beginif(cnt5==0 && cnt6==0)begincnt5<=3;cnt6<=2;endelse if(cnt5==0)begincnt5<=9;cnt6<=cnt6-1;endelsecnt5<=cnt5-1;endendelsebegincnt5<=cnt5;cnt6<=cnt6;endendelse if(key[2]==0 && key[3]==1)//-----------------------------------------------调整秒针beginif( key[0]==0 )beginif(count_05s==N2-1)beginif((cnt2==5)&&(cnt1==9))begincnt1<=0;cnt2<=0;endelse if(cnt1==9)begincnt1<=0;cnt2<=cnt2+1;endelsebegincnt1<=cnt1+1;endendendelse if(key[1]==0)beginif(count_05s==N2-1)beginif(cnt1==0 && cnt2==0)begincnt1<=9;cnt2<=5;endelse if(cnt1==0)begincnt1<=9;cnt2<=cnt2-1;endelsecnt1<=cnt1-1;endendelsebegincnt1<=cnt1;cnt2<=cnt2;endendend//-----------------------------------------------设置闹钟 if(sw3==1 )beginif(key[2]==1 && key[3]==1)//-----------------------------------------------调整分针beginif( key[0]==0 )beginif(count_05s==N2-1)beginif((count_set_4==5)&&(count_set_3==9))begincount_set_3<=0;count_set_4<=0;endelse if(count_set_3==9 )begincount_set_3<=0;count_set_4<=count_set_4+1;endelsebegincount_set_3<=count_set_3+1;endendendelse if(key[1]==0)beginif(count_05s==N2-1)beginif(count_set_3==0 && count_set_4==0)begincount_set_3<=9;count_set_4<=5;endelse if(count_set_3==0)begincount_set_3<=9;count_set_4<=count_set_4-1;endelsecount_set_3<=count_set_3-1;endendelsebegincount_set_3<=count_set_3;count_set_4<=count_set_4;endendelse if(key[2]==1 && key[3]==0)//-----------------------------------------------调整时针beginif( key[0]==0 )beginif(count_05s==N2-1)beginif((count_set_6==2)&&(count_set_5==3))begincount_set_5<=0;count_set_6<=0;endelse if(count_set_5==9)begincount_set_5<=0;count_set_6<=count_set_6+1;endelsebegincount_set_5<=count_set_5+1;endendendelse if(key[1]==0)beginif(count_05s==N2-1)beginif(count_set_5==0 && count_set_6==0)begincount_set_5<=3;count_set_6<=2;endelse if(count_set_5==0)begincount_set_5<=9;count_set_6<=count_set_6-1;endelsecount_set_5<=count_set_5-1;endendelsebegincount_set_5<=count_set_5;count_set_6<=count_set_6;endendendend
end//--------------------------------------------------------------------数码管显示//在过程块中只能给reg型变量赋值,Verilog中有两种过程块always和initialinitial //initial和always不同,其中语句只执行一次beginseg[0] = 9'h3f; //对存储器中第一个数赋值9'b00_0011_1111,相当于共阴极接地,DP点变低不亮,7段显示数字 0seg[1] = 9'h06; //7段显示数字 1seg[2] = 9'h5b; //7段显示数字 2seg[3] = 9'h4f; //7段显示数字 3seg[4] = 9'h66; //7段显示数字 4seg[5] = 9'h6d; //7段显示数字 5seg[6] = 9'h7d; //7段显示数字 6seg[7] = 9'h07; //7段显示数字 7seg[8] = 9'h7f; //7段显示数字 8seg[9] = 9'h6f; //7段显示数字 9end
always @(posedge clk)
begin if(sw3==0)beginif(key[2]==1 && key[3]==0)begincount5<=cnt5;count6<=cnt6;seg_led_1<=seg[count6];seg_led_2<=seg[count5]; endelse if(key[2]==0 && key[3]==1)begincount1<=cnt1;count2<=cnt2;seg_led_1<=seg[count2];seg_led_2<=seg[count1]; endelsebegincount4<=cnt4;count3<=cnt3;seg_led_1<=seg[count4];seg_led_2<=seg[count3]; endendelsebeginif(key[2]==1 && key[3]==0)begincount5<=count_set_5;count6<=count_set_6;seg_led_1<=seg[count6];seg_led_2<=seg[count5]; endelse if(key[2]==0 && key[3]==1)begincount1<=count_set_1;count2<=count_set_2;seg_led_1<=seg[count2];seg_led_2<=seg[count1]; endelsebegincount4<=count_set_4;count3<=count_set_3;seg_led_1<=seg[count4];seg_led_2<=seg[count3]; endendend//--------------------------------------------整点--三色灯闪烁
always @(posedge clk1s)
beginled_rgb2[0]<=~led_rgb2[0];//--------------------------------------------三色灯秒钟闪烁if(cnt3==0 && cnt4==0)beginled_rgb1[0]<=~led_rgb1[0];endelsebeginled_rgb1[0]<=1;endend
//-------------------------------------------闹钟闪烁
always @(posedge clk1s)
beginif(count_set_3 == cnt3 && count_set_4 == cnt4 && count_set_5 == cnt5 && count_set_6 == cnt6)beginled<=~led;end elsebeginled<=8'b 11111111;end
endendmodule
3.分频器
// Module Function:任意整数时钟分频module divide ( clk,rst_n,clkout);input clk,rst_n; //输入信号,其中clk连接到FPGA的C1脚,频率为12MHzoutput clkout; //输出信号,可以连接到LED观察分频的时钟//parameter是verilog里常数语句parameter WIDTH = 24; //计数器的位数,计数的最大值为 2**WIDTH-1parameter N = 12_000_000; //分频系数,请确保 N < 2**WIDTH-1,否则计数会溢出reg [WIDTH-1:0] cnt_p,cnt_n; //cnt_p为上升沿触发时的计数器,cnt_n为下降沿触发时的计数器reg clk_p,clk_n; //clk_p为上升沿触发时分频时钟,clk_n为下降沿触发时分频时钟//上升沿触发时计数器的控制always @ (posedge clk or negedge rst_n ) //posedge和negedge是verilog表示信号上升沿和下降沿//当clk上升沿来临或者rst_n变低的时候执行一次always里的语句beginif(!rst_n)cnt_p<=0;else if (cnt_p==(N-1))cnt_p<=0;else cnt_p<=cnt_p+1; //计数器一直计数,当计数到N-1的时候清零,这是一个模N的计数器end//上升沿触发的分频时钟输出,如果N为奇数得到的时钟占空比不是50%;如果N为偶数得到的时钟占空比为50%always @ (posedge clk or negedge rst_n)beginif(!rst_n)clk_p<=0;else if (cnt_p<(N>>1)) //N>>1表示右移一位,相当于除以2去掉余数clk_p<=0;else clk_p<=1; //得到的分频时钟正周期比负周期多一个clk时钟end//下降沿触发时计数器的控制 always @ (negedge clk or negedge rst_n)beginif(!rst_n)cnt_n<=0;else if (cnt_n==(N-1))cnt_n<=0;else cnt_n<=cnt_n+1;end//下降沿触发的分频时钟输出,和clk_p相差半个时钟always @ (negedge clk)beginif(!rst_n)clk_n<=0;else if (cnt_n<(N>>1)) clk_n<=0;else clk_n<=1; //得到的分频时钟正周期比负周期多一个clk时钟endassign clkout = (N==1)?clk:(N[0])?(clk_p&clk_n):clk_p; //条件判断表达式//当N=1时,直接输出clk//当N为偶数也就是N的最低位为0,N(0)=0,输出clk_p//当N为奇数也就是N最低位为1,N(0)=1,输出clk_p&clk_n。正周期多所以是相与
endmodule
4.广角分配
FPGA小脚丫开发板实现数字时钟,具备调时、整点报时、闹钟功能(含verilog代码)相关推荐
- 【Verilog】基于Nexys4DDR开发板实现数字钟
功能: 基于Nexys4DDR开发板实现的数字钟,六位数码管显示时分秒,可切换24时制/12时制,有整点报时功能(led灯闪烁). Verilog代码: `timescale 1ns / 1ps//数 ...
- STM32实例——基于STM32开发板实现传感数据采集-DHT11温湿度采集
STM32开发板实现传感数据采集-DHT11温湿度采集 一.前言 本项目是基于STM32开发板的温湿度采集,传感器采用DHT11温湿度传感器,软件采用keil5等.本项目采用ARM结构中最为代表的Co ...
- 基于PYNQ-Z2开发板实现矩阵乘法加速详细流程
基于PYNQ-Z2开发板实现矩阵乘法加速 主要内容 1.在Vivado HLS中生成矩阵乘法加速的IP核. 2.在Vivado中完成Block Design. 3.在Jupyter Notebook上 ...
- 利用粤嵌LinuxGEC6818开发板实现电子相册
实验目的 利用粤嵌LinuxGEC6818开发板实现电子相册,要求如下: 实验操作必须在Linux操作系统下完成 源代码模块化设计 实现水平或者垂直滑动切换图片 实验步骤 因为操作需要在Linux下运 ...
- 【微信小程序控制硬件16 】 安信可 ESP32-S 开发板实现移植腾讯物联开发平台蓝牙 llsync 协议,实现一键蓝牙快速配网+远程控制。(附带源码)
文章目录 一.前言 二.源码目录说明 三.编译指导 四.常见问题 五.开源微信物联网控制一览表 另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈! 微信物联 ...
- Mixly(米思齐)的安装以及基于Arduino开发板实现电容触摸控制灯
Mixly(米思齐)的安装以及基于Arduino开发板实现电容触摸控制灯 1.Mixly下载 http://mixly.org/bnu-maker/mixly-arduino-win Mixly软件安 ...
- GEC6818开发板JPG图像显示,科大讯飞离线语音识别包Linux_aitalk_exp1227_1398d7c6运行demo程序,开发板实现录音
GEC6818开发板JPG图像显示 | 开发板实现录音 一.GEC6818开发板JPG图像显示 1.jpg图片特性 2.如何解压缩jpg图片 1.对jpegsrc.v8c.tar.gz进行arm移植 ...
- CC2540 CC2541 蓝牙4.0BLE开发板实现 空中飞鼠、体感游戏手柄【多图】
蓝牙4.0BLE开发板实现空中飞鼠.体感游戏手柄 近年来开始流行空中飞鼠与体感游戏手柄,正好我们的开发板上设计有插入mpu6050六轴传感器的适配接口,我们中秋节期间兴趣使然,实现了这么一个方案. ...
- 基于STM32开发板实现传感数据采集-DHT11温湿度采集
基于STM32开发板实现传感数据采集-DHT11温湿度采集 一.项目简介 本次项目是基于STM32开发板实现传感数据采集-DHT11温湿度采集.采用ARM结构中最为代表的Cortex-M4系列的芯片, ...
最新文章
- python中字符abc_python3 正则匹配[^abc]和(?!abc)的区别(把多个字符作为一个整体匹配排除)...
- React Native
- (转)SpringMVC学习(三)——SpringMVC的配置文件
- Leetcode 剑指 Offer 58 - II. 左旋转字符串 (每日一题 20210830)
- 【论文】引用格式 NoteExpress管理文献
- NYOJ-523 亡命逃窜(三维立体的BFS)
- 在地理文本处理技术上,高德有哪些技巧?
- Identity Server4学习系列四之用户名密码获得访问令牌
- cpu使用率_单片机里面的CPU使用率是什么鬼?
- 入行数据科学,仅需6步
- Aerospike 使用场景
- Struts 2.2.3 DOS漏洞
- oracle19c ojdbc6,解决ojdbc6升级ojdbc8中文乱码问题
- 毕业设计,基于语音控制的智能家居控制系统
- 洛谷P1338 末日的传说
- 大数据分析取得的成果有哪些
- 网宿科技孙靖泽:CDN规模门槛为5T,整合潮年底就会出现
- 『TensorFlow』pad图片
- 鸿蒙系统会碎片化吗,鸿蒙系统讲解决安卓碎片化问题,4G流畅度媲美12G!
- IDEA安装教程及插件推荐
热门文章
- python绕过付费认正_python接口自动化三(登录绕开验证码及发帖)
- /id_xndu5otm2mdq0.html,WEUI应用之JS常用信息提示弹层的封装
- 修改smac协议成lmac
- Excel在计算机中的应用,计算机在化学中的应用 主要由excel处理.pdf
- word中新建的标题编号与上一级的标题编号没有顺承的一种解决方法
- 源码分析工具Joern的相关资料整理
- NLP模型应用之三:GPT与GPT-2
- python实现数据去重_Python实现的txt文件去重功能示例
- 远程登录Linux服务器
- 多线程爬取4k超高清美图壁纸