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
PIBreakout