FPGA项目设计:数字时钟

news2024/11/17 7:37:49

项目要求:
设计一个数字时钟,数码管前两位显示小时,数码管中间两位显示分钟,数码管后面两位显示秒。

项目设计:
系统框架图:
在这里插入图片描述
计数模块时序图:
在这里插入图片描述
代码实现:
计数模块:

/*
 * @Description: 用于记数产生时钟
 * @Author: Fu Yu
 * @Date: 2023-08-02 11:16:46
 * @LastEditTime: 2023-08-02 15:23:14
 * @LastEditors: Fu Yu
 */

module counter (
    input       wire            clk         ,
    input       wire            rst_n       ,

    output      wire [23:0]     clock_data      //输出时钟数值
);

parameter   MAX_1S    = 26'd49_999_999;//1s
parameter   MAX_S     = 6'd59;//1S*60 = 1min
parameter   MAX_MIN   = 6'd59;//1min*60 = 1h
parameter   MAX_H     = 5'd23;//1h*24 = 1d

localparam  INIT_S = 40,//赋初值
            INIT_M = 58,
            INIT_H = 23;

reg [25:0]  cnt_1s;
reg [5:0]   cnt_s;
reg [5:0]   cnt_min;
reg [4:0]   cnt_h;

reg [3:0]   time_s_low;
reg [3:0]   time_s_high;
reg [3:0]   time_min_low;
reg [3:0]   time_min_high;
reg [3:0]   time_h_low;
reg [3:0]   time_h_high;

wire add_cnt_1s;
wire end_cnt_1s;

wire add_cnt_s;
wire end_cnt_s;

wire add_cnt_min;
wire end_cnt_min;

wire add_cnt_h;
wire end_cnt_h;

//****************************************************************
//--1s计数器
//****************************************************************
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        cnt_1s <= 26'd0;
    end
    else if(add_cnt_1s) begin
        if(end_cnt_1s) begin
            cnt_1s <= 26'd0;
        end
        else begin
            cnt_1s <= cnt_1s + 1'd1;
        end
    end
    else begin
        cnt_1s <= cnt_1s;
    end
end

assign add_cnt_1s = 1'b1;
assign end_cnt_1s = add_cnt_1s && cnt_1s == MAX_1S;

//****************************************************************
//--秒计数器
//****************************************************************
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        cnt_s <= INIT_S;
    end
    else if(add_cnt_s) begin
        if(end_cnt_s) begin
            cnt_s <= 6'd0;
        end
        else begin
            cnt_s <= cnt_s + 1'd1;
        end
    end
    else begin
        cnt_s <= cnt_s;
    end
end

assign add_cnt_s = end_cnt_1s;
assign end_cnt_s = add_cnt_s && cnt_s == MAX_S;

//****************************************************************
//--分钟计数器
//****************************************************************
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        cnt_min <= INIT_M;
    end
    else if(add_cnt_min) begin
        if(end_cnt_min) begin
            cnt_min <= 6'd0;
        end
        else begin
            cnt_min <= cnt_min + 1'd1;
        end
    end
    else begin
        cnt_min <= cnt_min;
    end
end

assign add_cnt_min = end_cnt_s;
assign end_cnt_min = add_cnt_min && cnt_min == MAX_MIN;

//****************************************************************
//--小时计数器
//****************************************************************
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        cnt_h <= INIT_H;
    end
    else if(add_cnt_h) begin
        if(end_cnt_h) begin
            cnt_h <= 5'd0;
        end
        else begin
            cnt_h <= cnt_h + 1'd1;
        end
    end
    else begin
        cnt_h <= cnt_h;
    end
end

assign add_cnt_h = end_cnt_min;
assign end_cnt_h = add_cnt_h && cnt_h == MAX_H;

//****************************************************************
//--clock_data
//****************************************************************
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        time_s_high <= 4'd0;
        time_s_low <= 4'd0;
        time_min_high <= 4'd0;
        time_min_low <= 4'b0;
        time_h_high <= 4'd0;
        time_h_low <= 4'd0;
    end
    else begin
        time_h_high <= cnt_h/10;
        time_h_low <= cnt_h%10;
        time_min_high <= cnt_min/10;
        time_min_low <= cnt_min%10;
        time_s_high <= cnt_s/10;
        time_s_low <= cnt_s%10;
    end
end

assign clock_data = {time_h_high,time_h_low,time_min_high,time_min_low,time_s_high,time_s_low};

endmodule //counter

数码管显示模块:

/*
 * @Description: 数码管显示模块,前两位显示时钟数据的小时,中间两位显示时间数据的分钟,最后两位显示时间数据的秒
 * @Author: Fu Yu
 * @Date: 2023-08-02 13:43:47
 * @LastEditTime: 2023-08-02 14:00:00
 * @LastEditors: Fu Yu
 */


module seg_driver (
    input       wire            clk             ,
    input       wire            rst_n           ,
    input       wire [23:0]     clock_data_in   ,

    output      wire [5:0]      sel             ,//位选信号
    output      wire [7:0]      dig                 //段选信号
);

parameter MAX_1MS = 16'd49_999;//1ms

parameter   ZERO  = 7'b100_0000,
            ONE   = 7'b111_1001,
            TWO   = 7'b010_0100,
            THREE = 7'b011_0000,
            FOUR  = 7'b001_1001,
            FIVE  = 7'b001_0010,
            SIX   = 7'b000_0010,
            SEVEN = 7'b111_1000,
            EIGHT = 7'b000_0000,
            NINE  = 7'b001_0000;

reg [5:0] sel_r;
reg [7:0] dig_r;
reg [5:0] point_n;//小数点
reg point_n_r;
reg [3:0]   disp_data   ;//每一位数码管显示的数值

reg [15:0]  cnt_1ms;
wire add_cnt_1ms;
wire end_cnt_1ms;

//****************************************************************
//--1ms计数器
//****************************************************************
always @(posedge clk or negedge rst_n)begin 
   if(!rst_n)begin
        cnt_1ms <= 16'd0;
    end 
    else if(add_cnt_1ms)begin 
        if(end_cnt_1ms)begin 
            cnt_1ms <= 16'd0;
        end
        else begin 
            cnt_1ms <= cnt_1ms + 1'b1;
        end 
    end
end 

assign add_cnt_1ms = 1'b1;
assign end_cnt_1ms = add_cnt_1ms && cnt_1ms == MAX_1MS;

//****************************************************************
//--point_n
//****************************************************************
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        point_n <= 6'b111_111;
    end
    else begin
        point_n <= 6'b110101;
    end
end

//****************************************************************
//--sel
//****************************************************************
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        sel_r <= 6'b111110;
    end
    else if(end_cnt_1ms) begin
        sel_r <= {sel_r[4:0],sel_r[5]};
    end
    else begin
        sel_r <= sel_r;
    end
end

assign sel = sel_r;

//****************************************************************
//-- disp_data   
//****************************************************************
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        disp_data <= 4'd0;
        point_n_r <= 1'b1;
    end
    else begin
        case (sel_r)
            6'b111110 : begin
                disp_data <= clock_data_in[23:20];
                point_n_r <= point_n[0];
            end
            
            6'b111101 : begin
                disp_data <= clock_data_in[19:16];
                point_n_r <= point_n[1];
            end

            6'b111011 : begin
                disp_data <= clock_data_in[15:12];
                point_n_r <= point_n[2];
            end

            6'b110111 : begin
                disp_data <= clock_data_in[11:8];
                point_n_r <= point_n[3];
            end

             6'b101111 : begin
                disp_data <= clock_data_in[7:4];
                point_n_r <= point_n[4];
            end

            6'b011111 : begin
                disp_data <= clock_data_in[3:0];
                point_n_r <= point_n[5];
            end
        endcase
    end
end

//****************************************************************
//--dig
//****************************************************************
always @(*)begin 
        case (disp_data)
            0 :  dig_r <= {point_n_r,ZERO  };
            1 :  dig_r <= {point_n_r,ONE   };
            2 :  dig_r <= {point_n_r,TWO   };
            3 :  dig_r <= {point_n_r,THREE };
            4 :  dig_r <= {point_n_r,FOUR  };
            5 :  dig_r <= {point_n_r,FIVE  };
            6 :  dig_r <= {point_n_r,SIX   };
            7 :  dig_r <= {point_n_r,SEVEN };
            8 :  dig_r <= {point_n_r,EIGHT };
            9 :  dig_r <= {point_n_r,NINE  };
           
            default: dig_r <= 8'hff;
        endcase
    end

assign dig = dig_r;

endmodule //seg_driver

顶层文件:

module top (
    input           wire        clk     ,
    input           wire        rst_n   ,

    output          wire [5:0]  sel     ,
    output          wire [7:0]  dig         
);

wire [23:0] data;

counter u_counter(
    .     clk        (clk) ,
    .     rst_n      (rst_n) ,

    .     clock_data    (data)
);


seg_driver u_seg_driver (
    .     clk            (clk) ,
    .     rst_n          (rst_n) ,
    .     clock_data_in  (data),

    .     sel            (sel) ,
    .     dig              (dig)
);

endmodule //top

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/827167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

走进人工智能|自动驾驶 开启智能出行新时代

前言 自动驾驶&#xff0c;也被称为无人驾驶或自动驾驶汽车&#xff0c;是指能够在没有人类干预的情况下自主地感知环境、决策和控制车辆行驶的技术和系统。 文章目录 前言主题发展趋势自动驾驶等级L0级自动驾驶L1级别自动驾驶L2级别自动驾驶L3级别自动驾驶L4级别自动驾驶L5级…

C# Microsoft消息队列服务器的使用 MSMQ

先安装消息队列服务器 private static readonly string path ".\\Private$\\myQueue";private void Create(){if (!MessageQueue.Exists(path)){MessageQueue.Create(path);}}private void Send(){Stopwatch stopwatch new Stopwatch();stopwatch.Start();Message…

em3288 linux_4.19 lvds+tp调试

一、显示配置\rk3288_linux4.19\kernel\arch\arm\boot\dts\rk3288-evb-act8846.dtspanel {compatible "simple-panel";backlight <&backlight>;bus-format <MEDIA_BUS_FMT_RGB666_1X18>;enable-gpios <&gpio1 24 GPIO_ACTIVE_HIGH>;ena…

2023年中职组“网络安全”赛项吉安市竞赛任务书

2023年中职组“网络安全”赛项 吉安市竞赛任务书 一、竞赛时间 总计&#xff1a;360分钟 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略配置 A-3 流量完整性保护 A-4 事件监控 A-5 服务加固…

基于Java的房屋租赁系统设计与实现(源码+lun文+数据库)

对于需要租房的人&#xff0c;有的可能没有时间去街上广告处查看房屋信息&#xff1b;对于房屋出租者来说&#xff0c;大量复杂的房产信息、租金等信息很难通过传统的方式进行管理。以方便租客租房&#xff0c;房东求租、求售的需求为向导&#xff0c;开发一套基于web的房屋管理…

数字图像处理-彩色图像处理

文章目录 一、彩色模型1.1RGB彩色模型1.2CMY和CMYK彩色模型1.3HSI彩色模型 二、伪彩色图像处理2.1灰度分层2.2灰度到彩色的变换 三、彩色图像的分割3.1RGB中的彩色图像分割3.2彩色边缘检测 一、彩色模型 1.1RGB彩色模型 RGB空间是生活中最常用的一个模型&#xff0c;电视机、…

2D视觉检测算法整理

1.ROI pooling 和 ROI align的区别 ROI pooling第一步根据候选区域找特征图的位置&#xff0c;可能不是刚好对应&#xff0c;需要一次量化&#xff0c;如上图所示&#xff0c;第二次是特征图需要转化为特定的大小&#xff0c;这时候pooling可能也不能正好整除&#xff0c;所以第…

Vue3状态管理库Pinia——实现简易版购物车

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

重排序问题(详细说明指令重排序)

在执行程序时&#xff0c;为了提高性能&#xff0c;编译器和处理器常常会对指令做重排序。 重排序分3种类型。 编译器优化的重排序。编译器在不改变单线程程序语义的前提下&#xff0c;可以重新安排语句的执行顺序。 指令级并行的重排序。现代处理器采用了指令级并行技术&…

MySQL主从复制原理以及实操

一、MySQL主从复制原理&#xff1a; 1、MySQL将数据变化记录到二进制日志中&#xff1b; 2、Slave将MySQL的二进制日志拷贝到Slave的中继日志中&#xff1b; 3、Slave将中继日志中的事件在做一次&#xff0c;将数据变化&#xff0c;反应到自身&#xff08;Slave&#xff09;的数…

在Geogle Drive 上面下载压缩的文件

需要使用到 OCC3D 上面 的Waymo Occupancy 真值。 Occ3d 应该是一个文件夹里面有很多 个压缩包&#xff0c;如果直接下载 会下载很多个文件。 双击点进去 选择好对应的序列再进行下载。 这里的 000 001 应该是对应的 waymo 的相机序列。 waymo 的相机序列也是798 个序列

【数据结构】常见的排序算法

常见的排序算法 常见的排序算法插入排序之直接插入排序时间复杂度特性总结 插入排序之希尔排序时间复杂度 选择排序之直接选择排序特性总结 选择排序之堆排序时间复杂度特性总结 交换排序之冒泡排序特性总结 交换排序之快速排序hoare版本挖坑法双指针法快速排序的优化1&#xf…

(YouTube)KDBA QML 学习笔记1

&#xff08;YouTube&#xff09;KDBA QML 学习笔记 旧版本(QML文件介绍) main.qml import QtQuick 2.0Text {text: "Hell World" }main.cpp #include <QtQuick>int mian(int argc, char *argn[]) {QGuiApplication app(argc, argv);//QT开始 QQuickvi…

maven下载安装及初次使用相关配置

maven下载按照及初次使用相关配置 一、下载 与安装 下载完解压放在文件夹中即可&#xff01; 依赖Java&#xff0c;需要配置JAVA_HOME设置MAVEN自身的运行环境&#xff0c;需要配置MAVEN_HOME&#xff08;参考安装java&#xff09;测试环境配置结果 MVN测试成功&#xff01…

大牛练成记:用JavaScript徒手写出一个日期选择插件

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;100个JavaScript的小应用。 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收…

OpenMMLab MMDetectionV3.1.0-SAM(环境安装、模型测试、训练以及模型后处理工具)

OpenMMLab Playground 概况 当前通用目标检测的研究方向正在朝着大型多模态模型发展。除了图像输入之外&#xff0c;最近的研究成果还结合了文本模式来提高性能。添加文本模态后&#xff0c;通用检测算法的一些非常好的属性开始出现&#xff0c;例如&#xff1a; 可以利用大量…

【多线程系列-04】深入理解java中线程间的通信机制

多线程系列整体栏目 内容链接地址【一】深入理解进程、线程和CPU之间的关系https://blog.csdn.net/zhenghuishengq/article/details/131714191【二】java创建线程的方式到底有几种&#xff1f;(详解)https://blog.csdn.net/zhenghuishengq/article/details/127968166【三】深入…

如何通过 5 步激活策略扩大用户群

假设&#xff0c;你现在是一个“深藏功与名”的增长黑客。前期你表现非常好&#xff0c;做了一些拉新实验&#xff0c;每天都有上千用户进入到产品。团队成员和家人朋友都非常开心你们的产品增长终于有了起色。 然而&#xff0c;如果你不重视拉新&#xff08;acquisition&…

TI的IWR6843跑3D People Tracking(3D人体检测追踪实验)demo的上手教程

1.硬件准备 1.IWR6843板子 2.两个USB转串口模块&#xff08;因为我的是自己做的板子&#xff0c;板子上没有集成USB转串口芯片&#xff09; 2.软件准备 1.最新版本的CCS&#xff0c;注意后缀没有THEIA https://www.ti.com/tool/CCSTUDIO?DCMPdsp_ccs_v4&HQSccs 2.最新…

速通pytorch库

速通pytorch库&#xff08;长文&#xff09; 前言 ​ 本篇文章主要为那些对于pytorch库不熟悉、还没有上手的朋友们准备&#xff0c;梳理pytorch库的主要内容&#xff0c;帮助大家入门深度学习最重要的库之一。 目录结构 文章目录 速通pytorch库&#xff08;长文&#xff09;1.…