Skip to content

Commit ead753e

Browse files
authored
Add files via upload
1 parent 4d2056f commit ead753e

File tree

8 files changed

+285
-0
lines changed

8 files changed

+285
-0
lines changed

Diff for: ALU.v

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
`include "Adder.v"
2+
`include "Mux.v"
3+
`include "Gates.v"
4+
5+
module ALU(in1, in2, Binvert, Cin, Operation, Result, Carry);
6+
input [31:0] in1, in2;
7+
input [1:0] Operation;
8+
input Binvert, Cin;
9+
output [31:0] Result;
10+
output Carry;
11+
wire [31:0] not_in2, mux_out, and_out, or_out, sum;
12+
wire newc;
13+
14+
mux2to1 m1(newc, Operation[1], Cin, 1'b1);
15+
bit32Not n1(not_in2, in2);
16+
bit32_2to1mux b0(mux_out, Binvert, in2, not_in2);
17+
thirtytwoBitFullAdder fa(sum, Carry, in1, mux_out, newc);
18+
bit32And a1(and_out, in1, mux_out);
19+
bit32Or o1(or_out, in1, mux_out);
20+
bit32_3to1mux b1(Result, Operation, and_out, or_out, sum);
21+
22+
endmodule

Diff for: ALUController.v

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module ALUControlUnit (Operation, FuncField, ALUOp);
2+
input [5:0] FuncField;
3+
input [1:0] ALUOp;
4+
output [2:0] Operation;
5+
wire and_out, or_out;
6+
7+
and a1(and_out, ALUOp[1], FuncField[1]);
8+
or o1(Operation[2], ALUOp[0], and_out);
9+
or o2(or_out, FuncField[0], FuncField[3]);
10+
and a2(Operation[0], ALUOp[1], or_out);
11+
nand(Operation[1], ALUOp[1], FuncField[2]);
12+
13+
endmodule

Diff for: Adder.v

+126
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
module halfAdder(sum,carry,in1,in2);
2+
input in1, in2;
3+
output sum, carry;
4+
5+
xor x1(sum, in1, in2);
6+
and a1(carry, in1, in2);
7+
8+
endmodule
9+
10+
/*module testbench1;
11+
reg i1, i2;
12+
wire s, c;
13+
halfAdder ha1(s, c, i1, i2);
14+
initial
15+
begin
16+
$monitor($time, " input1 = %b, input2 = %b, Sum = %b, Carry = %b", i1, i2, s, c);
17+
#2 i1 = 1'b 0; i2 = 1'b 0;
18+
#2 i1 = 1'b 0; i2 = 1'b 1;
19+
#2 i1 = 1'b 1; i2 = 1'b 0;
20+
#2 i1 = 1'b 1; i2 = 1'b 1;
21+
end
22+
23+
endmodule */
24+
25+
module oneBitFullAdder(sum, carry, in1, in2, cin);
26+
input in1, in2, cin;
27+
output sum, carry;
28+
wire s1, c1, c2;
29+
30+
halfAdder ha1(s1, c1, in1, in2);
31+
halfAdder ha2(sum, c2, s1, cin);
32+
or o1(carry, c1, c2);
33+
34+
endmodule
35+
36+
/*module testbench2;
37+
reg in1, in2, cin;
38+
wire sum, carry;
39+
oneBitFullAdder fa1(sum, carry, in1, in2, cin);
40+
initial
41+
begin
42+
$monitor($time, " input1 = %b, input2 = %b, carryIn = %b, sum = %b, carry = %b", in1, in2, cin, sum, carry);
43+
#2 in1 = 1'b 0; in2 = 1'b 0; cin = 1'b 0;
44+
#2 in1 = 1'b 0; in2 = 1'b 1; cin = 1'b 0;
45+
#2 in1 = 1'b 1; in2 = 1'b 0; cin = 1'b 0;
46+
#2 in1 = 1'b 1; in2 = 1'b 1; cin = 1'b 0;
47+
#2 in1 = 1'b 0; in2 = 1'b 0; cin = 1'b 1;
48+
#2 in1 = 1'b 0; in2 = 1'b 1; cin = 1'b 1;
49+
#2 in1 = 1'b 1; in2 = 1'b 0; cin = 1'b 1;
50+
#2 in1 = 1'b 1; in2 = 1'b 1; cin = 1'b 1;
51+
end
52+
endmodule */
53+
54+
module fourBitFullAdder(sum, carry, in1, in2, cin);
55+
input [3:0] in1, in2;
56+
input cin;
57+
output [3:0] sum;
58+
output carry;
59+
wire c0, c1, c2;
60+
61+
oneBitFullAdder obfa1(sum[0], c0, in1[0], in2[0], cin);
62+
oneBitFullAdder obfa2(sum[1], c1, in1[1], in2[1], c0);
63+
oneBitFullAdder obfa3(sum[2], c2, in1[2], in2[2], c1);
64+
oneBitFullAdder obfa4(sum[3], carry, in1[3], in2[3], c2);
65+
66+
endmodule
67+
68+
/*module testbench3;
69+
reg [3:0] in1, in2;
70+
reg cin;
71+
wire [3:0] sum;
72+
wire carry;
73+
fourBitFullAdder fbfa1(sum, carry, in1, in2, cin);
74+
initial
75+
begin
76+
$monitor($time, " input1 = %b, input2 = %b, carryIn = %b, sum = %b, carry = %b", in1, in2, cin, sum, carry);
77+
#2 in1 = 4'b 0000; in2 = 4'b 0000; cin = 1'b 0;
78+
#2 in1 = 4'b 0010; in2 = 4'b 0100; cin = 1'b 1;
79+
#2 in1 = 4'b 0000; in2 = 4'b 1111; cin = 1'b 0;
80+
#2 in1 = 4'b 1111; in2 = 4'b 0001; cin = 1'b 1;
81+
end
82+
83+
endmodule */
84+
85+
module eightBitFullAdder(sum, carry, in1, in2, cin);
86+
input [7:0] in1, in2;
87+
input cin;
88+
output [7:0] sum;
89+
output carry;
90+
wire caux;
91+
92+
fourBitFullAdder fbfa1(sum[3:0], caux, in1[3:0], in2[3:0], cin);
93+
fourBitFullAdder fbfa2(sum[7:4], carry, in1[7:4], in2[7:4], caux);
94+
95+
endmodule
96+
97+
/*module testbench4;
98+
reg [7:0] in1, in2;
99+
reg cin;
100+
wire [7:0] sum;
101+
wire carry;
102+
eightBitFullAdder ebfa1(sum, carry, in1, in2, cin);
103+
initial
104+
begin
105+
$monitor($time, " input1 = %b, input2 = %b, carryIn = %b, sum = %b, carry = %b", in1, in2, cin, sum, carry);
106+
#2 in1 = 8'b 00000000; in2 = 8'b 00000000; cin = 1'b 0;
107+
#2 in1 = 8'b 10101010; in2 = 8'b 01010101; cin = 1'b 1;
108+
#2 in1 = 8'b 11111111; in2 = 8'b 00000000; cin = 1'b 1;
109+
#2 in1 = 8'b 11111111; in2 = 8'b 11111111; cin = 1'b 1;
110+
end
111+
112+
endmodule */
113+
114+
module thirtytwoBitFullAdder(sum, carry, in1, in2, cin);
115+
input [31:0] in1, in2;
116+
input cin;
117+
output [31:0] sum;
118+
output carry;
119+
wire caux1, caux2, caux3;
120+
121+
eightBitFullAdder ebfa1(sum[7:0], caux1, in1[7:0], in2[7:0], cin);
122+
eightBitFullAdder ebfa2(sum[15:8], caux2, in1[15:8], in2[15:8], caux1);
123+
eightBitFullAdder ebfa3(sum[23:16], caux3, in1[23:16], in2[23:16], caux2);
124+
eightBitFullAdder ebfa4(sum[31:24], carry, in1[31:24], in2[31:24], caux3);
125+
126+
endmodule

Diff for: Gates.v

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module bit32And (out, in1, in2);
2+
input [31:0] in1, in2;
3+
output [31:0] out;
4+
5+
assign {out} = in1 & in2;
6+
7+
endmodule
8+
9+
module bit32Or (out, in1, in2);
10+
input [31:0] in1, in2;
11+
output [31:0] out;
12+
13+
assign {out} = in1 | in2;
14+
15+
endmodule

Diff for: MainController.v

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
module MainControlUnit (RegDst, ALUSrc, MemtoReg, RegWrite, MemRead, MemWrite, Branch, ALUOp, Op);
2+
input [5:0] Op;
3+
output RegDst, ALUSrc, MemtoReg, RegWrite, MemRead, MemWrite, Branch;
4+
output [1:0] ALUOp;
5+
wire Rformat, lw, sw, beq;
6+
7+
assign Rformat = (~Op[0]) & (~Op[1]) & (~Op[2]) & (~Op[3]) & (~Op[4]) & (~Op[5]);
8+
assign lw = (Op[0]) & (Op[1]) & (~Op[2]) & (~Op[3]) & (~Op[4]) & (Op[5]);
9+
assign sw = (Op[0]) & (Op[1]) & (~Op[2]) & (Op[3]) & (~Op[4]) & (Op[5]);
10+
assign beq = (~Op[0]) & (~Op[1]) & (Op[2]) & (~Op[3]) & (~Op[4]) & (~Op[5]);
11+
assign RegDst = Rformat;
12+
assign ALUSrc = lw | sw;
13+
assign MemtoReg = lw;
14+
assign RegWrite = Rformat | lw;
15+
assign MemRead = lw;
16+
assign MemWrite = sw;
17+
assign Branch = beq;
18+
assign ALUOp[0] = Rformat;
19+
assign ALUOp[1] = beq;
20+
21+
endmodule

Diff for: Mux.v

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
module mux2to1(out, select, in1, in2);
2+
input in1, in2, select;
3+
output out;
4+
wire not_select, w1, w2;
5+
6+
not (not_select, select);
7+
and (w1, select, in2);
8+
and (w2, not_select, in1);
9+
or(out, w1, w2);
10+
11+
endmodule
12+
13+
module mux3to1(out, select, in1, in2, in3);
14+
input in1, in2, in3;
15+
input [1:0] select;
16+
output out;
17+
wire w;
18+
19+
mux2to1 m1(w, select[0], in1, in2); //in1 - 00; in2 - 01; in3 - 1x
20+
mux2to1 m2(out, select[1], w, in3);
21+
22+
endmodule
23+
24+
module bit32_3to1mux (out, select, in1, in2, in3);
25+
input [31:0] in1, in2, in3;
26+
input [1:0] select;
27+
output [31:0] out;
28+
genvar j;
29+
30+
generate
31+
for(j = 0; j <32; j = j + 1) begin: mux_loop
32+
mux3to1 m1(out[j], select, in1[j], in2[j], in3[j]);
33+
end
34+
endgenerate
35+
36+
endmodule

Diff for: Reg32.v

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
module dff_async_clear(q, d, clk, reset);
2+
input d, reset, clk;
3+
output q;
4+
reg q;
5+
6+
always @ (negedge reset or posedge clk)
7+
begin
8+
if (!reset) q <= 1'b0;
9+
else q <= d;
10+
end
11+
12+
endmodule
13+
14+
15+
module reg_32bit(q, d, clk, reset);
16+
input [31:0] d;
17+
input reset, clk;
18+
output [31:0] q;
19+
genvar j;
20+
21+
generate for (j = 0; j < 32; j = j + 1) begin: reg_loop
22+
dff_async_clear d(q[j], d[j], clk, reset);
23+
end
24+
endgenerate
25+
26+
endmodule

Diff for: RegFile.v

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
module RegFile(clk, reset, ReadReg1, ReadReg2, WriteData, WriteReg, RegWrite, ReadData1, ReadData2);
2+
input clk, reset, RegWrite;
3+
input [31:0] WriteData;
4+
input [1:0] WriteReg, ReadReg1, ReadReg2;
5+
output [31:0] ReadData1, ReadData2;
6+
wire [3:0] decw;
7+
wire [3:0] andout;
8+
wire [31:0] q0, q1, q2, q3;
9+
genvar j;
10+
11+
bit1_2to4decoder dec(decw, WriteReg[0], WriteReg[1]);
12+
generate
13+
for (j = 0; j < 4; j = j + 1) begin: reg_loop
14+
bit1_3to1and a1(andout[j], clk, RegWrite, decw[j]);
15+
end
16+
endgenerate
17+
18+
reg_32bit reg1(q0, WriteData, andout[0], reset);
19+
reg_32bit reg2(q1, WriteData, andout[1], reset);
20+
reg_32bit reg3(q2, WriteData, andout[2], reset);
21+
reg_32bit reg4(q3, WriteData, andout[3], reset);
22+
23+
bit32_4to1mux mux1(ReadData1, ReadReg1, q0, q1, q2, q3);
24+
bit32_4to1mux mux2(ReadData2, ReadReg2, q0, q1, q2, q3);
25+
26+
endmodule

0 commit comments

Comments
 (0)