blob: a2e5cbf12a1458612332329cf3085f8df80fd1ee [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 user_module_341521390605697619(
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]};
//2: io_out = {cnt[10:8], cnt_in[10:8], cnt[0], cnt_in[0]};
//3: io_out = cnt_in[15:8];
//4: io_out = {mulin1, mulin2};
//5: io_out = mulout;
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;
//mul_341521390605697619 #(.WIDTH(4)) mul_inst(
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;
//reg del = 0;
always @ (posedge clk) begin
//if (sw1[4] == 0) del <= ~del;
//else del <= sw1[3];
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
);
//assign c = {
//ll,
//t[3] ^ jj ^ kk,
//z[3] ^ t[2] ^ gg ^ hh ^ ii,
//y[3] ^ z[2] ^ t[1] ^ dd ^ ee ^ ff,
//x[3] ^ y[2] ^ z[1] ^ t[0] ^ bb ^ cc,
//x[2] ^ y[1] ^ z[0] ^ aa,
//x[1] ^ y[0],
//x[0]
//};
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;
//wire aa = x[1] & y[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)
);
//wire bb = (x[2] & y[1]) | ((x[2] ^ y[1]) & (z[0] ^ aa));
//wire cc = z[0] & aa;
//wire dd = x[3] & y[2] | ((x[3] ^ y[2]) & (z[1] ^ t[0]));
//wire ee = z[1] & t[0] | ((x[3] ^ y[2]) & (bb ^ cc));
//wire ff = bb & cc | ((bb ^ cc) & (z[1] ^ t[0]));
//wire gg = (y[3] ^ z[2]) | ();
//wire hh = (dd ^ ee) | ();
//wire ii = (t[2] ^ ff) | ();
//wire jj = z[3] ^ t[2];
//wire kk = (gg & (hh | ii)) || (hh & ii);
//wire ll = (t[3] & (jj | kk)) || (jj & kk);
endmodule
/*
* my_multiplier - an unoptimized multiplier
*
* copyright (c) 2021 hirosh dabui <hirosh@dabui.de>
*
* permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* the software is provided "as is" and the author disclaims all warranties
* with regard to this software including all implied warranties of
* merchantability and fitness. in no event shall the author be liable for
* any special, direct, indirect, or consequential damages or any damages
* whatsoever resulting from loss of use, data or profits, whether in an
* action of contract, negligence or other tortious action, arising out of
* or in connection with the use or performance of this software.
*
*/
//module mul_341521390605697619
//#(
//parameter WIDTH = 16
//)
//(
//input [WIDTH-1:0] a,
//input [WIDTH-1:0] b,
//output reg [(WIDTH<<1)-1:0] c = 0
//);
//reg [(WIDTH<<1)-1:0] tmp;
//reg [(WIDTH<<1)-1:0] add_a[WIDTH-1:0];
//reg [(WIDTH<<1)-1:0] add_b[WIDTH-1:0];
//wire [(WIDTH<<1)-1:0] add_y[WIDTH-1:0];
//genvar k;
//generate for (k = 0; k < WIDTH; k = k +1) begin
//full_addr_341521390605697619 #(WIDTH<<1) full_addr_i(add_a[k], add_b[k], add_y[k]);
//end endgenerate
//integer i;
//integer j;
//generate always @(*) begin
//tmp = 0;
//c = 0;
//[> generate parallel structure <]
//for (j = 0; j < WIDTH; j = j + 1) begin
//for (i = 0; i < WIDTH; i = i + 1) begin
//tmp[i] = b[i] & a[j];
//end
//add_a[j] = c;
//add_b[j] = (tmp << j);
//c = add_y[j];
//end
//end endgenerate
//endmodule
//// carry ripple style
//module full_addr_341521390605697619
//#(
//parameter WIDTH = 16
//)
//(
//input [WIDTH-1:0] a,
//input [WIDTH-1:0] b,
//output reg [WIDTH-1:0] y = 0
//);
//integer i;
//reg [WIDTH-1:0] c = 1;
//generate always @(*) begin
//c[0] = 0;
//y[0] = c[0] ^ (a[0] ^ b[0]);
//c[0] = a[0]&b[0] | b[0]&c[0] | a[0]&c[0];
//for (i = 1; i < WIDTH; i = i +1) begin
//y[i] = c[i -1] ^ (a[i] ^ b[i]);
//c[i] = a[i]&b[i] | b[i]&c[i -1] | a[i]&c[i -1];
//end
//end endgenerate
//endmodule