module sseg_disp #( parameter TMUX_DIV = 100, parameter N_TMUX_DIV = $clog2(TMUX_DIV) )( input wire clk, input wire rst, input wire [3:0] d0, input wire [3:0] d1, input wire [3:0] d2, input wire [3:0] d3, input wire [3:0] dps, output reg [8:0] segs_n, output wire [3:0] digs_n ); reg [N_TMUX_DIV - 1:0] cntr; always @(posedge clk) begin if (rst) begin cntr <= 0; end else begin if (cntr == (TMUX_DIV - 1)) begin cntr <= 0; end else begin cntr <= cntr + 1; end end end wire dig_step = cntr == (TMUX_DIV - 1); reg [3:0] dig_sel; always @(posedge clk) begin if (rst) begin dig_sel <= 4'b0001; end else begin if (dig_step) dig_sel <= { dig_sel[2:0], dig_sel[3] }; end end assign digs_n = ~dig_sel; reg [1:0] dig_cntr; always @(posedge clk) begin if (rst) begin dig_cntr <= 2'b0; end else begin if (dig_step) dig_cntr <= dig_cntr + 2'b1; end end reg [3:0] data; always @(*) begin case (dig_cntr) default : data <= d0; 2'd1 : data <= d1; 2'd2 : data <= d2; 2'd3 : data <= d3; endcase end wire [7:0] dp_n = dps[dig_cntr] ? 8'h7F : 8'hFF; always @(*) begin case (data) 4'h0 : segs_n <= 8'hc0 & dp_n; 4'h1 : segs_n <= 8'hf9 & dp_n; 4'h2 : segs_n <= 8'ha4 & dp_n; 4'h3 : segs_n <= 8'hb0 & dp_n; 4'h4 : segs_n <= 8'h99 & dp_n; 4'h5 : segs_n <= 8'h92 & dp_n; 4'h6 : segs_n <= 8'h82 & dp_n; 4'h7 : segs_n <= 8'hf8 & dp_n; 4'h8 : segs_n <= 8'h80 & dp_n; 4'h9 : segs_n <= 8'h90 & dp_n; 4'ha : segs_n <= 8'h88 & dp_n; 4'hb : segs_n <= 8'h83 & dp_n; 4'hc : segs_n <= 8'hc6 & dp_n; 4'hd : segs_n <= 8'ha1 & dp_n; 4'he : segs_n <= 8'h86 & dp_n; 4'hf : segs_n <= 8'h8e & dp_n; endcase end endmodule