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;elsecnt_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;elsecnt_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;elsedata<=data;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)seg_en<=1'b0;elseseg_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 beginsys_clk=1'b1;sys_rst_n<=1'b0;#20sys_rst_n<=1'b1;endalways #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