ENTITY inv IS
PORT (i1 : IN BIT; o1 : OUT BIT);
END inv;
(b)
ARCHITECTURE single_delay OF inv IS
BEGIN
o1 <= NOT i1 AFTER 4 NS;
END single_delay;
(c)
FIGURE 5.1
Inverter (a) symbol, (b) entity declaration, (c) architecture body, (d) notation.
FIGURE 5.2
Details of the entity declaration of inverter.
FIGURE 5.3
Elements of aspect notation.
FIGURE 5.4
Using ports (a) Inputs, (b) Outputs, (c) Bi-directional ports, (d) Buffers.
ENTITY nand2 IS
PORT (i1, i2 : IN BIT; o1 : OUT BIT);
END nand2;
(b)
ARCHITECTURE single_delay OF nand2 IS
BEGIN
o1 <= i1 NAND i2 AFTER 5 NS;
END single_delay;
(c)
FIGURE 5.5
Two-input NAND (a) symbol, (b) entity declaration, (c) architecture body, (d) notation.
FIGURE 5.6
Port clause details for nand2.
ENTITY nand3 IS
PORT (i1, i2, i3 : IN BIT; o1 : OUT BIT);
END nand3;
(b)
ARCHITECTURE single_delay OF nand3 IS
BEGIN
o1 <= NOT ( i1 AND i2 AND i3 ) AFTER 6 NS;
END single_delay;
(c)
FIGURE 5.7
Three-input NAND (a) symbol, (b) entity declaration, (c) architecture body, (d) notation.
FIGURE 5.8
Logical symbol of a single bit comparator.
FIGURE 5.9
Karnaugh maps for the outputs of the single bit comparator.
FIGURE 5.10
Logical diagram of bit_comparator.
(a)
ENTITY bit_comparator IS
PORT (a, b, -- data inputs
gt, -- previous greater than
eq, -- previous equal
lt : IN BIT; -- previous less than
a_gt_b, -- greater
a_eq_b, -- equal
a_lt_b : OUT BIT); -- less than
END bit_comparator;
(b)
FIGURE 5.11
Interface description of bit_comparator, (a) interface aspect, (b) entity declaration.
FIGURE 5.12
Composition Aspect of bit_comparator.
ARCHITECTURE gate_level OF bit_comparator IS
COMPONENT n1 PORT (i1: IN BIT; o1: OUT BIT); END COMPONENT;
COMPONENT n2 PORT (i1, i2: IN BIT; o1: OUT BIT); END COMPONENT;
COMPONENT n3 PORT (i1, i2, i3: IN BIT; o1: OUT BIT);
END COMPONENT;
FOR ALL : n1 USE ENTITY WORK.inv (single_delay);
FOR ALL : n2 USE ENTITY WORK.nand2 (single_delay);
FOR ALL : n3 USE ENTITY WORK.nand3 (single_delay);
-- Intermediate signals
SIGNAL im1,im2, im3, im4, im5, im6, im7, im8, im9, im10 : BIT;
BEGIN
-- a_gt_b output
g0 : n1 PORT MAP (a, im1);
g1 : n1 PORT MAP (b, im2);
g2 : n2 PORT MAP (a, im2, im3);
g3 : n2 PORT MAP (a, gt, im4);
g4 : n2 PORT MAP (im2, gt, im5);
g5 : n3 PORT MAP (im3, im4, im5, a_gt_b);
-- a_eq_b output
g6 : n3 PORT MAP (im1, im2, eq, im6);
g7 : n3 PORT MAP (a, b, eq, im7);
g8 : n2 PORT MAP (im6, im7, a_eq_b);
-- a_lt_b output
g9 : n2 PORT MAP (im1, b, im8);
g10 : n2 PORT MAP (im1, lt, im9);
g11 : n2 PORT MAP (b, lt, im10);
g12 : n3 PORT MAP (im8, im9, im10, a_lt_b);
END gate_level;
FIGURE 5.13
Architecture body of bit_comparator identified as gate_level.
FIGURE 5.14
Syntax details of the architecture body of bit_comparator.
FIGURE 5.15
Component instantiation statement syntax details.
ARCHITECTURE netlist OF bit_comparator IS
-- Intermediate signals
SIGNAL im1,im2, im3, im4, im5, im6, im7, im8, im9, im10 : BIT;
BEGIN
-- a_gt_b output
g0 : ENTITY WORK.inv(single_delay) PORT MAP (a, im1);
g1 : ENTITY WORK.inv(single_delay) PORT MAP (b, im2);
g2 : ENTITY WORK.nand2(single_delay) PORT MAP (a, im2, im3);
g3 : ENTITY WORK.nand2(single_delay) PORT MAP (a, gt, im4);
g4 : ENTITY WORK.nand2(single_delay) PORT MAP (im2, gt, im5);
g5 : ENTITY WORK.nand3(single_delay) PORT MAP (im3, im4, im5, a_gt_b);
-- a_eq_b output
g6 : ENTITY WORK.nand3(single_delay) PORT MAP (im1, im2, eq, im6);
g7 : ENTITY WORK.nand3(single_delay) PORT MAP (a, b, eq, im7);
g8 : ENTITY WORK.nand2(single_delay) PORT MAP (im6, im7, a_eq_b);
-- a_lt_b output
g9 : ENTITY WORK.nand2(single_delay) PORT MAP (im1, b, im8);
g10 : ENTITY WORK.nand2(single_delay) PORT MAP (im1, lt, im9);
g11 : ENTITY WORK.nand2(single_delay) PORT MAP (b, lt, im10);
g12 : ENTITY WORK.nand3(single_delay) PORT MAP (im8, im9, im10, a_lt_b);
END netlist;
FIGURE 5.16
Netlist description of bit_comparator.
FIGURE 5.17
bit_comparator simulation run.
FIGURE 5.18
Logical symbol of a 4-bit comparator.
FIGURE 5.19
A 4-bit comparator using four single bit comparators.
(a)
ENTITY nibble_comparator IS
PORT (a, b : IN BIT_VECTOR (3 DOWNTO 0); -- a and b data inputs
gt, -- previous greater than
eq, -- previous equal
lt : IN BIT; -- previous less than
a_gt_b, -- a > b
a_eq_b, -- a = b
a_lt_b : OUT BIT); -- a < b
END nibble_comparator;
FIGURE 5.20
Interface description of nibble_comparator, (a) interface aspect, (b) entity declaration.
FIGURE 5.21
Composition aspect of nibble_comparator.
ARCHITECTURE iterative OF nibble_comparator IS
COMPONENT comp1
PORT (a, b, gt, eq, lt : IN BIT; a_gt_b, a_eq_b, a_lt_b : OUT BIT);
END COMPONENT;
FOR ALL : comp1 USE ENTITY WORK.bit_comparator (gate_level);
SIGNAL im : BIT_VECTOR ( 0 TO 8);
BEGIN
c0: comp1 PORT MAP (a(0), b(0), gt, eq, lt, im(0), im(1), im(2));
c1to2: FOR i IN 1 TO 2 GENERATE
c: comp1 PORT MAP (a(i), b(i), im(i*3-3), im(i*3-2), im(i*3-1),
im(i*3+0), im(i*3+1), im(i*3+2) );
END GENERATE;
c3: comp1
PORT MAP (a(3), b(3), im(6), im(7), im(8), a_gt_b, a_eq_b, a_lt_b);
END iterative;
FIGURE 5.22
Iterative architecture of nibble_comparator.
FIGURE 5.23
Association list of c instance of comp1 within generate statement.
FIGURE 5.24
Generate statement syntax details.
ARCHITECTURE iterative OF nibble_comparator IS
COMPONENT comp1
PORT (a, b, gt, eq, lt : IN BIT; a_gt_b, a_eq_b, a_lt_b : OUT BIT);
END COMPONENT;
FOR ALL : comp1 USE ENTITY WORK.bit_comparator (gate_level);
CONSTANT n : INTEGER := 4;
SIGNAL im : BIT_VECTOR ( 0 TO (n-1)*3-1);
BEGIN
c_all: FOR i IN 0 TO n-1 GENERATE
l: IF i = 0 GENERATE
least: comp1 PORT MAP (a(i), b(i), gt, eq, lt, im(0), im(1), im(2) );
END GENERATE;
m: IF i = n-1 GENERATE
most: comp1 PORT MAP (a(i), b(i),
im(i*3-3), im(i*3-2), im(i*3-1), a_gt_b, a_eq_b, a_lt_b);
END GENERATE;
r: IF i > 0 AND i < n-1 GENERATE
rest: comp1 PORT MAP (a(i), b(i), im(i*3-3), im(i*3-2), im(i*3-1),
im(i*3+0), im(i*3+1), im(i*3+2) );
END GENERATE;
END GENERATE;
END iterative;
FIGURE 5.25
A more flexible iterative architecture of nibble_comparator.
l: IF i = 0 GENERATE
FOR least : comp1 USE ENTITY WORK.bit_comparator (gate_level);
BEGIN
least: comp1 PORT MAP (a(i), b(i), gt, eq, lt, im(0), im(1), im(2) );
END GENERATE;
VHDL 93, Unambigious Configuration Specification
FIGURE 5.26
A test bench for nibble_comparator, the composition aspect.
ENTITY nibble_comparator_test_bench IS
END nibble_comparator_test_bench ;
--
ARCHITECTURE input_output OF nibble_comparator_test_bench IS
COMPONENT comp4 PORT (a, b : IN bit_vector (3 DOWNTO 0);
a_gt_b, a_eq_b, a_lt_b : IN BIT;
a_gt_b_out, a_eq_b_out, a_lt_b_out : OUT BIT);
END COMPONENT;
FOR a1 : comp4 USE ENTITY WORK.nibble_comparator(iterative);
SIGNAL a, b : BIT_VECTOR (3 DOWNTO 0);
SIGNAL eql, lss, gtr : BIT;
SIGNAL vdd : BIT := '1';
SIGNAL gnd : BIT := '0';
BEGIN
a1: comp4 PORT MAP (a, b, gnd, vdd, gnd, gtr, eql, lss);
a2: a <= "0000", ---- a = b (steady state)
"1111" AFTER 0500 NS, -- a > b (worst case)
"1110" AFTER 1500 NS, -- a < b (worst case)
"1110" AFTER 2500 NS, -- a > b (need bit 1 info)
"1010" AFTER 3500 NS, -- a < b (need bit 2 info)
"0000" AFTER 4000 NS, -- a < b (steady state, prepare for next)
"1111" AFTER 4500 NS, -- a = b (worst case)
"0000" AFTER 5000 NS, -- a < b (need bit 3 only, best case)
"0000" AFTER 5500 NS, -- a = b (worst case)
"1111" AFTER 6000 NS; -- a > b (need bit 3 only, best case)
a3 : b <= "0000", ---- a = b (steady state)
"1110" AFTER 0500 NS, -- a > b (worst case)
"1111" AFTER 1500 NS, -- a < b (worst case)
"1100" AFTER 2500 NS, -- a > b (need bit 1 info)
"1100" AFTER 3500 NS, -- a < b (need bit 2 info)
"1111" AFTER 4000 NS, -- a < b (steady state, prepare for next)
"1111" AFTER 4500 NS, -- a = b (worst case)
"1111" AFTER 5000 NS, -- a < b (need bit 3 only, best case)
"0000" AFTER 5500 NS, -- a = b (worst case)
"0000" AFTER 6000 NS; -- a > b (need bit 3 only, best case)
END input_output;
FIGURE 5.27
Test bench for iterative architecture of nibble_comparator.
TIME (NS) |
SIGNALS |
||||
a(3:0) |
b(3:0) |
gtr |
eql |
lss |
|
0 |
"0000" |
"0000" |
'0' |
'0' |
'0' |
5 |
...... |
...... |
... |
'1' |
... |
500 |
"1111" |
"1110" |
... |
... |
... |
544 |
...... |
...... |
'1' |
... |
... |
548 |
...... |
...... |
... |
'0' |
... |
1500 |
"1110" |
"1111" |
... |
... |
... |
1544 |
...... |
...... |
'0' |
... |
... |
1548 |
...... |
...... |
... |
... |
'1' |
2500 |
...... |
"1100" |
... |
... |
... |
2533 |
...... |
...... |
... |
... |
'0' |
2537 |
...... |
...... |
'1' |
... |
... |
3500 |
"1010" |
...... |
... |
... |
... |
3522 |
...... |
...... |
'0' |
... |
... |
3526 |
...... |
...... |
... |
... |
'1' |
4000 |
"0000" |
"1111" |
... |
... |
... |
4500 |
"1111" |
...... |
... |
... |
... |
4544 |
...... |
...... |
... |
'1' |
... |
4548 |
...... |
...... |
... |
... |
'0' |
5000 |
"0000" |
...... |
... |
... |
... |
5011 |
...... |
...... |
... |
'0' |
... |
5015 |
...... |
...... |
... |
... |
'1' |
5500 |
...... |
"0000" |
... |
... |
... |
5544 |
...... |
...... |
... |
... |
'0' |
5548 |
...... |
...... |
... |
'1' |
... |
6000 |
"1111" |
...... |
... |
... |
... |
6011 |
...... |
...... |
'1' |
... |
... |
6015 |
...... |
...... |
... |
'0' |
... |
FIGURE 5.28
Simulation report for simulating the test bench in Figure 5.27. All events are observed.
FIGURE 5.29
Logical diagram of a simple latch.
ENTITY sr_latch IS PORT (s, r, c : IN BIT; q : OUT BIT);
END sr_latch;
--
ARCHITECTURE gate_level OF sr_latch IS
COMPONENT n2 PORT (i1, i2: IN BIT; o1: OUT BIT); END COMPONENT;
FOR ALL : n2 USE ENTITY WORK.nand2 (single_delay);
SIGNAL im1, im2, im3, im4 : BIT;
BEGIN
g1 : n2 PORT MAP (s, c, im1);
g2 : n2 PORT MAP (r, c, im2);
g3 : n2 PORT MAP (im1, im4, im3);
g4 : n2 PORT MAP (im3, im2, im4);
q <= im3;
END gate_level;
FIGURE 5.30
VHDL description of set-reset latch.
ARCHITECTURE gate_level OF sr_latch IS
COMPONENT n2 PORT (i1, i2: IN BIT; o1: BUFFER BIT); END COMPONENT;
FOR ALL : n2 USE ENTITY WORK.nand2 (single_delay);
SIGNAL im1, im2, im4 : BIT;
BEGIN
g1 : n2 PORT MAP (s, c, im1);
g2 : n2 PORT MAP (r, c, im2);
g3 : n2 PORT MAP (im1, im4, q);
g4 : n2 PORT MAP (q, im2, im4);
END gate_level;
FIGURE 5.31
sr_latch (gate_level) architecture using BUFFER.
ARCHITECTURE fast_single_delay OF nand2 IS
BEGIN
o1 <= i1 NAND i2 AFTER 3 NS;
END fast_single_delay;
FIGURE 5.32
A faster NAND gate.
(a)
ARCHITECTURE gate_level OF sr_latch IS
COMPONENT n2 PORT (i1, i2: IN BIT; o1: OUT BIT); END COMPONENT;
FOR g1, g3 : n2 USE ENTITY WORK.nand2 (fast_single_delay);
FOR g2, g4 : n2 USE ENTITY WORK.nand2 (single_delay);
SIGNAL im1, im2, im3, im4 : BIT;
BEGIN
g1 : n2 PORT MAP (s, c, im1);
g2 : n2 PORT MAP (r, c, im2);
g3 : n2 PORT MAP (im1, im4, im3);
g4 : n2 PORT MAP (im3, im2, im4);
q <= im3;
END gate_level;
FIGURE 5.33
SR-latch, using gates with different delays, (a) composition aspect, (b) architecture body.
(a)
ARCHITECTURE gate_level OF sr_latch IS
COMPONENT n2 PORT (x, y: IN BIT; z: OUT BIT); END COMPONENT;
FOR g1, g3 : n2 USE ENTITY WORK.nand2 (single_delay) PORT MAP (x, y, z);
FOR g2, g4 : n2 USE ENTITY WORK.nand3 (single_delay) PORT MAP (x, x, y, z);
SIGNAL im1, im2, im3, im4 : BIT;
BEGIN
g1 : n2 PORT MAP (s, c, im1);
g2 : n2 PORT MAP (r, c, im2);
g3 : n2 PORT MAP (im1, im4, im3);
g4 : n2 PORT MAP (im3, im2, im4);
q <= im3;
END gate_level;
FIGURE 5.34
SR-latch, using nand2 and nand3 gates, (a) composition aspect, (b) architecture body.
FIGURE 5.35
Two-step association.
FIGURE 5.36
Configuration specification syntax details.
FIGURE 5.37
Composition aspect of old_new_comparator.
ENTITY old_new_comparator IS
PORT (i : IN BIT_VECTOR (7 DOWNTO 0);
clk : IN BIT; gt_compare, eq_compare : OUT BIT);
END old_new_comparator;
--
ARCHITECTURE wiring OF old_new_comparator IS
COMPONENT byte_latch
PORT (di : IN BIT_VECTOR (7 DOWNTO 0);
clk : IN BIT; qo : OUT BIT_VECTOR (7 DOWNTO 0));
END COMPONENT;
COMPONENT byte_comparator
PORT(a, b : BIT_VECTOR (7 DOWNTO 0);
gt, eq, lt : IN BIT; a_gt_b, a_eq_b, a_lt_b : OUT BIT);
END COMPONENT;
SIGNAL con1 : BIT_VECTOR (7 DOWNTO 0);
SIGNAL vdd : BIT := '1'; SIGNAL gnd : BIT := '0';
BEGIN
l : byte_latch PORT MAP(i, clk, con1);
c : byte_comparator
PORT MAP(con1, i, gnd, vdd, gnd, gt_compare, eq_compare, OPEN);
END wiring;
FIGURE 5.38
old_new_comparator VHDL description.
ENTITY byte_latch IS
PORT (di : IN BIT_VECTOR (7 DOWNTO 0);
clk : IN BIT; qo : OUT BIT_VECTOR( 7 DOWNTO 0));
END byte_latch;
--
ARCHITECTURE iterative OF byte_latch IS
COMPONENT d_latch
PORT (d, c : IN BIT; q : OUT BIT);
END COMPONENT;
BEGIN
g : FOR i IN di'RANGE GENERATE
l7dt0 : d_latch PORT MAP (di(i), clk, qo(i));
END GENERATE;
END iterative;
FIGURE 5.39
VHDL description of byte_latch.
(a)
ENTITY d_latch IS PORT(d,c : IN BIT;q: OUT BIT); END d_latch;
--
ARCHITECTURE sr_based OF d_latch IS
COMPONENT sr_latch PORT (s, r, c : IN BIT; q : OUT BIT);
END COMPONENT;
COMPONENT inv PORT (i1 : IN BIT; o1 : OUT BIT);
END COMPONENT;
SIGNAL dbar: BIT;
BEGIN
c1 : sr_latch PORT MAP (d, dbar, c, q);
c2 : inv PORT MAP (d, dbar);
END sr_based;
(b)
FIGURE 5.40
Design of d_latch (a) Composition (b) VHDL description.
ARCHITECTURE iterative OF nibble_comparator IS
COMPONENT bit_comparator
PORT (a, b, gt, eq, lt : IN BIT; a_gt_b, a_eq_b, a_lt_b : OUT BIT);
END COMPONENT;
CONSTANT n : INTEGER := 8;
SIGNAL im : BIT_VECTOR ( 0 TO (n-1)*3-1);
BEGIN
c_all: FOR i IN 0 TO n-1 GENERATE
l: IF i = 0 GENERATE
least: bit_comparator PORT MAP (a(i), b(i), gt, eq, lt, im(0), im(1), im(2) );
END GENERATE;
m: IF i = n-1 GENERATE
most: bit_comparator PORT MAP (a(i), b(i),
im(i*3-3), im(i*3-2), im(i*3-1), a_gt_b, a_eq_b, a_lt_b);
END GENERATE;
r: IF i > 0 AND i < n-1 GENERATE
rest: bit_comparator PORT MAP (a(i), b(i), im(i*3-3), im(i*3-2), im(i*3-1),
im(i*3+0), im(i*3+1), im(i*3+2) );
END GENERATE;
END GENERATE;
END iterative;
FIGURE 5.41
Byte comparator VHDL description.