本次设计为数码管的循环显示,开发板上有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的小白,有很多的不足,如有错误,或者更好的办法,请大家指正,感谢!!!