FPGA数字时钟计数器

好久没有登博客了,周末出去浪了一转!!!
今天给大家讲一下数字时钟计数器,上个月写的。只是简单的数字时钟计数,没有设置闹钟、设置时间和秒表的功能,下次我会发一个带有功能的数字时钟,今天只是简单的数字时钟计数器。
由于我的板子只有4位数码管,因此该数字时钟我将用两位数码管进行分钟显示,两位数码管进行时钟显示,用一个LED灯进行秒钟闪烁。
(1)分频
数字时钟计数器,最重要的是分频系数。数字时钟所要进行的计数有秒钟计数、分钟计数、和时钟计数。

我所使用的板子内部时钟是50Mhz,首先要进行秒钟分频,由于要利用LED灯闪烁一次(高电平、低电平交替一次)代表1s,因此秒钟输出Ts=0.5s为一个周期,fs=1/Ts = 2Hz,分频系数为n_s=50Mhz/2hz-1=24999999;

接下来是时钟分频,时钟分频由秒钟输出时钟来计算,当秒钟上升沿到30次时,分钟时钟翻转一次,到59次时,再翻转一次,实现分钟计数(分钟时钟高电平、低电平交替一次为1分钟);

接下来是时钟分频,时钟分频原理类似于由秒钟时钟分频分钟时钟。

(2)有了秒钟时钟、分钟时钟、小时时钟,可以在各自的always块中设置对应数码管显示的参数,秒钟到分钟数字进制为60进制,分钟到时钟数字进制为60进制,时钟到天的数字进制为24进制,由于个位、十位在数码管上分开显示,我使用个位、十位分别计数(hg,hs,sg,ss)。
(3)然后我们还需要一个数码管动态显示的时钟,分频系数我设置为499,这个时钟大家可以根据人眼暂停原理自己设置满足该定理的分频系数即可。
(4)最后就是我们的动态显示,利用case语句和设置i变量循环实现动态显示。
代码如下:


//
// Company:
// Engineer:       Grace
//
// Create Date:    19:59:03 10/17/2018
// Design Name:
// Module Name:    D_CLOCK
// Project Name:   D_clock
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module D_CLOCK(
input clk,                                     //系统时钟输入
output reg [3:0] wei,                          //数码管位选
output reg [6:0] data_out,                     //数码管段选
output reg clk_s                               //秒钟输出
);
parameter n_s=24999999;                        //秒钟分频系数
parameter n_m=59;                              //分钟计数系数
parameter n_h=23;                              //时钟计数系数
parameter n_kj=499;                            //数码管显示时钟系数
reg clk_m;                                     //分钟时钟
reg clk_h;                                     //时钟时钟
reg [24:0] counts ;                            //秒钟计数器
reg [5:0]  countm ;                            //分钟计数器
reg [4:0]  counth ;                            //时钟计数器
reg [5:0]  count_s;                            //秒钟计数器2,当此计数器为59时,分钟计数器+1
reg [5:0]  count_m;                            //分钟计数器2,当此计数器为59时,时钟计数器+1
reg [3:0]  hg;                                 //时钟个位(用于显示)
reg [3:0]  hs;                                 //时钟十位(用于显示)
reg [3:0]  mg;                                 //分钟个位(用于显示)
reg [3:0]  ms;                                 //分钟十位(用于显示)
reg [8:0] count_kj;                            //数码管显示计数
reg clk_kj;                                    //数码管显示时钟
integer i = 0;initial                                        //初始化个计数器
begin
counts = 25'b0;
counth = 5'b0;
countm = 6'b0;
count_s = 6'b0;
count_m = 6'b0;
clk_h = 1'b1;
clk_m = 1'b1;
hg = 4'b0;
hs = 4'b0;
ms = 4'b0;
mg = 4'b0;
end
/**********************************************************************************
数码管显示时钟分频
***********************************************************************************/
always @(posedge clk)
beginif (count_kj == n_kj)beginclk_kj <= ~clk_kj;count_kj <= 9'b0;endelsecount_kj <= count_kj + 1'b1;
end
/***********************************************************************************
秒钟分频
***********************************************************************************/
always @(posedge clk)
beginif (counts == n_s)                           //当秒钟计数到达时beginclk_s <= ~clk_s;                          //秒钟电平翻转,秒钟灯暗(亮)counts <=25'b0;                           //秒钟计数器清零,用于重新计数endelse                                         //若秒钟计数未达到翻转值counts <= counts + 1'b1;                  //秒钟计数+1
end/************************************************************************************
分钟分频
************************************************************************************/
always @(posedge clk_s)
begin
count_s <= count_s + 1'b1;
if(count_s  == 5'd30) begin count_s <= 6'b0;clk_m <= ~clk_m;end
else if(count_s == 6'd59)begin count_s <= 6'b0;clk_m <= ~clk_m;end
elsecount_s <= count_s +1'b1;
end
end
/*************************************************************************************
分钟计数显示
*************************************************************************************/
always @(posedge clk_m)
begincountm <= countm +1'b1;if(count_m == n_m)begincountm <= 6'b0;mg <= 6'b0;ms <= 6'b0;endelsebeginmg <= mg +1'b1;if(mg == 4'd9)beginmg <= 4'd0;ms <= ms +1'b1;endend
end/****************************************************************************************
时钟计数分频
****************************************************************************************/
always @(posedge clk_m)
begincount_m <= count_m + 1'b1;
if(count_m  == 5'd30) begin count_m <= 6'b0;clk_h <= ~clk_h;end
else if(count_m == 6'd59)begin count_m <= 6'b0;clk_h <= ~clk_h;end
elsecount_m <= count_m +1'b1;
end
/****************************************************************************************
时钟计数显示
****************************************************************************************/
always @(posedge clk_h)
begincounth <= counth +1'b1;if(counth == n_h)begincounth <= 6'b0;hg <= 6'b0;hs <= 6'b0;endbeginhg <= hg +1'b1;if(hg == 4'd9)beginhg <= 4'd0;hs <= hs +1'b1;endend
end/******************************************************************************************
数码管显示
*******************************************************************************************/always @(posedge clk_kj)
begini = i +1;if(i == 1)beginwei <= 4'b1110;case (mg)4'b0000: data_out <= 7'b1000000; // 04'b0001: data_out <= 7'b1111001; // 14'b0010: data_out <= 7'b0100100; // 24'b0011: data_out <= 7'b0110000; // 34'b0100: data_out <= 7'b0011001; // 44'b0101: data_out <= 7'b0010010; // 54'b0110: data_out <= 7'b0000011; // 64'b0111: data_out <= 7'b1111000; // 74'b1000: data_out <= 7'b0000000; // 84'b1001: data_out <= 7'b0011000; // 9default: data_out <= 7'b1000000; // 0endcaseendelse if(i == 2)beginwei <= 4'b1101;case (ms)4'b0000: data_out <= 7'b1000000; // 04'b0001: data_out <= 7'b1111001; // 14'b0010: data_out <= 7'b0100100; // 24'b0011: data_out <= 7'b0110000; // 34'b0100: data_out <= 7'b0011001; // 44'b0101: data_out <= 7'b0010010; // 5default: data_out <= 7'b1000000; // 0endcaseendif(i == 3)beginwei <= 4'b1011;case (hg)4'b0000: data_out <= 7'b1000000; // 04'b0001: data_out <= 7'b1111001; // 14'b0010: data_out <= 7'b0100100; // 24'b0011: data_out <= 7'b0110000; // 34'b0100: data_out <= 7'b0011001; // 44'b0101: data_out <= 7'b0010010; // 54'b0110: data_out <= 7'b0000011; // 64'b0111: data_out <= 7'b1111000; // 74'b1000: data_out <= 7'b0000000; // 84'b1001: data_out <= 7'b0011000; // 9default: data_out <= 7'b1000000; // 0endcaseendelse if(i == 4)beginwei <= 4'b0111;case (hs)4'b0000: data_out <= 7'b1000000; // 04'b0001: data_out <= 7'b1111001; // 14'b0010: data_out <= 7'b0100100; // 2default: data_out <= 7'b1000000; // 0endcasei = 0;endend
endmodule

FPGA数字时钟计数器相关推荐

  1. 数字时钟计数器(Verilog HDL语言描述)(仿真和综合)

    目录 前言 主题 Verilog HDL设计代码 测试代码 仿真波形 ISE中综合 RTL Schematic Technology Schematic 前言 数字时钟计数器和我的前一篇博文:级联模6 ...

  2. (224)FPGA数字信号处理入门指导

    (224)FPGA数字信号处理入门指导 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)FPGA数字信号处理入门指导 5)技术交流 6)参考资料 2 FPGA入门与提 ...

  3. 艾为数字ic面试题_秋招 应聘FPGA/数字IC笔试面试经验分享(简单列举FPGA/数字IC公司)...

    1.自我介绍 我是一名二本院校的电气自动化专业的本科生,因为自己的爱好,喜欢FPGA开发,两年的开发经验,用FPGA开发并完成三个省级科研立项并获得一个A类竞赛国家一等奖.目前签约上海艾为电子,数字I ...

  4. FPGA数字信号处理(1)- AM调制的FPGA实现

    FPGA数字信号处理(1)-AM调制的实现 一:前言 本内容分享为本人自学经历.受限于作者水平可能有不准确的地方.欢迎诸位批评指正. 分享的文章需要一些基本的FPGA开发基础 二:概述 这部分简单,但 ...

  5. FPGA数字信号处理之乘法器

    FPGA数字信号处理之乘法器 软.硬件配置 system generator仿真 rom存储器实现正弦输入 乘法器模块 其他模块 乘法器IP核 3 \sqrt{3} 3 ​ / 2 用定点小数如何表示 ...

  6. 基于FPGA数字时钟的设计(附源码)

    大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注"FPGA技术江湖"微信公众号,在"闯荡江湖"."行侠仗义"栏里获取其 ...

  7. 新书预告:Xilix FPGA数字信号处理设计——基础版

    掌握FPGA数字信号处理设计需满足三个条件:熟悉FPGA设计方法.理解数字信号处理理论.掌握理论的工程实现方法.对初学者来讲,每个条件看似都难以逾越.杜勇老师完美融合课程教学与工程设计的需求特点,以独 ...

  8. FPGA数字信号处理(十八)Quartus CIC IP核实现

    该篇是FPGA数字信号处理的第18篇,题接上篇,本文详细介绍使用Quartus自带的CIC IP核进行设计的方法.下一篇会介绍使用Vivado的IP核设计CIC的方法. IP核概述 由于版本的关系,Q ...

  9. FPGA数字信号处理(四)Quartus FIR IP核实现

    该篇是FPGA数字信号处理的第四篇,选题为DSP系统中极其常用的FIR滤波器.本文将在前两篇的基础上,继续介绍在Quartus开发环境下使用Altera(或者叫Intel)提供的FIR IP核进行FI ...

  10. FPGADesigner《FPGA数字信号处理系列》目录与传送门

    FPGA数字信号处理(1)数字混频(NCO与DDS的使用): https://blog.csdn.net/fpgadesigner/article/details/80512067 FPGA数字信号处 ...

最新文章

  1. Computer:路由器、交换机、猫Modem的简介、区别之详细攻略
  2. QT的QSqlQueryModel类的使用
  3. GPU Gems2 - 12 基于贴面的纹理映射(Tile-Based Texture Mapping)
  4. 避免在ConcurrentHashMap.computeIfAbsent()中进行递归
  5. DataView的ToTable方法,类似数据库Distinct。
  6. wcf分布式构架集群案例解决方案
  7. JPA-save()方法会将字段更新为null的解决方法
  8. 线性筛法--------2013年1月2日
  9. jquery实现章节目录效果
  10. TCP/IP 报文格式(IP数据包、TCP报头、UDP报头)
  11. 【ANSYS命令流】模型的建立相关命令(一)
  12. (一)vmware中Linux共享文件夹设置
  13. 2021.10.07高一Python语法入门课堂检测题解
  14. 10-7 spj-查询供应工程 j1 的供应商
  15. 统计学原理 数据的来源
  16. Chrome浏览器设置打开书签时在新标签页打开(保姆级图文)
  17. 如何在Google表格中直接使用Google翻译
  18. hdu 4598 Difference(奇圈判定+差分约束)
  19. java转义字符响铃_转义字符
  20. XAMPP之Apache、MySQL不能正常启动的解决办法

热门文章

  1. Django博客项目实战
  2. telink ble mesh 介绍
  3. 市场车载音响麦克风摆放以及降噪解决方案
  4. PS2019 常用快捷键大全
  5. 一文了解中央银行数字货币CBDC的总体框架
  6. libusb 串口 android,rk3399pro通过修改内核编译支持luat air720上网及串口通讯
  7. 根据价格变化自动识别极值点策略
  8. js笔记,自封装篇(二)之对象克隆
  9. 笔记本电脑win10打开照相机显示灰色相机解决办法
  10. Python精灵模块:走来走去的小猫咪