Chapter 2 Digital Design
Chapter 2 Digital Design
Chapter 2
Combinational Basics
Combinational Circuits
Circuits whose outputs depend only
on current input values
no storage of past input values
no state
Can be analyzed using laws of logic
Boolean algebra, similar to propositional
calculus
Boolean Functions
Functions operating on two-valued
inputs giving two-valued outputs
0, implemented as a low voltage level
1, implemented as a high voltage level
Function defines output value for all
possible combinations of input value
Truth Tables
Logical OR Logical AND INVERTER
Boolean Expressions
Combination of variables, 0 and 1
literals, operators:
Precedence: · before +
Parentheses for order of
evaluation
Boolean Equations
Equality relation between
Boolean expressions
Often, LHS is a single variable
name
The Boolean equation then
defines a function of that name
Implemented as a combinational
circuit x
y f
z
Boolean Equations
Boolean equations and truth tables
are both valid ways to define a
function
Evaluate f for
each
combination of
input values,
and fill in table
Minterms
Given a truth table
For each rows where function
value is 1, form a minterm: AND of
variables where input is 1
NOT of variables where input is 0
Form OR of minterms
P-terms
x y z x z
Equivalence
These expressions all represent the
same Boolean function
f x y z
x y z x y z x y z
x y z x z
Consistent substitution of
variable values gives the same
values for the expressions
Optimization
Equivalence allows us to optimize
choose a different circuit that
implements the same function more
cheaply
x x
y y
z z
AND-
OR-
INVERT
Complex Gate Example
• These two expressions are equivalent
f 2 a b c
a a
b f1 b f2
c c
f1
a
b
f2
c
0
f2
b
a
Boolean Algebra – Axioms
x y y x x y y x
x y z x y z x y z x y z
x ( y z ) ( x y ) ( x z ) x ( y z ) ( x y ) ( x z )
x 0 x x 1 x
x x 1 x x 0
Dual of a Boolean equation
substitute 0 for 1, 1 for 0, + for ·, · for +
if original is valid, dual is also valid
Hardware Interpretation
Laws imply equivalent circuits
Example: Associative Laws
x x x
y y y
z z z
x x x
y y
z z
More Useful Laws
x x x x x x
x 1 1 x 0 0
x ( x y ) x x ( x y ) x
x y x y x y x y
Circuit Transformation
x
y
z f
x
y
f
z
Optimization Methods
How do we decide which Law to apply?
What are we trying to optimize?
Methods
Karnaugh maps, Quine-McClusky
minimize gate count
Espresso, Espresso-II, …
multi-output minimization
Manual methods are only tractable for
small circuits
Useful methods are embedded in EDA tools
We just specify constraints
Boolean Equations in Verilog
Use logical operators in assignment
statements
module circuit ( output f,
input x, y, z );
assign f = (x | (y & ~z)) & ~(y & z);
endmodule
Verilog Logical Operators
Precedence
not has highest
a & b
then &, then ^
and ~^, then |
a | b
~(a & b) use
~(a | b) parentheses to
a ^ b make order of
a ~^ b
evaluation clear
~a
Verilog bit
values
1'b0 and 1'b1
Boolean Equation Example
Air conditioner control logic
heater_on = temp_low · auto_temp + manual_heat
cooler_on = temp_high · auto_temp + manual_cool
Fan_on= heater_on + cooler_on + manual_fan
module aircon ( output heater_on, cooler_on, fan_on,
input temp_low, temp_high, auto_temp,
input manual_heat, manual_cool, manual_fan );
assign heater_on = (temp_low & auto_temp) | manual_heat;
assign cooler_on = (temp_high & auto_temp) | manual_cool;
assign fan_on = heater_on | cooler_on | manual_fan;
endmodule
Binary Coding
How do we represent information with
more than two possible values?
eg, numbers
N voltage levels? — No.
Multiple binary signals (multiple bits)
(a1, a0): (0, 0), (0, 1), (1, 0), (1, 1)
This is a binary code
Each pair of values is a code word
Uses two signal wires for a1, a0
Code Word Size
An n-bit code has 2n code words
To represent N possible values
Need at least log2N code word bits
More bits can be useful in some cases
Example: code for inkjet printer
black, cyan, magenta, yellow, red, blue
six values, log26 = 3
black: (0, 0, 1), cyan: (0, 1, 0), magenta: (0, 1,
1),
yellow: (1, 0, 0), red: (1, 0, 1), blue: (1, 1, 0)
One-Hot Codes
Each code word has exactly one 1 bit
Traffic light:
red: (1,0,0), yellow: (0,1,0), green:
(0,0,1)
Three signal wires: red, yellow, green
Each bit of a one-hot code
corresponds to an encoded value
No hardware needed to decode values
Binary Codes in Verilog
Multiple bits represented by a vector
wire [4:0] w;
This is a five-element wire
w[4], w[3], w[2], w[1], w[0]
wire [1:3] a;
This is a three-element wire
A[1], a[2], a[3]
Binary Coding Example
Traffic-light controller with 1-hot code
enable == 1: lights_out = lights_in
enable == 0: lights_out = (0, 0, 0)
module light_controller_and_enable
( output [1:3] lights_out,
input [1:3] lights_in,
input enable );
assign lights_out[1] = lights_in[1] & enable;
assign lights_out[2] = lights_in[2] & enable;
assign lights_out[3] = lights_in[3] & enable;
endmodule
Binary Coding Example
module light_controller_conditional_enable
( output [1:3] lights_out,
input [1:3] lights_in,
input enable );
assign lights_out = enable ? lights_in : 3'b000;
endmodule
Bit Errors
Electrical noise can change logic levels
Bit flip: 0 → 1, 1 → 0
If flipped signal is in a code word
result may be a different code word
or an invalid code word
inkjet printer, blue: (1, 1, 0) → ?: (1, 1, 1)
Could ignore the possibility of a bit flip
don’t specify behavior of circuit
ok if probability is low, effect isn’t disastrous,
and application is cost sensitive
Fail-Safe Design
Detect illegal code words
produce a safe result
Traffic-light controller with 1-hot code
illegal code red light
green s_red s_yellow s_green
yellow s_red s_yellow s_green
a0 a0
a1 a1
a2 a2
a3 a3
p
a4 a4
a5 a5
a6 a6 error
a7 a7
Combinational Components
We can build complex combination
components from gates
Decoders, encoders
Multiplexers
…
Use them as subcomponents of
larger systems
Abstraction and reuse
Decoders
A decoder derives control signals from
a binary coded signal
One per code word a0 y0
a1 y1
Control signal is 1 when input has the
a2 y2
a3 y3
corresponding code word; 0 otherwise y4
…
…
For an n-bit code input y15
…
a15
Encoder Example
Burglar alarm: encode which zone is
active
Encoder Example
module alarm_eqn ( output [2:0] intruder_zone,
output valid,
input [1:8] zone );
assign intruder_zone[2] = zone[5] | zone[6] |
zone[7] | zone[8];
assign intruder_zone[1] = zone[3] | zone[4] |
zone[7] | zone[8];
assign intruder_zone[0] = zone[2] | zone[4] |
zone[6] | zone[8];
assign valid = zone[1] | zone[2] | zone[3] |
zone[4] |
zone[5] | zone[6] | zone[7] |
zone[8];
endmodule
Priority Encoders
If more than one input can be 1
Encode input that is 1 with highest
priority
Priority Encoder Example
module alarm_priority_1 ( output [2:0] intruder_zone,
output valid,
input [1:8] zone );
assign intruder_zone = zone[1] ? 3'b000 :
zone[2] ? 3'b001 :
zone[3] ? 3'b010 :
zone[4] ? 3'b011 :
zone[5] ? 3'b100 :
zone[6] ? 3'b101 :
zone[7] ? 3'b110 :
zone[8] ? 3'b111 :
3'b000;
assign valid = zone[1] | zone[2] | zone[3] | zone[4] |
zone[5] | zone[6] | zone[7] | zone[8];
endmodule
BCD Code
Binary coded decimal
4-bit code for decimal digits
Seven-Segment Decoder
Decodes BCD to drive a 7-
segment LED or LCD display
digit
Segments: (g, f, e, d, c, b, a)
a
f g b
0111111 0000110 1011011 1001111 1100110
e d c
1101101 1111101 0000111 1111111 1101111
Seven-Segment Decoder
module seven_seg_decoder ( output [7:1] seg,
input [3:0] bcd, input blank );
reg [7:1] seg_tmp;
always @*
case (bcd)
4'b0000: seg_tmp = 7'b0111111; // 0
4'b0001: seg_tmp = 7'b0000110; // 1
4'b0010: seg_tmp = 7'b1011011; // 2
4'b0011: seg_tmp = 7'b1001111; // 3
4'b0100: seg_tmp = 7'b1100110; // 4
4'b0101: seg_tmp = 7'b1101101; // 5
4'b0110: seg_tmp = 7'b1111101; // 6
4'b0111: seg_tmp = 7'b0000111; // 7
4'b1000: seg_tmp = 7'b1111111; // 8
4'b1001: seg_tmp = 7'b1101111; // 9
default: seg_tmp = 7'b1000000; // "-" for invalid code
endcase
assign seg = blank ? 7'b0000000 : seg_tmp;
endmodule
Multiplexers
Chooses between data inputs based
on the select input
0
0 1
2
N-to-1
1
3
2
multiplexer
needs log2
N select
bits
Multiplexer Example
module multiplexer_4_to_1 ( output reg z,
input [3:0] a,
input sel );
always @*
case (sel)
2'b00: z = a[0];
2'b01: z = a[1];
2'b10: z = a[2];
2'b11: z = a[3];
endcase
endmodule
Multi-bit Multiplexers
To select between a0(0)
z(0)
N
0
a1(0) 1
a0(1)
m-bit codeword
0 z(1)
a1(1) 1
a0(2)
inputs a1(2)
sel
0
1
z(2)
Connect m N-input a0 3
0 3 z
a1 3
multiplexers in sel
1
parallel
Abstraction
Treat this as a
component
Multi-bit Mux Example
module multiplexer_3bit_2_to_1 ( output [2:0] z,
input [2:0] a0,a1,
input sel );
assign z = sel ? a1 : a0;
endmodule
Active-Low Logic
We’ve been using active-high logic
0 (low voltage): falsehood of a condition
1 (high voltage): truth of a condition
Active-low logic logic
0 (low voltage): truth of a condition
1 (high voltage): falsehood of a condition
voltage!
In circuit schematics, label active-low signals with
overbar notation
eg, lamp_lit: low when lit, high when not lit
Active-Low Example
Night-light circuit, lamp connected to
power supply
Overbar indicates active-low
+V +V
lamp_enabled
lamp_lit
Match bubbles
dark with active-low
sensor
signals to
preserve logic
sense
Implied Negation
Negation implied by connecting
An active-low signal to an active-high
input/output
An active-high
+V signal to an active-low
input/output
lamp_enabled
lamp_lit
light
sensor
Negation implied
Active-Low Signals and
Gates