//***********Copyright (c)************//
//-------------------------------------
// File name: my_seg_led_static
// Last modified Date: 2020/6/18 18:30
// Last Version: V1.1
// Descriptions: 静态数码管
//-------------------------------------
// 引脚分配,6位8段数码管
// sys_clk input E1
// sys_rst_n input M1
// sel[0] output N16 数码管位选0
// sel[1] output N15 数码管位选1
// sel[2] output P16 数码管位选2
// sel[3] output P15 数码管位选3
// sel[4] output R16 数码管位选4
// sel[5] output T15 数码管位选5
// seg_led[0] output M11 数码管段选a
//-------------------------------------
//*************************************//
//顶层代码如下
module my_seg_led_static_top
(
input sys_clk,
input sys_rst_n,
output [5:0] sel, //定义位选
output [7:0] seg_led //定义段选
);
//parameter define
parameter TIME_SHOW = 25'd25000_000;
//wire define
wire add_flag;
//**************************************
//** main code
//**************************************
//程序例化
seg_led_static u_seg_led_static (
//modele clock
.sys_clk (sys_clk ), // 模块时钟信号
.sys_rst_n (sys_rst_n), // 复位信号(低有效)
//seg_led interface
.sel (sel ), //数码管显示控制
.seg_led (seg_led ), //数码管显示的数据
.add_flag (add_flag ) // 数值增1标志信号
);
time_counter #(.MAX_NUM(TIME_SHOW)
) u_time_counter(
//system clock
.sys_clk (sys_clk ), // 时钟信号
.sys_rst_n (sys_rst_n), // 复位信号
//user interface
.flag (add_flag ) // 数值增1标志信号
);
endmodule
//计时模块代码如下
module time_counter
(
input sys_clk,
input sys_rst_n,
output reg flag //计数器标志
);
//parmeter define
parameter MAX_NUM=25000_000; //参数型常量
//计数器最大值,定时0.5s
//reg define
reg [24:0] counter ; //时钟分频计数器 25位
//**************************************
//** main code
//**************************************
always @(posedge sys_clk or negedge sys_rst_n)
begin
if(!sys_rst_n)begin //如果复位
flag<=1'b0; //复位标志归0
counter<=25'b0; //计数器重赋0
end
else if(counter<MAX_NUM-1'b1)begin
flag<=1'b0; //也占一个机器周期 -1
counter=counter+1'b1; //开始计数
end
else begin //counter>=MAX_NUM-1'b1
flag<=1'b1;
counter<=25'b0;
end
end
endmodule
//数码管静态显示代码
module seg_led_static
(
input sys_clk,
input sys_rst_n,
input add_flag,
output reg [5:0] sel, //6位数码管位选
output reg [7:0] seg_led //8位数码管段选
);
//reg define
reg [3:0] num; //数码管显示的数字 0-F 4位表示16个数字
//**************************************
//** main code
//**************************************
//控制数码管位选(低电平有效)
always @ (posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n) //如果复位
sel<=6'b111111; //全灭
else
sel<=6'b000000; //全亮
end
//每间隔0.5s(flag<=1),累加1
always @ (posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n) //如果复位
num <=4'h0; //复位则显示0
else if(add_flag) begin //计数标志为1
if(num<=4'hf)
num<=num+1'b1;
else
num<=4'h0;
end
else
num<=num; //计数时间未到则保持
end
//段选信号代码 共阳数码管(低电平有效)
always @ (posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
seg_led<=8'b0;
else begin
case (num) //定义数码管段码值
4'h0 : seg_led <= 8'b1100_0000;
4'h1 : seg_led <= 8'b1111_1001;
4'h2 : seg_led <= 8'b1010_0100;
4'h3 : seg_led <= 8'b1011_0000;
4'h4 : seg_led <= 8'b1001_1001;
4'h5 : seg_led <= 8'b1001_0010;
4'h6 : seg_led <= 8'b1000_0010;
4'h7 : seg_led <= 8'b1111_1000;
4'h8 : seg_led <= 8'b1000_0000;
4'h9 : seg_led <= 8'b1001_0000;
4'ha : seg_led <= 8'b1000_1000;
4'hb : seg_led <= 8'b1000_0011;
4'hc : seg_led <= 8'b1100_0110;
4'hd : seg_led <= 8'b1010_0001;
4'he : seg_led <= 8'b1000_0110;
4'hf : seg_led <= 8'b1000_1110;
default : seg_led <= 8'b1100_0000;
endcase
end
end
endmodule