Combinational Logic Circuit
Combinational Logic Circuit
Combinational Logic Circuit
System Design
Design of
combinational logics
Done by :
Sindu Mithra M K
2023203028
M.E. Applied Electronics
Table of content
Combinational Logic Circuit
Classification of CLC
Adder
Subtractor
Multiply
Divide
Comparator
Multiplexer
Demultiplexer
Encoder
Decoder
2
Introduction
5
Classification of CLC
6
Characteristics of combinational logic
circuit
Combinational logic circuits do not have any internal
memory elements like flip-flops or latches.
The output at any given time depends only on the
current input values and is not influenced by past
inputs or outputs.
Combinational logic circuits perform parallel
processing, where multiple logic operations can occur
simultaneously on different parts of the input data.
This parallelism allows for fast processing of
information.
Unlike sequential logic circuits that rely on clock
signals to synchronize their operations, combinational
logic circuits operate independently of any clock
signal. They respond immediately to changes in input
signals. 7
Adders
• Digital computers perform a variety of information processing
tasks. Among the basic functions encountered are the
various arithmetic operations (addition).
8
Binary Adder - Half Adder
.0+0=0
0+1=1
1+0=1
1 + 1 = 10
9
10
Half adder Verilog code
Test bench
Code:
module half_adder_tb;
//half adder using reg a,b;
structural modeling wire sum,carry;
module half_adder_s ( half_adder_s uut(a,b,sum,carry);
input a,b, initial begin
output sum,carry ); a = 0; b = 0; #10
xor(sum,a,b); a = 0; b = 1; #10
and(carry,a,b); a = 1; b = 0; #10
a = 1; b = 1; #10
endmodule
$finish();
end
endmodule
11
Stimulation output half adder
12
Binary Adder - Full Adder
Combinational logic circuit that performs
arithmetic operation for adding three bits
n=3bit , n=23=8
13
14
Program
module full_adder(
input a,b,cin,
output sum, carry );
assign sum = a^b^cin ;
assign carry = (a&b)|(b&cin)|(cin&a);
endmodule
15
Test bench
module full_adder_tb ; a=0; b=1; cin=1;
#10;
reg cin,a,b; a=1; b=0; cin=0;
wire sum , carry; #10;
a=1; b=0; cin=1;
full_adder uut (a,b,cin,sum,carry);
#10;
initial begin a=1; b=1; cin=0;
#10;
a=0; b=0; cin=0;
a=1; b=1; cin=1;
#10; #10;
a=0; b=0; cin=1; $finish();
end
#10; endmodule
a=0; b=1; cin=0;
#10;
16
Output
17
Subtractor
Binary
Arithmetic
18
Binary Subtractor – Half Subtractor
n= 2bit , n=22=4
0 – 0 =0
1 – 0 =1
1 – 1 =0
0 – 1 = 10 – 1 = 1
(The 1 borrowed from
the next higher stage) 19
20
Verilog code for half subtractor
Test bench :
Code :
module tb_top;
module Half_Subtractor ( reg a, b;
output D, B, wire D, B;
input X, Y) ; half_subtractor hs(a, b, D, B);
assign D = X ^ Y; initial begin
a = 0; b = 0;
assign B = ~X & Y;
#1;
endmodule a = 0; b = 1;
#1;
a = 1; b = 0;
#1;
a = 1; b = 1;
end
endmodule 21
22
Binary Subtractor – Full Subtractor
Combinational logic circuit that performs arithmetic
operation for subtracting three bits
n=3bits , n=23=8
23
24
Verilog code for full
subtractor Test bench :
module tb_top;
reg a, b, Bin;
Code : wire D, Bout;
module full_subtractor(
full_subtractor fs(a, b, Bin, D, Bout);
input a, b, Bin,
output D, Bout); initial begin
a = 0; b = 0; Bin = 0; #1;
assign D = a ^ b ^ Bin;
a = 0; b = 0; Bin = 1; #1;
assign Bout = (~a & b) | (~(a ^ b) & Bin); a = 0; b = 1; Bin = 0; #1;
a = 0; b = 1; Bin = 1; #1;
endmodule
a = 1; b = 0; Bin = 0; #1;
a = 1; b = 0; Bin = 1; #1;
a = 1; b = 1; Bin = 0; #1;
a = 1; b = 1; Bin = 1;
end 25
endmodule
26
Multiplier
Array multiplier has regular Structure. Multiplier circuit is
based on add and shift algorithm Each partial Product is
generated by multiplication of multiplicand with one multiplier
bit. The partial product are shifted according to their bit
orders and then added
The addition can be performed with nominal carry propagate
adder.
27
28
30
reg signed p[4][4];
wire [10:0] c; // c represents carry of HA/FA
wire [5:0] s; // s represents sum of HA/FA
// For ease and readability, two different name s and c are
used instead of single wire name.
genvar g;
generate
for(g = 0; g<4; g++) begin
and a0(p[g][0], A[g], B[0]);
and a1(p[g][1], A[g], B[1]);
and a2(p[g][2], A[g], B[2]);
and a3(p[g][3], A[g], B[3]);
end
endgenerate 31
assign z[0] = p[0][0];
//row 0
half_adder h0(p[0][1], p[1][0], z[1], c[0]);
half_adder h1(p[1][1], p[2][0], s[0], c[1]);
half_adder h2(p[2][1], p[3][0], s[1], c[2]);
//row1
full_adder f0(p[0][2], c[0], s[0], z[2], c[3]);
full_adder f1(p[1][2], c[1], s[1], s[2], c[4]);
full_adder f2(p[2][2], c[2], p[3][1], s[3], c[5]);
//row2
full_adder f3(p[0][3], c[3], s[2], z[3], c[6]);
full_adder f4(p[1][3], c[4], s[3], s[4], c[7]);
full_adder f5(p[2][3], c[5], p[3][2], s[5], c[8]);
//row3
half_adder h3(c[6], s[4], z[4], c[9]);
full_adder f6(c[9], c[7], s[5], z[5], c[10]);
full_adder f7(c[10], c[8], p[3][3], z[6], z[7]);
endmodule 32
Test bench
module TB;
reg [3:0] A, B;
wire [7:0] P;
array_multiplier am(A,B,P);
initial begin
A = 1; B = 0; #3;
A = 7; B = 5; #3;
A = 8; B = 9; #3;
A = 4'hf; B = 4'hf;
end
endmodule
33
Output
A = 0001: B = 0000 --> P = 00000000, P(dec) = 0
A = 0111: B = 0101 --> P = 00100011, P(dec) = 35
A = 1000: B = 1001 --> P = 01001000, P(dec) = 72
A = 1111: B = 1111 --> P = 11100001, P(dec) = 225
34
Divider
35
36
Comparator
37
38
Verilog code for comparator
module comparator(
input [3:0] A, B,
output reg A_grt_B, A_less_B, A_eq_B);
always@(*) begin
A_grt_B = 0; A_less_B = 0; A_eq_B = 0;
if(A>B)
A_grt_B = 1'b1;
else if(A<B)
A_less_B = 1'b1;
else
A_eq_B = 1'b1;
end 39
endmodule
Test bench
module tb;
reg [3:0] A, B;
wire A_grt_B, A_less_B, A_eq_B;
comparator comp(A, B, A_grt_B, A_less_B, A_eq_B);
initial begin
repeat(5) begin
A=$random; B=$random; #1;
end
end
endmodule
40
Output
A = 4, B = 1 -> A_grt_B = 1, A_less_B = 0, A_eq_B = 0
A = 9, B = 3 -> A_grt_B = 1, A_less_B = 0, A_eq_B = 0
A = 6, B = 6 -> A_grt_B = 0, A_less_B = 0, A_eq_B = 1
A = 5, B = 2 -> A_grt_B = 1, A_less_B = 0, A_eq_B = 0
A = 6, B = 2 -> A_grt_B = 0, A_less_B = 1, A_eq_B = 0
41
Multiplexer (Data Selector)
Multiplexing means transmitting a large number of information units
over a smaller number of channels or lines. A digital multiplexer is
CLC that selects binary information from one of many input lines
and directs it to a single output line. The selection of a particular
input line is controlled by of a selection lines.
Design MUX:
AND gates used to represent
inputs.
One OR gate only used to
collect inputs.
NOT gates as a selector to
connect inputs to output.
42
For example, you have a and b as Input One and Input
Two, and you need to select between inputs. You can set
a Select to decide which inputs must transfer to output (y).
43
It consists of two AND, one OR, and one NOT
gates. The boolean logic equation for a 2-to-1
multiplexer is (A.~S)+(B. S), where A is the first
input and B is the second input.
44
Program for 2:1 mux
module mux(
input S,I0,I1,
output Y );
assign Y = (~S&I0)|(S&I1);
endmodule
45
Test bench
module mux_tb;
reg I0,I1,S;
wire Y;
mux uut (S,I0,I1,Y);
initial begin
S=0 ; I0=0 ; I1=0 ;
#10;
S=0 ; I0=0 ; I1=1 ;
#10;
S=1 ; I0=1 ; I1=0 ;
#10;
S=1 ; I0=1 ; I1=1 ;
#10;
$finish();
end 46
endmodule
Output
47
Demultiplexer
A demultiplexer performs the reverse operation of a
multiplexer i.e. it receives one input and distributes it over
several outputs.
Design DMUX:
AND gates used to
represent inputs.
NOT gates as a selector to
connect inputs to output.
48
49
50
Verilog code for demux
module demux_1_4(
input [1:0] sel,
input i,
output reg y0,y1,y2,y3);
endmodule
Test bench
module tb;
reg [1:0] sel;
reg i;
wire y0,y1,y2,y3;
demux_1_4 demux(sel, i, y0, y1, y2, y3);
initial begin
sel=2'b00; i=0; #1;
sel=2'b00; i=1; #1;
sel=2'b01; i=0; #1;
sel=2'b01; i=1; #1;
sel=2'b10; i=0; #1;
sel=2'b10; i=1; #1;
sel=2'b11; i=0; #1;
sel=2'b11; i=1; #1;
end 52
Endmodule
Output
sel = 00, i = 0 -> y0 = 0, y1 = 0 ,y2 = 0, y3 = 0
sel = 00, i = 1 -> y0 = 1, y1 = 0 ,y2 = 0, y3 = 0
sel = 01, i = 0 -> y0 = 0, y1 = 0 ,y2 = 0, y3 = 0
sel = 01, i = 1 -> y0 = 0, y1 = 1 ,y2 = 0, y3 = 0
sel = 10, i = 0 -> y0 = 0, y1 = 0 ,y2 = 0, y3 = 0
sel = 10, i = 1 -> y0 = 0, y1 = 0 ,y2 = 1, y3 = 0
sel = 11, i = 0 -> y0 = 0, y1 = 0 ,y2 = 0, y3 = 0
sel = 11, i = 1 -> y0 = 0, y1 = 0 ,y2 = 0, y3 = 1
53
Encoder
An encoder is a device, circuit, software program,
algorithm or person that converts information from one
format or code to another. The purpose of encoder is
standardization, speed, secrecy, security, or saving space by
shrinking size. If a device output code has fewer bits than the
input code has, the device is usually called an encoder.
Design ENC:
OR gates used to
design encoder.
54
55
56
Verilog code for encoder
module binary_encoder(
input [7:0] D,
output [2:0] y);
assign y[2] = D[4] | D[5] | D[6] | D[7];
assign y[1] = D[2] | D[3] | D[6] | D[7];
assign y[0] = D[1] | D[3] | D[5] | D[7];
endmodule
57
Test bench
module tb;
reg [7:0] D;
wire [2:0] y;
int i;
binary_encoder bin_enc(D, y);
initial begin
D=8'b1; #1;
for(i=0; i<8; i++) begin
$display("D = %h(in dec:%0d) -> y = %0h", D, i, y);
D=D<<1; #1;
end
end
endmodule 58
Output
D = 01(in dec:0) -> y = 0 D = 10(in dec:4) -> y = 4
D = 02(in dec:1) -> y = 1
D = 20(in dec:5) -> y = 5
D = 04(in dec:2) -> y = 2
D = 40(in dec:6) -> y = 6
D = 08(in dec:3) -> y = 3
D = 80(in dec:7) -> y = 7
59
Priority encoder
The priority encoder overcome the drawback of binary encoder
that generates invalid output for more than one input line is set to
high. The priority encoder prioritizes each input line and provides
an encoder output corresponding to its highest input priority.
The priority encoder is widely used in digital applications. One
common example of a microprocessor detecting the highest
priority interrupt. The priority encoders are also used in navigation
systems, robotics for controlling arm positions, communication
systems, etc.
60
Block diagram
Truth table
61
Verilog code for priority
encoder
module priority_encoder(
input [7:0] D,
output reg [2:0] y);
always@(D) begin
casex(D)
8'b1xxx_xxxx: y = 3'b111;
8'b01xx_xxxx: y = 3'b110;
8'b001x_xxxx: y = 3'b101;
8'b0001_xxxx: y = 3'b100;
8'b0000_1xxx: y = 3'b011;
8'b0000_01xx: y = 3'b010;
8'b0000_001x: y = 3'b001;
8'b0000_0001: y = 3'b000;
default: $display("Invalid data received");
endcase 62
end
Test bench
module tb;
reg [7:0] D;
wire [2:0] y;
initial begin
repeat(5) begin
D=$random; #1;
end
end
endmodule
63
Output
D = 00100100 -> y = 101
D = 10000001 -> y = 111
D = 00001001 -> y = 011
D = 01100011 -> y = 110
D = 00001101 -> y = 011
64
Decoder
A decoder is a combinational circuit that converts
binary information from n input lines to a maximum
of 2n unique output lines.
Design DEC:
AND gates used to
represent inputs.
NOT gates to connect
inputs to output.
65
66
67
68
69
3x8 Decoder logical diagram
Verilog code for decoder
module decoder( in,out, en); 3'b010: out[2]=1'b1;
input [2:0] in; 3'b011: out[3]=1'b1;
input en; 3'b100: out[4]=1'b1;
output [7:0] out;
3'b101: out[5]=1'b1;
reg [7:0] out;
3'b110: out[6]=1'b1;
3'b111: out[7]=1'b1;
always @( in,out, en)
begin default: out=8'd0;
endcase
if (en) end
begin else
out=8'd0;
out=8'd0;
case (in)
end 70
3'b000: out[0]=1'b1;
endmodule
3'b001: out[1]=1'b1;
#10;
Test bench in = 3'b010 ;
#10;
module decoder_tb; in = 3'b011 ;
wire [7:0] out; #10;
reg en; in = 3'b100 ;
reg [2:0] in; #10;
in = 3'b101 ;
decoder uut(in,out,en); #10;
in = 3'b110 ;
initial begin #10;
en = 1'd1; in = 3'b111 ;
in = 3'b000 ; #10;
#10; end
in = 3'b001 ; endmodule
71
Output
72
References
https://www.slideshare.net/sonalivyas/combinational-circuits-68665
803
https://chat.openai.com/c/cce450fd-3c27-4fc3-8061-7c4c752f4350
https://www.electronicshub.org/introduction-to-combinational-logic-
circuits/
https://medium.com/@nimk/verilog-mux-2-to-1-multiplexer-9ca280
72c255
https://www.javatpoint.com/encoders-digital-electronics
73
Thank you
74