数码管显示写起来非常简单
并且可以被顶层调用,下边附代码。
module seventobe (
input wire clk,
input wire rst,
input wire[23:0] number,
output reg [7:0] seg, //数码管段选
output reg [5:0] sel //数码管片选
);
reg [25:0] cnt=0;
localparam T=50_000; //刷新时间为1ms
//采用三段式状态机
reg [2:0] cstate; //定义现态
reg [2:0] nstate; //定义次态
//状态空间,6个数码管,所以定义6个状态
localparam s0=0;
localparam s1=1;
localparam s2=2;
localparam s3=3;
localparam s4=4;
localparam s5=5;
//定义计数器
always@(posedge clk or posedge rst) begin
if(rst)
cnt<=0;
else if(cnt==T-1)
cnt<=0;
else
cnt<=cnt+1;
end
//【1】现态跟随次态
always @ (posedge clk or posedge rst) begin
if(rst)
cstate<=0;
else
cstate<=nstate;
end
//【2】状态的判断和转移
always@(*) begin
if(rst)
nstate=s0;
else
case(cstate)
s0 : begin
if(cnt==T-1)
nstate=s1;
else
nstate=s0;
end
s1 : begin
if(cnt==T-1)
nstate=s2;
else
nstate=s1;
end
s2 : begin
if(cnt==T-1)
nstate=s3;
else
nstate=s2;
end
s3 : begin
if(cnt==T-1)
nstate=s4;
else
nstate=s3;
end
s4 : begin
if(cnt==T-1)
nstate=s5;
else
nstate=s4;
end
s5 : begin
if(cnt==T-1)
nstate=s0;
else
nstate=s5;
end
default: nstate=s0;
endcase
end
//定义显示数据
reg [3:0] value=0;
always @ (posedge clk or posedge rst) begin
if(rst) begin
sel<=6'b111_111; //低电平有效,6个1 代表数码管不亮
value<=0;
end
else
case(cstate)
s0 : begin
sel<=6'b111_110;
value<=number[3:0]; //每个数码管都是4个位宽,因此每4位赋一个值
end
s1 : begin
sel<=6'b111_101;
value<=number[7:4];
end
s2 : begin
sel<=6'b111_011;
value<=number[11:8];
end
s3 : begin
sel<=6'b110_111;
value<=number[15:14];
end
s4 : begin
sel<=6'b101_111;
value<=number[19:16];
end
s5 : begin
sel<=6'b011_111;
value<=number[23:20];
end
default : begin
sel<=6'b111_111;
value<=0;
end
endcase
end
//定义字符译码
always@ (*) begin
case(value)
0 : seg=8'b11000000;//seg[0]=a,seg[1]=b
1 : seg=8'b11111001;
2 : seg=8'b10100100;
3 : seg=8'b10110000;
4 : seg=8'b10011001;
5 : seg=8'b10010010;
6 : seg=8'b10000010;
7 : seg=8'b11111000;
8 : seg=8'b10000000;
9 : seg=8'b10010000;
10 : seg=8'b10001000;
11 : seg=8'b10000011;
12 : seg=8'b11000110;
13 : seg=8'b10100001;
14 : seg=8'b10000110;
15 : seg=8'b10001110;
default : seg=8'b00000000;
endcase
end
endmodule