module wokwi(
input CLK,
input RST,
output SEGA,
output SEGB,
output SEGC,
output SEGD,
output SEGE,
output SEGF,
output SEGG
);
reg [3:0] digit;
seven_segment_decoder decoder(
.digit(digit),
.segment({SEGG, SEGF, SEGE, SEGD, SEGC, SEGB, SEGA})
);
pi_digits_decimal pi(
.clk(CLK),
.rst(RST),
.pi_digit(digit)
);
endmodule
module seven_segment_decoder (
input [3:0] digit,
output reg [6:0] segment
);
always @(*) begin
case (digit)
4'h0: segment = ~7'b1000000;
4'h1: segment = ~7'b1111001;
4'h2: segment = ~7'b0100100;
4'h3: segment = ~7'b0110000;
4'h4: segment = ~7'b0011001;
4'h5: segment = ~7'b0010010;
4'h6: segment = ~7'b0000010;
4'h7: segment = ~7'b1111000;
4'h8: segment = ~7'b0000000;
4'h9: segment = ~7'b0011000;
4'ha: segment = ~7'b0001000;
4'hb: segment = ~7'b0000011;
4'hc: segment = ~7'b0100111;
4'hd: segment = ~7'b0100001;
4'he: segment = ~7'b0000110;
4'hf: segment = ~7'b0001110;
endcase
end
endmodule
module pi_digits_decimal (
input clk,
input rst,
output reg [3:0] pi_digit
);
reg [11:0] S;
reg [11:0] W;
reg [11:0] K;
reg [11:0] M;
reg [11:0] L;
reg [11:0] X;
always @(posedge clk) begin
if (rst) begin
S <= 0;
W <= 0;
K <= 0;
M <= 0;
L <= 0;
X <= 0;
pi_digit <= 0;
end else begin
S <= S + 1;
W <= W + 545140134;
K <= K + 1;
M <= M + 1;
L <= L + 6;
X <= X + 13591409;
pi_digit <= (4*(S*W+K*X)-L*13591409)/(S*S*S*M);
end
end
endmodule