pong-verilog/sseg_disp.v
2025-11-04 22:47:49 +01:00

106 lines
1.7 KiB
Verilog

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