FPGA通过数码管实现电子时钟

news2024/11/18 21:45:50

文章目录

  • 前言
  • 一、原理
    • 1、共阴极数码管or共阳极数码管
    • 2、共阴极与共阳极的真值表
  • 二、系统设计
    • 1、总体框图:
    • 2、模块调用
    • 3、模块原理图
  • 三、源码
    • 1、计数模块
    • 2、数码管驱动模块
    • 3、顶层模块
  • 四、运行效果
  • 五、总结
  • 六、参考资料


前言

环境:
1、Quartus18.1
2、vscode
3、板子型号:EP4CE6F17C8N


一、原理

视觉暂留原理:人眼在观察景物时,光信号传入大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失,这种残留的视觉称“后像”,视觉的这一现象则被称为“视觉暂留”。
这里我们的数码管其实是在一直切换的,但是由于切换得太快,产生了视觉暂留,从而影响我们的眼睛以为数码管没有变换。

1、共阴极数码管or共阳极数码管

共阴极:公共端为阴极,加阳极数码管点亮。即当真值为1时,数码管点亮;真值为0时,数码管不亮。
共阳极:公共端为阳极,加阴极数码管点亮。即当真值为0时,数码管点亮;真值为1时,数码管不亮。
所以在使用到数码管时,我们需要去判断板子的数码管是共阴极还是共阳极。

在这里插入图片描述

2、共阴极与共阳极的真值表

共阴极真值表:
在这里插入图片描述
共阳极真值表:
在这里插入图片描述

二、系统设计

1、总体框图:

在这里插入图片描述

2、模块调用

在这里插入图片描述

3、模块原理图

在这里插入图片描述

三、源码

1、计数模块

module counter(
    input     wire         clk      ,
    input     wire         rst_n    ,

    output    wire   [16:0] dout
);
localparam [25:0] CNTMAX_1s   = 26'd50_000_000;
localparam [16:0] CNTMAX_days = 17'd86400;
reg [25:0] cnt_1s;
reg [16:0] cnt_days;
wire   [4:0] hour;
wire   [5:0] min ;
wire   [5:0] sec;
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        cnt_1s<=26'd0;
    else if(cnt_1s==CNTMAX_1s-1)
        cnt_1s<=26'd0;
    else
        cnt_1s<=cnt_1s+1;
end

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        cnt_days<=17'd0;
    else if(cnt_days==CNTMAX_days-1&&cnt_1s==CNTMAX_1s-1)
        cnt_days<=17'd0;
    else if(cnt_1s==CNTMAX_1s-1)
        cnt_days<=cnt_days+1;
    else
        cnt_days<=cnt_days;
end
assign hour=cnt_days/3600;
assign min =(cnt_days-(hour*3600))/60;
assign sec =cnt_days-(hour*3600+min*60);
assign dout= {hour,min,sec};
endmodule

2、数码管驱动模块

module seg_driver(  //数码管驱动
    input               clk     ,
    input               rst_n   ,
    input       [16:0]  din     ,

    output reg  [5:0]   sel     , //片选
    output reg  [7:0]   dig       //段选     
);

    // parameter TIME_SCAN = 50_000 ; // 1MS 让片选一直扫描的移动
parameter TIME_SCAN = 50_000;
    parameter   ZER = 7'b100_0000,  // 0亮 1灭
                ONE = 7'b111_1001,
                TWO = 7'b010_0100,
                THR = 7'b011_0000,
                FOR = 7'b001_1001,
                FIV = 7'b001_0010,
                SIX = 7'b000_0010,
                SEV = 7'b111_1000,
                EIG = 7'b000_0000,
                NIN = 7'b001_0000;

    reg    [15:0]   cnt_scan    ; //扫描计数器
    wire            add_cnt_scan;
    wire            end_cnt_scan;

    reg    [3:0]    data        ; //寄存器 缓存数据
    reg             dot         ; //小数点

    wire   [3:0]    sec_l       ;  //秒低位
    wire   [3:0]    sec_h       ;  //秒 高位
    wire   [3:0]    min_l       ;  // 分地位
    wire   [3:0]    min_h       ;  //分高位
    wire   [3:0]    hou_l       ; 
    wire   [3:0]    hou_h       ;

    assign  sec_l = din[5:0]   % 10 ;  // 59 % 10 = 9 
    assign  sec_h = din[5:0]   / 10 ;  // 59 / 10 = 5 
    assign  min_l = din[11:6]  % 10 ;
    assign  min_h = din[11:6]  / 10 ;
    assign  hou_l = din[16:12] % 10 ;
    assign  hou_h = din[16:12] / 10 ;

    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt_scan <= 16'b0;
        end
        else if(add_cnt_scan)begin
            if(end_cnt_scan)begin
                cnt_scan <= 16'b0;
            end
            else begin
                cnt_scan <= cnt_scan + 1'b1;
            end
        end
        else begin
            cnt_scan <= cnt_scan ;
        end
    end

    assign add_cnt_scan = 1'b1;
    assign end_cnt_scan = add_cnt_scan && cnt_scan == TIME_SCAN - 1;

    always @(posedge clk or negedge rst_n)begin   // 片选
        if(!rst_n)begin
            sel <= 6'b011_111;
        end
        else if(end_cnt_scan)begin
            sel <= {sel[0],sel[5:1]};//循环向右移动  
        end
        else begin
            sel <= sel;
        end
    end 

    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            data <= 3'b0;
            dot  <= 1'b1;
        end
        else begin
            case(sel)
                6'b011_111 : begin data <= sec_l; dot <= 1'b1; end
                6'b101_111 : begin data <= sec_h; dot <= 1'b1; end
                6'b110_111 : begin data <= min_l; dot <= 1'b0; end
                6'b111_011 : begin data <= min_h; dot <= 1'b1; end
                6'b111_101 : begin data <= hou_l; dot <= 1'b0; end
                6'b111_110 : begin data <= hou_h; dot <= 1'b1; end
                default : begin data <= 3'b0; dot <= 1'b1;end
            endcase
        end
    end
    
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            dig <= 8'b0;
        end
        else begin
            case(data)
                0 : dig <= {dot,ZER};
                1 : dig <= {dot,ONE};
                2 : dig <= {dot,TWO};
                3 : dig <= {dot,THR};
                4 : dig <= {dot,FOR};
                5 : dig <= {dot,FIV};
                6 : dig <= {dot,SIX};
                7 : dig <= {dot,SEV};
                8 : dig <= {dot,EIG};
                9 : dig <= {dot,NIN};
                default : dig <= 8'b0;
            endcase
        end
    end
endmodule

3、顶层模块

module Clock_top(
    input       clk   ,
    input       rst_n ,

    output  [5:0]  sel ,
    output  [7:0]  dig 
);
wire [16:0] dout;
counter counter_inst(
    .clk      (clk),
    .rst_n    (rst_n),
    
    .dout(dout)
);
seg_driver seg_driver_inst(  //数码管驱动
    .clk     (clk),
    .rst_n   (rst_n),
    .din     (dout),

    .sel     (sel), //片选
    .dig     (dig)  //段选     
);
endmodule

四、运行效果

数码管实现电子时钟


五、总结

此次的工程并不难,只是需要我们对基础有一定的理解能力即可。首先是必须的计时器的实现,还有就是对数码管的片选、段选的操作。

六、参考资料

1、共阴极和共阳数码管详解
2、数码管电子时钟

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

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

相关文章

cloud在gateway支持https和http请求

在项目中遇到既要支持http协议请求和https协议请求的场景&#xff0c;结合场景有两种解决方案&#xff1a; 第一种&#xff1a;编程实现&#xff0c;第二种&#xff1a;反向代理。 首先我们要清楚http和https的区别&#xff0c;百度过来一点 HTTP&#xff08;HTTP&#xff0…

目标检测之Neck选择

文章来自于&#xff1a;曲終人不散丶知乎&#xff0c; 连接&#xff1a;https://www.zhihu.com/people/qu-zhong-ren-bu-san-zhu-45/posts&#xff0c; 本文仅用于学术分享&#xff0c;如有侵权&#xff0c;前联系后台做删文处理。 Neck是目标检测框架中承上启下的关键环节。它…

Golang Gin 多数据格式返回请求结果

下面介绍返回类型如下&#xff1a; [ ]byte和stringJSON格式HTML模板渲染静态资源设置 背景 在前面的课程中&#xff0c;我们已经学习和掌握了多类型的网络请求和处理&#xff0c;还掌握了提交数据与结构体绑定的操作。我们都知道&#xff0c;一个完整的请求包含请求、处理请求…

掌握Linux操作系统:一步步引导您成为Linux专家

Linux是一种流行的操作系统&#xff0c;我们可以在服务器、桌面电脑和移动设备上使用它。基本的Linux知识可以帮助您理解操作系统如何工作&#xff0c;以及如何为您的计算机提供安全和可靠的环境。下面是一些方法&#xff0c;可以帮助您学习Linux&#xff1a; 安装Linux操作系统…

4月京东生鲜水果行业数据报告:榴莲销量增长400%,市场格局剧变

众所周知&#xff0c;今年水果领域的一个重磅消息就是&#xff1a;榴莲价格暴跌。目前全国多地线下水果专卖店、农贸市场的榴莲价格都在下滑&#xff0c;有的地区在4月底甚至已经降至最低每斤20元左右。预测在5月的销售旺季&#xff0c;价格还有望一路向下。 •榴莲逆袭苹果&am…

二十一、线索转换2:线索公司信息到客户表,线索中个人信息到联系人

功能需求 1.线索的关联公司信息--》客户表 2.线索的个人信息--》联系人 3.线索的公司备注信息--》客户备注 4.线索的个人信息---》联系人备注 5.线索-市场 --> 联系人和市场 6.创建交易&#xff0c;交易表添加记录 7.创建交易&#xff0c;线索的备注-->交易备注 …

JMeter自动化压力测试-http

下载&#xff1a; Apache JMeter - Download Apache JMeterhttps://jmeter.apache.org/download_jmeter.cgi 安装&#xff1a; JDK 版本要求为 1.8。 一、Jmeter 介绍 1.1、Jmeter 有什么样功能 Apache JMeter 是一个开源、纯 Java、优秀的性能测试工具 能够测试许多不同的应…

lua | 运算符与字符串

目录 一、运算符 算数运算符 关系运算符 逻辑运算符 其他运算符 运算符优先级 二、字符串 转义字符 方法与用途 字符串截取 字符串大小转换 字符串查找与反转 字符串格式化 字符与整数的转换 匹配模式 本文章为笔者学习分享 学习网站&#xff1a;Lua 基本语法 | …

分享三种高效的方法,快速将一个PDF文件分割成两个!

如何将一个PDF分割成两个&#xff1f;PDF文件在学习和工作中都是常用的文件格式&#xff0c;但是有时候我们可能只需要其中的一部分内容&#xff0c;这时候就需要将PDF文件分割成两个或多个。本文将分享三种不同的方法&#xff0c;供大家参考。 一、使用在线工具分割 记灵在线…

设计模式:DDD领域驱动设计

领域 Domain-driven design DDD 强调是说得先把 “领域” 中涉及到的数据、流程、规则等都弄明白了&#xff0c;然后以面向对象的观点为其建立一个模型&#xff08;即领域模型&#xff09;&#xff0c;而这个模型&#xff0c;决定了你将用什么技术、什么架构、什么平台来实现这…

国产仪器 1652A/1652B 函数/任意波形发生器

1652A函数/任意波形发生器采样率2.5GSa/s&#xff0c;垂直分辨率14bits&#xff0c;最高输出频率500MHz&#xff08;直流耦合模式&#xff09;&#xff0c;双通道&#xff0c;存储深度1G点/通道&#xff1b;1652B函数/任意波形发生器采样率5GSa/s&#xff08;插值到10GSa/s&…

【Flink】DataStream API使用之执行环境

1. 执行环境 Flink 程序可以在各种上下文环境中运行&#xff1a;我们可以在本地 JVM 中执行程序&#xff0c;也可以提交 到远程集群上运行。不同的环境&#xff0c;代码的提交运行的过程会有所不同。这就要求我们在提交作业执行计算时&#xff0c;首先必须获取当前 Flink 的运…

【Unity3D插件】动态连线插件CustomWire,使用教程

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 CustomWire插件可以在Unity3D中实现动态连线&#xff0c;将三维…

ADAudit Plus的UEBA功能如何解决企业面临的安全挑战

随着企业信息系统的不断发展和扩大&#xff0c;越来越多的安全威胁开始涌现。从内部员工的误操作到外部黑客的入侵&#xff0c;企业信息系统的安全风险日益增加。为了保护企业的关键数据和业务&#xff0c;企业需要采取一系列的安全措施。而其中一项关键的安全措施是实时监控和…

【BingChat】Microsoft Edge/Bing Chat 注册使用完全指南

欢迎关注【youcans的学习笔记】原创作品&#xff0c;火热更新中 【BingChat】Microsoft Edge/Bing Chat 注册使用完全指南 1. BingChat 简介2. BingChat 用户注册2.1 下载微软浏览器 Edge 预览版2.2 申请微软账户2.3 登录 Bing.com2.4 手机/平板使用 BingChat 3. BingChat 的聊…

P1056 [NOIP2008 普及组] 排座椅

题目描述 上课的时候总会有一些同学和前后左右的人交头接耳&#xff0c;这是令小学班主任十分头疼的一件事情。不过&#xff0c;班主任小雪发现了一些有趣的现象&#xff0c;当同学们的座次确定下来之后&#xff0c;只有有限的 &#xfffd;D 对同学上课时会交头接耳。 同学们…

【OpenSSH】无需公网IP使用SSH远程连接服务器

文章目录 前言视频教程1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 转…

家里小孩要去学网络安全,网络安全行业前景到底怎么样?

最近接待了很多学生家长来咨询网络安全学习的问题。 家长们最主要关注三点&#xff1a;什么是网络安全&#xff1f;网络安全行业前景好吗&#xff1f;工资能拿多少&#xff1f;哪些专业什么学历可以学习网络安全&#xff1f; 那么盾叔就来综合解答一下。 什么是网络安全&…

UG NX二次开发(C#)-建模-判断一条曲线是否封闭的方法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在UG NX中创建一条不封闭的曲线和一条封闭的曲线3、函数说明4、代码5、测试1、前言 前面有个博客介绍了边UG NX二次开发(C#)-建模-判断一条曲线是不是封闭,但是这个博客是判断边对象是…

Interest-aware Message-Passing GCN for Recommendation(www 21)

论文地址&#xff1a;https://arxiv.org/abs/2102.10044 BACKGROUND GCN信息聚合的模式非常适合推荐&#xff0c;但众所周知在模型设计的时候通常只能堆叠2-3层&#xff0c;再多就会出现过平滑问题&#xff08;结点特征之间没有区分度&#xff09;&#xff0c;LightGCN证明了G…