hc595_ctl
shizhong
第一次写csdn,自学FPGA有一段时间了,七月中旬买的开发板,到现在一个多月终于稍微学懂点FPGA了。
这个分享的是野火FPGA开发指南数码管动态显示拓展训练的试题。
一开始一头雾水,野火教程只讲到动态扫描,自己在网上找秒表的教程,很少,并且野火的板子是使用74hc595驱动数码管,这点跟其他平台的板子不太一样。参考了明德扬一个教程里面的设计方法。
实验目标是生成一个时分秒时钟,设计思路是分别对时分秒的个位,十位进行设计,正好对应6段数码管。计时设计完成之后,直接用顶层模块调用shizhong模块和74hc595驱动模块,74hc595驱动原理野火有详细教程,话不多说直接上代码。
时钟设计
module shizhong
(
input sys_clk,//50MHz
input sys_rst_n,//复位信号
output wire[7:0] seg,//数码管段选信号,
output wire[5:0] sel//位选信号
);
parameter CNT_MAX = 50_000;//动态扫描计时最大值
parameter CNT_MAX_1S = 50_000_000;//1s计数器计时最大值
reg[15:0] cnt_1ms;//动态扫描
reg[2:0] cnt_6;//对动态扫描计时6次,方便位选
reg[5:0] sel_reg;//位选信号中间变量
reg[25:0] cnt_1s;//1s计数器
reg[3:0] m_g;//秒个位
reg[2:0] m_s;
reg[3:0] f_g;
reg[3:0] f_s;
reg[3:0] s_g;
reg[3:0] s_s;
reg[7:0] seg_reg;//段选信号中间变量
reg[3:0] x;//对时个位变量法计数最大值,因为时个位的跳转可能为9(9,19),也可能为3(23)
reg[3:0] data;//很重要,将时分秒各数据赋值到数码管的中间变量
//设置动态扫描时间为1ms的计时器cnt_1ms
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==0)
cnt_1ms <= 0;
else if(cnt_1ms==CNT_MAX-1)
cnt_1ms <= 0;
else
cnt_1ms <= cnt_1ms + 1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==0)
cnt_6 <= 0;
else if((cnt_1ms==CNT_MAX-1)&&(cnt_6 > 3'd4))
cnt_6 <= 0;
else if(cnt_1ms==CNT_MAX-1)
cnt_6 <= cnt_6 + 1;
else
cnt_6 <= cnt_6;
//位选信号sel_reg 赋值
always@(posedge sys_clk or negedge sys

本文记录了作者自学FPGA的过程,通过野火征途Pro开发板实现数码管动态显示的秒表设计。面对74HC595驱动的数码管,作者参考了其他教程并成功设计出时分秒时钟。文章强调了FPGA学习中的实践操作、模块调用、仿真与调试的重要性,认为不断试错是快速进步的关键。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



