Cypress Semiconductor VHDL Training

advertisement
VHDL Training
PROGRAMMABLE LOGIC
DESIGN WITH VHDL
©1997 Cypress Semiconductor, rev 2.5.3
1
VHDL Training
Objectives
 Upon completion of this training, your VHDL knowledge will enable
you to:




Implement efficient combinatorial and sequential logic
Design state machines and understand implementation trade-offs
Use hierarchy / Create reusable components
Identify how VHDL will synthesize and fit into a PLD or CPLD
©1997 Cypress Semiconductor, rev 2.5.3
2
VHDL Training
Agenda













Introduction, Why Use VHDL?
PLD Design Flow
VHDL Design Descriptions
The Entity, Ports, Modes, Types
Exercise #1
The Architecture, Architecture Styles
VHDL Statements, Combinational Logic
Processes, Signals vs. Variables
VHDL Operators/Overloading/Inferencing
Tri-State Logic, Don't Cares
VHDL Identifiers
Exercise #2, Exercise #3
Registers/Sequential Logic
©1997 Cypress Semiconductor, rev 2.5.3
3
 Wait Statement, Implicit
Memory
 Exercise #4 - Lunch
 State Machines and State
Encoding
 Exercise #5
 Hierarchy (components,
packages, and libraries)
 Exercise #6
 Generate Statement
 Multiplexing I/O pins
 Exercise #7
 Attributes, Miscellaneous
Topics, Wrap-up
VHDL Training
Introduction
 VHDL is used to:
 document circuits
 simulate circuits
 synthesize design descriptions
 Synthesis is the reduction of a design description to a
lower-level representation (such as a netlist or a set of
equations).
 This training course covers VHDL for PLD synthesis
 The course will at times draw upon the concepts of
VHDL as a simulation language
©1997 Cypress Semiconductor, rev 2.5.3
4
VHDL Training
Why Use VHDL?
 Quick Time-to-Market
 Allows designers to quickly develop designs requiring
tens of thousands of logic gates
 Provides powerful high-level constructs for describing
complex logic
 Supports modular design methodology and multiple levels
of hierarchy
 One language for design and simulation
 Allows creation of device-independent designs that are
portable to multiple vendors.
 Allows user to pick any synthesis tool, vendor, or device
©1997 Cypress Semiconductor, rev 2.5.3
5
VHDL Training
PLD Design Flow
 Design Entry
 Schematic Capture/HDL or Both
 Front-End Simulation (optional)
 Design Compilation
 Synthesis, Fitting/Place&Route
 Design Verification
 Back-End Simulation (optional)
 Device Programming
©1997 Cypress Semiconductor, rev 2.5.3
6
VHDL Training
Design
Entry
Schematic
Text
Simulation
Front
End
Synthesis
Design
Compilation
Fitting
Place&Route
Sim. Model
Design
Verification
JEDEC
File
Simulation
Programmer
©1997 Cypress Semiconductor, rev 2.5.3
7
Prog.
File
Back
End
VHDL Training
VHDL Design Descriptions
 VHDL design descriptions (referred to as "design
entities") consist of an ENTITY declaration and
ARCHITECTURE body pair
 The ENTITY declaration describes the design I/O
 The ARCHITECTURE body describes the content of
the design
©1997 Cypress Semiconductor, rev 2.5.3
8
VHDL Training
VHDL Entity/Architecture Pairs:
2-Input And Function
ENTITY and2 IS PORT (
a,b :
IN std_logic;
f:
OUT std_logic);
END and2;
ARCHITECTURE behavioral OF and2 IS
BEGIN
f <= a AND b;
END behavioral;
©1997 Cypress Semiconductor, rev 2.5.3
9
VHDL Training
The Entity
 A “BLACK BOX”
 The ENTITY describes the periphery of the
black box (i.e., the design I/O)
BLACK_BOX
rst
q[7:0]
d[7:0]
co
clk
©1997 Cypress Semiconductor, rev 2.5.3
10
VHDL Training
Example Entity declaration
ENTITY black_box IS PORT (
clk, rst:
IN std_logic;
d:
IN std_logic_vector(7 DOWNTO 0);
q:
OUT std_logic_vector(7 DOWNTO 0);
co:
OUT std_logic);
END black_box;
BLACK_BOX
 More shortly
rst
q[7:0]
d[7:0]
clk
©1997 Cypress Semiconductor, rev 2.5.3
11
co
VHDL Training
The Entity Declaration
ENTITY entity_name IS PORT (
-- optional generics
name : mode type ;
...
) ;
END entity_name;
 entity_name is an arbitrary name
 generics are used for defining paramaterized components
 name is the signal/port identifier and may be a comma
separate list for ports of identical modes and types
 mode describes the direction the data is flowing
 type indicates the set of values the port name may be
assigned
©1997 Cypress Semiconductor, rev 2.5.3
12
VHDL Training
Ports
 The Entity (“BLACK BOX”) has PORTS
 PORTS are points of communication
• PORTS are often associated with the device pins
 PORTS are a special class of SIGNAL
 PORTS have an associated SIGNAL name,
mode, and type
©1997 Cypress Semiconductor, rev 2.5.3
13
VHDL Training
PORT modes
A port’s MODE is the direction data is transferred:
 IN
Data goes into the entity but not out
 OUT
Data goes out of the entity but not in
(and is not used internally)
 INOUT
Data is bi-directional (goes into and
out of the entity)
 BUFFER Data that goes out of the entity and is
also fed-back internally within the entity
©1997 Cypress Semiconductor, rev 2.5.3
14
VHDL Training
IEEE 1076 Types
 VHDL is a strongly typed language (you cannot assign a signal of
one type to the signal of another type)
 bit - a signal of type bit that can only take values of '0' or '1'
 bit_vector - a grouping of bits (each can be '0' or '1')
SIGNAL a: BIT_VECTOR(0 TO 3);
-- ascending range
SIGNAL b: BIT_VECTOR(3 DOWNTO 0); -- descending range
a <= "0111"; -- double quotes used for
vectors
b <= "0101";
This means that: a(0) = '0'
b(0) = '1'
a(1) = '1'
b(1) = '0'
a(2) = '1'
b(2) = '1'
a(3) = '1'
b(3) = '0'
©1997 Cypress Semiconductor, rev 2.5.3
15
VHDL Training
IEEE 1076 TYPES (contd.)
 INTEGER
• useful as index holders for loops, constants,
generics, or high-level modeling
 BOOLEAN
• can take values ‘TRUE’ or ‘FALSE’
 ENUMERATED
• has user defined set of possible values, e.g.,
• TYPE states IS (start, slow, fast, stop);
©1997 Cypress Semiconductor, rev 2.5.3
16
VHDL Training
IEEE 1164




"Multi-value logic system for VHDL interoperability"
A package created as an aid to VHDL users
Nine values as opposed to two ('0' and '1')
Allows increased flexibility in behavioral VHDL
coding, synthesis, and simulation
 std_logic and std_logic_vector are used as opposed to
bit and bit_vector when a multi-valued logic system is
required.
 std_logic and std_logic_vector are used when tri-state
logic is required.
©1997 Cypress Semiconductor, rev 2.5.3
17
VHDL Training
1164 Types
 std_logic and std_logic_vector are the industry
standard logic type for digital design
 All 9 values are valid in a VHDL simulator, however
only:
 ‘0’ -- Forcing ‘0’
 ‘1’ -- Forcing ‘1’
 ‘Z’ -- High Impedance
 ‘L’ -- Weak ‘0’
 ‘H’ -- Weak ‘1’
 ‘-’
-- Don’t care
are recognized for logic synthesis
©1997 Cypress Semiconductor, rev 2.5.3
18
VHDL Training
Entity Declaration Example
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY black_box IS PORT (
clk, rst:
IN std_logic;
d:
IN std_logic_vector(7 DOWNTO 0);
q:
OUT std_logic_vector(7 DOWNTO 0);
co:
OUT std_logic);
END black_box;
BLACK_BOX
MODE
rst
TYPE
q[7:0]
d[7:0]
clk
©1997 Cypress Semiconductor, rev 2.5.3
19
co
VHDL Training
Exercise #1: The Entity
 Write an entity declaration for the following:
Port D is a 12-bit bus, input only
Port OE and CLK are each input bits
Port AD is a 12-bit, three-state bi-directional bus
Port A is a 12-bit bus, output only
Port INT is a three-state output
Port AS is an output also used internally
my_design
ad[11:0]
d[11:0]
©1997 Cypress Semiconductor, rev 2.5.3
oe
a[11:0]
clk
int
as
20
VHDL Training
Exercise #1: Solution
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY my_design IS PORT (
d:
IN std_logic_vector(11 DOWNTO 0);
oe, clk: IN std_logic;
ad:
INOUT std_logic_vector(11 DOWNTO 0);
a:
OUT std_logic_vector(11 DOWNTO 0);
int:
OUT std_logic;
my_design
as:
BUFFER std_logic);
END my_design;
ad[11:0]
d[11:0]
-- In this presentation, VHDL keywords
a[11:0]
oe
-- are highlighted in bold, CAPITALS;
int
clk
as
-- however, VHDL is not case sensitive:
-- clock, Clock, CLOCK all refer to the
-- same signal, -- means a comment
©1997 Cypress Semiconductor, rev 2.5.3
21
VHDL Training
The Architecture
 Architectures describe what is in the black box (i.e., the
structure or behavior of entities)
 Descriptions can be either a combination of
 Structural descriptions
• Instantiations (placements of logic-much like in a
schematic-and their connections) of building blocks
referred to as components
 Behavioral/Dataflow descriptions
• Algorithmic (or “high-level”) descriptions:
IF a = b THEN state <= state5;
• Boolean equations (also referred to as dataflow):
x <= (a OR b) AND c;
©1997 Cypress Semiconductor, rev 2.5.3
22
VHDL Training
The Architecture Declaration
ARCHITECTURE arch_name OF entity_name IS
-- optional signal declarations, etc.
BEGIN
--VHDL statements
END arch_name;
 arch_name is an arbitrary name
 optional signal declarations are used for signals local to
the architecture body (that is, not the entity’s I/O).
 entity_name is the entity name
 statements describe the function or contents of the entity
©1997 Cypress Semiconductor, rev 2.5.3
23
VHDL Training
Architecture Body Styles : Behavioral
ENTITY compare IS PORT (
a, b: IN std_logic_vector(0 TO 3);
equals: OUT std_logic);
END compare;
ARCHITECTURE behavior OF compare IS
BEGIN
comp: PROCESS (a,b)
BEGIN
IF a = b THEN
equals <= '1' ;
ELSE
equals <= '0' ;
END IF ;
END PROCESS comp;
END behavior;
©1997 Cypress Semiconductor, rev 2.5.3
24
VHDL Training
Architecture Body Styles : Dataflow
ENTITY compare IS PORT (
a, b: IN std_logic_vector(0 TO 3);
equals: OUT std_logic);
END compare;
ARCHITECTURE dataflow OF compare IS
BEGIN
equals <= '1' WHEN a = b ELSE '0' ;
END dataflow;
©1997 Cypress Semiconductor, rev 2.5.3
25
VHDL Training
Architecture Body Styles : Structural
ENTITY compare IS PORT (
a, b: IN std_logic_vector(0 TO 3);
equals: OUT std_logic);
END compare;
USE WORK.gatespkg.ALL ;
ARCHITECTURE structure OF compare IS
SIGNAL x : std_logic_vector (0 to 3) ;
BEGIN
u0: xnor2 PORT MAP (a(0),b(0),x(0)) ;
u1: xnor2 PORT MAP (a(1),b(1),x(1)) ;
u2: xnor2 PORT MAP (a(2),b(2),x(2)) ;
u3: xnor2 PORT MAP (a(3),b(3),x(3)) ;
u4: and4 PORT MAP (x(0),x(1),x(2),x(3),equals) ;
END structure;
©1997 Cypress Semiconductor, rev 2.5.3
26
VHDL Training
Comparing Architecture Styles
 These examples synthesize to equivalent circuits
 In more elaborate designs, some descriptions may yield
more efficient circuits
 sloppy code = inefficient results (see section 3.3.4)
 Use styles that make your designs easier to describe and
maintain
 Behavioral/Dataflow exploit module generation
(described later)
 Structural descriptions may make the design less
portable (may rely on a library of vendor-specific
components)
©1997 Cypress Semiconductor, rev 2.5.3
27
VHDL Training
Mixing Architecture Styles
 The various styles may be mixed in one architecture.
ENTITY logic IS PORT (
a,b,c: IN std_logic;
f:
OUT std_logic);
END logic;
LOGIC
a
b
d
g1
c
USE WORK.gatespkg.ALL;
ARCHITECTURE archlogic OF logic IS
SIGNAL d: std_logic;
BEGIN
Behavioral/Dataflow
d <= a AND b;
Structural
g1: nor2 PORT MAP (c, d, f);
END archlogic;
©1997 Cypress Semiconductor, rev 2.5.3
28
f
VHDL Training
VHDL Statements
 There are two types of statements
 Sequential
• Though hardware is concurrent, it may be
modeled with algorithms, by a series of sequential
statements
• By definition, sequential statements are grouped
using a process statement.
 Concurrent
• Statements outside of a process are evaluated
concurrently during simulation
• Processes are concurrent statements
©1997 Cypress Semiconductor, rev 2.5.3
29
VHDL Training
Concurrent Statements
 Concurrent statements include:
 boolean equations
 conditional/selective signal assignments
(when/else, with/select)
 instantiations
 Examples of concurrent statements:
-- Examples of boolean equations
x <= (a AND (NOT sel1)) OR (b AND sel1);
g <= NOT (y AND sel2);
-- Examples of conditional assignments
y <= d WHEN (sel1 = '1') ELSE c;
h <= '0' WHEN (x = '1' AND sel2 = '0') ELSE
'1';
-- Examples of instantiation
inst: nand2 PORT MAP (h, g, f);
©1997 Cypress Semiconductor, rev 2.5.3
30
VHDL Training
The Process Statement
 Used to construct algorithms/group sequential
statements
 Statements within a process are sequential
statements-they execute sequentially during
simulation
 An architecture can contain multiple processes.
Each process is executed concurrently
 Processes may be used to model combinational or
synchronous logic
©1997 Cypress Semiconductor, rev 2.5.3
31
VHDL Training
The Process (contd.)
label: PROCESS (sensitivity list)
-- variable declarations
BEGIN
-- sequential statements
END PROCESS label ;
 The process label and variable declarations are
optional
 The process executes when one of the signals in the
sensitivity list has an event (changes value).
©1997 Cypress Semiconductor, rev 2.5.3
32
VHDL Training
Process (contd.)
 Processes are executing or suspended (active or
inactive/awake or asleep)
 A process typically has a sensitivity list
 When a signal in the sensitivity list changes value,
the process is executed by the simulator
 e.g., a process with a clock signal in its sensitivity
list becomes active on changes of the clock signal
 All signal assignments occur at the END PROCESS
statement in terms of simulation
 The process is then suspended until there is an event
(change in value) on a signal in the sensitivity list
©1997 Cypress Semiconductor, rev 2.5.3
33
VHDL Training
Combinational Logic
 Can be described with concurrent statements
 e.g. with-select-when, when-else, boolean
equations, component instantiatons
 Can be described with sequential statements
 e.g. if-then-else, case-when
©1997 Cypress Semiconductor, rev 2.5.3
34
VHDL Training
Combinational Logic w/ Boolean Equations
 Boolean Equations can be used in both concurrent
and sequential signal assignment statements.
 A 4-1 multiplexer is shown below
s
x <= (a AND NOT(s(1)) AND NOT(s(0))) OR
(b AND NOT(s(1)) AND s(0)) OR
(c AND s(1) AND NOT(s(0))) OR
(d AND s(1) AND s(0)) ;
©1997 Cypress Semiconductor, rev 2.5.3
35
2
a
b
c
d
mux
x
VHDL Training
Selective Signal Assignment:
with-select-when




Assignment based on a selection signal
WHEN clauses must be mutually exclusive
Use a WHEN OTHERS to avoid latches
Only one reference to the signal, only one assignment operator (<=)
WITH selection_signal SELECT
signal_name <= value_1 WHEN value_1 of selection_signal,
value_2 WHEN value_2 of selection_signal,
...
value_n WHEN value_n of selection_signal,
value_x WHEN OTHERS;
©1997 Cypress Semiconductor, rev 2.5.3
36
VHDL Training
Combinational Logic w/
Selective Signal Assignment
 The same 4-1 multiplexer is shown below
with s select
x <= a when “00” ,
b when “01” ,
c when “10” ,
d when others ;
©1997 Cypress Semiconductor, rev 2.5.3
37
VHDL Training
More on with-select-when
 You can use a range of values
with int_value select
x <= a when 0 to 3,
b when 4 | 6 | 8 ,
c when 10 ,
d when others ;
©1997 Cypress Semiconductor, rev 2.5.3
38
VHDL Training
Conditional Signal Assignment:
when-else




Signal is assigned a value based on conditions
Any simple expression can be a condition
Priority goes in order of appearance
Only one reference to the signal, only one assignment
operator (<=)
 Use a final ELSE to avoid latches
signal_name <= value_1
value_2
...
value_n
value_x
©1997 Cypress Semiconductor, rev 2.5.3
WHEN condition1 ELSE
WHEN condition2 ELSE
WHEN conditionn ELSE
;
39
VHDL Training
Combinational Logic w/
Conditional Signal Assignment
 The same 4-1 multiplexer is shown below
x <= a when (s = “00”) else
b when (s = “01”) else
c when (s = “10”) else
d;
©1997 Cypress Semiconductor, rev 2.5.3
40
VHDL Training
Combinational Logic w/
Conditional Signal Assignment
 The when conditions do not have to be mutually
exclusive (as in with-select-when)
 A priority encoder is shown below
j <= w when (a = ‘1’) else
x when (b = ‘1’) else
y when (c = ‘1’) else
z when (d = ‘1’) else
‘0’ ;
©1997 Cypress Semiconductor, rev 2.5.3
41
VHDL Training
Combinational Logic w/ Sequential
Statements
 Grouped together with Processes
 Processes are concurrent with one another and with
concurrent statements
 Order of sequential statements does make a
difference in synthesis
©1997 Cypress Semiconductor, rev 2.5.3
42
VHDL Training
Sequential Statements
if-then-else
 Used to select a set of statements to be executed
 Selection based on a boolean evaluation of a
condition or set of conditions
IF condition(s) THEN
do something;
ELSIF condition_2 THEN -- optional
do something different;
ELSE
-- optional
do something completely different;
END IF ;
©1997 Cypress Semiconductor, rev 2.5.3
43
VHDL Training
if-then-else
 Absence of ELSE results in implicit memory
 4-1 mux shown below
mux4_1: process (a, b, c, d, s)
begin
if s = “00” then x <= a ;
elsif s = “01” then x <= b ;
elsif s = “10” then x <= c ;
else x <= d ;
end process mux4_1 ;
©1997 Cypress Semiconductor, rev 2.5.3
44
VHDL Training
Sequentional Statements: Case-When
CASE selection_signal
WHEN value_1_of_selection_signal =>
(do something)
-- set of statements 1
WHEN value_2_of_selection_signal =>
(do something)
-- set of statements 2
...
WHEN value_N_of_selection_signal =>
(do something)
-- set of statements N
WHEN OTHERS =>
(do something)
-- default action
END CASE ;
©1997 Cypress Semiconductor, rev 2.5.3
45
VHDL Training
The CASE Statement: 4-1 Mux
ARCHITECTURE archdesign OF design IS
SIGNAL s: std_logic_vector(0 TO 1);
BEGIN
mux4_1: PROCESS (a,b,c,d,s)
BEGIN
CASE s IS
WHEN "00" => x <= a;
WHEN "01" => x <= b;
WHEN "10” => x <= c;
WHEN OTHERS => x <= d;
END CASE;
END PROCESS mux4_1;
END archdesign;
©1997 Cypress Semiconductor, rev 2.5.3
46
VHDL Training
Sequential Statements: An Example
mux: PROCESS (a, b, s)
BEGIN
IF s = '0' THEN
x <= a;
ELSE
x <= b;
END IF;
END PROCESS mux;
s
a(3 DOWNTO 0)
x(3 DOWNTO 0)
b(3 DOWNTO 0)
 Note: logic within a process can be registered or combinatorial
 Note: the order of the signals in the sensitivity list is not important
 Note: the process mux is sensitive to signals a, b, and s; i.e., whenever one
or more of those signals changes value, the statements inside of the process
are executed
©1997 Cypress Semiconductor, rev 2.5.3
47
VHDL Training
Signal Assignment in Processes
Which Circuit is Correct?
PROCESS
BEGIN
WAIT UNTIL clock = '1' ; -- implied sensitivity list
b <= a;
c <= b;
END PROCESS ;
a
a
c
clock
clock
©1997 Cypress Semiconductor, rev 2.5.3
48
b
c
VHDL Training
Signal Assignment in Processes
(contd.)
 Signals are not updated immediately. Rather, they are
scheduled.
 The signals are not updated until time advances
(after the End Process statement)
 Therefore, two registers will be synthesized
 Note: In some instances, the use of concurrent
statements outside the process may alleviate the
problem, but this is not possible with registered
logic.
©1997 Cypress Semiconductor, rev 2.5.3
49
VHDL Training
VARIABLES
 When a concurrent signal assignment cannot be used,
the previous problem can be avoided using a VARIABLE
 Variables can only exist within a PROCESS, they
cannot be used to communicate information
between processes
 Variables can be of any valid data type
 The value assigned to a variable is available
immediately
 The variable assignment statement is used to
assign values to variables, e.g.,
c := a AND b;
©1997 Cypress Semiconductor, rev 2.5.3
50
VHDL Training
Using Variables vs. Signals
 Solution using a variable within a process:
-- assume a and c are signals defined elsewhere
PROCESS
VARIABLE b : std_logic ;
BEGIN
WAIT UNTIL clock = '1' ;
b := a ; -- this is immediate
c <= b ; -- this is scheduled
END PROCESS ;
©1997 Cypress Semiconductor, rev 2.5.3
51
VHDL Training
Native Operators
 Logical - defined for type bit, bit_vector, boolean*
 AND, NAND
 OR, NOR
 XOR, XNOR
 NOT
 Relational - defined for types bit, bit_vector, integer*
 = (equal to)
 /= (not equal to)
 < (less than)
 <= (less than or equal to)
 > (greater than)
 >= (greater than or equal to)
 * overloaded for std_logic, std_logic_vector
©1997 Cypress Semiconductor, rev 2.5.3
52
VHDL Training
Native Operators (contd.)
 Unary Arithmetic - defined for type integer*
 - (arithmetic negate)
 Arithmetic - defined for type integer*
 + (addition), * (multiplication)
 - (subtraction)
 Concatenation - defined for strings
 &
Note, a STRING is any sequence of characters, therefore a
std_logic_vector is an example of a STRING
 * overloaded for std_logic, std_logic_vector
©1997 Cypress Semiconductor, rev 2.5.3
53
VHDL Training
Overloaded Operators
 In VHDL, the scope of all of the previous operators
can be extended (or overloaded) to accept any type
supported by the language, e.g.,
-----
assume a declaration of a 16-bit vector as
SIGNAL pc IS std_logic_vector(15 DOWNTO 0);
then a valid signal assignment is
pc <= pc + 3;
assuming the '+' operator has been overloaded to accept std_logic_vector and integer operands
 The std_logic_1164 package defines overloaded
logical operators (AND, OR, NOT, etc.,) for the
std_logic and std_logic_vector types
 In this training, you will learn to use overloaded
operators, but not to define them
©1997 Cypress Semiconductor, rev 2.5.3
54
VHDL Training
Using Tri-State Logic
ENTITY test_three IS
PORT( oe
: in std_logic;
data
: out std_logic_vector(0 to 7));
END test_three;
ARCHITECTURE archtest_three OF test_three IS
BEGIN
PROCESS (oe)
BEGIN
IF (oe = '1') THEN
data <= "01100100";
ELSE
data <= "ZZZZZZZZ";
END IF;
END PROCESS;
END archtest_three;
©1997 Cypress Semiconductor, rev 2.5.3
55
VHDL Training
Behavioral Don’t Cares
 Can use explicit "don’t care" conditions to produce
optimal logic equations
IF (a = '1') AND (b = '1') THEN
x <= c;
ELSE
x <= '-';
END IF;
 Produces the equation x = c
 To assign don’t cares in VHDL: mysig <= '-';
 'X' means "unknown" and is not useful for
synthesis
©1997 Cypress Semiconductor, rev 2.5.3
56
VHDL Training
Comparing Vectors to Strings
-more on don't cares



Comparing "1101" to "11-1" will return FALSE
Use std_match(a,"string")
Must include std_arith package
Example:
...
signal a : stdlogic_vector (1 to 4) ;
...
IF (std_match(a,"10-1")) THEN
x <= '1' ;
END IF ;
©1997 Cypress Semiconductor, rev 2.5.3
57
VHDL Training
Legal VHDL Identifiers
 Letters, digits, and underscores only (first character must
be a letter)
 The last character cannot be an underscore
 Two underscores in succession are not allowed
 Using reserved words is not allowed
 Examples
 Legal
• tx_clk, Three_State_Enable, sel7D, HIT_1124
 Not Legal
• _tx_clk, 8B10B, large#num, register, clk_
©1997 Cypress Semiconductor, rev 2.5.3
58
VHDL Training
Exercise #2: Architecture
Declaration of a Comparator
 The entity declaration is as follows:
a(0 TO 3)
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
b(0 TO 3)
ENTITY compare IS PORT (
a, b: IN std_logic_vector(0 TO 3);
aeqb: OUT std_logic);
END compare;
 Write an architecture that causes aeqb to be asserted
when a is equal to b
 Multiple solutions exist
©1997 Cypress Semiconductor, rev 2.5.3
59
aeqb
VHDL Training
Three possible solutions
 Concurrent statement solution using a conditional
assignment:
ARCHITECTURE archcompare OF compare IS
BEGIN
aeqb <= '1' WHEN a = b ELSE '0';
END archcompare;
 Concurrent statement solution using boolean
equations:
ARCHITECTURE archcompare OF compare IS
BEGIN
aeqb <= NOT(
(a(0) XOR b(0)) OR
(a(1) XOR b(1)) OR
(a(2) XOR b(2)) OR
(a(3) XOR b(3)));
END archcompare;
©1997 Cypress Semiconductor, rev 2.5.3
60
VHDL Training
Three possible solutions (contd.)
 Solution using a process with sequential statements:
ARCHITECTURE archcompare OF compare IS
BEGIN
comp: PROCESS (a, b)
BEGIN
IF a = b THEN
aeqb <= '1';
a(0 TO 3)
ELSE
aeqb <= '0';
b(0 TO 3)
END IF;
END PROCESS comp;
END archcompare;
©1997 Cypress Semiconductor, rev 2.5.3
61
aeqb
VHDL Training
Exercise #3:
The Schematic
en(0)
dir
gnd
en(1)
nOE
LE
nOE
LE
control[7:0]
status[7:0]
gnd
dir
CY74FCT373T
en(2)
en(3)
nOE
T/R
CY74FCT373T
nOE
LE
data[7:0]
CY74FCT245T
CY74FCT373T
addr[1:0]
dir
nvalid
en[0:3]
PLD
©1997 Cypress Semiconductor, rev 2.5.3
62
VHDL Training
Exercise #3
 Use Warp to compile the VHDL design description
of the truth table below:
addr
nvalid
b"00"
b"00"
b"01"
b"01"
b"10"
b"10"
b"11"
b"11"
'0'
'1'
'0'
'1'
'0'
'1'
'0'
'1'
en(0) en(1) en(2) en(3) dir
L
L
H
L
L
L
L
L
L
H
H
H
H
H
H
H
H
H
H
H
L
H
H
H
L
L
L
L
L
L
H
L
L
H
H
H
L
H
H
H
 Write the Architecture for the given Entity (next)
 Save design in file named “ex3.vhd”
©1997 Cypress Semiconductor, rev 2.5.3
63
VHDL Training
Exercise #3:
The Entity Declaration
 the entity declaration is as follows:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY ex3 IS PORT (
addr: IN std_logic_vector(1 DOWNTO 0);
nvalid: IN std_logic;
en: BUFFER std_logic_vector(0 TO 3);
dir: OUT std_logic
);
addr
END ex3;
dir
nvalid
en
PLD
©1997 Cypress Semiconductor, rev 2.5.3
64
VHDL Training
Exercise #3: Solution
The Architecture
 The architecture is as follows:
ARCHITECTURE archex3 OF ex3 IS
BEGIN
en(0) <= '0' WHEN (addr = "00" AND nvalid = '0') ELSE '1';
en(1) <= (NOT addr(1)) AND addr(0) AND (NOT nvalid) ;
en(2) <= '0' WHEN (addr = "10" AND nvalid = '0') ELSE '1';
en(3) <= addr(1) AND addr(0) AND (NOT nvalid);
dir <= '0' WHEN (addr = "00" AND nvalid = '0') OR
(addr = "10" AND nvalid = '0') ELSE '1' ;
END archex3;
©1997 Cypress Semiconductor, rev 2.5.3
65
VHDL Training
Aggregates and Subscripts




Aggregate assignment concatenates signals together
Good for creating a bus from several inputs
Concatenation operator can be used as well
Same number of array elements on both sides of <=
tmp <= (a,b,c,d);
tmp <= a & b & c & d;
 Signals can be “pulled” from larger vectors
 Good for grouping outputs as an “alias”
 Sizes on both sides must match
rw <= ctrl(0); ce <= ctrl(1); oe <= ctrl(2);
highcount <= count(7 DOWNTO 4);
©1997 Cypress Semiconductor, rev 2.5.3
66
VHDL Training
Exercise #3: Alternate Solution
 Using With/Select and aggregates
ARCHITECTURE archex3 OF ex3 IS
SIGNAL control : std_logic_vector(2 DOWNTO 0);
SIGNAL outputs : std_logic_vector(0 TO 4);
BEGIN
control <= addr & nvalid;
WITH control SELECT
outputs <= "00100" WHEN "000",
"10101" WHEN "001",
"11101" WHEN "010",
"10101" WHEN "011",
"10000" WHEN "100",
"10101" WHEN "101",
"10111" WHEN "110",
"10101" WHEN "111",
"-----" WHEN OTHERS;
en <= outputs(0 TO 3);
dir <= outputs(4);
END archex3;
©1997 Cypress Semiconductor, rev 2.5.3
67
VHDL Training
Designs that use Registers
 There are two methods of utilizing and generating
flip-flops:
 Instantiate (place) a flip-flop or a component
that contains a flip-flop
 Use a process that is sensitive to a clock edge
©1997 Cypress Semiconductor, rev 2.5.3
68
VHDL Training
Instantiating a registered component
 Example: Using LPM library
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE WORK.lpmpkg.all ;
ENTITY registered IS PORT (
d, clk: IN std_logic;
q:
OUT std_logic);
END registered;
d
q
clk
ARCHITECTURE archregistered OF registered IS
BEGIN
flipflop: Mff generic map (lpm_width=>1,lpm_fftyp=>lpm_dff)
PORT MAP (data=>d,clock=>clk,enable=>one,q=>q);
END archregistered;
©1997 Cypress Semiconductor, rev 2.5.3
69
VHDL Training
Registers in Behavioral VHDL
 Example: a D-type flip-flop
ENTITY registered IS PORT (
d, clk:
IN std_logic;
q:
OUT std_logic);
END registered;
ARCHITECTURE archregistered OF registered IS
BEGIN
flipflop: PROCESS (clk)
BEGIN
IF clk’EVENT AND clk = '1' THEN
q <= d;
END IF;
END PROCESS flipflop;
END archregistered;
©1997 Cypress Semiconductor, rev 2.5.3
70
VHDL Training
Registers in Behavioral VHDL
 The synthesis compiler infers that a register is to be
created for which signal q is the output because
 The clock (clk) is in the sensitivity list
 The construct, clk’event and clk = ‘1’, appears
in the process
 The clk’event and clk = ‘1’ statement implies that
subsequent signal assignments occur on the risingedge of the clock
 The absence of an “else” clause in the “if-then”
statement implies that if the clk’event and clk = ‘1’
condition is not fulfilled (i.e. not a rising-edge), q
will retain its value until the next assignment occurs
(this is referred to as implied memory)
©1997 Cypress Semiconductor, rev 2.5.3
71
VHDL Training
A Registered Process (1)
 A 4-bit counter with synchronous reset
USE WORK.std_arith.ALL;
...
upcount: PROCESS (clk)
BEGIN
IF clk’EVENT AND clk= '1' THEN
IF reset = '1' THEN
count <= "0000"; -- or x"0" instead
ELSE
count <= count + 1;
END IF;
END IF;
END PROCESS upcount;
 This process is only sensitive to changes in “clk”, i.e.,
it will become active only when the clock transitions
©1997 Cypress Semiconductor, rev 2.5.3
72
VHDL Training
A Registered Process (2)
 A 4-bit counter with asynchronous reset
USE WORK.std_arith.ALL;
...
upcount: PROCESS (clk, rst)
BEGIN
IF rst = '1' THEN
count <= x"0";
ELSIF clk’EVENT AND clk = '1' THEN
count <= count + 1;
END IF;
END PROCESS upcount;
 This process is sensitive to changes in both clk and
rst, i.e., it will become active during clock or reset
transitions.
©1997 Cypress Semiconductor, rev 2.5.3
73
VHDL Training
A Registered Process (3)
 A 4-bit loadable counter with asynchronous reset
USE WORK.std_arith.ALL;
...
upcount: PROCESS (clk, rst)
BEGIN
IF rst = '1' THEN
count <= x"0" ;
ELSIF clk’EVENT AND clk = '1' THEN
IF load = '1' THEN
count <= data;
ELSE
count <= count + 1;
END IF;
END IF;
END PROCESS upcount;
©1997 Cypress Semiconductor, rev 2.5.3
74
VHDL Training
The WAIT statement
 This is another method to activate a process
 The WAIT statement is a sequential statement which
suspends the execution of a process until the
condition specified becomes valid (true)
i.e., an implied sensitivity list, e.g.,
sync: PROCESS
BEGIN
WAIT UNTIL clock='1';
IF enable='1' THEN
q_out <= d_in;
ELSE
q_out <= '0';
END IF;
END PROCESS sync;
©1997 Cypress Semiconductor, rev 2.5.3
enable
d_in
clock
75
D
Q
q_out
VHDL Training
Implicit memory
 Signals in VHDL have a current value and may be
scheduled for a future value
 If the future value of a signal cannot be determined, a
latch will be synthesized to preserve its current value
 Advantages:
 Simplifies the creation of memory in logic
design
 Disadvantages:
 Can generate unwanted latches, e.g., when all of
the options in a conditional sequential statement
are not specified
©1997 Cypress Semiconductor, rev 2.5.3
76
VHDL Training
Implicit memory:
Example of incomplete specification
ARCHITECTURE archincomplete OF
incomplete IS
a
BEGIN
im_mem: PROCESS (a,b)
c
BEGIN
IF a = '1' THEN c <= b;
b
END IF;
END PROCESS im_mem;
END archincomplete;
 Note: the incomplete specification of the IF...THEN...
statement causes a latch to be synthesized to store the
previous state of ‘c’
©1997 Cypress Semiconductor, rev 2.5.3
77
VHDL Training
Implicit memory:
Example of complete specification
ARCHITECTURE archcomplete OF
complete IS
BEGIN
no_mem: PROCESS (a, b)
BEGIN
IF a = '1' THEN c <= b;
ELSE c <= '0';
END IF;
END PROCESS no_mem;
END archcomplete;
a
b
 The conditional statement is fully specified, and this
causes the process to synthesize to a single gate
©1997 Cypress Semiconductor, rev 2.5.3
78
c
VHDL Training
The rules to avoid implicit memory
 To avoid the generation of unexpected latches
 always terminate an IF...THEN... statement with an
ELSE clause
 cover all alternatives in a CASE statement
• define every alternative individually, or
• terminate the CASE statement with a WHEN
OTHERS... clause, e.g.,
CASE select IS
WHEN b"100" => key
x <= a
WHEN b"010" => key
WHEN b"001" => key
WHEN OTHERS => key
END CASE;
©1997 Cypress Semiconductor, rev 2.5.3
79
<= first;
AND b;
<= second;
<= third;
<= none;
VHDL Training
Exercise #4
 Making use of the previous examples, write an
entity/architecture pair for the following design:
ENC
COUNTER
DATA
LD
4
DIN
LD
COUNT
Q
4
ENC
COMPARATOR
CLOCK
P
RST
RESET (sync)
P=Q
Q
REGISTER
DIN
ENR
©1997 Cypress Semiconductor, rev 2.5.3
Q
4
ENR
80
VHDL Training
Exercise #4: Solution
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY ex4 IS PORT (
clock, reset, enc, enr, ld: IN std_logic;
data: IN std_logic_vector (3 DOWNTO 0);
count: BUFFER std_logic_vector(3 DOWNTO 0));
END ex4;
USE WORK.std_arith.ALL; -- for counter and ultragen
ARCHITECTURE archex4 OF ex4 IS
SIGNAL comp: std_logic;
SIGNAL regout: std_logic_vector (3 DOWNTO 0);
BEGIN
reg: PROCESS (clock)
BEGIN
IF clock'EVENT AND clock = '1' THEN
IF enr = '1' THEN
regout <= data;
END IF;
END IF;
END PROCESS reg;
©1997 Cypress Semiconductor, rev 2.5.3
81
VHDL Training
Exercise #4: Solution (contd.)
cntr: PROCESS (clock)
BEGIN
IF clock'EVENT AND clock = '1' THEN
IF reset = '1' THEN
count <= "0000";
ELSIF ld = '1' THEN
count <= data;
ELSIF enc = '1' AND comp = '0' THEN
count <= count + 1;
END IF;
END IF;
END PROCESS cntr;
comp <= '1' WHEN regout = count ELSE '0';
END archex4;
©1997 Cypress Semiconductor, rev 2.5.3
82
VHDL Training
State machines
 Moore Machines
 A finite state machine in which the outputs
change due to a change of state
 Mealy Machines
 A finite state machine in which the outputs can
change asynchronously i.e., an input can cause
an output to change immediately
©1997 Cypress Semiconductor, rev 2.5.3
83
VHDL Training
Moore machines
 Outputs may change only with a change of state
 Multiple implementations include:
 Arbitrary state assignment
• outputs must be decoded from the state bits
• combinatorial decode
• registered decode
 Specific state assignment
• outputs may be encoded within the state bits
• one-hot encoding
©1997 Cypress Semiconductor, rev 2.5.3
84
VHDL Training
Moore state machine implementations (1)
 Outputs decoded from state bits
 Combinatorial decode
• Outputs are decoded combinatorially from
the current state
• outputscomb = f(present state)
Inputs
©1997 Cypress Semiconductor, rev 2.5.3
Logic
State
Registers
85
Output
Logic
Outputs
VHDL Training
Moore state machine implementations (2)
 Outputs decoded from state bits
 Registered decode
• Outputs are registered; decode of outputs is
in parallel with decode of next state
• outputsreg = f(previous state, inputs)
Inputs
Next
State
Logic
Current State
State
Registers
Output
Logic
©1997 Cypress Semiconductor, rev 2.5.3
86
Output Outputs
Registers
VHDL Training
Moore State Machine Implementations (3)
 Outputs encoded within state bits
Example:
State
Output 1
Output 2
State Encoding
s1
0
0
00
s2
1
0
01
s3
0
1
10
Note: Both bits of the state encoding are used as outputs
Inputs
©1997 Cypress Semiconductor, rev 2.5.3
State
Registers
Logic
87
Outputs
VHDL Training
Example: A wait state generator
 State diagram:
PWAIT
ack_out='1'
RESET
(async)
IDLE
REQ
RETRY
00
PWAIT
01
REQ
retry_out='1'
©1997 Cypress Semiconductor, rev 2.5.3
88
ACK
10
VHDL Training
Example: The entity declaration
 The entity declaration remains essentially the same
for each implementation (except for the entity name)
e.g.,
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY moore1 IS PORT (
clock, reset: IN std_logic;
req, pwait: IN std_logic;
retry_out, ack_out: OUT std_logic);
END moore1;
©1997 Cypress Semiconductor, rev 2.5.3
89
VHDL Training
Example: Solution 1
 Combinatorial outputs decoded from the state bits
ARCHITECTURE archmoore1 OF moore1 IS
TYPE fsm_states IS (idle, retry, ack);
SIGNAL wait_gen : fsm_states;
BEGIN
fsm: PROCESS (clock, reset)
BEGIN
IF reset = '1' THEN
wait_gen <= idle; -- asynchronous reset
ELSIF clock'EVENT AND clock = '1' THEN
CASE wait_gen IS
WHEN idle => IF req = '0' THEN wait_gen <= retry;
ELSE wait_gen <= idle;
END IF;
WHEN retry => IF pwait='1' THEN wait_gen <= ack;
ELSE wait_gen <= retry;
END IF;
©1997 Cypress Semiconductor, rev 2.5.3
90
VHDL Training
Example: Solution 1 (contd.)
WHEN ack => wait_gen <= idle;
WHEN OTHERS => wait_gen <= idle;
END CASE;
END IF;
END PROCESS fsm;
retry_out <= '1' WHEN (wait_gen = retry) ELSE '0';
ack_out
<= '1' WHEN (wait_gen = ack)
ELSE '0';
END archmoore1;
©1997 Cypress Semiconductor, rev 2.5.3
91
VHDL Training
Example: Solution 2
 Registered outputs decoded from the state bits
ARCHITECTURE archmoore2 OF moore2 IS
TYPE fsm_states IS (idle, retry, ack);
SIGNAL wait_gen: fsm_states;
BEGIN
fsm: PROCESS (clock, reset)
BEGIN
IF reset = '1' THEN
wait_gen <= idle;
retry_out <= '0';
ack_out
<= '0';
ELSIF clock'EVENT AND clock = '1' THEN
retry_out <= '0'; -- a default assignment, could do ack_out
too
CASE wait_gen IS
WHEN idle => IF req = '0' THEN wait_gen <= retry;
retry_out <= '1';
ack_out
<= '0';
ELSE wait_gen <= idle;
ack_out
<= '0';
END IF;
©1997 Cypress Semiconductor, rev 2.5.3
92
VHDL Training
Example: Solution 2 (contd.)
WHEN retry
=> IF pwait = '1' THEN wait_gen <= ack;
ack_out
<= '1';
ELSE wait_gen <= retry;
retry_out <= '1';
ack_out
<= '0';
END IF;
WHEN ack
=> wait_gen <= idle;
ack_out
<= '0';
WHEN OTHERS => wait_gen <= idle;
ack_out
<= '0'; --END CASE;
-END IF;
-END PROCESS fsm;
-END archmoore2;
--
©1997 Cypress Semiconductor, rev 2.5.3
93
note must define what
happens to ‘ack_out’
here or a latch will
be synthesized to
preserve it’s current
state
VHDL Training
Example: Solution 3
 Outputs encoded within the state bits
ARCHITECTURE archmoore3 OF moore3 IS
SIGNAL wait_gen: std_logic_vector(1 DOWNTO 0);
CONSTANT idle:
std_logic_vector(1 DOWNTO 0) :=
CONSTANT retry: std_logic_vector(1 DOWNTO 0) :=
CONSTANT ack:
std_logic_vector(1 DOWNTO 0) :=
BEGIN
fsm: PROCESS (clock, reset)
BEGIN
IF reset = '1' THEN
wait_gen <= idle;
ELSIF clock'EVENT AND clock = '1' THEN
CASE wait_gen IS
WHEN idle
=> IF req = '0' THEN wait_gen <=
ELSE wait_gen <=
END IF;
©1997 Cypress Semiconductor, rev 2.5.3
94
"00";
"01";
"10";
retry;
idle;
VHDL Training
Example: Solution 3 (contd.)
WHEN retry
=> IF pwait = '1'
THEN wait_gen <= ack;
ELSE wait_gen <= retry;
END IF;
WHEN ack
=> wait_gen <= idle;
WHEN OTHERS => wait_gen <= idle;
END CASE;
END IF;
END PROCESS fsm;
retry_out <= wait_gen(0);
ack_out
<= wait_gen(1);
END archmoore3;
©1997 Cypress Semiconductor, rev 2.5.3
95
VHDL Training
State Machines: One-hot Encoding
 One state per flip-flop
 in FPGA-type architectures
• reduces the next state logic
• requires fewer levels of logic cells
• enables high-speed state machines (> 100MHz)
 in CPLDs
• reduces the number of product terms
• can eliminate ‘expander’ product terms (i.e.
reduce delays, and increase operating speed)
• but, uses more macrocells
©1997 Cypress Semiconductor, rev 2.5.3
96
VHDL Training
Example: One-hot-one Solution
ARCHITECTURE archmoore4 OF moore4 IS
TYPE fsm_states IS (idle, retry, ack);
ATTRIBUTE state_encoding OF fsm_states:TYPE IS one_hot_one;
SIGNAL wait_gen: fsm_states;
BEGIN
fsm: PROCESS (clock, reset)
BEGIN
IF reset = '1' THEN
wait_gen <= idle;
ELSIF clock'EVENT AND clock = '1' THEN
CASE wait_gen IS
WHEN idle => IF req = '0' THEN wait_gen <= retry;
ELSE wait_gen <= idle;
END IF;
©1997 Cypress Semiconductor, rev 2.5.3
97
VHDL Training
Example: One-hot-one Solution (contd.)
WHEN retry
=> IF pwait = '1' THEN wait_gen <= ack;
ELSE wait_gen <= retry;
END IF;
WHEN ack
=> wait_gen <= idle;
WHEN OTHERS => wait_gen <= idle;
END CASE;
END IF;
END PROCESS fsm;
-- Assign state outputs
retry_out <= '1' WHEN (wait_gen = retry) ELSE '0';
ack_out
<= '1' WHEN (wait_gen = ack)
ELSE '0';
END archmoore4;
©1997 Cypress Semiconductor, rev 2.5.3
98
VHDL Training
Moore Machines: Summary
 Outputs decoded from the state bits
• flexibility during the design process
• using enumerated types allows automatic
state assignment during compilation
 Outputs encoded within the state bits
• manual state assignment using constants
• the state registers and the outputs are merged
• reduces the number of registers
• but, may require more product terms
 One-Hot encoding
• reduces next state decode logic
• high speed operation
• but, uses more registers
©1997 Cypress Semiconductor, rev 2.5.3
99
VHDL Training
Mealy Machines
 Outputs may change with a change of state OR with
a change of inputs
 Mealy outputs are non-registered because they
are functions of the present inputs
State
Registers
Inputs
Outputs
Logic
©1997 Cypress Semiconductor, rev 2.5.3
100
VHDL Training
Example: The Wait State Generator
 State diagram:
PWAIT
RESET
(async)
IDLE
REQ
0
1
REQ
PWAIT
©1997 Cypress Semiconductor, rev 2.5.3
RETRY
101
RETRY_OUT='1'
if, ENABLE='0'
VHDL Training
Example: Mealy Machine Solution
ARCHITECTURE archmealy1 OF mealy1 IS
TYPE fsm_states IS (idle, retry);
SIGNAL wait_gen: fsm_states;
BEGIN
fsm: PROCESS (clock, reset)
BEGIN
IF reset = '1' THEN
wait_gen <= idle;
ELSIF clock'EVENT AND clock = '1' THEN
CASE wait_gen IS
WHEN idle
=> IF req = '0'
THEN wait_gen <= retry;
ELSE wait_gen <= idle;
END IF;
WHEN retry => IF pwait = '1' THEN wait_gen <= idle;
ELSE wait_gen <= retry;
END IF;
WHEN OTHERS => wait_gen <= idle;
END CASE;
END IF;
END PROCESS fsm;
retry_out <= '1' WHEN (wait_gen = retry AND enable='0') ELSE '0';
END archmealy1;
©1997 Cypress Semiconductor, rev 2.5.3
102
VHDL Training
Exercise #5
 Design a state machine to implement the function
shown below:
RESET
POS
hold
POS
RESET
©1997 Cypress Semiconductor, rev 2.5.3
sample
extend
clear='0'
track='1'
track='1'
if, busy='0'
103
VHDL Training
Exercise #5: Solution
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY ex5 IS PORT (
clock, pos,
busy, reset: IN std_logic;
clear, track: OUT std_logic);
END ex5;
ARCHITECTURE archex5 OF ex5 IS
TYPE states IS (hold, sample, extend);
ATTRIBUTE state_encoding OF states:TYPE IS one_hot_one;
SIGNAL fsm: states;
BEGIN
clear <= '0' WHEN fsm = sample ELSE '1';
track <= '1' WHEN (fsm = sample) OR
(fsm = extend AND busy = '0') ELSE '0';
©1997 Cypress Semiconductor, rev 2.5.3
104
VHDL Training
Exercise #5: Solution (contd.)
sync: PROCESS (clock)
BEGIN
IF clock'EVENT AND clock = '1' THEN
IF reset = '1' THEN
fsm <= hold; -- synchronous reset
ELSE
CASE fsm IS
WHEN hold =>
IF pos = '0'
THEN fsm <= sample;
ELSE fsm <= hold;
END IF;
WHEN sample => fsm <= extend;
WHEN extend => fsm <= hold;
WHEN OTHERS => fsm <= hold;
END CASE;
END IF; -- reset = '1'
END IF; -- clk'EVENT AND clk = '1'
END PROCESS sync;
END archex5;
©1997 Cypress Semiconductor, rev 2.5.3
105
VHDL Training
Hierarchical design methodology
 Advantages:
 Allows the re-use of common building blocks
 Components (VHDL models or schematic symbols)
can be created, tested and held for later use
 Smaller components can be more easily integrated
with other blocks
 Designs are more readable
 Designs are more portable
 The design task can be split among several members
of a team
©1997 Cypress Semiconductor, rev 2.5.3
106
VHDL Training
Hierarchy decomposition
 A VHDL hierarchy is composed of
 COMPONENTs
• declarations of VHDL models which can be
instantiated (placed) within other models
 PACKAGEs
• a collection of one or more COMPONENT
(and other) declarations
©1997 Cypress Semiconductor, rev 2.5.3
107
VHDL Training
Packages and hierarchical designs
 Packages contain components, types, and/or subtypes
which can be used in other designs
 Components are entity/architecture pairs with
component declarations
 Designs that make use of components or types in
packages must include a USE clause, e.g.,
USE WORK.my_package.ALL;
 The above allows the VHDL code to instantiate
all components/types in my_package
USE WORK.my_package.cnt4;
 The above allows the VHDL code to instantiate
only the cnt4 components in my_package
©1997 Cypress Semiconductor, rev 2.5.3
108
VHDL Training
Packages: How it all fits together
mux2to1
p
q
a
c
a
i
r
b
c
t
b
sel
s
sel
•
•
schematic
entity/architecture
toplevel
mux2to1
•
•
mux2to1
a
•
•
c
b
sel
©1997 Cypress Semiconductor, rev 2.5.3
•
•
symbol
component
109
library
package
schematic
entity/architecture
VHDL Training
Package declaration: Example
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY mux2to1 IS PORT (
a, b, sel: IN std_logic;
c: OUT std_logic);
END mux2to1;
-- port list
ARCHITECTURE archmux2to1 OF mux2to1 IS
BEGIN
c <= (a AND NOT sel) OR (b AND sel);
END archmux2to1;
LIBRARY ieee;
-- note repeated LIBRARY
USE ieee.std_logic_1164.ALL; -- and USE statements
PACKAGE mymuxpkg IS
COMPONENT mux2to1 PORT (
a, b, sel: IN std_logic; -- identical port list
c: OUT std_logic);
END COMPONENT;
END mymuxpkg;
©1997 Cypress Semiconductor, rev 2.5.3
110
VHDL Training
Hierarchical design: Example
 Signals are connected via a PORT MAP that associates signals with the
component's I/O
 Port map association can be either explicit (named) or implicit (positional)
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY toplevel IS PORT (s: IN std_logic;
p, q, r: IN std_logic_vector(2 DOWNTO 0);
t: OUT std_logic_vector(2 DOWNTO 0));
END toplevel;
USE WORK.mymuxpkg.ALL;
ARCHITECTURE archtoplevel OF toplevel IS
Named Association
SIGNAL i: std_logic_vector(2 DOWNTO 0);
BEGIN
m0: mux2to1 PORT MAP (a=>i(2), b=>r(0), sel=>s, c=>t(0));
m1: mux2to1 PORT MAP (c=>t(1), b=>r(1), a=>i(1), sel=>s);
m2: mux2to1 PORT MAP (i(0), r(2), s, t(2));
i <= p AND NOT q;
Positional Association
END archtoplevel;
©1997 Cypress Semiconductor, rev 2.5.3
111
VHDL Training
Exercise #6: The Design
OE
8
DECODER
8
DATA
MUX
8
MUX
8
8
LOAD
ENABLE
4 (LSB)
UPCNT
4 (MSB)
CLOCK
DECODER
8
RESET
TEST
©1997 Cypress Semiconductor, rev 2.5.3
112
VHDL Training
Exercise #6
 Write a hierarchical VHDL description of the
previous schematic which instantiates all of the
components shown in the design
 entity/architecture given for top-level design
 package/entity/architecture given for decoder
 entity/architecture given for counter, write
package
 The target device is a CY7C371I-143JC
 Compile and synthesize your design using Warp
©1997 Cypress Semiconductor, rev 2.5.3
113
VHDL Training
Exercise #6: dcodepkg.vhd
 Analogous to mymuxpkg
 A entity/architecture for a 7-segment display decoder
is provided in the file - ’decoder.vhd’
 A package declaration is also provided in the file ‘dcodepkg.vhd’, e.g.:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
PACKAGE dcodepkg IS
COMPONENT decoder PORT(
digit: IN std_logic_vector(3 DOWNTO 0);
leds: OUT std_logic_vector(7 DOWNTO 0));
END COMPONENT;
END dcodepkg;
©1997 Cypress Semiconductor, rev 2.5.3
114
VHDL Training
Exercise #6: upcnt.vhd
 Analogous to mux2to1 and archmux2to1
 An entity/architecture pair for an 8-bit loadable
counter is provided in the file - ‘upcnt.vhd’
 In a separate file create a package declaration for the
counter based on the entity in upcnt.vhd:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY upcnt IS PORT (
clock, load, reset, enable: IN std_logic;
data: IN std_logic_vector(7 DOWNTO 0);
count: OUT std_logic_vector(7 DOWNTO 0));
END upcnt;
©1997 Cypress Semiconductor, rev 2.5.3
115
VHDL Training
Exercise #6 top level: - ex6.vhd
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY ex6 IS PORT(
clock, load, enable, test, oe, reset: IN std_logic;
data: IN std_logic_vector(7 DOWNTO 0);
seg7hi, seg7lo: OUT std_logic_vector(7 DOWNTO 0));
END ex6;
USE WORK.upcntpkg.ALL;
USE WORK.dcodepkg.ALL;
ARCHITECTURE archex6 OF ex6 IS
SIGNAL hicode, locode, count: std_logic_vector(7 DOWNTO 0);
BEGIN
c1: upcnt PORT MAP (clock, load, reset,
enable, data, count);
d1: decoder PORT MAP (count(7 DOWNTO 4), hicode);
d2: decoder PORT MAP (count(3 DOWNTO 0), locode);
seg7hi <= "ZZZZZZZZ" WHEN oe = '0' ELSE
hicode WHEN test = '0' ELSE data;
seg7lo <= (OTHERS => 'Z') WHEN oe = '0' ELSE
locode WHEN test = '0' ELSE data;
END archex6;
©1997 Cypress Semiconductor, rev 2.5.3
116
VHDL Training
Exercise #6: Instructions
 Write package for the upcounter
 Add all of the necessary files to the input list, the top-level
file (ex6.vhd) should be last
 Click-on the Device button to select the target device
 Highlight the top-level file and Click-on the Set top button
in the Compiler options
 Except for the file containing the top-level, highlight each
file in turn and Click-on Selected in the Compile box
 Finally, highlight and then compile the top-level file to
synthesize the design. Smart will compile only files that
have been updated since the last compile.
©1997 Cypress Semiconductor, rev 2.5.3
117
VHDL Training
Exercise #6: Solution upcntpkg.vhd
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
PACKAGE upcntpkg IS
COMPONENT upcnt PORT(
clock, load, reset, enable: IN std_logic;
data: IN std_logic_vector(7 DOWNTO 0);
count: OUT std_logic_vector(7 DOWNTO 0));
END COMPONENT;
END upcntpkg;
©1997 Cypress Semiconductor, rev 2.5.3
118
VHDL Training
Creating repetitive structures
 e.g., a 32-bit serial to parallel converter:
reset
si
q(31)
q(30)
q(29)
•••
q(1)
q(0)
po(1)
po(0)
clock
po(31)
©1997 Cypress Semiconductor, rev 2.5.3
po(30)
po(29)
119
VHDL Training
The GENERATE statement
 Used to specify repetitive or conditional execution of
a set of concurrent statements
 Useful for instantiating arrays of components
ENTITY sipo IS PORT (
clk, reset: IN std_logic;
si: IN std_logic;
po: BUFFER std_logic_vector(31 DOWNTO 0));
END sipo;
USE WORK.rtlpkg.ALL; -- User-defined package containing dsrff
ARCHITECTURE archsipo OF sipo IS
BEGIN
gen: FOR i IN 0 TO 30 GENERATE
nxt: dsrff PORT MAP (po(i+1), zero, reset, clk,
po(i));
END GENERATE;
beg: dsrff PORT MAP (si, zero, reset, clk, po(31));
END archsipo;
©1997 Cypress Semiconductor, rev 2.5.3
120
VHDL Training
Multiplexing I/O pins:
LIBRARY ieee ;
USE ieee.std_logic_1164.ALL;
USE WORK.std_arith.all ;
ENTITY ldcnt IS PORT (
clk, ld, oe: IN std_logic;
count:
INOUT std_logic_vector(7 DOWNTO 0));
END ldcnt;
ARCHITECTURE archldcnt OF ldcnt IS
SIGNAL int_count: std_logic_vector(7 DOWNTO 0);
BEGIN
cnt: PROCESS (clk)
BEGIN
IF clk’EVENT AND clk = '1' THEN
IF ld = '1' THEN int_count <= count; -- count as "IN"
ELSE int_count <= int_count + 1;
END IF;
END IF;
END PROCESS cnt ;
outen: PROCESS (oe, int_count) BEGIN
IF oe = '1' THEN count <= int_count ; -- count as "OUT"
ELSE count <= (OTHERS => 'Z') ;
-- count as "OUT"
END IF ;
-- equivalent to count <= "ZZZZZZZZ"
END PROCESS outen;
END archldcnt;
©1997 Cypress Semiconductor, rev 2.5.3
121
VHDL Training
Exercise #7
 Design a Moore Machine to implement the Output Enable
Controller shown below:
68040
DRAM BANK A
DRAM BANK C
Output
Enable
Controller
©1997 Cypress Semiconductor, rev 2.5.3
122
DRAM BANK B
DRAM BANK D
DRAM
Controller
VHDL Training
Exercise #7: The FSM chart
 Use the following FSM chart:
RESET
RAM
IDLE
OE=1111
/RAM
CHOOSE
OE=1111
/EOC
/A3 AND /A2
BANK A
/A3 AND A2
EOC
OE=1110
BANK B
OE=1101
A3 AND /A2
EOC
A3 AND A2
BANK C
EOC
OE=1011
OE=0111
EOC
©1997 Cypress Semiconductor, rev 2.5.3
123
BANK D
VHDL Training
Exercise #7: Solution
ENTITY ex7 IS PORT (
clk, reset: IN std_logic;
ram, eoc: IN std_logic;
a3a2 : IN std_logic_vector(1 DOWNTO 0) ;
oe : OUT std_logic_vector(3 DOWNTO 0));
END ex7;
ARCHITECTURE archex7 OF ex7 IS
TYPE oe_states IS (idle, choose, banka, bankb, bankc, bankd);
ATTRIBUTE state_encoding OF oe_states : TYPE IS gray ;
SIGNAL present_state, next_state : oe_states ;
SIGNAL oe_out : std_logic_vector(3 DOWNTO 0) ;
BEGIN
©1997 Cypress Semiconductor, rev 2.5.3
124
VHDL Training
Exercise #7: Solution (contd.)
fsm: PROCESS (clk)
BEGIN
IF clk'EVENT AND clk = '1' THEN
IF reset = '1' THEN
next_state <= idle;
ELSE
CASE present_state IS
WHEN idle => IF ram = '0' THEN next_state <= choose ;
ELSE next_state <= idle ;
END IF ;
WHEN choose =>
CASE a3a2 IS
WHEN "00" => next_state <= banka ;
WHEN "01" => next_state <= bankb ;
WHEN "10" => next_state <= bankc ;
WHEN "11" => next_state <= bankd ;
WHEN OTHERS => next_state <= banka ;
END CASE ;
WHEN banka => IF eoc = '1' THEN next_state <= bankb ;
ELSE next_state <= idle ;
END IF ;
©1997 Cypress Semiconductor, rev 2.5.3
125
VHDL Training
Exercise #7: Solution (contd.)
WHEN bankb => IF eoc = '1' THEN next_state <= bankc ;
ELSE next_state <= idle ;
END IF ;
WHEN bankc => IF eoc = '1' THEN next_state <= bankd ;
ELSE next_state <= idle ;
END IF ;
WHEN bankd => IF eoc = '1' THEN next_state <= banka ;
ELSE next_state <= idle ;
END IF ;
WHEN OTHERS => next_state <= idle;
END CASE;
END IF ;
END IF;
END PROCESS fsm;
©1997 Cypress Semiconductor, rev 2.5.3
126
VHDL Training
Exercise #7: Solution (contd).
output_logic: PROCESS (next_state)
BEGIN
CASE next_state IS
WHEN idle => oe_out <= "1111" ;
WHEN choose => oe_out <= "1111" ;
WHEN banka => oe_out <= "1110" ;
WHEN bankb => oe_out <= "1101" ;
WHEN bankc => oe_out <= "1011" ;
WHEN bankd => oe_out <= "0111" ;
WHEN OTHERS => oe_out <= "1111" ;
END CASE;
END PROCESS output_logic ;
advance_state: PROCESS (clk)
BEGIN
IF clk'EVENT AND clk = '1' THEN
present_state <= next_state ;
oe <= oe_out ;
END IF;
END PROCESS ;
END archex7;
©1997 Cypress Semiconductor, rev 2.5.3
127
VHDL Training
VHDL User-defined Attributes
 VHDL construct which is used to provide information
about VHDL objects such as entities, architectures,
types, and signals.
 user-defined attributes are used as synthesis
directives to the compiler. These include:
• state_encoding
• enum_encoding
• pin_numbers
• synthesis_off
©1997 Cypress Semiconductor, rev 2.5.3
128
VHDL Training
The state_encoding attribute
 This is used to specify the state encoding scheme of
the FSMs in a VHDL file.
 The default scheme for CPLDs is sequential.
 Other schemes such as one_hot_zero and gray
encodings are available.
TYPE state_type IS (idle,state1,state2,state3);
ATTRIBUTE state_encoding OF state_type: TYPE IS
sequential;
©1997 Cypress Semiconductor, rev 2.5.3
129
VHDL Training
The enum_encoding Attribute
 Used to specify the exact internal encoding to be use for
each value of a user-defined enumerated type.
 Overrides state_encoding in same description.
TYPE states IS (idle,state1,state2,state3);
ATTRIBUTE enum_encoding OF states: TYPE IS "11 01 00 10";
©1997 Cypress Semiconductor, rev 2.5.3
130
VHDL Training
The pin_numbers attribute
 Used to map the external signals of an entity to the
pins on the target device
 Allows the back-annotation of pin placements
after synthesis, e.g.,
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY counter IS PORT (
clock, reset: IN std_logic;
count: OUT std_logic_vector(3 DOWNTO 0)
);
ATTRIBUTE pin_numbers OF counter:ENTITY IS
"clock:13 reset:2" &
" count(3):3 count(2):4 count(1):5 count(0):6";
END counter;
©1997 Cypress Semiconductor, rev 2.5.3
131
VHDL Training
The synthesis_off attribute
 Controls the flattening and factoring of signals
 Makes the signal a factoring point
 Useful when a signal with a large number of product
terms is used in other equations
 Helpful in cases where substitution causes
unacceptable compile time (due to exponentially
increasing CPU and memory requirements)
 Achieves more efficient implementation
 Should only be used on combinatorial equations
 Registered equations are natural factoring points
©1997 Cypress Semiconductor, rev 2.5.3
132
VHDL Training
synthesis_off: CPLD Example
 An 8-bit comparator controlling a 4-bit, 2-to-1
multiplexer
c(7 DOWNTO 0)
d(7 DOWNTO 0)
8-bit
compare
a(3 DOWNTO 0)
mux
b(3 DOWNTO 0)
©1997 Cypress Semiconductor, rev 2.5.3
133
x(3 DOWNTO 0)
VHDL Training
Without synthesis_off
 An implementation (without synthesis_off)
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY mux IS PORT (
a, b: IN std_logic_vector(3 DOWNTO 0);
c, d: IN std_logic_vector(7 DOWNTO 0);
x: OUT std_logic_vector(3 DOWNTO 0));
END mux;
ARCHITECTURE archmux OF mux IS
BEGIN
x <= a WHEN (c = d) ELSE b;
END archmux;
 Resources used: 1092 product terms, 68 sum splits,
72 macrocells - the comparison is not done on a bit
by bit basis
©1997 Cypress Semiconductor, rev 2.5.3
134
VHDL Training
Comparison: with a 4-bit vector
S_2
b
+ b
S_1
=
* c_0 * /d_0 + b * /c_3 * d_3 + b * c_3 * /d_3 + b * /c_2 * d_2
* c_2 * /d_2 + b * /c_1 * d_1 + b * c_1 * /d_1 + b * /c_0 * d_0
=
a * c_3 * c_2 * c_1 * /c_0 * d_3 * d_2 * d_1 * /d_0
+ a * /c_3 * c_2 * c_1 * /c_0 * /d_3 * d_2 * d_1 * /d_0
+ a * c_3 * /c_2 * c_1 * /c_0 * d_3 * /d_2 * d_1 * /d_0
+ a * /c_3 * /c_2 * c_1 * /c_0 * /d_3 * /d_2 * d_1 * /d_0
+ a * c_3 * c_2 * /c_1 * /c_0 * d_3 * d_2 * /d_1 * /d_0
+ a * /c_3 * c_2 * /c_1 * /c_0 * /d_3 * d_2 * /d_1 * /d_0
+ a * c_3 * /c_2 * /c_1 * /c_0 * d_3 * /d_2 * /d_1 * /d_0
+ a * /c_3 * /c_2 * /c_1 * /c_0 * /d_3 * /d_2 * /d_1 * /d_0
+ a * c_3 * c_2 * c_1 * c_0 * d_3 * d_2 * d_1 * d_0
+ a * /c_3 * c_2 * c_1 * c_0 * /d_3 * d_2 * d_1 * d_0
+ a * c_3 * /c_2 * c_1 * c_0 * d_3 * /d_2 * d_1 * d_0
+ a * /c_3 * /c_2 * c_1 * c_0 * /d_3 * /d_2 * d_1 * d_0
+ a * c_3 * c_2 * /c_1 * c_0 * d_3 * d_2 * /d_1 * d_0
+ a * /c_3 * c_2 * /c_1 * c_0 * /d_3 * d_2 * /d_1 * d_0
+ a * c_3 * /c_2 * /c_1 * c_0 * d_3 * /d_2 * /d_1 * d_0
+ a * /c_3 * /c_2 * /c_1 * c_0 * /d_3 * /d_2 * /d_1 * d_0
/x0 =
/S_1.CMB * /S_2.CMB
©1997 Cypress Semiconductor, rev 2.5.3
135
VHDL Training
With synthesis_off
 A better implementation (with synthesis_off)
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY mux IS PORT (
a, b: IN std_logic_vector(3 DOWNTO 0);
c, d: IN std_logic_vector(7 DOWNTO 0);
x: OUT std_logic_vector(3 DOWNTO 0));
END mux;
ARCHITECTURE archmux OF mux
SIGNAL sel: std_logic;
ATTRIBUTE synthesis_off
BEGIN
sel <= '1' WHEN (c = d)
x <= a WHEN (sel = '1')
END archmux;
IS
OF sel:SIGNAL is TRUE;
ELSE '0';
ELSE b;
 Resources used: 24 product terms, 1 partial result, 5
macrocells
©1997 Cypress Semiconductor, rev 2.5.3
136
VHDL Training
Results with synthesis_off
DESIGN EQUATIONS
x_3 = b_3 * /sel.CMB + a_3 * sel.CMB
x_2 = /sel.CMB * b_2 + sel.CMB * a_2
x_1 = /sel.CMB * b_1 + sel.CMB * a_1
x_0 = /sel.CMB * b_0 + sel.CMB * a_0
/sel =
+
+
+
c_0
c_2
c_4
c_6
©1997 Cypress Semiconductor, rev 2.5.3
*
*
*
*
/d_0
/d_2
/d_4
/d_6
+
+
+
+
/c_0
/c_2
/c_4
/c_6
*
*
*
*
137
d_0
d_2
d_4
d_6
+
+
+
+
c_1
c_3
c_5
c_7
*
*
*
*
/d_1
/d_3
/d_5
/d_7
+
+
+
+
/c_1
/c_3
/c_5
/c_7
*
*
*
*
d_1
d_3
d_5
d_7
VHDL Training
Third Party Tool Support
 CAE Bolt-in Tools
- Viewlogic Workview Plus/Powerview/WorkView Office (Q1)
- Mentor (CY3144), Cadence (Q3)
 Synthesis Tools
- Synopsys (Q2), Exemplar
 PLD Development Tools
- Data I/O Abel 4/5/6 and Synario, MINC, CUPL, LOG/iC, OrCAD
PLD
 Simulation Tools
- LMG SmartModels
- All VHDL and Verilog Simulators (with timing)
©1997 Cypress Semiconductor, rev 2.5.3
138
Download