106 lines
1.7 KiB
Verilog
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
|