Files
micore/display.sv

67 lines
2.0 KiB
Systemverilog
Executable File

module DynamicDisplay(
input clock,
reset,
input [31:0] reg_result,
output [3:0] io_anodes,
output [6:0] io_segments
);
reg [6:0] digit_segments [0:9];
initial begin
digit_segments[0] = 7'b0000001;
digit_segments[1] = 7'b1001111;
digit_segments[2] = 7'b0010010;
digit_segments[3] = 7'b0000110;
digit_segments[4] = 7'b1001100;
digit_segments[5] = 7'b0100100;
digit_segments[6] = 7'b0100000;
digit_segments[7] = 7'b0001111;
digit_segments[8] = 7'b0000000;
digit_segments[9] = 7'b0000100;
end
reg [3:0] anode_select [0:3];
initial begin
anode_select[0] = 4'b1110;
anode_select[1] = 4'b1101;
anode_select[2] = 4'b1011;
anode_select[3] = 4'b0111;
end
// 扫描计数器和时钟分频
reg [15:0] clkDiv; // 分频计数器
reg [1:0] scanCounter; // 扫描计数器
wire clk1kHz = (clkDiv == 16'd50_000);
always @(posedge clock or posedge reset) begin
if (reset) begin
clkDiv <= 16'd0;
scanCounter <= 2'd0;
end
else begin
if (clk1kHz) begin
clkDiv <= 16'd0;
scanCounter <= scanCounter + 2'd1;
end
else begin
clkDiv <= clkDiv + 16'd1;
end
end
end
reg [3:0] digit_value;
always @(*) begin
case (scanCounter)
2'b11: digit_value = reg_result / 1000; // 千位
2'b10: digit_value = (reg_result / 100) % 10; // 百位
2'b01: digit_value = (reg_result / 10) % 10; // 十位
2'b00: digit_value = reg_result % 10; // 个位
default:
digit_value = 4'd0;
endcase
end
assign io_segments = digit_segments[digit_value];
assign io_anodes = anode_select[scanCounter];
endmodule