Im writing code for a 4bit Arithmetic Logic Unit in Verilog HDL as a
structural model. I need help programming the function for adding
alu_in_a+alu_in_b+Cin. I also need help with variable names. In this
project the ALU module is intended to have inputs alu_in_a and alu_in_b.
I designed all of my adders using A and B as inputs. I realized I don't
fully understand how module instantiation inside another module works,
and how inputs to one module are passed to another module for some
desired operation. I would very much appreciate clarification on this in
general and in the specific instance of the 4bit ALU. On a side note
this code does compile, but I suspect there are errors resulting from my
ignorance which will cause it to malfunction in simulation. Thanks!
// ALU
module ALU (input [3:0] alu_in_a, alu_in_b, OPCODE, input Cin, output
reg [3:0] Sum, output reg Cout, output OF);
reg [3:0] Bin;
wire [3:0] Bn, S;
wire Co;
com2s C1 (aluin_b, Bn);
ripple_adder_4bit FA4 (A, Bin, Cin, S, Co, OF);
always @ (*) begin
Bin = 4'b000; Sum = 4'b0000; Cout = 'b0;
case (OPCODE)
//ALU operations
// A+B : add
4'b1000 : begin
Bin = alu_in_b; Sum = S; Cout = Co;
end
// A+B+Cin : add with Cin
4'b1001 : begin
Bin = alu_in_b; Sum = S; Cout = Co; ***HELP***
end
// A-B : sub a from b
4'b1010 : begin
Bin = Bn; Sum = S; Cout = Co;
end
// ~(A&B) : bitwise NAND
4'b0000 : begin
Sum = ~alu_in_a&~alu_in_b;
end
// ~(A|B) : bitwise NOR
4'b0001 : begin
Sum = ~alu_in_a|~alu_in_b;
end
// A^B : bitwise XOR
4'b0010 : begin
Sum = alu_in_a^alu_in_b;
end
// ~A : bitwise inversion
4'b0100 : begin
Sum = ~alu_in_a;
end
// A_leftshift
4'b0101 : begin
Sum = alu_in_a << 1;
end
endcase
end
endmodule
// 4 Bit Ripple Carry Adder
module ripple_adder_4bit(input Cin, input [3:0] A, B, output [3:0] Sum,
output Cout, OF);
full_adder FA1(Sum[0], Cout1, A[0], B[0], Cin);
full_adder FA2(Sum[1], Cout2, A[1], B[1], Cout1);
full_adder FA3(Sum[2], Cout3, A[2], B[2], Cout2);
full_adder FA4(Sum[3], Cout, A[3], B[3], Cout3);
xor X1 (OF, Cout3, Cout);
endmodule
// Twos Compliment
module com2s (input [3:0] B, output [3:0] Bn);
wire [3:0] Bn1;
wire OF;
assign Bn1 = ~B;
ripple_adder_4bit FA4 (Bn1, 4'b0000, 1'b1, Bn, Cout, OF);
endmodule
// Full Adder
module full_adder(output S, Cout, input A, B, Cin);
wire Sum1, Cout1, Cout2;
half_adder HA1(Sum1, Cout1, A, B);
half_adder HA2(Sum1, C, Sum, C);
or O1(Cout, Cout1, Cout2);
endmodule
// Half Adder
module half_adder(output Sum, Cout, input A,B);
assign Sum = A^B;
assign Cout = A&B;
endmodule
You should add the port name upfront:
1 | ripple_adder_4bit FA4 (.A(A), .Bin(Bin), .Cin(Cin), .S(S), .Co(Co), .OF(OF)); |
Otherwise you need to keep the port order as it defined in the module and that might change... You can also define localparam for your opcodes
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.