1.原理
把每一个数码管闪烁的时间设置为1ms,肉眼观察不到就会认为6个数码管在同时闪烁。
实验目标:
使用6位8段数码管实现数码管的动态显示,显示的内容就是0-999_999。当计数到最大值,让他归零,然后循环显示。每0.1秒加1。也就是说第一个0.1秒显示的是0,第2个0。1秒显示的是1。
高电平定义小数点位有效。符号位也是高电平有效。因为没有用到小数点位和符号位,所以一直让其保持低电平。使能信号控制数码管的显示,当为高电平,数码管可以正常显示。
2.代码
2.1data_gen.v
module data_gen#(
parameter CNT_MAX=23'd4999_999,
parameter DATA_MAX=20'd999_999
)
(
input wire sys_clk ,
input wire sys_rst_n ,
output reg[19:0] data ,
output wire[5:0] point ,
output wire sign ,
output reg seg_en
);
reg[22:0] cnt_100ms;
reg cnt_flag;
assign sign=1'b0;
assign point=6'b000_000;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
cnt_100ms<=23'd0;
else if(cnt_100ms==CNT_MAX)
cnt_100ms<=23'd0;
else
cnt_100ms<=cnt_100ms+1'b1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
cnt_flag<=1'b0;
else if(cnt_100ms==CNT_MAX-1'b1)
cnt_flag<=1'b1;
else
cnt_flag<=1'b0;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
data<=20'd0;
else if(data==DATA_MAX)
data<=20'd0;
else if(cnt_flag==1'b1)
data<=data+1'b1;
else
data<=data;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
seg_en<=1'b0;
else
seg_en<=1'b1;
endmodule
2.2 tb_data_gen.v
`timescale 1ns/1ns
module tb_data_gen();
reg sys_clk;
reg sys_rst_n;
wire seg_en ;
wire sign;
wire point;
initial
begin
sys_clk=1'b1;
sys_rst_n<=1'b0;
#20
sys_rst_n<=1'b1;
end
always #10 sys_clk=~sys_clk;
data_gen#(
.CNT_MAX(6'd49),
.DATA_MAX(4'd9)
)
data_gen_inst(
.sys_clk (sys_clk) ,
.sys_rst_n (sys_rst_n),
.data (data),
.point (point),
.sign (sign),
.seg_en (seg_en )
);
endmodule