使用verilog中的计数器知识,实现多数码管循环显示功能

本次设计为数码管的循环显示,开发板上有8个数码管,使用全部数码管进行数字显示。

1.具体要求

1.复位时,数码管0亮,显示数字0、

2.复位后,数码管0显示数字0,持续1秒,其他数码管灭。然后数码管1显示数字1,持续2秒,其他数码管灭。以此类推,一直到数码管7显示数字7,持续8秒,其他数码管灭。

3.重复步骤2.

2.所用信号

clk                           系统工作时钟 50 MHz。

rst_n                        复位信号。

segment                  数码管的选段信号,共7位,从低到高。依次为a,b,c,d,e,f,g.  0为灭,1为亮。

seg_sel                   选择数码管的信号,共8位,从低到高。0为灭,1为亮。

 

 3.思路

1.一个一秒的计数器:time_1s.

2.一个36秒的计数器:time_36s.

3.数码管显示数字.

4.选择数码管.

 

4.实现代码

module duoshumaguan(

input clk,
input rst_n,

output [6:0] dout_seg,
output [7:0] dout_sel
    );
reg [6:0]  segment ;
reg [7:0]  seg_sel ;
reg [5:0]  time_36s;
reg [25:0] time_1s ;

parameter t = 50_000_000 - 1;
parameter data0 = 7'b1111_110;
parameter data1 = 7'b0110_000;
parameter data2 = 7'b1101_101;
parameter data3 = 7'b1111_001;
parameter data4 = 7'b0110_011;
parameter data5 = 7'b1011_011;
parameter data6 = 7'b1011_111;
parameter data7 = 7'b1110_000;

//第一步,一秒计数器
always @(posedge clk or negedge rst_n)begin
	if(!rst_n)
		time_1s <= 0;
	else if(time_1s == t )
		time_1s <= 0;
	else
		time_1s <= time_1s + 1;
end

//第二步,36秒的计数器
always @(posedge clk or negedge rst_n)begin
	if(!rst_n)
		time_36s <= 0;
	else if (time_1s == t)
			if(time_36s == 35)
		time_36s <= 0;
	else
		time_36s <= time_36s + 1;		
end

//第三步,数码管显示数字
always @(posedge clk or negedge rst_n)begin
	if(!rst_n)
		segment <= data0;
	else if(time_36s == 1)	
		segment <= data1;
	else if(time_36s == 3)
		segment <= data2;
	else if(time_36s == 6)
		segment <= data3;
	else if(time_36s == 10)
		segment <= data4;
	else if(time_36s == 15)
		segment <= data5;
	else if(time_36s == 21)
		segment <= data6;
	else if(time_36s == 27)
		segment <= data7;
	else if(time_36s == 35)
		segment <= data0;
	else 
		segment <= segment;
end

assign dout_seg = segment;

//第四步,选择数码管
always @(posedge clk or negedge rst_n)begin
	if(!rst_n)
		seg_sel <= 8'b0000_0001;
	else if (time_36s == 1)
		seg_sel <= 8'b0000_0010;
	else if (time_36s == 3)
		seg_sel <= 8'b0000_0100;
	else if (time_36s == 6)
		seg_sel <= 8'b0000_1000;
	else if (time_36s == 10)
		seg_sel <= 8'b0001_0000;
	else if (time_36s == 15)
		seg_sel <= 8'b0010_0000;
	else if (time_36s == 21)
		seg_sel <= 8'b0100_0000;
	else if (time_36s == 28)
		seg_sel <= 8'b1000_0000;
	else if (time_36s == 35)
		seg_sel <= 8'b0000_0001;
	else
		seg_sel <= seg_sel;
end

assign dout_sel = seg_sel;

endmodule

 

5.仿真模块

module duoshumaguan_m(   );

reg               clk    ;
reg             rst_n    ;
 
 
wire [6:0]  dout_seg    ;
wire [7:0]  dout_sel    ;


initial begin
	clk = 0;
	rst_n = 0;
	
    #210
    rst_n = 1;
    
end
 
always #10 clk = ~clk;


duoshumaguan duoshumaguan_u(

.clk         (clk),
.rst_n       (rst_n),

.dout_seg     (dout_seg),
.dout_sel     (dout_sel)



);
endmodule

 6.仿真结果

本次使用的软件为vivado.2019。为了仿真方便,设置的时间t=10,原本的时钟周期为1秒50MHz,也就是一个时钟20ns,在此次仿真中,将原本的50MHz的时钟周期改成10Hz,原本的1秒也替换成200ns为1秒。在图中可以看到,仿真结果符合上述的要求。

作为一个刚刚接触fpga的小白,有很多的不足,如有错误,或者更好的办法,请大家指正,感谢!!!

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余味_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值