module seg7(clk,rst,sel,seg,num);
input clk;
input rst;
output reg[3:0] sel;
output reg[7:0] seg;
output reg[3:0] num;
reg[31:0] counter_5kHz;
reg[31:0] counter_1Hz;
reg[1:0] pos;
always@(posedge clk or negedge rst)
begin
if(!rst)
begin
seg<=8'b0000_0000; //复位键按下,初始化
sel<=4'b1111;
counter_1Hz<=0;
counter_5kHz<=0;
num<=0;
pos<=0;
end
else
begin
if(counter_1Hz<5000_0000) //显示数据刷新控制
//未达到计数值,数据保持且计数器加一
begin
counter_1Hz<=counter_1Hz+1;
end
else
begin
num<=num+1;
counter_1Hz<=0;
end
case(num) //判断数据值,将对应数码管显示编码赋给段选端口
4'b0000:seg<=8'b0011_1111;
4'b0001:seg<=8'b0000_0110;
4'b0010:seg<=8'b0101_1011;
4'b0011:seg<=8'b0100_1111;
4'b0100:seg<=8'b0110_0110;
4'b0101:seg<=8'b0110_1101;
4'b0110:seg<=8'b0111_1101;
4'b0111:seg<=8'b0000_0111;
4'b1000:seg<=8'b0111_1111;
4'b1001:seg<=8'b0110_1111;
4'b1010:seg<=8'b0111_0111;
4'b1011:seg<=8'b0111_1100;
4'b1100:seg<=8'b0011_1001;
4'b1101:seg<=8'b0101_1110;
4'b1110:seg<=8'b0111_1001;
4'b1111:seg<=8'b0111_0001;
default:seg<=8'b0000_0000;
endcase
if(counter_5kHz<1_0000)
begin
counter_5kHz<=counter_5kHz+1;
end
else
begin
pos<=pos+1;
counter_5kHz<=0;
end
case(pos) //判断数码管位选控制信号
2'b00:sel<=4'b1110;
2'b01:sel<=4'b1101;
2'b10:sel<=4'b1011;
2'b11:sel<=4'b0111;
default:sel<=8'b1111;
endcase
end
end
endmodule
`timescale 1ns/1ps //测试代码
module seg7_tb;
reg clk; //时钟
reg rst; //复位
wire[3:0] sel; //位选端口
wire[7:0] seg; //段选端口
wire[3:0] num; //数据输出端口
initial begin
clk = 0;
rst = 0;
#20 rst = 1;
end
always #10 clk = ~clk;
seg7 i(
.clk(clk),
.rst(rst),
.sel(sel),
.seg(seg),
.num(num)
);
endmodule