PART 5

Design_Organization

Describing Logic
Aid in testing
Utilities
Components
Utilities
Generic design
Generic specification
Using defaults
Using fixed values
Passing values
Comparator example
Register example











Design_Organization.subprograms.describing_logic



a_gt_b = a. gt + b'. gt+ a.b'
a_eq_b = a.b.eq + a'.b'.eq
a_lt_b = b.lt + a'.lt + b.a'

ARCHITECTURE functional OF bit_comparator IS
FUNCTION fgl (w, x, gl : BIT) RETURN BIT IS
BEGIN
RETURN (w AND gl) OR (NOT x AND gl) OR (w AND NOT x);
END fgl;
FUNCTION feq (w, x, eq : BIT) RETURN BIT IS
BEGIN
RETURN (w AND x AND eq) OR (NOT w AND NOT x AND eq);
END feq;
BEGIN
a_gt_b <= fgl (a, b, gt) AFTER 12 NS;
a_eq_b <= feq (a, b, eq) AFTER 12 NS;
a_lt_b <= fgl (b, a, lt) AFTER 12 NS;
END functional;













Design_Organization.syntax















Design_Organization.subprograms.testing



ARCHITECTURE structural 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 (functional);
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 structural;













Design_Organization.subprograms.aid_in_testing



ARCHITECTURE procedural OF nibble_comparator_test_bench IS
TYPE integers IS ARRAY (0 TO 12) OF INTEGER;
PROCEDURE apply_data
(SIGNAL target : OUT BIT_VECTOR (3 DOWNTO 0);
CONSTANT values : IN integers; CONSTANT period : IN TIME
) IS
VARIABLE j : INTEGER; VARIABLE tmp, pos : INTEGER := 0;
VARIABLE buf : BIT_VECTOR (3 DOWNTO 0);
BEGIN
FOR i IN 0 TO 12 LOOP
tmp := values (i); j := 0;
WHILE j <= 3 LOOP
IF (tmp MOD 2 = 1) THEN buf (j) := '1'; ELSE buf (j) := '0'; END IF;
tmp := tmp / 2; j := j + 1;
END LOOP;
target <= TRANSPORT buf AFTER i * period;
END LOOP;
END apply_data;
COMPONENT comp4 PORT (a, b : IN bit_vector (3 DOWNTO 0);
gt, eq, lt : IN BIT; a_gt_b, a_eq_b, a_lt_b : OUT BIT);
END COMPONENT;
FOR a1 : comp4 USE ENTITY WORK.nibble_comparator(structural);
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);
apply_data (a, 00&15&15&14&14&14&14&10&00&15&00&00&15, 500 NS);
apply_data (b, 00&14&14&15&15&12&12&12&15&15&15&00&00, 500 NS);
END procedural;













Design_Organization.subprograms.Aid_intesting



. . .
BEGIN
a1: comp4 PORT MAP (a, b, gnd, vdd, gnd, gtr, eql, lss);
apply_data (a,
00&15&15&14&14&14&14&10&00&15&00&00&15, 500 NS);
apply_data (b,
00&14&14&15&15&12&12&12&15&15&15&00&00, 500 NS);
END procedural;
. . .













Design_Organization.subprograms.aid_in_testing
















Design_Organization.subprograms.syntax















Design_Organization.subprograms.syntax















Design_Organization.subprograms.utilities



PROCEDURE bin2int (bin : IN BIT_VECTOR; int : OUT INTEGER) IS
VARIABLE result: INTEGER;
BEGIN
result := 0;
FOR i IN 0 TO (bin'LENGTH - 1) LOOP
IF bin(i) = '1' THEN result := result + 2**i; END IF;
END LOOP;
int := result;
END bin2int;

PROCEDURE apply_data
(SIGNAL target : OUT BIT_VECTOR (3 DOWNTO 0);
CONSTANT values : IN integers; CONSTANT period : IN TIME) IS
VARIABLE buf : BIT_VECTOR (3 DOWNTO 0);
BEGIN
FOR i IN 0 TO 12 LOOP
int2bin (values(i), buf);
target <= TRANSPORT buf AFTER i * period;
END LOOP;
END apply_data;

PROCEDURE int2bin (int : IN INTEGER; bin : OUT BIT_VECTOR) IS
VARIABLE tmp : INTEGER;
VARIABLE buf : BIT_VECTOR (bin'RANGE);
BEGIN
tmp := int;
FOR i IN 0 TO (bin'LENGTH - 1) LOOP
IF (tmp MOD 2 = 1) THEN bin (i) := '1'; ELSE bin (i) := '0'; END IF;
tmp := tmp / 2;
END LOOP;
END int2bin;













Design_Organization.packaging.components



PACKAGE simple_gates 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;
END simple_gates;

USE WORK.simple_gates.ALL;
ARCHITECTURE gate_level OF bit_comparator IS
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;













Design_Organization.packaging.components



USE WORK.simple_gates.ALL

-- is equaivalent to:

USE
WORK.simple_gates.n1,
WORK.simple_gates.n2,
WORK.simple_gates.n3;
-- n1, n2 and n3 component declarations are visible













Design_Organization.packaging.utilities



PACKAGE basic_utilities IS
TYPE integers IS ARRAY (0 TO 12) OF INTEGER;
FUNCTION fgl (w, x, gl : BIT) RETURN BIT;
FUNCTION feq (w, x, eq : BIT) RETURN BIT;
PROCEDURE bin2int (bin : IN BIT_VECTOR; int : OUT INTEGER);
PROCEDURE int2bin (int : IN INTEGER; bin : OUT BIT_VECTOR);
PROCEDURE apply_data (
SIGNAL target : OUT BIT_VECTOR (3 DOWNTO 0);
CONSTANT values : IN integers; CONSTANT period : IN TIME);
END basic_utilities;

PACKAGE BODY basic_utilities IS
FUNCTION fgl (w, x, gl : BIT) RETURN BIT IS
BEGIN RETURN (w AND gl) OR (NOT x AND gl) OR (w AND NOT x);
END fgl;
FUNCTION feq (w, x, eq : BIT) RETURN BIT IS
BEGIN RETURN (w AND x AND eq) OR (NOT w AND NOT x AND eq);
END feq;
PROCEDURE bin2int (bin : IN BIT_VECTOR; int : OUT INTEGER) IS
VARIABLE result: INTEGER;
BEGIN
result := 0;
FOR i IN 0 TO (bin'LENGTH - 1) LOOP
IF bin(i) = '1' THEN result := result + 2**i; END IF;
END LOOP;
int := result;
END bin2int;
PROCEDURE int2bin (int : IN INTEGER; bin : OUT BIT_VECTOR) IS
VARIABLE tmp : INTEGER;
BEGIN
tmp := int;
FOR i IN 0 TO (bin'LENGTH - 1) LOOP
IF (tmp MOD 2 = 1) THEN bin (i) := '1'; ELSE bin (i) := '0'; END IF;
tmp := tmp / 2;
END LOOP;
END int2bin;
PROCEDURE apply_data (
SIGNAL target : OUT BIT_VECTOR (3 DOWNTO 0);
CONSTANT values : IN integers; CONSTANT period : IN TIME) IS
VARIABLE buf : BIT_VECTOR (3 DOWNTO 0);
BEGIN
FOR i IN 0 TO 12 LOOP
int2bin (values(i), buf);
target <= TRANSPORT buf AFTER i * period;
END LOOP;
END apply_data;
END basic_utilities;













Design_Organization.packaging.utilities



USE WORK.basic_utilities.ALL;
ARCHITECTURE functional OF bit_comparator IS
BEGIN
a_gt_b <= fgl (a, b, gt) AFTER 12 NS;
a_eq_b <= feq (a, b, eq) AFTER 12 NS;
a_lt_b <= fgl (b, a, lt) AFTER 12 NS;
END functional;

USE WORK.basic_utilities.ALL;
ARCHITECTURE procedural OF nibble_comparator_test_bench IS
COMPONENT comp4 PORT (
a, b : IN bit_vector (3 DOWNTO 0); gt, eq, lt : IN BIT;
a_gt_b, a_eq_b, a_lt_b : OUT BIT);
END COMPONENT;
FOR a1 : comp4 USE ENTITY WORK.nibble_comparator(structural);
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);
apply_data (a, 00&15&15&14&14&14&14&10&00&15&00&00&15, 500 NS);
apply_data (b, 00&14&14&15&15&12&12&12&15&15&15&00&00, 500 NS);
END procedural;













Design_Organization.packaging.utilities



USE WORK.basic_utilities.ALL;
USE WORK.basic_utilities .bin2int;
...













Design_Organization.parametrization



ENTITY inv_t IS
GENERIC (tplh : TIME := 3 NS; tphl : TIME := 5 NS);
PORT (i1 : IN BIT; o1 : OUT BIT);
END inv_t;
--
ARCHITECTURE average_delay OF inv_t IS
BEGIN
o1 <= NOT i1 AFTER (tplh + tphl) / 2;
END average_delay;

ENTITY nand2_t IS
GENERIC (tplh : TIME := 4 NS; tphl : TIME := 6 NS);
PORT (i1, i2 : IN BIT; o1 : OUT BIT);
END nand2_t;
--
ARCHITECTURE average_delay OF nand2_t IS
BEGIN
o1 <= i1 NAND i2 AFTER (tplh + tphl) / 2;
END average_delay;

ENTITY nand3_t IS
GENERIC (tplh : TIME := 5 NS; tphl : TIME := 7 NS);
PORT (i1, i2, i3 : IN BIT; o1 : OUT BIT);
END nand3_t;
--
ARCHITECTURE average_delay OF nand3_t IS
BEGIN
o1 <= NOT ( i1 AND i2 AND i3 ) AFTER (tplh + tphl) / 2;
END average_delay;













Design_Organization.parametrization



ENTITY inv_t IS
GENERIC (tplh : TIME := 3 NS; tphl : TIME := 5 NS);
PORT (i1 : IN BIT; o1 : OUT BIT);
END inv_t;
--
ARCHITECTURE average_delay OF inv_t IS
BEGIN
o1 <= NOT i1 AFTER (tplh + tphl) / 2;
END average_delay;













Design_Organization.parametrization.syntax















Design_Organization.parametrization















Design_Organization.parametrization.default_values



ARCHITECTURE default_delay 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_t (average_delay);
FOR ALL : n2 USE ENTITY WORK.nand2_t (average_delay);
FOR ALL : n3 USE ENTITY WORK.nand3_t (average_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 default_delay;













Design_Organization.parametrization.fixed_values



ARCHITECTURE fixed_delay OF bit_comparator IS
COMPONENT n1
GENERIC (tplh, tphl : TIME); PORT (i1: IN BIT; o1: OUT BIT);
END COMPONENT;
COMPONENT n2
GENERIC (tplh, tphl : TIME); PORT (i1, i2: IN BIT; o1: OUT BIT);
END COMPONENT;
COMPONENT n3
GENERIC (tplh, tphl : TIME); PORT (i1, i2, i3: IN BIT; o1: OUT BIT);
END COMPONENT;
FOR ALL : n1 USE ENTITY WORK.inv_t (average_delay);
FOR ALL : n2 USE ENTITY WORK.nand2_t (average_delay);
FOR ALL : n3 USE ENTITY WORK.nand3_t (average_delay);
-- Intermediate signals
SIGNAL im1,im2, im3, im4, im5, im6, im7, im8, im9, im10 : BIT;
BEGIN
-- a_gt_b output
g0 : n1 GENERIC MAP (2 NS, 4 NS) PORT MAP (a, im1);
g1 : n1 GENERIC MAP (2 NS, 4 NS) PORT MAP (b, im2);
g2 : n2 GENERIC MAP (3 NS, 5 NS) PORT MAP (a, im2, im3);
g3 : n2 GENERIC MAP (3 NS, 5 NS) PORT MAP (a, gt, im4);
g4 : n2 GENERIC MAP (3 NS, 5 NS) PORT MAP (im2, gt, im5);
g5 : n3 GENERIC MAP (4 NS, 6 NS) PORT MAP (im3, im4, im5, a_gt_b);
-- a_eq_b output
g6 : n3 GENERIC MAP (4 NS, 6 NS) PORT MAP (im1, im2, eq, im6);
. . .
-- a_lt_b output
g9 : n2 GENERIC MAP (3 NS, 5 NS) PORT MAP (im1, b, im8);
. . .
END fixed_delay;













Design_Organization.parametrization.passing_values



ENTITY bit_comparator_t IS
GENERIC (tplh1, tplh2, tplh3, tphl1, tphl2, tphl3 : TIME);
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_t;













Design_Organization.parametrization.passing_values



ARCHITECTURE passed_delay OF bit_comparator_t IS
COMPONENT n1
GENERIC (tplh, tphl : TIME); PORT (i1: IN BIT; o1: OUT BIT);
END COMPONENT;
COMPONENT n2
GENERIC (tplh, tphl : TIME); PORT (i1, i2: IN BIT; o1: OUT BIT);
END COMPONENT;
COMPONENT n3
GENERIC (tplh, tphl : TIME); PORT (i1, i2, i3: IN BIT; o1: OUT BIT);
END COMPONENT;
FOR ALL : n1 USE ENTITY WORK.inv_t (average_delay);
FOR ALL : n2 USE ENTITY WORK.nand2_t (average_delay);
FOR ALL : n3 USE ENTITY WORK.nand3_t (average_delay);
-- Intermediate signals
SIGNAL im1,im2, im3, im4, im5, im6, im7, im8, im9, im10 : BIT;
BEGIN
-- a_gt_b output
g0 : n1 GENERIC MAP (tplh1, tphl1) PORT MAP (a, im1);
g1 : n1 GENERIC MAP (tplh1, tphl1) PORT MAP (b, im2);
g2 : n2 GENERIC MAP (tplh2, tphl2) PORT MAP (a, im2, im3);
g3 : n2 GENERIC MAP (tplh2, tphl2) PORT MAP (a, gt, im4);
g4 : n2 GENERIC MAP (tplh2, tphl2) PORT MAP (im2, gt, im5);
g5 : n3 GENERIC MAP (tplh3, tphl3) PORT MAP (im3, im4, im5, a_gt_b);
-- a_eq_b output
g6 : n3 GENERIC MAP (tplh3, tphl3) PORT MAP (im1, im2, eq, im6);
. . .
-- a_lt_b output
g9 : n2 GENERIC MAP (tplh2, tphl2) PORT MAP (im1, b, im8);
. . .
END passed_delay;













Design_Organization.parametrization.passing_values















Design_Organization.parametrization.passing_values



ARCHITECTURE iterative OF nibble_comparator IS
COMPONENT comp1
GENERIC (tplh1 : TIME := 2 NS; tplh2 : TIME := 3 NS;
tplh3 : TIME := 4 NS; tphl1 : TIME := 4 NS;
tphl2 : TIME := 5 NS; tphl3 : TIME := 6 NS);
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_t (passed_delay);
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;













Design_Organization.Passing_values.OPEN



ARCHITECTURE iterative OF nibble_comparator IS
. . .
BEGIN
c0: comp1
GENERIC MAP (OPEN, OPEN, 8 NS, OPEN, OPEN, 10 NS)
PORT MAP (a(0), b(0), gt, eq, lt, im(0), im(1), im(2));
. . .
END iterative;

ARCHITECTURE iterative OF nibble_comparator IS
. . .
BEGIN
c0: comp1
GENERIC MAP (tplh3 => 8 NS, tphl3 => 10 NS)
PORT MAP (a(0), b(0), gt, eq, lt, im(0), im(1), im(2));
. . .
END iterative;













Design_Organization.design_configuration



USE WORK.basic_utilities.ALL;
ARCHITECTURE customizable OF nibble_comparator_test_bench IS
COMPONENT comp4 PORT (
a, b : IN bit_vector (3 DOWNTO 0); gt, eq, lt : IN BIT;
a_gt_b, a_eq_b, a_lt_b : OUT BIT);
END COMPONENT;
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);
apply_data (a, 00&15&15&14&14&14&14&10&00&15&00&00&15, 500 NS);
apply_data (b, 00&14&14&15&15&12&12&12&15&15&15&00&00, 500 NS);
END customizable;













Design_Organization.configuration.testbench



CONFIGURATION functional OF nibble_comparator_test_bench IS
FOR customizable
FOR a1 : comp4
USE ENTITY WORK.nibble_comparator (structural);
END FOR;
END FOR;
END functional;

CONFIGURATION average_delay OF nibble_comparator_test_bench IS
FOR customizable
FOR a1 : comp4
USE ENTITY WORK.nibble_comparator (iterative);
END FOR;
END FOR;
END average_delay;


1) Structural architecture of nibble_comparator
2) Iterative architecture of nibble_comparator












Design_Organization.configuration.syntax















Design_Organization.configuration.nesting



ARCHITECTURE flexible 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;
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 flexible;


1) Specifying nibble_comparator for testbench
2) Specifying bit_comparator for nibble_comparator












Design_Organization.configuration.nesting















Design_Organization.configuration.nesting



USE WORK.ALL;
CONFIGURATION default_bit_level OF nibble_comparator_test_bench IS
FOR customizable
FOR a1 : comp4
USE ENTITY WORK.nibble_comparator(flexible);
FOR flexible
FOR c0, c3: comp1
USE ENTITY WORK.bit_comparator (default_delay);
END FOR;
FOR c1to2
FOR c: comp1
USE ENTITY WORK.bit_comparator (default_delay);
END FOR;
END FOR;
END FOR;
END FOR;
END FOR;
END default_bit_level;


default_delay bit_comparator

instantiated through
flexible nibble_comparator












Design_Organization.configuration.nesting



USE WORK.ALL;
CONFIGURATION fixed_bit_level OF nibble_comparator_test_bench IS
FOR customizable
FOR a1 : comp4
USE ENTITY WORK.nibble_comparator(flexible);
FOR flexible
FOR c0, c3: comp1
USE ENTITY WORK.bit_comparator (fixed_delay);
END FOR;
FOR c1to2
FOR c: comp1
USE ENTITY WORK.bit_comparator (fixed_delay);
END FOR;
END FOR;
END FOR;
END FOR;
END FOR;
END fixed_bit_level;


fixed_delay bit_comparator

instantiated through
flexible nibble_comparator












Design_Organization.configuration.generics















Design_Organization.design_configure.generics



USE WORK.ALL;
CONFIGURATION passed_bit_level OF nibble_comparator_test_bench IS
FOR customizable
FOR a1 : comp4
USE ENTITY WORK.nibble_comparator(flexible);
FOR flexible
FOR c0, c3: comp1
USE ENTITY WORK.bit_comparator_t (passed_delay)
GENERIC MAP (tplh1 => 2 NS, tplh2 => 3 NS,
tplh3 => 4 NS, tphl1 => 4 NS,
tphl2 => 5 NS, tphl3 => 6 NS);
END FOR;
FOR c1to2
FOR c: comp1
USE ENTITY WORK.bit_comparator_t (passed_delay)
GENERIC MAP (tplh1 => 2 NS, tplh2 => 3 NS,
tplh3 => 4 NS, tphl1 => 4 NS,
tphl2 => 5 NS, tphl3 => 6 NS);
END FOR;
END FOR;
END FOR;
END FOR;
END FOR;
END passed_bit_level;


Component binding, and Generic Map specification











Design_Organization.configuration.syntax















Design_Organization.configuration.n_bit_register



FORMING AN n-BIT REGISTER FROM BASIC GATES













Design_Organization.configuration.n_bit_register



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;
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;

ENTITY d_latch IS PORT (d, c : IN BIT; q : OUT BIT); END d_latch;
ARCHITECTURE sr_based OF d_latch IS
COMPONENT sr PORT (s, r, c : IN BIT; q : OUT BIT); END COMPONENT;
COMPONENT n1 PORT (i1: IN BIT; o1: OUT BIT); END COMPONENT;
SIGNAL dbar : BIT;
BEGIN
c1 : sr PORT MAP (d, dbar, c, q); c2 : n1 PORT MAP (d, dbar);
END sr_based;

ENTITY d_register IS
PORT (d : IN BIT_VECTOR (7 DOWNTO 0); c : IN BIT;
q : OUT BIT_VECTOR (7 DOWNTO 0) );
END d_register;
ARCHITECTURE latch_based OF d_register IS
COMPONENT dl PORT (d, c : IN BIT; q : OUT BIT); END COMPONENT;
BEGIN
dn : FOR i IN d'RANGE GENERATE
di : dl PORT MAP (d(i), c, q(i));
END GENERATE;
END latch_based;













Design_Organization.configuration.n_bit_register















Design_Organization.configuration.n_bit_register



USE WORK.ALL;
CONFIGURATION average_gate_delay OF d_register IS --1
FOR latch_based --2
FOR dn --3
FOR di : dl --4
USE ENTITY WORK.d_latch(sr_based);
FOR sr_based --5
FOR c1 : sr --6
USE ENTITY WORK.sr_latch(gate_level);
FOR gate_level --7
FOR g2, g4 : n2 USE ENTITY WORK.nand2_t (average_delay)
GENERIC MAP (5 NS, 6 NS);
END FOR;
FOR g1, g3 : n2 USE ENTITY WORK.nand2_t (average_delay)
GENERIC MAP (2 NS, 4 NS);
END FOR;
END FOR;
END FOR;
FOR c2 : n1 USE ENTITY WORK.inv_t(average_delay)
GENERIC MAP (3 NS, 5 NS);
END FOR;
END FOR;
END FOR;
END FOR;
END FOR;
END average_gate_delay;


g1,g3 delays are at 2NS, 4NS












Design_Organization.configuration.n_bit_register















Design_Organization.configuration.n_bit_register



USE WORK.ALL;
CONFIGURATION single_gate_delay OF d_register IS
FOR latch_based
FOR dn
FOR di : dl
USE ENTITY WORK.d_latch(sr_based);
FOR sr_based
FOR c1 : sr
USE ENTITY WORK.sr_latch(gate_level);
FOR gate_level
FOR g2, g4 : n2 USE ENTITY WORK.nand3 (single_delay)
PORT MAP (i1, i1, i2, o1);
END FOR;
FOR g1, g3 : n2 USE ENTITY WORK.nand2 (single_delay);
END FOR;
END FOR;
END FOR;
FOR c2 : n1 USE ENTITY WORK.inv (single_delay);
END FOR;
END FOR;
END FOR;
END FOR;
END FOR;
END single_gate_delay;













Design_Organization.configuration.n_bit_register



ARCHITECTURE single OF d_register_test_bench IS
COMPONENT reg PORT (d : IN BIT_VECTOR (7 DOWNTO 0); c : IN BIT;
q : OUT BIT_VECTOR (7 DOWNTO 0) );
END COMPONENT;
FOR r8 : reg USE CONFIGURATION WORK.single_gate_delay;
SIGNAL data, outdata : BIT_VECTOR (7 DOWNTO 0);
SIGNAL clk : BIT;
BEGIN
r8: reg PORT MAP (data, clk, outdata);
data <= X"00", X"AA" AFTER 0500 NS, X"55" AFTER 1500 NS;
clk <= '0', '1' AFTER 0200 NS, '0' AFTER 0300 NS,
'1' AFTER 0700 NS, '0' AFTER 0800 NS,
'1' AFTER 1700 NS, '0' AFTER 1800 NS;
END single;













Design_Organization.configuration.parity_checker



ENTITY xor2_t IS
GENERIC (tplh : TIME := 9 NS; tphl : TIME := 7 NS);
PORT (i1, i2 : IN BIT; o1 : OUT BIT);
END xor2_t;
--
ARCHITECTURE average_delay OF xor2_t IS
BEGIN
o1 <= i1 XOR i2 AFTER (tplh + tphl) / 2;
END average_delay;
----

ENTITY inv_t IS
GENERIC (tplh : TIME := 5 NS; tphl : TIME := 3 NS);
PORT (i1 : IN BIT; o1 : OUT BIT);
END inv_t;
--
ARCHITECTURE average_delay OF inv_t IS
BEGIN
o1 <= NOT i1 AFTER (tplh + tphl) / 2;
END average_delay;













Design_Organization.configuration.parity_checker















Design_Organization.configuration.parity_checker



ENTITY parity IS
PORT (a : IN BIT_VECTOR (7 DOWNTO 0); odd, even : OUT BIT);
END parity;
--
ARCHITECTURE iterative OF parity IS
COMPONENT x2 PORT (i1, i2: IN BIT; o1: OUT BIT); END COMPONENT;
COMPONENT n1 PORT (i1: IN BIT; o1: OUT BIT); END COMPONENT;
SIGNAL im : BIT_VECTOR ( 0 TO 6 );
BEGIN
first: x2 PORT MAP (a(0), a(1), im(0));
middle: FOR i IN 1 TO 6 GENERATE
m: x2 PORT MAP (im(i-1), a(i+1), im(i));
END GENERATE;
last: odd <= im(6);
inv: n1 PORT MAP (im(6), even);
END iterative;













Design_Organization.configuration.parity_checker



CONFIGURATION parity_binding OF parity IS
FOR iterative
FOR first : x2
USE ENTITY WORK.xor2_t (average_delay)
GENERIC MAP (5 NS, 5 NS);
END FOR;
FOR middle(1 TO 5)
FOR m : x2
USE ENTITY WORK.xor2_t (average_delay)
GENERIC MAP (5 NS, 5 NS);
END FOR;
END FOR;
FOR middle ( 6)
FOR m : x2
USE ENTITY WORK.xor2_t (average_delay)
GENERIC MAP (6 NS, 7 NS);
END FOR;
END FOR;
FOR inv : n1
USE ENTITY WORK.inv_t (average_delay) GENERIC MAP (5 NS, 5 NS);
END FOR;
END FOR;
END parity_binding;













Design_Organization.libraries



LIBRARY "ls7400" User: ... Date: ...

simple_gates PACKAGE DECLARATION ...
inv ENTITY ...
inv (single_delay) ARCHITECTURE ...
nand2 ENTITY ...
nand2 (single_delay) ARCHITECTURE ...
nand3 ENTITY ...
nand3 (single_delay) ARCHITECTURE ...













Design_Organization.libraries



LIBRARY my_lib
USE my_lib.ALL
USE my_lib.my_pack
USE my_lib.my_pack.ALL












Design_Organization.libraries



LIBRARY ls7400;
USE ls7400.simple_gates.ALL;
--
ARCHITECTURE gate_level OF sr_latch IS
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;













Design_Organization.libraries



LIBRARY ls7400;
USE ls7400.ALL;
--
.
.
. . . _FOR g1, g3 : n2
. . . _ USE ENTITY ls7400.nand2 (single_delay);
. . . _ END FOR;













Design_Organization.conclusions

1. Outline: Introduction, Organization, Outline

2. Review: Behavioral description, Using process statements, Top-down design, Using available components, Wiring predefined components, Wiring from bottom to top, Generation of testbench data, Using procedures

3. VHDL_Timing: Modeling requirements, Objects & classes, Signals & variables, Concurrent & sequential assignments, Events, transactions & delta delays, Delay modeling, Sequential placement of transactions, Conventions

4. Structural_Description_of_Hardware: Wiring parts into larger designs, Start with primitives, Wire gates into general purpose components, Use iterative constructs, Generate testbenches, Show binding alternatives, Use gate-based components for a larger design

5. Design_Organization: Subprograms, Packaging, Parameter specification, Parametrization, Top level configuration, Design libraries, A complete example

6. Utilities_for_high_level_descriptions: Language aspects, Types, Over loading subprograms operators, Predefined Attributes, User defined attributes

7. Dataflow: Constructs for dataflow descriptions, Multiplexing and clocking, Multiple assignments, State machines, Open collector gates, A complete dataflow example, Load dependent timing

8. Behavioral_Descriptions: Constructs for sequential descriptions, Assertion for behavioral checks, Handshaking constructs, Timing control, Formatted I/O, MSI parts, A complete MSI based design

9. STANDARDS: MVL9: logic value system, Logic type, Operators, Conversions; VHDL'93: Operators, Delay model, Instantiation, Binding, Attributes, Signal assignments, Report, Postponed process






to the top of the Document