要点:定时轮询6位数码管的使能位,通过人眼的视觉差动态显示数码管信息。
1、模块信息
module seg_led_driver(
input sys_clk,
input sys_rst_n,
input [5:0] point, //数码管point的显示状态,0为显示,1为不显示;
input seg_en, //数码管使能,0为关闭,1为打开
input seg_sign, //数码管符号位(负号),0为不显示,1为显示;
input [19:0] data, //当前要显示的数据
output reg[5:0] seg_cs, //数码管的6位片选位,低电平有效
output reg[7:0] seg_led //数码管的数据总线
);
2、需要用的变量
localparam CLK_DIV = 4'd10; //时钟分频系数,要对系统时钟10分频
localparam MAX_CNT = 13'd5000; //数码管5M时钟下1ms所需的最大计数
reg[3:0] clk_cnt; //时钟分频计数器;
reg seg_clk; //数码管时钟,5Mhz
reg[23:0] seg_num; //6位数码管的24位BCD码计数器
reg[12:0] cnt_1ms; //1ms的计数器
reg flag_1ms; //1ms计数完成标志
reg[2:0] cnt_cs; //数码管选位(片选)计数器
reg[3:0] seg_dip; //当前数码管显示的数据
reg dot_dip; //当前数码管显示的point
//每位数码管需要显示的数据
wire[3:0] data0; //个位
wire[3:0] data1; //十位
wire[3:0] data2; //百位
wire[3:0] data3; //千位
wire[3:0] data4; //万位
wire[3:0] data5; //十万位
3、获得每位数码管要显示的数据
//获取各数位对应的十进制数据
assign data0 = data % 4'd10; //个位数
assign data1 = data / 4'd10 % 4'd10; //十位数
assign data2 = data / 7'd100 % 4'd10; //百位数
assign data3 = data / 10'd1000 % 4'd10; //千位数
assign data4 = data / 14'd10000 % 4'd10; //万位数
assign data5 &#