Files
ciciec2026_loongson/rtl/ip/confreg/digitaltube_controller.v
2026-04-12 22:20:18 +08:00

102 lines
3.0 KiB
Verilog
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
module digitaltube_controller(
// 输入配置寄存器 默认 32 位
// [1:0] 控制右边的数码管 00灭 01仅显示数字 10显示数字和小数点
// [3:2] 控制左边数码管
input wire [31:0] control_reg,
// 数据寄存器 [15:0]
// 0x0000_000X [3:0] 对应第一个灯的显示
// 0x0000_00X0 [7:4] 对应第二个灯的显示
inout wire [31:0] data_reg,
input wire clk,
input wire rst_n,
output wire [7:0] dpy0, // dpy0
output wire [7:0] dpy1 // dpy1
);
// 内部寄存器定义
reg [7:0] dpy0_reg;
reg [7:0] dpy1_reg;
assign dpy0 = dpy0_reg;
assign dpy1 = dpy1_reg;
reg [3:0] dpy0_data; // dpy0 显示内容4 位0-F
reg [3:0] dpy1_data; // dpy1 显示内容4 位0-F
// 数码管段码存储
reg [6:0] seg_code [0:15]; // 存储 0-F 的编码
// 初始化数码管段码
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
seg_code[0] <= 7'b1000000; // 0
seg_code[1] <= 7'b1110110; // 1
seg_code[2] <= 7'b0100001; // 2
seg_code[3] <= 7'b0100100; // 3
seg_code[4] <= 7'b0010110; // 4
seg_code[5] <= 7'b0001100; // 5
seg_code[6] <= 7'b0001000; // 6
seg_code[7] <= 7'b1100110; // 7
seg_code[8] <= 7'b0000000; // 8
seg_code[9] <= 7'b0000110; // 9
seg_code[10] <= 7'b0000010; // A
seg_code[11] <= 7'b0011000; // B
seg_code[12] <= 7'b1001001; // C
seg_code[13] <= 7'b0110000; // D
seg_code[14] <= 7'b0001001; // E
seg_code[15] <= 7'b0001011; // F
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
dpy0_reg <= 8'b0000_0000;
end
else begin
// 解析数据寄存器中的显示内容
dpy0_data <= data_reg[3:0]; // dpy0 显示的内容
// 根据 control_reg 控制显示
case (control_reg[1:0])
2'b01: begin
dpy0_reg <= {~seg_code[dpy0_data], 1'b0}; // 显示 dpy0
end
2'b10: begin
dpy0_reg <= {~seg_code[dpy0_data], 1'b1}; // 显示 dpy0和小数点
end
default: begin
dpy0_reg <= 8'b0000_0000;
end
endcase
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
dpy1_reg <= 8'b0000_0000;
end
else begin
// 解析数据寄存器中的显示内容
dpy1_data <= data_reg[7:4]; // dpy0 显示的内容
// 根据 control_reg 控制显示
case (control_reg[3:2])
2'b01: begin
dpy1_reg <= {~seg_code[dpy1_data], 1'b0}; // 显示 dpy0
end
2'b10: begin
dpy1_reg <= {~seg_code[dpy1_data], 1'b1}; // 显示 dpy0和小数点
end
default: begin
dpy1_reg <= 8'b0000_0000;
end
endcase
end
end
endmodule