blob: d976b2ea742fcec31840b2f4fec0102d86a53b33 [file] [log] [blame]
`default_nettype none
// Top level io for this module should stay the same to fit into the scan_wrapper.
// The pin connections within the user_module are up to you,
// although (if one is present) it is recommended to place a clock on io_in[0].
// This allows use of the internal clock divider if you wish.
//
// so, just somehow calculate x^2+y^2 with random
// 0<x, y<1, and compare it with 1
// using 8-bit fixed point, [7:0]x means x/2**8
// 0.0039 resolution is really coarse...
module regymm_mcpi(
input [7:0] io_in,
output reg [7:0] io_out
);
wire clk = io_in[0];
wire rst = io_in[1];
wire [5:0]sw1 = io_in[7:2];
always @ (*) begin
io_out = 0;
case(sw1[1:0])
0: io_out = cnt[7:0];
1: io_out = cnt_in[7:0];
2: io_out = {6'b0, cnt[0], cnt_in[0]};
endcase
end
reg [8:0]breg;
reg [7:0]breg2; // shouldn't exceed 7:0 because x^2<1 when 0<x<1
reg [7:0]x;
reg [3:0]mulin1;
reg [3:0]mulin2;
wire [7:0]mulout;
mul4_341521390605697619 mul_inst(
.a(mulin1),
.b(mulin2),
.c(mulout)
);
reg [7:0]addin1;
reg [7:0]addin2;
wire [8:0]addout;
assign addout = addin1 + addin2;
// not very random actually, should somehow
// receive seed from outside
reg [7:0]random = 8'h01;
always @ (posedge clk) begin
random <= {random[6:0], (random[7] ^ random[5] ^ random[4] ^ random[3])};
end
reg [3:0]sts;
reg [7:0]cnt;
reg [7:0]cnt_in;
always @ (posedge clk) begin
if (rst) begin
sts <= 0;
cnt <= 0;
cnt_in <= 0;
//x <= 0;
end else begin
if (sw1[5] == 0) begin
case (sts)
0: begin
breg <= 0;
x <= random;
end
4: begin
x <= random;
breg2 <= breg_in;
end
9: begin
cnt <= cnt + 1;
if (addout[8]) cnt_in <= cnt_in + 1;
end
endcase
sts <= sts == 10 ? 0 : sts + 1;
breg <= breg_in;
end
end
end
reg [8:0]breg_in;
always @ (*) begin
mulin1 = 0;
mulin2 = 0;
addin1 = 0;
addin2 = 0;
breg_in = 0;
if (sts == 9) begin
addin1 = breg;
addin2 = breg2;
end else begin
case(sts[1:0])
2'b01: begin
mulin1 = x[3:0];
mulin2 = x[3:0];
breg_in = {1'b0, mulout};
end
2'b10: begin
mulin1 = x[7:4];
mulin2 = x[3:0];
addin1 = {4'b0, breg[7:4]};
addin2 = mulout;
breg_in = addout;
end
2'b11: begin
mulin1 = x[3:0];
mulin2 = x[7:4];
addin1 = breg[7:0];
addin2 = mulout;
breg_in = addout;
end
2'b00: begin
mulin1 = x[7:4];
mulin2 = x[7:4];
addin1 = {3'b0, breg[8:4]};
addin2 = mulout;
breg_in = addout;
end
endcase
end
end
endmodule
module add_341521390605697619
#(parameter WIDTH = 8)
(
input [WIDTH-1:0]a,
input [WIDTH-1:0]b,
output [WIDTH:0]c
);
assign c = a + b;
endmodule
module mul4_341521390605697619
(
input [3:0] a,
input [3:0] b,
output [7:0] c
);
wire [3:0]x = b[0] ? a : 0;
wire [3:0]y = b[1] ? a : 0;
wire [3:0]z = b[2] ? a : 0;
wire [3:0]t = b[3] ? a : 0;
assign c = {
add3,
add2[0],
add1[0],
x[0]
};
wire [4:0]add1;
add_341521390605697619 #(.WIDTH(4)) add_1(
.a({1'b0, x[3:1]}),
.b(y),
.c(add1)
);
wire [4:0]add2;
add_341521390605697619 #(.WIDTH(4)) add_2(
.a(add1[4:1]),
.b(z),
.c(add2)
);
wire [4:0]add3;
add_341521390605697619 #(.WIDTH(4)) add_3(
.a(add2[4:1]),
.b(t),
.c(add3)
);
endmodule