diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | mgabed-lab5-report.pdf | bin | 0 -> 268548 bytes | |||
-rwxr-xr-x | verilog/DFF.v | 27 | ||||
-rwxr-xr-x | verilog/DFF_test.v | 51 | ||||
-rwxr-xr-x | verilog/S1.v | 67 | ||||
-rwxr-xr-x | verilog/S2.v | 116 | ||||
-rwxr-xr-x | verilog/S3.v | 53 | ||||
-rwxr-xr-x | verilog/alu.v | 67 | ||||
-rwxr-xr-x | verilog/alu_slice1bit.v | 65 | ||||
-rwxr-xr-x | verilog/cin_choice.v | 39 | ||||
-rwxr-xr-x | verilog/clock_delay.v | 52 | ||||
-rwxr-xr-x | verilog/datapath.v | 101 | ||||
-rwxr-xr-x | verilog/full_adder.v | 61 | ||||
-rwxr-xr-x | verilog/instruction_decode.v | 41 | ||||
-rwxr-xr-x | verilog/mux_2to1.v | 34 | ||||
-rwxr-xr-x | verilog/mux_2to1_nbit.v | 39 | ||||
-rwxr-xr-x | verilog/mux_8to1.v | 55 | ||||
-rwxr-xr-x | verilog/nbit_demux.v | 33 | ||||
-rwxr-xr-x | verilog/nbit_mux.v | 19 | ||||
-rwxr-xr-x | verilog/nbit_reg.v | 23 | ||||
-rwxr-xr-x | verilog/nbit_register_file.v | 76 | ||||
-rwxr-xr-x | verilog/overflow.v | 50 | ||||
-rwxr-xr-x | verilog/slt.v | 45 | ||||
-rwxr-xr-x | verilog/test_alu.v | 129 | ||||
-rwxr-xr-x | verilog/test_slt.v | 76 | ||||
-rwxr-xr-x | verilog/xor.v | 40 |
26 files changed, 1361 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bf9dfdc --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.swp +.DS_Store diff --git a/mgabed-lab5-report.pdf b/mgabed-lab5-report.pdf Binary files differnew file mode 100644 index 0000000..b45a615 --- /dev/null +++ b/mgabed-lab5-report.pdf diff --git a/verilog/DFF.v b/verilog/DFF.v new file mode 100755 index 0000000..53ae504 --- /dev/null +++ b/verilog/DFF.v @@ -0,0 +1,27 @@ +//D Flip-flop
+module DFF(D, // DFF Input + Q, // DFF Output + Write, // Only accept input when this is set + Reset, // Synchronous Reset + Clk); // Clock
+ + //-------------Input Ports-----------------------------
+ input D; + input Write;
+ input Reset; + input Clk; + //-------------Output Ports---------------------------- + output Q;
+ //-------------Wires----------------------------------- + //-------------Other----------------------------------- + reg data; + //------------Code Starts Here------------------------- + assign Q= data; + always @ (posedge Clk) + if (Reset) begin + data <= 1'b0; + end else begin + if(Write) + data <= D; + end
+endmodule
diff --git a/verilog/DFF_test.v b/verilog/DFF_test.v new file mode 100755 index 0000000..9af6b50 --- /dev/null +++ b/verilog/DFF_test.v @@ -0,0 +1,51 @@ +`timescale 1ns / 1ps + +module DFF_test; + + //-------------Input Ports----------------------------- + reg D; + reg Write; + reg Reset; + reg Clk; + //-------------Output Ports---------------------------- + wire Q; + //-------------Wires----------------------------------- + //-------------Other----------------------------------- + //------------Code Starts Here------------------------- + + // Instantiate the Unit UDer Test (UUT) + DFF uut ( + .D(D), + .Q(Q), + .Write(Write), + .Reset(Reset), + .Clk(Clk) + ); + + initial + begin + $display ("time\tD\tQ\tWrite\tReset\tClk"); + $monitor ("%g\t%b\t%b\t%b\t%b\t%b", + $time, D, Q, Write, Reset, Clk); + end + + // Test vectors + always begin + + D= 0; Write= 1; Reset= 1; Clk= 0; + #20 D= 0; Write= 1; Reset= 1; Clk= 1; + #20 D= 0; Write= 1; Reset= 0; Clk= 0; + #20 D= 0; Write= 1; Reset= 0; Clk= 1; + #20 D= 1; Write= 1; Reset= 0; Clk= 0; + #20 D= 1; Write= 1; Reset= 0; Clk= 1; + #20 D= 0; Write= 0; Reset= 0; Clk= 0; + #20 D= 0; Write= 0; Reset= 0; Clk= 1; + #20 D= 1; Write= 1; Reset= 1; Clk= 0; + #20 D= 1; Write= 1; Reset= 1; Clk= 1; + #20 D= 0; Write= 1; Reset= 0; Clk= 0; + + #20 $finish; // Terminate simulation + end + +endmodule + diff --git a/verilog/S1.v b/verilog/S1.v new file mode 100755 index 0000000..95321b4 --- /dev/null +++ b/verilog/S1.v @@ -0,0 +1,67 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 20:03:20 10/21/2012 +// Design Name: +// Module Name: Stage1 +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module Stage1( + type, // R or I type + alu_op, // which aluoption to take + r1sel, // which register to write to + r2sel, // the value of a selected register + r3sel, // the value of another seclected register + imm, // the value if it's an immediate + + instr, // the instruction to run + clk, // clock input + reset // rest everything +); +parameter BITS = 32; // width of reg select +parameter RSELW = 5; // N-BIT Values +parameter DEPTH = 3; // pipeline depth + +output type; +output [2:0] alu_op; // always 3 bits +output [RSELW-1:0] r1sel; +output [RSELW-1:0] r2sel, r3sel; +output [15:0] imm; // 32 bit opcode -> 16 bit immediate +input [31:0] instr; // 32 bit opcode +input clk; +input reset; + + +wire [31:0] iw; +nbit_reg #(32) ireg( + .nD(instr), + .nQ(iw), + .Write(1'b1), + .Clk(clk), + .Reset(reset) +); + +instruction_decode dec( + .op_type(type), + .alu_op(alu_op), + .r1sel(r1sel), + .r2sel(r2sel), + .r3sel(r3sel), + .immediate(imm), + .instruction(iw) +); + + +endmodule diff --git a/verilog/S2.v b/verilog/S2.v new file mode 100755 index 0000000..5c142b3 --- /dev/null +++ b/verilog/S2.v @@ -0,0 +1,116 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 23:49:19 10/21/2012 +// Design Name: +// Module Name: Stage2 +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module Stage2( + operand1, + operand2, + wout, + alu_op_out, + op_type, // R or I instruction + alu_op_in, + data1, + data2, + immediate, + win, + clk, + reset +); + +parameter BITS=32; +parameter RSELW=5; + +output [BITS-1:0] operand1, operand2; +output [2:0] alu_op_out; +output [RSELW-1:0] wout; +input op_type; +input [2:0] alu_op_in; +input [BITS-1:0] data1, data2; +input [15:0] immediate; +input [RSELW-1:0] win; +input clk, reset; + + +wire [BITS-1:16] sign_extend = immediate[15] ? ~0 : 0; +wire [BITS-1:0] immw; +assign immw = {sign_extend,immediate}; + +wire [BITS-1:0] op2w; + +nbit_reg #(BITS) o1reg( + .nD(data1), + .nQ(operand1), + .Write(1'b1), + .Clk(clk), + .Reset(reset) +); + +wire [BITS-1:0] d2wo, imw0; +nbit_reg #(BITS) o2reg( + .nD(data2), + .nQ(d2wo), + .Write(1'b1), + .Clk(clk), + .Reset(reset) +); + +nbit_reg #(BITS) imreg( + .nD(immw), + .nQ(imw0), + .Write(1'b1), + .Clk(clk), + .Reset(reset) +); + +nbit_reg #(3) opreg( + .nD(alu_op_in), + .nQ(alu_op_out), + .Write(1'b1), + .Clk(clk), + .Reset(reset) +); + +nbit_reg #(RSELW) wreg( + .nD(win), + .nQ(wout), + .Write(1'b1), + .Clk(clk), + .Reset(reset) +); + +nbit_reg #(1) treg( + .nD(op_type), + .nQ(op_typew), + .Write(1'b1), + .Clk(clk), + .Reset(reset) +); + +generate +genvar i; +for (i = 0; i < BITS; i = i + 1) begin:mux + nbit_mux#(1) mux( + .MuxIn({imw0[i],d2wo[i]}), + .MuxOut(operand2[i]), + .MuxSel(op_typew) + ); +end +endgenerate + +endmodule diff --git a/verilog/S3.v b/verilog/S3.v new file mode 100755 index 0000000..2fa74ef --- /dev/null +++ b/verilog/S3.v @@ -0,0 +1,53 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 02:50:52 10/22/2012 +// Design Name: +// Module Name: Stage3 +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module Stage3( + alu_in, + wsel_in, + alu_out, + wsel_out, + clk, + reset + ); +parameter BITS=32; +parameter RSELW=5; +input clk, reset; +input [BITS-1:0] alu_in; +input [RSELW-1:0] wsel_in; + +output [BITS-1:0] alu_out; +output [RSELW-1:0] wsel_out; + +nbit_reg #(BITS) rreg( + .nD(alu_in), + .nQ(alu_out), + .Write(1'b1), + .Clk(clk), + .Reset(reset) +); + +nbit_reg #(RSELW) wreg( + .nD(wsel_in), + .nQ(wsel_out), + .Write(1'b1), + .Clk(clk), + .Reset(reset) +); +endmodule diff --git a/verilog/alu.v b/verilog/alu.v new file mode 100755 index 0000000..158d9a6 --- /dev/null +++ b/verilog/alu.v @@ -0,0 +1,67 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 19:56:04 10/03/2012 +// Design Name: +// Module Name: alu +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module alu( r1, r2, r3, aluop); + +parameter BITS = 32; + +input [BITS-1:0] r2, r3; +input [2:0] aluop; +output [BITS-1:0] r1; + +wire cinw; +wire carries [0:BITS-1]; +wire [BITS-1:0] r1out; +cin_choice cin(cinw, aluop); + +alu_slice1bit alu_slice_init( + .r1(r1out[0]), + .cout(carries[0]), + .r2(r2[0]), + .r3(r3[0]), + .cin(cinw), + .op(aluop) + ); + +generate + genvar i; + for (i = 1; i < BITS; i = i + 1) begin:aluslice + alu_slice1bit alu_slice( + .r1(r1out[i]), + .cout(carries[i]), + .r2(r2[i]), + .r3(r3[i]), + .cin(carries[i-1]), + .op(aluop) + ); + end +endgenerate + +wire sltw; +slt sltg(sltw, r2[BITS-1], r3[BITS-1], r1out[BITS-1], carries[BITS-1]); + + +wire doslt; +wire [BITS-2:0] s; +assign s = 0; +and a(doslt, aluop[2], aluop[1], aluop[0]); +mux_2to1_nbit #(BITS) m(r1, doslt, r1out, {s,sltw}); + +endmodule diff --git a/verilog/alu_slice1bit.v b/verilog/alu_slice1bit.v new file mode 100755 index 0000000..7f481d1 --- /dev/null +++ b/verilog/alu_slice1bit.v @@ -0,0 +1,65 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 12:08:08 10/04/2012 +// Design Name: +// Module Name: alu_slice1bit +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module alu_slice1bit( + output r1, + output cout, + input r2, + input r3, + input cin, + input [2:0] op + ); + +// wires for operation outputs and carries +wire movw, notw, notw2, addw, addcw, subw, subcw, orw, andw, xorw, sltw, sltcw; + +not notg(notw, r2); // NOT: R1 = ~R2 + +not nogt(notw2, r3); // for subtract; higher level sets cin to 1 +fa addg(addw, addcw, r2, r3, cin); // ADD: R1 = R2 + R3 +fa subg(subw, subcw, r2, notw2, cin); // SUB: R1 = R2 - R3 + +or org(orw, r2, r3); // OR: R1 = R2 | R3 +and andg(andw, r2, r3); // AND: R1 = R2 & R3 +xor_custom xorg(xorw, r2, r3); // XOR: R1 = R2 ^ R3 + +mux_8to1 opsel( .out(r1), + .sel(op), + .o0(r2), + .o1(notw), + .o2(addw), + .o3(subw), + .o4(orw), + .o5(andw), + .o6(xorw), + .o7(subw) + ); + +mux_8to1 csel( .out(cout), + .sel(op), + .o0(1'b0), .o1(1'b0), + .o2(addcw), + .o3(subcw), + .o4(1'b0), .o5(1'b0), + .o6(1'b0), + .o7(subcw) + ); + +endmodule diff --git a/verilog/cin_choice.v b/verilog/cin_choice.v new file mode 100755 index 0000000..e6ab92b --- /dev/null +++ b/verilog/cin_choice.v @@ -0,0 +1,39 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 12:44:24 10/04/2012 +// Design Name: +// Module Name: cin_choice +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module cin_choice( + output cin, + input [2:0] op + ); + +// we only want non-zero cin if we're subtracting. +// Subtraction is used in both sub and slt, so we have two cases +// 011 and 111. output is 1 for these and 0 for others + +// This is equivalent to a'bc + abc (where a, b, c are bits in op) + +wire notw, subw, sltw; +not n1(notw, op[2]); + +and sub_choose(subw, notw, op[1], op[0]); +and slt_choose(sltw, op[2], op[1], op[0]); +or choose(cin, sltw, subw); + +endmodule diff --git a/verilog/clock_delay.v b/verilog/clock_delay.v new file mode 100755 index 0000000..048b8ef --- /dev/null +++ b/verilog/clock_delay.v @@ -0,0 +1,52 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 22:02:54 10/21/2012 +// Design Name: +// Module Name: clock_delay +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module clock_delay( + out, + in, + clk, + reset + ); + +input clk, reset; + +parameter TIME=3; // number of bits to save +parameter BITS=5; // number of bits per tick + +input [BITS-1:0] in; +output [BITS-1:0] out; + +wire [BITS-1:0] connector [0:TIME+1]; + +assign connector[0] = in; +assign out = connector[TIME+1]; + + +generate +genvar i; + +for (i = 1; i <= TIME+1; i = i + 1) begin:reggen + nbit_reg #(BITS) nb(.nD(connector[i-1]), .nQ(connector[i]), .Write(1'b1), .Reset(reset), .Clk(clk)); +end + +endgenerate + + +endmodule diff --git a/verilog/datapath.v b/verilog/datapath.v new file mode 100755 index 0000000..beef5d9 --- /dev/null +++ b/verilog/datapath.v @@ -0,0 +1,101 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 23:27:42 10/21/2012 +// Design Name: +// Module Name: datapath +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module datapath( + aluout, // the output from the alu + instruction, // the instruction to execute + clk, + reset + ); +input clk, reset; + +parameter BITS = 32; // size of ALU operations and registers +parameter RSELW = 5; // bits required to select a register +parameter DEPTH = 3; // pipeline depth + +input [31:0] instruction; +output [BITS-1:0] aluout; + +wire [RSELW-1:0] rsel1, rsel2; // read selectors +wire [RSELW-1:0] wsel, wsel1, wsel2; // write selectors +wire [2:0] alu_op; +wire [15:0] immediate; + +// stage 1 handles decoding and register file select signals +Stage1 #(BITS,RSELW,DEPTH) s1( + .type(op_type), + .alu_op(alu_op), + .r1sel(wsel1), + .r2sel(rsel1), + .r3sel(rsel2), + .imm(immediate), + .instr(instruction), + .clk(clk), + .reset(reset) +); + +// the registers +wire [BITS-1:0] data1, data2; +nbit_register_file #(RSELW,BITS) regfile( + .WriteData(aluout), + .ReadData1(data1), + .ReadData2(data2), + .ReadSelect1(rsel1), + .ReadSelect2(rsel2), + .WriteSelect(wsel[RSELW-1:0]), + .WriteEnable(1'b1), + .Reset(reset), + .Clk(clk) +); + +wire [BITS-1:0] operand1, operand2; +wire [2:0] alu_op_out; +Stage2 #(BITS, RSELW) s2( + .operand1(operand1), + .operand2(operand2), + .wout(wsel2), + .alu_op_out(alu_op_out), + .op_type(op_type), + .alu_op_in(alu_op), + .data1(data1), + .data2(data2), + .immediate(immediate), + .win(wsel1), + .clk(clk), + .reset(reset) +); + +wire [BITS-1:0] alu_result; +alu #(BITS) a( + .r1(alu_result), + .r2(operand1), + .r3(operand2), + .aluop(alu_op_out) +); + +Stage3 #(BITS,RSELW) s3( + .alu_in(alu_result), + .alu_out(aluout), + .wsel_in(wsel2), + .wsel_out(wsel), + .clk(clk), + .reset(reset) +); +endmodule diff --git a/verilog/full_adder.v b/verilog/full_adder.v new file mode 100755 index 0000000..c669c6a --- /dev/null +++ b/verilog/full_adder.v @@ -0,0 +1,61 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 12:24:15 10/04/2012 +// Design Name: +// Module Name: fa +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module fa( + output sum, + output cout, + input a, + input b, + input cin + ); + + +wire s1, s2, s3, s4; // sum wires +wire c1, c2, c3; // carry wires +wire ia, ib, ic; // inverted wires + +// invert wires ad needed for the sum +not n1(ia, a); +not n2(ib, b); +not n3(ic, cin); + +// SUM CALCULATION + +// compute relevant minterms +and a1(s1, ia, ib, cin); +and a2(s2, ia, b, ic); +and a3(s3, a, ib, ic); +and a4(s4, a, b, cin); + +// or minterm results +or o1(sum, s1, s2, s3, s4); + +// CARRY CALCULATION + +// compute minterms +and ca1(c1, a, b); +and ca2(c2, a, cin); +and ca3(c3, b, cin); + +// or results +or o2(cout, c1, c2, c3); + + +endmodule diff --git a/verilog/instruction_decode.v b/verilog/instruction_decode.v new file mode 100755 index 0000000..f74e466 --- /dev/null +++ b/verilog/instruction_decode.v @@ -0,0 +1,41 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 20:27:39 10/21/2012 +// Design Name: +// Module Name: instruction_decode +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module instruction_decode( + output op_type, + output math_type, + output [2:0] alu_op, + output [4:0] r1sel, + output [4:0] r2sel, + output [4:0] r3sel, + output [15:0] immediate, + input [31:0] instruction +); + + +assign math_type = instruction[30]; +assign op_type = instruction[29]; +assign alu_op = instruction[28:26]; +assign r1sel = instruction[25:21]; +assign r2sel = instruction[20:16]; +assign r3sel = instruction[15:11]; +assign immediate = instruction[15:0]; + +endmodule diff --git a/verilog/mux_2to1.v b/verilog/mux_2to1.v new file mode 100755 index 0000000..48ad684 --- /dev/null +++ b/verilog/mux_2to1.v @@ -0,0 +1,34 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 13:02:11 10/05/2012 +// Design Name: +// Module Name: mux_2to1 +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module mux_2to1( + output out, + input sel, + input o0, + input o1 + ); + +wire a1, a2, n; +not n1(n, sel); +and ag1(a1, o0, n); +and ag2(a2, o1, sel); +or og1(out, a1, a2); + +endmodule diff --git a/verilog/mux_2to1_nbit.v b/verilog/mux_2to1_nbit.v new file mode 100755 index 0000000..3e70955 --- /dev/null +++ b/verilog/mux_2to1_nbit.v @@ -0,0 +1,39 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 13:03:36 10/05/2012 +// Design Name: +// Module Name: mux_2to1_nbit +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module mux_2to1_nbit( + out, + sel, + o0, + o1 + ); +parameter BITS = 32; +input [BITS-1:0] o1, o0; +output [BITS-1:0] out; +input sel; + +generate +genvar i; + for (i = 0; i < BITS; i = i + 1) begin:muxgen + mux_2to1 m(out[i], sel, o0[i], o1[i]); + end +endgenerate + +endmodule diff --git a/verilog/mux_8to1.v b/verilog/mux_8to1.v new file mode 100755 index 0000000..f9ebb65 --- /dev/null +++ b/verilog/mux_8to1.v @@ -0,0 +1,55 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 22:40:54 10/04/2012 +// Design Name: +// Module Name: mux_8to1 +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module mux_8to1( + output out, + input [2:0] sel, + input o0, + input o1, + input o2, + input o3, + input o4, + input o5, + input o6, + input o7 + ); + +wire sn0, sn1, sn2; +not n1(sn0, sel[0]); +not n2(sn1, sel[1]); +not n3(sn2, sel[2]); +wire a0, a1, a2, a3, a4, a5, a6, a7; + +// 111 corresponds to ag0 + +and ag0(a0, sn2, sn1, sn0, o0); +and ag1(a1, sn2, sn1, sel[0], o1); +and ag2(a2, sn2, sel[1], sn0, o2); +and ag3(a3, sn2, sel[1], sel[0], o3); + +and ag4(a4, sel[2], sn1, sn0, o4); +and ag5(a5, sel[2], sn1, sel[0], o5); +and ag6(a6, sel[2], sel[1], sn0, o6); +and ag7(a7, sel[2], sel[1], sel[0], o7); + +or(out, a0, a1, a2, a3, a4, a5, a6, a7); + + +endmodule diff --git a/verilog/nbit_demux.v b/verilog/nbit_demux.v new file mode 100755 index 0000000..5be44c8 --- /dev/null +++ b/verilog/nbit_demux.v @@ -0,0 +1,33 @@ +//n bit DeMux +// Specify the number of select lines as a parameter.
+module nbit_demux(DeMuxIn, // DeMux input: 1 bit. + DeMuxOut, // DeMux output: 2^SELECT_WIDTH bits. + DeMuxSel); // DeMux select lines: SELECT_WIDTH bits. + +// Specifies the select line width. +parameter SELECT_WIDTH = 3; + +//-------------Input Ports----------------------------- +input DeMuxIn; +input [SELECT_WIDTH-1:0] DeMuxSel; +//-------------Output Ports---------------------------- +output [2 ** SELECT_WIDTH-1:0] DeMuxOut; +//-------------Wires----------------------------------- +wire [2 ** SELECT_WIDTH-1:0] select; +//-------------Other----------------------------------- +//------------Code Starts Here------------------------- + +generate + genvar i; // Instance variable + + // address decoder + assign select[2 ** SELECT_WIDTH-1:0] = 2 ** DeMuxSel[SELECT_WIDTH-1:0]; + + // Generation for loop + for(i= 0;i< 2 ** SELECT_WIDTH;i= i+1) + begin:demux_loop + assign DeMuxOut[i] = DeMuxIn & select[i]; + end +endgenerate +
+endmodule
diff --git a/verilog/nbit_mux.v b/verilog/nbit_mux.v new file mode 100755 index 0000000..fb5cd14 --- /dev/null +++ b/verilog/nbit_mux.v @@ -0,0 +1,19 @@ +//n bit Mux +// Specify the number of select lines as a parameter.
+module nbit_mux(MuxIn, // Mux input: 2^SELECT_WIDTH bits. + MuxOut, // Mux output: 1 bit. + MuxSel); // Mux select lines: SELECT_WIDTH bits. + +// Specifies the select line width. +parameter SELECT_WIDTH = 3; + +//-------------Input Ports----------------------------- +input [2 ** SELECT_WIDTH-1:0] MuxIn; +input [SELECT_WIDTH-1:0] MuxSel; +//-------------Output Ports---------------------------- +output MuxOut; +//-------------Wires----------------------------------- +//-------------Other----------------------------------- +//------------Code Starts Here------------------------- +assign MuxOut = MuxIn[MuxSel];
+endmodule
diff --git a/verilog/nbit_reg.v b/verilog/nbit_reg.v new file mode 100755 index 0000000..892d42c --- /dev/null +++ b/verilog/nbit_reg.v @@ -0,0 +1,23 @@ +//n bit register
+
+module nbit_reg(nD, // Register Input + nQ, // Register Output + Write, // Only accept input when this is set + Reset, // Synchronous Reset + Clk); // Clock + +// Specifies the register data width. +parameter DATA_WIDTH = 32; + +//-------------Input Ports----------------------------- +input [DATA_WIDTH-1:0] nD; +input Write; +input Reset; +input Clk; +//-------------Output Ports---------------------------- +output [DATA_WIDTH-1:0] nQ; +//-------------Wires----------------------------------- +//-------------Other----------------------------------- +//------------Code Starts Here------------------------- +DFF DFFs[DATA_WIDTH-1:0] (nD, nQ, Write, Reset, Clk);
+endmodule
diff --git a/verilog/nbit_register_file.v b/verilog/nbit_register_file.v new file mode 100755 index 0000000..8711209 --- /dev/null +++ b/verilog/nbit_register_file.v @@ -0,0 +1,76 @@ +// nbit_register_file +// +// A generic register file which can be parameterized +// by the following: +// +// - number of register select lines REG_SELECT_WIDTH: +// number of registers in the file is 2 to the power +// of this number. +// +// - number of register bits DATA_WIDTH. +// +// Updates: +// 10/18: Reset fix. +// 10/21: Timing fix. +//
+module nbit_register_file(WriteData, // Input data + ReadData1, // Output data 1 + ReadData2, // Output data 2 + ReadSelect1, // Select lines for output 1 + ReadSelect2, // Select lines for output 2 + WriteSelect, // Select lines for input + WriteEnable, // Causes write to take place on posedge + Reset, // Synchronous reset + Clk); // Clock + +// Register select line size (number of registers is 2 +// to the power of this number). +parameter REG_SELECT_WIDTH = 1; +// Register size in bits. +parameter DATA_WIDTH = 32; + +//-------------Input Ports----------------------------- +input [DATA_WIDTH-1:0] WriteData; +input [REG_SELECT_WIDTH-1:0] ReadSelect1; +input [REG_SELECT_WIDTH-1:0] ReadSelect2; +input [REG_SELECT_WIDTH-1:0] WriteSelect; +input WriteEnable; +input Reset; +input Clk; +//-------------Output Ports---------------------------- +output [DATA_WIDTH-1:0] ReadData1; +output [DATA_WIDTH-1:0] ReadData2; +//-------------Wires----------------------------------- +wire [2 ** REG_SELECT_WIDTH-1:0] w_reg_to_outmux [DATA_WIDTH-1:0]; +wire [2 ** REG_SELECT_WIDTH-1:0] w_write_select; +//-------------Other----------------------------------- +//------------Code Starts Here------------------------- + +// Muxes from registers to outputs +generate + genvar k; // Instance variable + // Generation for loop + for(k= 0;k< DATA_WIDTH;k= k+1) + begin:mux_loop + nbit_mux #(REG_SELECT_WIDTH) nbitmuxes1 (w_reg_to_outmux[k], ReadData1[k], ReadSelect1); + nbit_mux #(REG_SELECT_WIDTH) nbitmuxes2 (w_reg_to_outmux[k], ReadData2[k], ReadSelect2); + end +endgenerate + +// Demux to select which register to write to +nbit_demux #(REG_SELECT_WIDTH) writeselect (WriteEnable, w_write_select, WriteSelect); + +// Array of D Flip-flops for the registers +generate + genvar i,j; // Instance variable + // Generation for loop + for(i= 0;i< DATA_WIDTH;i= i+1) + begin:reg_loop1 + for(j= 0;j< 2 ** REG_SELECT_WIDTH;j= j+1) + begin:reg_loop2 + DFF DFFS (WriteData[i],w_reg_to_outmux[i][j],w_write_select[j],Reset,Clk); + end + end +endgenerate + +endmodule diff --git a/verilog/overflow.v b/verilog/overflow.v new file mode 100755 index 0000000..1662d21 --- /dev/null +++ b/verilog/overflow.v @@ -0,0 +1,50 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 22:17:44 10/04/2012 +// Design Name: +// Module Name: overflow +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module overflow( + output ovf, + input r2, + input r3, + input r1, + input carry + ); + +// overflow occurs (in subtraction) only when the signs are different +// for r2 - r3 +// if r2 is negative, and r3 is potitive, will overflow to positive +// so cout would be 0 +// if r2 is positive and r3 is negative, will overflow to negative +// so cout would be 1 + + +wire r2pos, r3pos, r1pos, nsout; +wire aw1, aw2; + +not n1(r2pos, r2); // positive if not r2 +not n2(r3pos, r3); // "" "" "" r3 +not n3(r1pos, r1); +not n4(nsout, carry); + +and a1(aw1, r2, r3pos, r1pos,carry); // negative - positive = bigger negative and can overflow +and a2(aw2, r2pos, r3, r1, nsout); // pos - neg = pos + +or o1(ovf, aw1, aw2); + +endmodule diff --git a/verilog/slt.v b/verilog/slt.v new file mode 100755 index 0000000..2501a07 --- /dev/null +++ b/verilog/slt.v @@ -0,0 +1,45 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 10:49:01 10/05/2012 +// Design Name: +// Module Name: slt +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module slt( + output out, + input r2, + input r3, + input signres, + input carryres + ); + +// r2 is less than r3 if the result of subtraction is negative +// or if it's positive and there's overflow + +wire ovfw, novfw, pos; + +overflow ovf(ovfw, r2, r3, signres, carryres); +not n1(novfw, ovfw); +not n2(pos, signres); + +wire aw1, aw2; + +and a1(aw1, signres, novfw); +and a2(aw2, pos, ovfw); + +or o1(out, aw1, aw2); + +endmodule diff --git a/verilog/test_alu.v b/verilog/test_alu.v new file mode 100755 index 0000000..9b936ce --- /dev/null +++ b/verilog/test_alu.v @@ -0,0 +1,129 @@ +`timescale 1ns / 1ps + +//////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 23:34:01 10/04/2012 +// Design Name: toplevel +// Module Name: /ad/eng/users/m/g/mgabed/Documents/ec413/mgabed-lab4/test_alu.v +// Project Name: mgabed-lab4 +// Target Device: +// Tool versions: +// Description: +// +// Verilog Test Fixture created by ISE for module: toplevel +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +//////////////////////////////////////////////////////////////////////////////// + +module test_alu; + + // Inputs + reg [31:0] r2; + reg [31:0] r3; + reg [2:0] aluop; + reg reset; + reg clk; + + // Outputs + wire [31:0] r1; + + // Instantiate the Unit Under Test (UUT) + toplevel uut ( + .r1(r1), + .r2(r2), + .r3(r3), + .aluop(aluop), + .reset(reset), + .clk(clk) + ); + + initial begin + // Initialize Inputs + r2 = 0; + r3 = 0; + aluop = 0; + reset = 0; + clk = 1; + + // Wait 100 ns for global reset to finish + #100; + + // Add stimulus here + fork + begin + // test MOV + aluop = 3'b0; + r2 = 391; #2; + r2 = 81283; #2; + r3 = 3281; r2 = 1; #2; + r2 = 0; #2; + #20; + + // test NOT + aluop = 3'b1; + r2 = 391; #2; + r2 = 81835; #2; + r2 = 32'b110101011; #2; + #20; + + // test ADD + aluop = 3'b010; + r2 = 20; r3 = 50; #2; + r2 = -18; r3 = 188; #2; + r2 = 0; r3 = 818; #2; + r2 = 8184803; r3 =818501028; #2; + #20; + + // test SUB + aluop = 3'b011; + r2 = 180; r3 = 170; #2; + r2 = 50; r3 = 90; #2; + r2 = -50; r3 = -150; #2; + #20; + + // test OR + aluop = 3'b100; + r2 = 32'b01101001; r3 = 32'b10010110; #2; + r2 = 18581; r3 = 18204; #2; + #20; + + // test AND + aluop = 3'b101; + r2 = 32'b10101010; r3 = 23'b11001100; #2; + r2 = 8101; r2 = 192189258; #2; + #20; + + // test XOR + aluop = 3'b110; + r2 = 32'b11110011; r3 = 32'b11000011; #2; + r2 = 182381052; r3 = 19285; #2; + #20; + + // test SLT + aluop = 3'b111; + r2 = 500; r3 = 40; #2; + r2 = -5; r3 = 100; #2; + r2 = 1; r3 = 5; #2; + r2 = 32'hfffffff0; r3 = 189; #2; + r2 = 0; r3 = 0; #2; + r2 = 32'hf0000000; r3 = 32'hf0000001; #2; + r2 = 32'h7fffffff; r3 = 32'h80000000; #2; + + #20; + end + + while (1) begin + clk = ~clk; #1; + end + join + end + +endmodule + diff --git a/verilog/test_slt.v b/verilog/test_slt.v new file mode 100755 index 0000000..4ae94c3 --- /dev/null +++ b/verilog/test_slt.v @@ -0,0 +1,76 @@ +`timescale 1ns / 1ps + +//////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 13:25:07 10/05/2012 +// Design Name: slt +// Module Name: /ad/eng/users/m/g/mgabed/Documents/ec413/mgabed-lab4/test_slt.v +// Project Name: mgabed-lab4 +// Target Device: +// Tool versions: +// Description: +// +// Verilog Test Fixture created by ISE for module: slt +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +//////////////////////////////////////////////////////////////////////////////// + +module test_slt; + + // Inputs + reg r2; + reg r3; + reg signres; + reg carryres; + + // Outputs + wire out; + + // Instantiate the Unit Under Test (UUT) + slt uut ( + .out(out), + .r2(r2), + .r3(r3), + .signres(signres), + .carryres(carryres) + ); + + initial begin + // Initialize Inputs + r2 = 0; + r3 = 0; + signres = 0; + carryres = 0; + + // Wait 100 ns for global reset to finish + #100; + + // Add stimulus here + signres = 1; carryres = 1; r2 = 1; r3 = 1; #5; + signres = 1; carryres = 1; r2 = 1; r3 = 0; #5; + signres = 1; carryres = 1; r2 = 0; r3 = 1; #5; + signres = 1; carryres = 1; r2 = 0; r3 = 0; #5; + signres = 1; carryres = 0; r2 = 1; r3 = 1; #5; + signres = 1; carryres = 0; r2 = 1; r3 = 0; #5; + signres = 1; carryres = 0; r2 = 0; r3 = 1; #5; + signres = 1; carryres = 0; r2 = 0; r3 = 0; #5; + signres = 0; carryres = 1; r2 = 1; r3 = 1; #5; + signres = 0; carryres = 1; r2 = 1; r3 = 0; #5; + signres = 0; carryres = 1; r2 = 0; r3 = 1; #5; + signres = 0; carryres = 1; r2 = 0; r3 = 0; #5; + signres = 0; carryres = 0; r2 = 1; r3 = 1; #5; + signres = 0; carryres = 0; r2 = 1; r3 = 0; #5; + signres = 0; carryres = 0; r2 = 0; r3 = 1; #5; + signres = 0; carryres = 0; r2 = 0; r3 = 0; #5; + + end + +endmodule + diff --git a/verilog/xor.v b/verilog/xor.v new file mode 100755 index 0000000..0282080 --- /dev/null +++ b/verilog/xor.v @@ -0,0 +1,40 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 12:20:45 10/04/2012 +// Design Name: +// Module Name: xor +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module xor_custom( + output o, + input a, + input b + ); + +wire na, nb; +wire aw1, aw2; +// xor (a,b) = ab' + a'b + +not n1(na, a); +not n2(nb, b); + +and a1(aw1, a, nb); +and a2(aw2, na, b); + +or o1(o, aw1, aw2); + + +endmodule |