FPGA通过数码管实现电子时钟
文章目录
- 前言
- 一、原理
- 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)beginif(!rst_n)cnt_1s<=26'd0;else if(cnt_1s==CNTMAX_1s-1)cnt_1s<=26'd0;elsecnt_1s<=cnt_1s+1;
endalways @(posedge clk or negedge rst_n)beginif(!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;elsecnt_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 = 9assign sec_h = din[5:0] / 10 ; // 59 / 10 = 5assign 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)beginif(!rst_n)begincnt_scan <= 16'b0;endelse if(add_cnt_scan)beginif(end_cnt_scan)begincnt_scan <= 16'b0;endelse begincnt_scan <= cnt_scan + 1'b1;endendelse begincnt_scan <= cnt_scan ;endendassign 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)beginsel <= 6'b011_111;endelse if(end_cnt_scan)beginsel <= {sel[0],sel[5:1]};//循环向右移动endelse beginsel <= sel;endend always @(posedge clk or negedge rst_n)beginif(!rst_n)begindata <= 3'b0;dot <= 1'b1;endelse begincase(sel)6'b011_111 : begin data <= sec_l; dot <= 1'b1; end6'b101_111 : begin data <= sec_h; dot <= 1'b1; end6'b110_111 : begin data <= min_l; dot <= 1'b0; end6'b111_011 : begin data <= min_h; dot <= 1'b1; end6'b111_101 : begin data <= hou_l; dot <= 1'b0; end6'b111_110 : begin data <= hou_h; dot <= 1'b1; enddefault : begin data <= 3'b0; dot <= 1'b1;endendcaseendendalways @(posedge clk or negedge rst_n)beginif(!rst_n)begindig <= 8'b0;endelse begincase(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;endcaseendend
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、数码管电子时钟
FPGA通过数码管实现电子时钟相关推荐
- 八位一体共阴极数码管显示电子时钟+闹铃+温度检测
老师一枚,服务于学生,制作了电子时钟融合温度检测的系统. 首先在焊接式前一定要仿真,更要注意仿真引脚和实际引脚的不同. 下面这个链接是常用元器件实物引脚图和解释. CSDNhttps://mp.csd ...
- 51单片机 Proteus仿真 数码管 万年历 电子时钟 阴历阳历 星期 DS1302 修改时间
做了个比较叼的,数码管显示出年月日时分秒星期以及阴历的月份和日期. 按键可以修改年月日时分秒,星期几是根据年月日计算的,阴历也是计算出来的,不用按键修改.
- FPGA课程设计——数字电子时钟VERILOG(基于正点原子新起点开发板,支持8位或6位共阳极数码管显示时分秒毫秒,可校时,可设闹钟,闹钟开关,led指示)
2019级电子科学与技术专业FPGA课程设计 报 告 2022 年 5 月 20 日 多功能数字电子钟的设计 摘要 电子设计自动化(EDA)是一种实现电子系统或电子产品自动化设计的技术,使用ED ...
- 【FPGA】数码管电子时钟
目录 一丶数码管介绍 二丶任务描述 三丶系统框图 四丶模块调用 五丶模块原理图 六丶工程源码 1.计数器模块 2.数码管驱动模块 3.顶层模块 七丶仿真测试 1.TestBench 2.仿真结果 八丶 ...
- 炫彩LED电子时钟制作记录
炫彩LED电子时钟制作笔记 以前也做过2.3寸数码管的电子时钟,但是显示颜色是固定的红色或蓝色.最近因为PCB厂家打样大放血,10*10以内5片只要5元还包邮,网上流出雪花灯,灯珠用的是那种单总线内置 ...
- 【FPGA】数码管电子时钟(可设置时间和闹钟)
目录 前言 一丶需求分析 1.设置时间 2.设置闹钟 二丶工程源码 1.counter 2.seg_driver 3.key_debounce 4.beep 5.顶层模块 三丶模块原理图 四丶管脚信息 ...
- C51单片机的电子时钟(数码管显示)
C51单片机的电子时钟 硬件环境: 相关开发板原理图解析 正式代码: 效果预览图 硬件环境: 普中科技51单片机开发板STC89C52 相关开发板原理图解析 查看这两个原理图,我们可以发现控制这8个数 ...
- 用四位数码管和DS3231时钟模块做车载电子时钟
用四位数码管和DS3231时钟模块做车载电子时钟 本来咱车上收音模块上是有一个时钟的,但换了导航以后,发现时钟不好用了:主界面上有时钟,但位置太靠左侧,俺的大手握方向盘刚好挡住视线,而且在播放音乐时, ...
- 基于51单片机的8位数码管显示的可调时电子时钟
基于51单片机的8位数码管显示的可调时电子时钟 本人大二本科生,第一次发东西,功能比较简单,代码有点复杂,希望能有大神指正. 基于51单片机的不可调时间的时钟显示,晶振为11.0592MHZ,60H ...
最新文章
- JQuery实现滚动广告(转)
- 《Java 2D游戏编程入门》—— 1.5 创建一个主动渲染的窗口
- 【C/C++多线程编程之七】pthread信号量
- android获取apk名称_安卓逆向——APK安装流程
- 第13篇: Flowable-BPMN操作流程之流程进展查看之流程图
- linux 集群管理工具,运维人员能轻松管理集群的必备工具有哪些?
- MUSIC算法---空间谱估计
- 台达PLC,触摸屏程序工程案例 含电气图 台达与伺服变频通讯实例
- Electron 使用Widevine CDM插件
- 人物-发明家-特斯拉:尼古拉·特斯拉
- win10 jFrameDesigner安装
- 概要设计的必要性及写法
- Unity创建渐变背景
- 【产业互联网周报】微软、谷歌再布局边缘云;美团放弃公有云业务;开普云登陆科创板...
- 配置MySQL环境、安装MySQL、解决mysql无法修改密码问题
- (node:22344) [DEP0123] DeprecationWarning: Setting the TLS ServerName to an IP address is not permit
- 从事互联网经营就要办理icp许可证吗
- linux环境下单网卡配置多个IP地址(详细)
- 【AI测试】人工智能测试整体介绍——第六部分
- bootstrap4 黑底白字导航