一、实现功能

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代码)相关推荐

  1. 【Verilog】基于Nexys4DDR开发板实现数字钟

    功能: 基于Nexys4DDR开发板实现的数字钟,六位数码管显示时分秒,可切换24时制/12时制,有整点报时功能(led灯闪烁). Verilog代码: `timescale 1ns / 1ps//数 ...

  2. STM32实例——基于STM32开发板实现传感数据采集-DHT11温湿度采集

    STM32开发板实现传感数据采集-DHT11温湿度采集 一.前言 本项目是基于STM32开发板的温湿度采集,传感器采用DHT11温湿度传感器,软件采用keil5等.本项目采用ARM结构中最为代表的Co ...

  3. 基于PYNQ-Z2开发板实现矩阵乘法加速详细流程

    基于PYNQ-Z2开发板实现矩阵乘法加速 主要内容 1.在Vivado HLS中生成矩阵乘法加速的IP核. 2.在Vivado中完成Block Design. 3.在Jupyter Notebook上 ...

  4. 利用粤嵌LinuxGEC6818开发板实现电子相册

    实验目的 利用粤嵌LinuxGEC6818开发板实现电子相册,要求如下: 实验操作必须在Linux操作系统下完成 源代码模块化设计 实现水平或者垂直滑动切换图片 实验步骤 因为操作需要在Linux下运 ...

  5. 【微信小程序控制硬件16 】 安信可 ESP32-S 开发板实现移植腾讯物联开发平台蓝牙 llsync 协议,实现一键蓝牙快速配网+远程控制。(附带源码)

    文章目录 一.前言 二.源码目录说明 三.编译指导 四.常见问题 五.开源微信物联网控制一览表 另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈! 微信物联 ...

  6. Mixly(米思齐)的安装以及基于Arduino开发板实现电容触摸控制灯

    Mixly(米思齐)的安装以及基于Arduino开发板实现电容触摸控制灯 1.Mixly下载 http://mixly.org/bnu-maker/mixly-arduino-win Mixly软件安 ...

  7. GEC6818开发板JPG图像显示,科大讯飞离线语音识别包Linux_aitalk_exp1227_1398d7c6运行demo程序,开发板实现录音

    GEC6818开发板JPG图像显示 | 开发板实现录音 一.GEC6818开发板JPG图像显示 1.jpg图片特性 2.如何解压缩jpg图片 1.对jpegsrc.v8c.tar.gz进行arm移植 ...

  8. CC2540 CC2541 蓝牙4.0BLE开发板实现 空中飞鼠、体感游戏手柄【多图】

    蓝牙4.0BLE开发板实现空中飞鼠.体感游戏手柄 近年来开始流行空中飞鼠与体感游戏手柄,正好我们的开发板上设计有插入mpu6050六轴传感器的适配接口,我们中秋节期间兴趣使然,实现了这么一个方案.   ...

  9. 基于STM32开发板实现传感数据采集-DHT11温湿度采集

    基于STM32开发板实现传感数据采集-DHT11温湿度采集 一.项目简介 本次项目是基于STM32开发板实现传感数据采集-DHT11温湿度采集.采用ARM结构中最为代表的Cortex-M4系列的芯片, ...

最新文章

  1. python中字符abc_python3 正则匹配[^abc]和(?!abc)的区别(把多个字符作为一个整体匹配排除)...
  2. React Native
  3. (转)SpringMVC学习(三)——SpringMVC的配置文件
  4. Leetcode 剑指 Offer 58 - II. 左旋转字符串 (每日一题 20210830)
  5. 【论文】引用格式 NoteExpress管理文献
  6. NYOJ-523 亡命逃窜(三维立体的BFS)
  7. 在地理文本处理技术上,高德有哪些技巧?
  8. Identity Server4学习系列四之用户名密码获得访问令牌
  9. cpu使用率_单片机里面的CPU使用率是什么鬼?
  10. 入行数据科学,仅需6步
  11. Aerospike 使用场景
  12. Struts 2.2.3 DOS漏洞
  13. oracle19c ojdbc6,解决ojdbc6升级ojdbc8中文乱码问题
  14. 毕业设计,基于语音控制的智能家居控制系统
  15. 洛谷P1338 末日的传说
  16. 大数据分析取得的成果有哪些
  17. 网宿科技孙靖泽:CDN规模门槛为5T,整合潮年底就会出现
  18. 『TensorFlow』pad图片
  19. 鸿蒙系统会碎片化吗,鸿蒙系统讲解决安卓碎片化问题,4G流畅度媲美12G!
  20. IDEA安装教程及插件推荐

热门文章

  1. python绕过付费认正_python接口自动化三(登录绕开验证码及发帖)
  2. /id_xndu5otm2mdq0.html,WEUI应用之JS常用信息提示弹层的封装
  3. 修改smac协议成lmac
  4. Excel在计算机中的应用,计算机在化学中的应用 主要由excel处理.pdf
  5. word中新建的标题编号与上一级的标题编号没有顺承的一种解决方法
  6. 源码分析工具Joern的相关资料整理
  7. NLP模型应用之三:GPT与GPT-2
  8. python实现数据去重_Python实现的txt文件去重功能示例
  9. 远程登录Linux服务器
  10. 多线程爬取4k超高清美图壁纸