数码管电子时钟

这篇具有很好参考价值的文章主要介绍了数码管电子时钟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.数码管简介:

        本人用的FPGA板子用的是Cyclone IV ,这个板子的数码管是共阳极的,即当给的信号为0时,才会点亮它,而且数码管的段选信号是六个位置共用的,意味着它不能在同一时间两个位置显示不同的内容,而要想达到同时看到时分秒,只能不断将每个位置的数码管赋予不同的值,并循环亮灭,将时间设置的很短,就能出现“余晖效应”,眼睛能看见的就是六个不同位置同时显示不同的内容。

2.实验思想:

做一个计时器,闹钟,使用六个计数器,分别是对
时的高位,低位
分的高位,低位
秒的高位,低位
秒的低位0-9,逢时进一,即用一个flag1,当计十秒后,flag1=1,并归零,当秒的高位收到flag1,执行+1操作;
秒的高位0-6, 逢六进一,用一个flag2,当计满过6过后,flag2 = 1,并归零 ,当分的低位收到flag2,执行+1操作;
分的低位,0-9,逢十进一,用一个flag3,当计满过10,flag3 = 1,归零 ,分的高位+1;
分的高位,0-6,当计满六,flag4 =1,归零,时的低位+1;
时的低位,0-10, 计满 flag5 = 1,归零,时的高位+1;
时的高位 0-2 

当时间为23:59:59时,当计时一秒满的标志传来,将六个计数器全部清零,就意味着这个计时器只能计满24个小时。

3.系统框图

数码管电子时钟

4.程序代码

module clock (
    input           clk,
    input           rst_n,

    output reg[5:0] sel,
    output reg[7:0] seg
);

reg [25:0] cnt; //1s寄存器
reg [25:0] cnt_10ms; //10ms寄存器
parameter MAX_NUM = 26'd5000_0000;//1s
parameter MIN_NUM = 26'd5_0000 ; //1ms数码管每1ms变换一次亮的位置,由于时间太短,人眼看着就是都在亮着。

reg [3:0] sec_low;//秒的低位寄存器,0-9
reg [3:0] sec_high;//秒的高位寄存器 ,0-5
reg [3:0] min_low;//分的低位寄存器0-9
reg [3:0] min_high;//分的低位寄存器0-5
reg [3:0] h_low;//时的低位寄存器0-9
reg [3:0] h_high;//时的低位寄存器0-2

reg flag1; //秒低位寄存满标志,计满为1,然后高位加一
reg flag2; //秒高位寄存满标志,计满唯一,然后分低位加一
reg flag3; //分低位寄存满标志,计满唯一,然后分高位加一
reg flag4;//分高位寄存满标志,计满为1,然后时低位加一
reg flag5;//时低位寄存满编制,计满为1,然后时高位加一
reg [2:0]flag6;//10ms计满标志,为1时数码管位选信号切换
reg [3:0] value; //对数码管数值的寄存

always @(posedge clk or negedge rst_n) begin  //1s计时模块
    if(!rst_n)begin
        cnt <= 26'd0;
    end
    else if(cnt == MAX_NUM - 1'd1)begin
        cnt <= 26'd0;
    end
    else begin
        cnt <= cnt + 1'd1;
    end
end

always @(posedge clk or negedge rst_n) begin //10ms计时模块,且每10ms  flag6加一,在0-5循环,代表位选信号。
    if(!rst_n)begin
        cnt_10ms <= 26'd0;
        flag6 <= 3'd0;
    end
    else if(cnt_10ms == MIN_NUM - 1'd1 && flag6 < 3'd5)begin
        cnt_10ms <= 26'd0;
        flag6 <=flag6+ 1'd1;
    end
    else if(cnt_10ms == MIN_NUM -1'd1 && flag6 == 3'd5)begin
        flag6 <= 3'd0;
        cnt_10ms <= 26'd0;
    end
    else begin
        cnt_10ms <= cnt_10ms +1;
        flag6 <= flag6;
    end
end


always @(posedge clk or negedge rst_n) begin //秒的低位计数模块
    if(!rst_n)begin
        sec_low <= 4'd0;
        flag1 <= 1'b0;
    end
    else if(cnt == MAX_NUM - 1'd1)begin 
        if(sec_low == 4'd9)begin //计满1s并且秒的低位为9时。将sec_low 变为0,flag1变成1,信号给到高位,高位加1;
            sec_low <= 4'd0;
            flag1 <= 1'b1;
        end
        else begin
            sec_low <= sec_low + 1;
            flag1 <=1'b0;
        end 
    end
    else if(h_high == 2 && h_low == 3 && min_high ==5 && min_low == 9 && sec_high ==5 && sec_low == 9 && cnt == MAX_NUM _1'd1)begin // 当时间为23:59:59时,并加一秒后,全部归零。
        sec_low <= 4'd0;
    end 
    else begin
        sec_low <= sec_low;
        flag1 <= 1'b0;
    end
end

always @(posedge clk or negedge rst_n) begin //秒的高位计数模块
    if(!rst_n)begin
        sec_high <= 4'd0;
        flag2 <= 1'b0;
    end
    else if(flag1)begin
        if(sec_high == 4'd5)begin //当秒的高位为5,且低位计满,传过来flag1==1 时,将flag2赋值为1,并将高位归零。
            sec_high <= 4'd0;
            flag2 <= 1'b1;
        end
        else begin
            sec_high <= sec_high + 1'd1;
            flag2 <= 1'b0;
        end
    end
    else if(h_high == 2 && h_low == 3 && min_high ==5 && min_low == 9 && sec_high ==5 && sec_low == 9 && cnt == MAX_NUM _1'd1)begin // 当时间为23:59:59时,并加一秒后,全部归零。
        sec_high <= 4'd0;
    end    
    else begin
        sec_high <= sec_high;
        flag2 <= 1'b0;
    end
end

always @(posedge clk or negedge rst_n) begin //分的低位计数模块
    if(!rst_n)begin
        min_low <= 4'd0;
        flag3 <= 1'b0;
    end
    else if(flag2)begin
        if(min_low == 4'd9)begin //当分的低位为9,且秒的高位计满,传过来flag2==1 时,将flag3赋值为1,并将低位归零。
            min_low <= 4'd0;
            flag3 <= 1'b1;
        end
        else begin
            min_low <= min_low + 1'd1;
            flag3 <= 1'b0;
        end
    end
    else if(h_high == 2 && h_low == 3 && min_high ==5 && min_low == 9 && sec_high ==5 && sec_low == 9 && cnt == MAX_NUM _1'd1)begin // 当时间为23:59:59时,并加一秒后,全部归零。
        min_low <= 4'd0;
    end 
    else begin
        min_low <= min_low;
        flag3 <= 1'b0;
    end
end

always @(posedge clk or negedge rst_n) begin //分的高位计数模块
    if(!rst_n)begin
        min_high <= 4'd0;
        flag4 <= 1'b0;
    end
    else if(flag3)begin
        if(min_high == 4'd5)begin //当分的高位为5,且分的低位计满,传过来flag3==1 时,将flag4赋值为1,并将低位归零。
            min_high <= 4'd0;
            flag4 <= 1'b1;
        end
        else begin
            min_high <= min_high + 1'd1;
            flag4 <= 1'b0;
        end
    end
    else if(h_high == 2 && h_low == 3 && min_high ==5 && min_low == 9 && sec_high ==5 && sec_low == 9 && cnt == MAX_NUM _1'd1)begin // 当时间为23:59:59时,并加一秒后,全部归零。
        min_high <= 4'd0;
    end     
    else begin
        min_high <= min_high;
        flag4 <= 1'b0;
    end
end

always @(posedge clk or negedge rst_n) begin //时的低位计数模块
    if(!rst_n)begin
        h_low <= 4'd0;
        flag5 <= 1'b0;
    end
    else if(flag4)begin 
        if(h_low == 4'd9)begin //当时的低位为9,flag4 ==1 时,将低位归零,flag5变1;
            h_low <= 4'd0;
            flag5 <= 1'b1;
        end
        else begin
            h_low <= h_low + 1'd1;
            flag5 <=1'b0;
        end 
    end
    else if(h_high == 2 && h_low == 3 && min_high ==5 && min_low == 9 && sec_high ==5 && sec_low == 9 && cnt == MAX_NUM _1'd1)begin // 当时间为23:59:59时,并加一秒后,全部归零。
        h_low <= 4'd0;
    end     
    else begin
        h_low <= h_low;
        flag5 <= 1'b0;
    end
end

always @(posedge clk or negedge rst_n) begin //时的高位计数模块
    if(!rst_n)begin
        h_high <= 4'd0;
    end
    else if(flag5)begin 
        h_high <= h_high +1;
    end
    else if(h_high == 2 && h_low == 3 && min_high ==5 && min_low == 9 && sec_high ==5 && sec_low == 9 && cnt == MAX_NUM _1'd1)begin // 当时间为23:59:59时,并加一秒后,全部归零。
        h_high <= 4'd0;
    end 
    else begin
        h_high <= h_high;
    end
end

这里开始可以将以下代码做成一个数码管控制模块,诶,我就是不换,就是玩,换的话可以将flag6做成输出传递到此模块,其他都不用改
always @(posedge clk or negedge rst_n) begin //位选信号定义
    if(!rst_n)begin
        sel <= 6'b000_000;
        value <= 4'd0;
    end
    else begin
        case (flag6)
            3'd0 :begin
            sel <= 6'b111_110;
            value <= h_high;
            end
            3'd1 :begin
            sel <= 6'b111_101;
            value <= h_low;
            end
            3'd2 : begin
            sel <= 6'b111_011;
            value <= min_high;
            end
            3'd3 :begin
            sel <= 6'b110_111;
            value <= min_low;
            end
            3'd4 :begin
            sel <= 6'b101_111;
            value <= sec_high;
            end
            3'd5 :begin
            sel <= 6'b011_111;
            value <= sec_low;
            end
            default: sel <= 6'b111_111;
        endcase
    end
end


always@(posedge clk or negedge rst_n)begin
	if(!rst_n)begin
		seg <= 8'b1100_0000;//初始化显示0
	end
	else begin
		case(value)
			4'd0:		seg <= 8'b1100_0000;//数码管显示0
			4'd1:		seg <= 8'b1111_1001;//数码管显示1
			4'd2: 		seg <= 8'b1010_0100;//数码管显示2
			4'd3: 		seg <= 8'b1011_0000;//数码管显示3
			4'd4: 		seg <= 8'b1001_1001;//数码管显示4
			4'd5: 		seg <= 8'b1001_0010;//数码管显示5
			4'd6: 		seg <= 8'b1000_0010;//数码管显示6
			4'd7: 		seg <= 8'b1111_1000;//数码管显示7
			4'd8: 		seg <= 8'b1000_0000;//数码管显示8
			4'd9:    	seg <= 8'b1001_0000;//数码管显示9
			default:	seg <= 8'b1100_0000;//数码管显示0
		endcase 
	end 
end 



endmodule

6还有两种方法实现时钟,

第一,使用一个计数器,每一秒加一,然后用除法,取余等操作将时分秒的高低位计算出来,然后通过数码管显示出来。

第二,可使用三个计时器,分别是时分秒的计时器,上限分别为23,59,59,再通过除法和取余计算。

这两种虽然计数器数量较少,但是消耗的组合逻辑比较多,而FPGA正好缺的就是组合逻辑资源,触发器资源反倒不缺,所以,使用六个计数器的方法比较适合FPGA。

5.测试代码

`timescale 1ns/1ps
module tb_clock();

reg clk;
reg rst_n;
defparam u_clock.MAX_NUM = 50;
defparam u_clock.MIN_NUM = 5;

always #10 clk = ~clk;

initial begin
    clk = 1'b0;
    rst_n = 1'b0;
    #10 rst_n = 1'b1;

    #10000 $stop;
end
clock  u_clock(
.clk   (clk  ),
.rst_n (rst_n),
.sel   (sel  ),
.seg(seg)
);

endmodule

6.仿真截图

数码管电子时钟

 7.上板测试

数码管时钟文章来源地址https://www.toymoban.com/news/detail-449560.html

到了这里,关于数码管电子时钟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C51单片机的电子时钟(数码管显示+独立按键模块修改及暂停时间)

    IMG_1120 通过查看这三个原理图我们可以得知控制K1、K2、K3及K4是通过P31、P30、P32及P33来实现的,控制8个数码管是P22、P23及P24来实现, 控制发光二极管则由P00-P07来实现。 代码分为三部分分别为main.c、key.h、key.c scankey()函数的主要代码,通过软件入手提高系统的可靠性,防止外

    2024年02月05日
    浏览(52)
  • 基于RASC的keil电子时钟制作(瑞萨RA)(6)----定时器驱动数码管

    要想让每个数码管显示不同的数字,但是数码管必须依次地被持续驱动,数码管之间的刷新速度应该足够快,这样就看不出来数码管之间在闪烁。刷新频率可以设置为2ms刷新一次,这样人眼就看不出闪烁了。 首先需要准备一个开发板,这里我准备的是芯片型号R7FA2E1A72DFL的开

    2024年02月15日
    浏览(42)
  • FPGA课程设计——数字电子时钟VERILOG(基于正点原子新起点开发板,支持8位或6位共阳极数码管显示时分秒毫秒,可校时,可设闹钟,闹钟开关,led指示)

    2019   级    电子科学与技术   专业FPGA课程设计 报   告 2022  年 5 月 20 日 多功能数字电子钟的设计 摘要 电子设计自动化(EDA)是一种实现电子系统或电子产品自动化设计的技术,使用EDA技术设计的结果既可以用FPGA / CPLD来实施验证,也可以直接做成专用集成电路(ASIC)。

    2024年02月03日
    浏览(43)
  • 51单片机(数码管可调时钟)

    1.数码管(共阴极)如何显示数字:位选+段选(单个) 位选:138译码器通过P22、P23、P24三个端口输入二进制数(011、000等)来选择连同译码器右边的哪一条线,而这些线又分别连着数码管的LED12345678、决定选择哪一个来显示数字 段选:决定输出什么数字,数码管下方又连着一

    2024年02月05日
    浏览(46)
  • 单片机电子元器件-数码管

    把所有数码管的阳极接到一起形成公共阳极COM 数码管 共阳极COM 接到 5V 电源 把所有数码管的阴极接到一起形成公共阴极COM 数码管 共阴极COM 接到 地 GND 上  八段 数码管 和 七段数码管, 多了一个 小数点 DP 一个数码管有 10 个引脚  ,显示 8  字  一个数码管 有8个小的发光二

    2024年02月10日
    浏览(56)
  • 【个人笔记】51单片机串口通信的字符串接收和发送,串口通信调节数码管显示时钟(串口通信,定时器,数码管)

           目的:利用PROTUES仿真软件、串口调试助手、虚拟串口,搭建单片机与PC通信仿真平台,熟悉单片机串口的配置及与PC机的通信方法;尝试制定通信协议,单片机根据通信协议解析接收到的内容,并根据接收的指令执行相应的操作。 基本功能: 1.时分秒的动态显示。

    2024年02月11日
    浏览(59)
  • FPGA学习—通过数码管实现电子秒表模拟

    请参阅博主以前写过的一篇电子时钟模拟,在此不再赘述。 https://blog.csdn.net/qq_54347584/article/details/130402287 项目说明:本次项目是为了通过数码管实现秒表模拟。其中,六位数码管分别显示秒表的分位,秒位,毫秒位(由于毫秒有三位,在此只取百位和十位),其中分位和秒位

    2024年02月14日
    浏览(44)
  • Arduino UNO驱动TM1637四位时钟数码管显示时间

    TM1637 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。  显示模式(8 段×6 位),支持共阳数码管输出  键扫描(8×2bit),增强型抗干扰按键识别电路  辉度调节电路(占空比

    2024年02月12日
    浏览(42)
  • stm32使用四位数码管制作简易时钟(库函数版)

    1.数码管情况介绍 数码管接线引脚:    段码与上图情况,位选为:1-PB0,2-PB12,3-PB13,4-PB14。 本项目使用5461BS-1共四位数码管,为共阳型。  2.程序部分 Timer定时器: SMG数码管 main主函数 资料参考: (75条消息) STM32F103C8T6 I/O口驱动4位共阳数码管_io口控制数码管_seaup2011的博客-CSDN博

    2024年02月08日
    浏览(41)
  • 51单片机实验三:数码管显示时钟 按键调节时间时闪烁提示

    功能效果:1.时分秒的动态显示。2.用三个按键实现时分秒的修改,调节的数字闪烁提示。  

    2024年02月11日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包