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
