Verilog
Verilog
Half Adder
// Code of a Half Adder circuit
module FourbitAdder (input [3:0] X, input [3:0] Y, output [3:0] S, output Co);
wire co1, co2, co3;
FullAdder fa0 (.A(X[0]), .B(Y[0]), .Ci(0), .S(S[0]), .Co(co1));
FullAdder fa1 (.A(X[1]), .B(Y[1]), .Ci(co1), .S(S[1]), .Co(co2));
FullAdder fa2 (.A(X[2]), .B(Y[2]), .Ci(co2), .S(S[2]), .Co(co3));
FullAdder fa3 (.A(X[3]), .B(Y[3]), .Ci(co3), .S(S[3]), .Co(Co));
endmodule
// A sophisticated way to code a 4-bit Adder circuit
module FourbitAdder (input [3:0] X, input [3:0] Y, input Ci, output [3:0] S, output Co);
assign {Co, S} = X + Y + Ci;
endmodule
Leave it to the computer to figure out the logical circuit
module FourbitAdderSubtractor (input [3:0] X, input [3:0] Y, input C_B_in, input Control,
output [3:0] Sum_Diff, output C_B_out);
Example:
Design a circuit to implement the logical expression x y+ y (x+ z )
module myModule(input x, input y, input z, output out);
assign out = (~x)&(~y) | y&(x|z);
endmodule
Example:
Consider a circuit that accepts a 3-bit binary number X and outputs a 2-bit binary number
Y that is equal to the number of 1’s that appear in X.
For example,
(a) X=000 contains no 1’s and Y=00,
(b) X=110 contains two 1’s and Y=10,
(c) X=111 contains three 1’s and Y=11, etc
Design this circuit using Verilog.
module countOnes (input [2:0] X, output [1:0] Y);
assign Y = X[0] + X[1] + X[2];
endmodule
Note how the individual bits are referred
Example:
Design a three-input circuit that yields an output 1 when exactly one of its inputs is 1
module isSingleOne(input [2:0] X, output Z);
wire [1:0] Y;
assign Y = X[0] + X[1] + X[2];
assign Z = (Y==1)? 1:0;
endmodule
// A 16:1 Multiplexer
module Multiplexer (input [3:0] Select, input [15:0] DataIn, output DataOut);
assign DataOut = DataIn[Select];
endmodule
// A 4:16 Decoder
// A Magnitude Comparator
// Half Adder
module HalfAdder (input wire a, input wire b, output reg s, output reg co);
always @(a, b)
begin
s = a ^ b;
co = a & b;
end
endmodule
begin Explanation:
s = a ^ b; begin end: this acts as a pair of brackets. It is like:
co = a & b; {
end s = a ^ b;
co = a & b;
}
module HalfAdder (input wire a, input wire b, output reg s = 0, output reg co = 0);
always @(a, b)
begin
s = a ^ b;
co = a & b;
end
endmodule
// Full Adder
module FullAdder1(input A, input B, input Ci, output reg S = 0, output reg Co = 0);
always @(A, B, Ci)
begin
S = A ^ B ^ Ci;
Co = (A & B) | (B & Ci) | (Ci & A);
end
endmodule
// Four-bit Adder
module FourbitAdderSubtractor (input [3:0] X, input [3:0] Y, input C_B_in, input Control,
output reg [3:0] Sum_Diff = 0, output reg C_B_out = 0);
module PriorityEncoder(input [7:0] D, output reg [3:0] A = 0, output reg DataValid = 0);
always @(D) begin
if(D[7]) begin
A = 7;
DataValid = 1;
end
else if(D[6]) begin
A = 6;
DataValid = 1;
end
else if(D[5]) begin
A = 5;
DataValid = 1;
end
else if(D[4]) begin
A = 4;
DataValid = 1;
end
else if(D[3]) begin
A = 3;
DataValid = 1;
end
else if(D[2]) begin
A = 2;
DataValid = 1;
end
else if(D[1]) begin
A = 1;
DataValid = 1;
end
else if(D[0]) begin
A = 0;
DataValid = 1;
end
else begin
DataValid = 0;
end
end
endmodule
for loop (similar to C language)
// Priority Encoder
module PriorityEncoder(input [7:0] D, output reg [3:0] A = 0, output reg DataValid = 0);
integer i;
always @(D) begin
A = 0;
DataValid = 0;
for(i=0; i<=8; i=i+1) begin
if(D[i]) begin
A = i;
DataValid = 1;
end
end
end
endmodule
module PriorityEncoder(input [7:0] D, output reg [3:0] A = 0, output reg DataValid = 0);
integer i;
always @(D) begin
DataValid = 0;
i=7;
while((i>=0) && (DataValid == 0)) begin
if(D[i]) begin
A = i;
DataValid = 1;
end
i = i-1;
end
end
endmodule
// BCD to Seven Segment Display Decoder