数码管的动态显示(一)

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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值