//用4个数码管显示一个16位二进制数据Data,每个数码管显示各自的数据0.2ms
module SMG_4(
input [15:0] Data,
input CLR,//高电平有效
input CLK,//100MHz
output [3:0] AN,
output [7:0] SEG
);
reg[3:0] Data_4;
reg[1:0] BIT_SEL;
reg[15:0] cnt;
SMG_1 SMG_i(SEG,AN,BIT_SEL,Data_4);
always @(posedge CLK or posedge CLR)
if(CLR)
begin
cnt<=16'b0;
BIT_SEL<=2'b0;
end
else
begin
cnt<= cnt + 1'b1;
if (cnt==16'd20000) //延时20000*10ns=0.2ms
begin
BIT_SEL <= BIT_SEL + 1'b1;//换一位数码管显示
cnt <=16'b0;
end
end
always @(*)//控制每个数码管显示对应位的数字
begin
case(BIT_SEL)
0:Data_4[3:0] <= Data[15:12];
1:Data_4[3:0] <= Data[11:8];
2:Data_4[3:0] <= Data[7:4];
3:Data_4[3:0] <= Data[3:0];
default:Data_4[3:0] <= Data[3:0];
endcase
end
endmodule
module SMG_1(
output reg [7:0] seg,
output reg [3:0] AN,
input wire [1:0] Bit_Sel,
input wire [3:0] Data
);
always @(*)
begin
case (Bit_Sel)
2'b00: AN<=4'b0111;
2'b01: AN<=4'b1011;
2'b10: AN<=4'b1101;
2'b11: AN<=4'b1110;
default:AN<=4'b1111;
endcase
end
always @(*)
begin
case (Data[3:0])
0:seg[7:0]<=8'b00000011;
1:seg[7:0]<=8'b10011111;
2:seg[7:0]<=8'b00100101;
3:seg[7:0]<=8'b00001101;
4:seg[7:0]<=8'b10011001;
5:seg[7:0]<=8'b01001001;
6:seg[7:0]<=8'b01000001;
7:seg[7:0]<=8'b00011111;
8:seg[7:0]<=8'b00000001;
9:seg[7:0]<=8'b00001001;
10:seg[7:0]<=8'b00010001;
11:seg[7:0]<=8'b11000001;
12:seg[7:0]<=8'b01100011;
13:seg[7:0]<=8'b10000101;
14:seg[7:0]<=8'b01100001;
15:seg[7:0]<=8'b01110001;
default:seg[7:0]<=8'b11111111;
endcase
end
endmodule