Digital Image Processing

advertisement
COE4DI4
Engineering Design and VHDL
Definition of Engineering Design
• The process of devising a system, component, or process to
meet desired needs
Copyright S. Shirani
2
Required product
Design specifications
Initial design
Simulation
Redesign
No
Design correct?
Yes
Prototype implementation
Make corrections
Yes
Testing
Minor errors?
Meets specifications?
No
No
Yes
Finished product
The development process
Copyright S. Shirani
3
Design Process
• Define specifications: essential features of the product are
identified.
– Specifications must be tight enough to ensure that the developed
product will meet the general expectations, but not be unnecessarily
constraining.
• Initial design: is generated from the design specifications
– This step is usually performed by a human designer.
– It requires considerable design experience and intuition.
Copyright S. Shirani
4
Design Process
• Simulation: CAD tools are used to simulate the behavior of
the initial design to determine whether the obtained design
meets the required specifications.
• If errors are found appropriate changes are made and
verification is repeated through simulation.
• Usually all except subtle problems are discovered in this way.
• When simulation indicated that the design is correct, a
prototype of the product is constructed.
Copyright S. Shirani
5
Design Process
• The prototype is thoroughly tested for conformance with the
specifications.
• Minor errors are often eliminated by making small corrections
directly on the prototype.
• In the case of large errors, it is necessary to redesign the
product.
Copyright S. Shirani
6
Design of digital hardware
Copyright S. Shirani
7
Design concept
A
Partition
B
Design one block
Design one block
C
Design interconnection between blocks
Functional simulation of complete system
Correct?
No
D
Yes
Physical mapping
Timing simulation
Correct?
No
Yes
Implementation
Figure 1.6
Design flow for logic circuits
Copyright S. Shirani
8
Implementation
Build prototype
Testing
Modify prototype
Yes
Correct?
No
Minor errors?
No
Yes
Finished
Go to A, B, C, or D
Development of a complex digital hardware
Copyright S. Shirani
9
Design of digital hardware
• A common way of dealing with complexity in digital
hardware is to partition the circuit into smaller blocks and
design each block separately.
• Having successfully designed all blocks, the interconnection
between blocks must be defined.
• The complete circuit is simulated and errors are corrected
• Errors caused by incorrect connections: connections are
redefined (path C)
• Some blocks have not been designed correctly: erroneous
blocks are redesigned (path B)
• Some functionality missing: incorrect partitioning (path A)
Copyright S. Shirani
10
Design of digital hardware
• Physical mapping: physical location of each chip on the board
and wiring pattern
– CAD tools are relied on
• Does the physical layout affect the performance of the circuit
(even though the functional behavior of complete system is
correct)?
• Physical wiring introduce resistance and capacitance. It may
have an impact on the speed of operation.
• Timing simulation is used to check the performance of the
circuit after wiring.
Copyright S. Shirani
11
Design of digital hardware
• Having completed timing simulation a prototype of the circuit
is implemented.
• The prototype is tested.
• Minor errors are corrected on the prototype.
• Large problems require a redesign.
Copyright S. Shirani
12
CAD tools
• A CAD system has tools for performing the following tasks:
–
–
–
–
–
–
–
Design entry
Initial synthesis
Functional simulation
Logic synthesis and optimization
Physical design
Timing simulation
Chip configuration
Copyright S. Shirani
13
Design conception
DESIGN ENTRY
Truth table
Schematic capture
Simple synthesis
VHDL
Translation
Merge
INITIAL SYNTHESIS TOOLS
Boolean equations
Functional simulation
No
Design correct?
Yes
Logic synthesis, physical design, timing simulation
The first stages of a CAD system
Copyright S. Shirani
14
Design conception
Design entry, initial synthesis, and functional simulation
Logic synthesis/optimization
Physical design
Timing simulation
No
Design correct?
Yes
Chip configuration
A complete CAD system
Copyright S. Shirani
15
CAD tools
• The starting point in the process of designing a digital circuit
is the conception of what the circuit is supposed to do and the
formulation of its general structure.
• This step is done manually. The rest is done by CAD tools.
Copyright S. Shirani
16
CAD tools
• Design entry: a description of the circuit being designed
should be entered into CAD system
• Different ways of doing this:
– Truth tables
– Schematic capture
– Hardware description languages
• Initial synthesis: produces a network of logic gates
Copyright S. Shirani
17
CAD tools
• Functional simulation: is used to verify the functionality of
the circuit based on input provided by the designer
• This simulation is performed before any optimization and
propagation delays are ignored.
• Goal: validate the basic operations of the circuit
Copyright S. Shirani
18
CAD tools
• Logic synthesis and optimization: produces an equivalent but
better circuit
• The measure of what makes one circuit better depends on the
needs of a design project and the technology chosen for
implementation
Copyright S. Shirani
19
CAD tools
• Physical design (layout synthesis): how to implement the
circuit in the target technology
• This step consists of placement and routing
• Placement: where in the target device each logic function in
the optimized circuit will be realized
• Routing: which wires in the chip are to be used to realize the
required interconnections
Copyright S. Shirani
20
CAD tools
• Timing simulation: determines the propagation delays that are
expected in the implemented circuit
• Timing simulation: ensures that the implemented circuit meets
the required performance
• Some of timing errors can be corrected by using the synthesis
tool
• If the logic synthesis tool cannot resolve the timing problem,
it is necessary to return to the beginning of the design flow to
consider other alternatives
• Final step: configure the target chip to implement the circuit
Copyright S. Shirani
21
Summary
• Design and development process
• Design of digital hardware
• CAD tools
Copyright S. Shirani
22
Design concept
Initial design
Simulation
Design correct?
Redesign
No
Yes
Successful design
The basic design loop
Copyright S. Shirani
23
Introduction to VHDL
• VHDL (VHSIC Hardware Description Language) is a
language used to express complex digital systems concepts
for documentation, simulation, verification and synthesis.
• VHDL is a language widely used to model and design digital
hardware.
• Design tools translate a design described in VHDL into actual
working system in various target technologies very fast and
reliable.
• VHDL is supported by numerous CAD tools and
programmable logic vendors.
• VHDL was first standardized in 1987 in IEEE 1076-1987
• An enhanced version was released in 1993
Copyright S. Shirani
24
Introduction
• VHDL has had an enormous impact on digital system design
and methodology
• VHDL promotes a hierarchical top-down design
• It takes the designer away from low level details (e.g.,
transistors and gates) to higher levels (system description)
• VHDL allows design entry in different levels:
– Exp: part of the design at behavioral level and part at the level of
netlist
• Conventional programming languages: sequential operations
• VHDL is designed to model parallel operations (concurrent
events)
Copyright S. Shirani
25
Introduction
•
1.
2.
3.
4.
5.
6.
7.
Advantages of using VHDL for design:
Shorter design time and reduced time to market
Reusability of already designed units
Fast exploration of design alternatives
Independence of the target implementation technology
Automated synthesis
Easy transportability to other design tools
Parallelization of the design process using a team work
approach
Copyright S. Shirani
26
Introduction
• VHDL consists of several parts organized as follows:
1. Actual VHDL language specified by IEEE
2. Some additional data type declarations in the standard
package called IEEE standard 1164
3. A WORK library reserved for user’s designs
4. Vendor packages with vendor libraries
5. User packages and libraries
Copyright S. Shirani
27
VHDL design
• A VHDL design consists of several design units (building
blocks)
• Each design unit can be compiled into a library for subsequent
simulation or use in other designs
• Four source design units that can be compiled are:
–
–
–
–
Entity: describes the design’s interface signals
Architecture: describes design’s behavior
Package: stores frequently used specifications such as data types
Configuration: selects a variation of a design from a library
Copyright S. Shirani
28
VHDL design
• Two built-in libraries are WORK and STD
• VHDL source design units are complied into WORK library
• The ieee library is a storage place for IEEE standard design
units
• User can create other libraries
Copyright S. Shirani
29
VHDL design (Library)
• To use a library it should be declared (made accessible to the
design):
– Exp: library ieee
• WORK library is implicitly accessible in all designs and does
not need to be declared
• Complied units in a library can be accessed via a use
statement
• Syntax:
– use library_name.package_name.item_name
– use library_name.item_name
• Exp: use ieee.std_logic_1164.all
Copyright S. Shirani
30
VHDL design (Package)
• Next level of hierarchy within a library is a package.
• Package is created to store common data types, constants and
complied designs that will be used in more than one design
(reusability)
• A package is used for:
–
–
–
–
Type and subtype declaration
Constant declaration
Function and procedure declaration
File declaration
Copyright S. Shirani
31
VHDL design (Package)
• All vendors provide a package named STANDARD in a
predefined library named STD. This package defines useful
data types
• A use clause allows access to a package in a library
• Syntax:
– use library_name.package_name.item_name
– use library_name.item_name
• Exp: use ieee.std_logic_1164.all
• No use clause is required for the package STANDARD (it is
default)
Copyright S. Shirani
32
Entity & Architecture
• A VHDL design is a paring of an entity declaration and an
architecture body.
• Entity declaration: describes the design I/O and my include
parameters used to customize an entity
• Architecture body: describes the function of a design
• Each I/O signal in an entity declaration is referred to as a port
• A port is a data object
• Like other data objects it can be assigned values and used in
expressions
Copyright S. Shirani
33
Entity & Architecture
• Each port must have a name, a direction (mode) and a data
type.
• Mode: describes the direction in which data is transferred
through a port
• Example: port (a, b : in bit_vector(3 downto 0);
equals: out bit);
• Mode can be one of 4 values: in, out, inout, or buffer
• In: data flows only into the entity. The driver of the port is
external (e.g., clock input)
• Out: data flows only from its source (inside the entity) to the
port
• Note: out does not allow feedback
Copyright S. Shirani
34
Entity & Architecture
• Buffer: for internal feedback (to use a port also as a driver
within the architecture)
• Buffer is used for ports that must be readable inside the entity,
such as the counter outputs (the present state of a counter
must be used to determine its next stage
• Inout: allows data to flow into or out of the entity. It also
allows for internal feedback
• Mode inout can replace any of the other modes
Copyright S. Shirani
35
Entity & Architecture
• In addition to specifying modes for ports, you must declare
data types for ports
• The most important data types in VHDL are Boolean, bit,
bit_vector, and integer
• The most useful types provided by the IEEE std_logic_1164
package is std_logic and array of this type.
• For simulation and synthesis software to process these types,
their declaration must be made visible to the entity by way of
library and use clauses
Copyright S. Shirani
36
entity eqcomp4 is
port (a, b : in bit_vector(3 downto 0);
equals: out bit);
end eqcomp4;
architecture dataflow of eqcomp4 is
begin
equals <=‘1’ when (a=b) else ‘0’;
end dataflow;
Copyright S. Shirani
37
VHDL design (Entity)
• Design entity defines a new component name, its input/output
connections and describes parameterized values.
• Entity represents the I/O interface (external connections) of a
component.
ANDGATE
A
C
B
entity andgate is
port (a,b : in bit;
c: out bit);
end andgate
Copyright S. Shirani
38
VHDL design (Entity)
• Syntax for an entity declaration:
entity entity_name is
[generic (list-of-generics-and-their-types);]
[port (list-of-interface-port-names-and-their-types);]
[begin entity-statements]
end [entity] entity-name;
• Generic list: allows additional information to pass into an
entity
• Useful for parameterization of the design
Copyright S. Shirani
39
VHDL design (Architecture)
•
•
•
•
An architecture specifies the behavior, interconnections and
components of an entity.
Architecture defines the function of an entity
It specifies the relationship between inputs and outputs.
VHDL architectures are categorized in style as:
1. Behavior
2. Dataflow
3. Structural
•
A design can use any or all of these styles.
Copyright S. Shirani
40
VHDL design (Architecture)
• Behavior: the behavior of the entity is expressed using
sequentially executed procedural code (very similar to
programming languages like C)
• Sometimes called high-level description
• Rather than specifying the structure of a circuit, you specify a
set of statements that when executed in sequence model the
behavior of the entity.
• Uses process statement and sequential statements (the
ordering of statements inside process is important)
Copyright S. Shirani
41
VHDL design (Architecture)
• Dataflow: specifies the functionality of the entity (the flow of
information) without explicitly specifying its structure
• It specifies how data will be transferred from signal to signal
and input to output without the use of sequential statements.
• No use of process or sequential statements
• Structural: an entity is modeled as a set of components
connected by signals
• Components are instantiated and connected together
Copyright S. Shirani
42
-- a four bit equality comparator
library ieee;
use iee.std_logic_1164.all;
entity eqcomp4 is
port (a, b : in std_logic_vector(3 downto 0);
equals: out std_logic);
end eqcomp4;
architecture behav of eqcomp4 is
begin
comp: process (a, b);
begin
if a=b then
equals <= ‘1’;
else
equals<=‘0’;
end if;
end process comp;
end behav;
Copyright S. Shirani
43
library ieee;
use iee.std_logic_1164.all;
entity eqcomp4 is
port (a, b : in std_logic_vector(3 downto 0);
equals: out std_logic);
end eqcomp4;
architecture dataflow of eqcomp4 is
begin
equals <=‘1’ when (a=b) else ‘0’;
end dataflow;
Copyright S. Shirani
44
library ieee;
use iee.std_logic_1164.all;
entity eqcomp4 is
port (a, b : in std_logic_vector(3 downto 0);
equals: out std_logic);
end eqcomp4;
architecture bool of eqcomp4 is
begin
equals <=
not(a(0) xor b(0))
and not(a(1) xor b(1))
and not(a(2) xor b(2))
and not(a(3) xor b(3)) ;
end bool;
Copyright S. Shirani
45
library ieee;
use iee.std_logic_1164.all;
library altera;
use altera.quartus.all;
entity eqcomp4 is port (a, b : in std_logic_vector(3 downto 0);
equals: out std_logic);
end eqcomp4;
architecture struct of eqcomp4 is
signal x: std_logic_vector(0 to 3);
begin
u0: xnor port map (a(0),b(0),x(0));
u1: xnor port map (a(1),b(1),x(1));
u2: xnor port map (a(2),b(2),x(2));
u3: xnor port map (a(3),b(3),x(3));
u4: and4 port map(x(0), x(10, x(2), x(3), equals);
end struct;
Copyright S. Shirani
46
VHDL
• VHDL does not assume any precedence of operation and
therefore parentheses are necessary in VHDL expressions.
• <= is the signal assignment operator in VHDL
Copyright S. Shirani
47
x1
x3
f
x2
g
x4
Logic circuit for four-input function
Copyright S. Shirani
48
Whenever there is an event on x1, x2, x3, the
expression on the right side is evaluated and the value
appears on f and/or g.
Figure 2.30
VHDL code for a four-input functionCopyright S. Shirani
49
Example
• The signal assignments in the previous example are
concurrent statements.
• Concurrent statements are order independent.
Copyright S. Shirani
50
VHDL
• A very useful data type defined in VHDL: STD_LOGIC
• STD_LOGIC can have a number of legal values: 0, 1, z, • To use STD_LOGIC type the VHDL code must have these
two lines:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
• The first line declares that the code will use ieee library
Copyright S. Shirani
51
xi yi
ci
ci
xi
yi
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
c
i
+
1
00
0
1
1
0
1
0
0
1
11
10
1
0
si
1
0
0
0
1
0
1
1
1
01
1
1
1
si =
x i  y i  c i
xi yi
ci
00
01
1
1
ci
+ 1
10
1
0
(a) Truth table
11
=
1
1
xi yi + xici + yici
(b) Karnaugh maps
xi
yi
si
ci
ci
+ 1
(c) Circuit
Figure5.4
Full-adder
Copyright S. Shirani
52
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY fulladd IS
PORT ( Cin, x, y : IN
s, Cout : OUT
END fulladd ;
STD_LOGIC ;
STD_LOGIC ) ;
ARCHITECTURE LogicFunc OF fulladd IS
BEGIN
s <= x XOR y XOR Cin ;
Cout <= (x AND y) OR (Cin AND x) OR (Cin AND y) ;
END LogicFunc ;
Figure 5.23
VHDL code for the full-adder
Copyright S. Shirani
53
VHDL
• Now if we want to create a 4-bit adder we can use the 1-bit
adder already designed as a sub-circuit.
• This is an important feature of VHDL which makes the reuse
of entities possible.
• components: design entities used in other designs
• Before an entity can be used in another design it has to be
declared
• A component declaration defines an interface for instantiating
a component.
Copyright S. Shirani
54
VHDL
•
A component declaration may be
1. in a package: the package is made accessible by use statement
2. might be declared in an architecture declarative region using
component statement
•
•
Every time a component is used it has to be instantiated
Every instantiation has a name.
Copyright S. Shirani
55
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY adder4 IS
PORT ( Cin
x3, x2, x1, x0
y3, y2, y1, y0
s3, s2, s1, s0
Cout
END adder4 ;
: IN
: IN
: IN
: OUT
: OUT
STD_LOGIC ;
STD_LOGIC ;
STD_LOGIC ;
STD_LOGIC ;
STD_LOGIC ) ;
ARCHITECTURE Structure OF adder4 IS
SIGNAL c1, c2, c3 : STD_LOGIC ;
COMPONENT fulladd
PORT ( Cin, x, y : IN
STD_LOGIC ;
s, Cout
: OUT
STD_LOGIC ) ;
END COMPONENT ;
BEGIN
stage0: fulladd PORT MAP ( Cin, x0, y0, s0, c1 ) ;
stage1: fulladd PORT MAP ( c1, x1, y1, s1, c2 ) ;
stage2: fulladd PORT MAP ( c2, x2, y2, s2, c3 ) ;
stage3: fulladd PORT MAP (
Cin => c3, Cout => Cout, x => x3, y => y3, s => s3 ) ;
END Structure ;
Figure 5.24
VHDL code for a four-bit adder
Copyright S. Shirani
56
Data objects
• Data objects: hold values of specific types
• Data objects belong to one of four classes: constant, signals,
variables, or files
• Constant: holds a value that cannot be changed within the
design
• Exp: width of a register
– constant width: integer :=8;
• := indicates immediate assignment
• Constant can be declared in package, entity, architecture, or
process
– Defined in a package: can be referenced by any entity or architecture
for which the package is used
Copyright S. Shirani
57
Data objects
– Defined in an entity declaration is visible only within the entity
– Defined in an architecture is visible only to the architecture
– Defined in a process declarative region is visible only to that process
• Signals: represent wires, and therefore interconnect
components
• Ports are signals
– signal count: bit_vector(3 downto 0);
Copyright S. Shirani
58
Data objects
• Variables: used only in processes, functions and procedures
• Unlike signals variables do not represent wires
• They are usually used for computational purposes in high
level modeling (e.g., index, temporary storage of data)
• Usually we avoid using them
• Files: contain values of a specific type
Copyright S. Shirani
59
Variables
• Operator for variable assignment is :=
• Signal assignment generally results in a latch
• Variable assignment generally is synthesized to a node (a
wire)
• In short, signal assignment has a delay and variable
assignment has no delay
Copyright S. Shirani
60
Common mistake
process(i0,i1,a)
begin
muxval <=0;
if (a =‘1’) then
muxval <=muxval +1;
end if;
case muxval is
when 0 =>
q<=i0;
when 1
q<=i1;
when others =>
null;
end case
end process
process(i0,i1,a)
variable muxval :integer;
begin
muxval :=0;
if (a =‘1’) then
muxval :=muxval +1;
end if;
case muxval is
when 0 =>
q<=i0;
when 1
q<=i1;
when others =>
null;
end case
end process
Copyright S. Shirani
61
Data types
• VHDL is a strongly typed language: data objects of different
types cannot be assigned to one another without use of typeconversion
• Besides predefined types (e.g., BIT, STD_LOGIC) user can
define their own types in VHDL.
• The command for this purpose is type
• Example:
type DIGIT is (‘0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’);
• A subtype is a type with a constraint
• Example:
subtype MIDDLE is DIGIT range ’3’ to ’7’;
Copyright S. Shirani
62
Data types
• Arrays of predefined or user defined types can be introduced.
• Example:
– type ADDRESS_WORD is array (0 to 63) of BIT
– type DATA_WORD is array (7 downto 0) of STD_LOGIC
• In the first example ADDRESS_WORD(0) is the most
significant bit and in the second one DATA_WORD(7) is the
most significant bit.
• There is a predefined array type in ieee library:
STD_LOGIC_VECTOR
• It can be used for presentation of multibit signals.
Copyright S. Shirani
63
Data types
• An array object can be assigned to another array object of the
same type.
• Assignment can be made to an entire array, or to an element
or to a slice.
• Example:
SIGNAL X: STD_LOGIC_VECTOR(3 to 0)
X <=“1100”
X(3) <=‘0’
X(2 to 0) <=“101”
Copyright S. Shirani
64
Data types
• Now that we have multibit signals we are able to represents
numbers.
• Are we able to perform arithmetic operations on the numbers
in VHDL?
• Another package named std_logic_arith defines types for this
• Two predefined types in this package: SIGNED and
UNSINGED
• SIGNED and UNSIGNED are the same as
STD_LOGIC_VECTOR
• SIGNED represents signed integer data in two’s complement
form
• UNSIGNED represents unsigned integer data in the form of
an array of std_logic
Copyright S. Shirani
65
Arithmetic operations
std_logic_signed
STD_LOGIC_VECTOR
std_logic_arith
SIGNED
UNSINGED
std_logic_unsigned
STD_LOGIC_VECTOR
Copyright S. Shirani
66
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
USE ieee.std_logic_arith.all ;
ENTITY adder16 IS
PORT ( Cin
X, Y
S
Cout, Overflow
END adder16 ;
: IN
: IN
: OUT
: OUT
STD_LOGIC ;
SIGNED(15 DOWNTO 0) ;
SIGNED(15 DOWNTO 0) ;
STD_LOGIC ) ;
ARCHITECTURE Behavior OF adder16 IS
SIGNAL Sum : SIGNED(16 DOWNTO 0) ;
BEGIN
Sum <= ('0' & X) + Y + Cin ;
S <= Sum(15 DOWNTO 0) ;
Cout <= Sum(16) ;
Overflow <= Sum(16) XOR X(15) XOR Y(15) XOR Sum(15) ;
END Behavior ;
Figure 5.30
Use of the arithmetic package
Copyright S. Shirani
67
4-bit up-down counter
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counter is port (clk, clr, load, up, down: in std_logic; data: in std_logic_vector(3
downto 0); count: out std_logic_vector(3 downto 0));
end counter;
architecture count4 of counter is
signal cnt: std_logic_vector(3 downto 0);
begin
process (clr, clk)
begin
if clr=‘1’ then cnt<=‘0000’;
elsif clk’event and clk=‘1’ then
if load=‘1’ then cnt<=data
elsif up=‘1’ then
Copyright S. Shirani
68
4-bit up-down counter
cnt<=cnt+1;
elsif down=‘1’ then
cnt<=cnt-1;
else
cnt<=cnt;
end if;
end if;
count<=cnt;
end process;
end count4;
Copyright S. Shirani
69
Selective signal assignment
• Selected signal assignment is used to assign one of multiple
values to a signal, based on some criteria.
• The WITH-SELECT-WHEN structure can be used for this
purpose.
• Syntax: with selection_signal select
signal_name <= value_a when value1_of_selection_signal,
value_b when value2_of_selection_signal,
value_c when value3_of_selection_signal;
• All values of selection_signal must be listed in the when
clause
• We can use the word OTHERS to cover some of the values
Copyright S. Shirani
70
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY mux2to1 IS
PORT ( w0, w1, s
f
END mux2to1 ;
: IN
: OUT
STD_LOGIC ;
STD_LOGIC ) ;
ARCHITECTURE Behavior OF mux2to1 IS
BEGIN
WITH s SELECT
f <= w0 WHEN '0',
w1 WHEN OTHERS ;
END Behavior ;
Figure 6.27
VHDL code for a 2-to-1 multiplexer Copyright S. Shirani
71
Conditional signal assignment
• Conditional signal assignment is used to assign one of
multiple values to a signal, based on some criteria.
• The WHEN ELSE structure can be used for this purpose.
• Syntax:
signal_name <= value_a when condition1 else
value_b when condition2 else
value_c when condition3 else
value_d;
Copyright S. Shirani
72
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
USE ieee.std_logic_unsigned.all ;
ENTITY compare IS
PORT ( A, B
: IN
AeqB, AgtB, AltB : OUT
END compare ;
STD_LOGIC_VECTOR(3 DOWNTO 0) ;
STD_LOGIC ) ;
ARCHITECTURE Behavior OF compare IS
BEGIN
AeqB <= '1' WHEN A = B ELSE '0' ;
AgtB <= '1' WHEN A > B ELSE '0' ;
AltB <= '1' WHEN A < B ELSE '0' ;
END Behavior ;
Figure 6.34
VHDL code for a four-bit comparatorCopyright S. Shirani
73
Concurrent statements
• Assignment statements, selected assignment statements and
conditional assignment statements are called concurrent
statements because the order in which they appear in VHDL
code does not affect the meaning of the code
• Concurrent statements are executed in parallel.
• Each concurrent statement is a different hardware element
operating in parallel.
Copyright S. Shirani
74
VHDL
•
Syntax of architecture body
architecture architecture_name of entity_name is
[architecture_item_declaration]
begin
concurrent_statements
process_statement
block_statement
concurrent_procedure_call_statement
component_instantiation_statement
generate_statement
end
Copyright S. Shirani
75
Sequential statements
• Sequential statements: ordering of statements may affect the
meaning of the code
• Sequential statements should be placed inside process
statement.
Copyright S. Shirani
76
Process
[process_label:] process [(sensitivity_list)] [is]
[process_item_declaration]
begin
sequential_statements; these are
variable_assignment
signal_assignment
wait_statement
if_statement
case_statement
loop_statement
null_statement
exit_statement
next_statement
report_statement
return_statement
end process [process_label]
Copyright S. Shirani
77
Process
• Sensitivity list: signals to which the process is sensitive
• Each time an event occurs on any of the signals in sensitivity
list, the sequential statements within the process are executed
in the order they appear
Copyright S. Shirani
78
If statement
• An if statement selects a sequence of statements for execution
based on the value of a condition
• Syntax:
If condition1 then
sequential_statements
[elsif condition2 then
sequential_statements]
[else
sequential_statements]
end if
Copyright S. Shirani
79
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY mux2to1 IS
PORT ( w0, w1, s
f
END mux2to1 ;
: IN
: OUT
STD_LOGIC ;
STD_LOGIC ) ;
ARCHITECTURE Behavior OF mux2to1 IS
BEGIN
PROCESS ( w0, w1, s )
BEGIN
IF s = '0' THEN
f <= w0 ;
ELSE
f <= w1 ;
END IF ;
END PROCESS ;
END Behavior ;
A 2-to-1 multiplexer specified using an if-then-else statement
Copyright S. Shirani
80
Case
• Syntax:
case selection_signal is
when value1_selection_signal => sequential_statements
when value2_selection_signal => sequential_statements
..
[when others => sequential_statements]
end case
Copyright S. Shirani
81
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY seg7 IS
PORT ( bcd
: IN
STD_LOGIC_VECTOR(3 DOWNTO 0) ;
leds : OUT
STD_LOGIC_VECTOR(1 TO 7) ) ;
END seg7 ;
ARCHITECTURE Behavior OF seg7 IS
BEGIN
PROCESS ( bcd )
BEGIN
CASE bcd IS
-abcdefg
WHEN "0000"
=> leds <= "1111110" ;
f
WHEN "0001"
=> leds <= "0110000" ;
WHEN "0010"
=> leds <= "1101101" ;
e
WHEN "0011"
=> leds <= "1111001" ;
WHEN "0100"
=> leds <= "0110011" ;
WHEN "0101"
=> leds <= "1011011" ;
WHEN "0110"
=> leds <= "1011111" ;
WHEN "0111"
=> leds <= "1110000" ;
WHEN "1000"
=> leds <= "1111111" ;
WHEN "1001"
=> leds <= "1110011" ;
WHEN OTHERS => leds <= "-------" ;
END CASE ;
END PROCESS ;
END Behavior ;
Figure 6.47
A BCD-to-7-segment decoder
a
b
g
c
d
Copyright S. Shirani
82
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
-- Input Signals and Mux Control
ENTITY multiplexer IS
: IN
PORT( A, B, Mux_Control
STD_LOGIC;
Mux_Control
Mux_Out1, Mux_Out2,
Mux_Out3, Mux_Out4 : OUT STD_LOGIC );
A
0
END multiplexer;
B
ARCHITECTURE behavior OF multiplexer IS
BEGIN
1
Mux_Outx
-- selected signal assignment statement…
Mux_Out1 <= A WHEN Mux_Control = '0' ELSE B;
-- … with Select Statement
WITH mux_control SELECT
Mux_Out2 <=
A WHEN '0',
B WHEN '1',
A WHEN OTHERS;
PROCESS ( A, B, Mux_Contro l)
BEGIN
IF Mux_Control = '0' THEN
Mux_Out3 <= A;
ELSE
Mux_out3 <= B;
END IF;
-- OTHERS case required since STD_LOGIC
-has values other than "0" or "1"
-- Statements inside a process
-execute sequentially.
CASE Mux_Control IS
WHEN '0' =>
Mux_Out4 <= A;
WHEN '1' =>
Mux_Out4 <= B;
WHEN OTHERS =>
Mux_Out4 <= A;
END CASE;
END PROCESS;
END behavior;
Copyright S. Shirani
83
Combinational logic implementation
• Combinational logic circuits can be modeled in different
ways:
– Using signal assignment statements (which include expressions with
logic, arithmetic and relational operators)
– Using if and case statements
Copyright S. Shirani
84
Logic operators
• Standard VHDL logical operators are defined for types bit,
std_logic, Boolean and their arrays.
Library ieee;
Use ieee.std_logic_1164.all;
Entity logic_operators_1 is
Port(a, b, c, d, : in std_logic; y: out std_logic);
End logic_operators_1;
Architecture arch1 of logic_operators_1 is
Signal e:bit;
Begin
y <=(a and b) or e;
e <= c or d;
End arch1;
Copyright S. Shirani
85
Conditional Logic
• Concurrent statements for creating conditional logic:
– Conditional signal assignment
– Selected signal assignment
• Sequential statements for creating conditional logic:
– If statement
– Case statement
Copyright S. Shirani
86
Conditional Logic
Library ieee;
Use ieee.std_logic_1164.all;
Entity condit_stmt is Port(
sel, b, c: in boolean;
y: out boolean);
End condit_stmt;
Architecture concurrent of condit_stmt is
Begin
y <=b when sel else c;
End concurrent;
Copyright S. Shirani
87
Conditional Logic
• The same function implemented using sequential statements
Library ieee;
Use ieee.std_logic_1164.all;
Entity condit_stmt is Port(
sel, b, c: in boolean;
y: out boolean);
End condit_stmt;
Architecture sequential of condit_stmt is
begin
Process(s,b,c)
begin
if sel then
y <=b;
else
y <=c;
end if;
end process;
end sequential;
Copyright S. Shirani
88
Three-state (tri-state) logic
•
•
•
•
When data from multiple possible sources need to be
directed to one or more destinations we usually use either
multiplexers or three-state buffers.
Output buffers are placed in a high impedance state so they
do not drive a shared bus at the wrong time
Bidirectional pins are placed in high impedance state so they
are not driven by off-chip signals at the wrong time
VHDL provides two methods to describe three-state buffers:
1. Using the ‘Z’ (high impedance) which applies to the type std_logic
2. Using an assignment of null to turn off a driver. This applies to any
type.
Copyright S. Shirani
89
Three-state (tri-state) logic
Library ieee;
Use ieee.std_logic_1164.all;
Entity tbuf4 is Port(
enable: in std_logic;
a: in std_logic_vector(0 to 3);
y: out std_logic_vector(0 to 3));
End tbuf4;
Architecture arch1 of tbuf4 is
Begin
Process(enable, a)
begin
if enable=‘1’ then
y<=a;
else
y<=‘Z’;
end if;
end process
End arch1;
Copyright S. Shirani
90
Three-state (tri-state) logic
The same function implemented using concurrent
statements
Library ieee;
Use ieee.std_logic_1164.all;
Entity tbuf4 is Port(
enable: in std_logic;
a: in std_logic_vector(0 to 3);
y: out std_logic_vector(0 to 3));
End tbuf4;
Architecture arch2 of tbuf4 is
Begin
y <=a when enable=‘1’ else ‘Z’;
End arch2;
Copyright S. Shirani
91
•
Three-state (tri-state) logic
Another way to model three-state buffers is to use the assignment of null to a
signal to turn off its derives.
Library ieee;
Use ieee.std_logic_1164.all;
Package pack_bus is
subtype bus8 is integer range 0 to 255;
End pack_bus;
Use work.pack_bus.all;
Entity tbuf8 is Port(
enable: in std_logic; a: in bus8;
y: out bus8);
End tbuf8;
Architecture arch1 of tbuf4 is
Begin
process(enable, a)
begin
if enable=‘1’ then
y <=a ;
else
y<= null;
end if;
end process
End arch1;
Copyright S. Shirani
92
Relational Operators
• Relational operators are = ,/= , >=, <=, >, <.
• The resulting type for all these operators is Boolean
• Equal and not equal are cheaper to implement (in terms of
gates) than the ordering operators.
Copyright S. Shirani
93
Relational Operators
Library ieee;
Use ieee.std_logic_1164.all;
Entity relat_operators is Port(
a, b : in integer range 0 to 15 ;
y: out boolean);
End relat_operators;
Architecture arch2 of relat_operators is
Begin
y <= a >= b;
End arch2;
Copyright S. Shirani
94
Relational Operators
• Relational operators might be used in connection with conditional signal
assignment
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_ungined.all;
Entity compare is Port(
a : in unsgined(3 downto 0);
x: out std_logic);
End compare;
Architecture compare of compare is
Begin
x <= ‘1’ when a=3 else ‘0’;
End compare;
Copyright S. Shirani
95
Arithmetic Operators
•
•
•
•
•
•
Adding operators (+,-) are fairly expensive (in terms of number of gates)
Multiplying operators (*,/,mod, rem) are very expensive.
They are not supported on many VHDL synthesis tools.
In Quartus II, only multiply and divide by integers are supported
Mod and Rem are not supported
Implementation is highly dependent to the target technology
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_unsigned.all;
Entity arith_operators is
Port(a, b, c, d : in unsigned (7 downto 0); y: out unsigned (9 downto 0));
End arith_operators;
Architecture arch2 of relat_operators is
Begin
y <= a+b+c+d;
End arch2;
Copyright S. Shirani
96
Wait
• When a process has a sensitivity list it is always suspended
after executing the last statement in the process
• Wait is an alternative way of suspending a process
• Syntax:
wait on sensitivity_list
wait until boolean_expression;
wait for time_expression;
Copyright S. Shirani
97
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY flipflop IS
PORT ( D, Clock : IN
STD_LOGIC ;
Q
: OUT STD_LOGIC) ;
END flipflop ;
ARCHITECTURE Behavior OF flipflop IS
BEGIN
PROCESS ( Clock )
BEGIN
IF Clock'EVENT AND Clock = '1' THEN
Q <= D ;
END IF ;
END PROCESS ;
END Behavior ;
Figure 7.38
Code for a D flip-flop
Copyright S. Shirani
98
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY flipflop IS
PORT ( D, Clock : IN
Q
: OUT
END flipflop ;
STD_LOGIC ;
STD_LOGIC ) ;
ARCHITECTURE Behavior OF flipflop IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL Clock'EVENT AND Clock = '1' ;
Q <= D ;
END PROCESS ;
END Behavior ;
Figure 7.39
Code for a D flip-flop using WAIT UNTIL
Copyright S. Shirani
99
Sequential Logic Synthesis
•
•
•
•
Sequential logic elements: latch, flip-flop, register, counter
Behavior of sequential logic elements can be described using a process
statement
The sequential nature of process statements make them idea for the
description of circuits that have memory and must save their state over
time
The design of sequential logic uses one or more of the following rules:
1. A process that does not include all entity inputs in the sensitivity list
(otherwise the combinational circuit will be inferred)
2. Use incompletely specified if-then-elsif logic to imply that one or more
signals must hold their values under certain conditions
3. Use one or more variables in such a way that they must hold a value between
iterations of the process
Copyright S. Shirani
100
Basic Sequential Logic
•
Two most basic types of synchronous elements:
1. D-type latch
2. D-type flip-flop
•
•
•
D-type latch: a level sensitive memory element that passes
the input (D) to output (Q) when enabled (ENA=1) and hold
the value of the output when disabled (ENA=0)
D-type flip-flop: an edge-triggered memory element that
transfers the input (D) to output (Q) when an active edge
transition occurs on its clock. The output value is held until
the next active clock edge
Active clock edge: transition of clock from 0 to 1
Copyright S. Shirani
101
Basic Sequential Logic
• Conditional specification is the most common method in
describing behavior of basic memory elements
• This relies on an if statement and assigning a value in only
one condition
• Example: a D latch
process(enable)
begin
if enable=‘1’ then
q <=d;
end if;
end process
• If we had assigned values in both conditions the behavior
would be a multiplexer
Copyright S. Shirani
102
Basic Sequential Logic
• Exp: Edge triggered flip-flop
process(clk)
begin
if (clk and clk’event) then
q <=d;
end if;
End process
• The second method is to use a wait statement
wait until clk and clk’event
q <=d;
Copyright S. Shirani
103
Basic Sequential Logic
• Latches can have additional inputs such as preset and clear.
• Preset and clear inputs to the latch are always asynchronous.
• Exp: a latch with active high preset and clear
Library ieee;
Use ieee.std_logic_1164.all;
Entity latch is
Port(enable, clear, preset, d : in std_logic; q:out std_logic);
End latch;
Architecture arch2 of latch is
Begin
process(enable, preset, clear)
begin
if (clear = ‘1’) then
q <=‘0’;
elsif (preset=‘1’)
q <=‘1’;
elsif (enable=‘1’)
q <=d;
end if;
End process;
End arch2;
Copyright S. Shirani
104
Basic Sequential Logic
• Registers can be implemented using if statement or wait statement
• They can have any combination of clear, preset and enable
• Exp: register with edge-triggered clock and asynchronous load
Library ieee;
Use ieee.std_logic_1164.all;
Entity reg is
Port(load, clk, d, data : in std_logic; q:out std_logic);
End reg;
Architecture arch1 of reg is
Begin
process(load, clk)
begin
if (load = ‘1’) then
q <=data;
elsif clk’event and clk=‘1‘
q <=d;
end if;
end process
End arch1;
Copyright S. Shirani
105
Basic Sequential Logic
•
•
Counters can be implemented with if and wait statements
Exp: an 4-bit, synchronous load, up-down counter
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counter is port (clk, clr, load, up, down: in std_logic; data: in std_logic_vector(3 downto 0); count: out
std_logic_vector(3 downto 0));
end counter;
architecture count4 of counter is
signal cnt: std_logic_vector(3 downto 0);
begin
process (clr, clk)
begin
if clr=‘1’ then cnt<=‘0000’;
elsif clk’event and clk=‘1’ then
if load=‘1’ then cnt<=data
elsif up=‘1’ then
Copyright S. Shirani
106
4-bit up-down counter
if cnt=‘1111’ then cnt <=‘0000’;
else cnt<=cnt+1;
endif
elsif down=‘1’ then
if cnt=‘0000’then cnt<=‘1111’;
else cnt<=cnt-1;
end if
else
cnt<=cnt;
end if;
end if;
count<=cnt;
end process;
end count4;
Copyright S. Shirani
107
Finite-State Machine
• Finite State Machines (FSMs) represent an important part of
design of almost any complex digital system.
• FSMs are used to sequence specific operations, control other
logic circuits, and provide synchronization of different parts
of more complex circuits.
• FSM is a circuit that is designed to sequence through specific
patterns of states in a predetermined manner.
• Sequence of states through which an FSM passes depends on
the current state of the FSM and the input
• A state is represented by the binary value held on the current
state register
• FSM is clocked from a free running clock source
Copyright S. Shirani
108
Finite-State Machine
• FSM contains three main parts:
1. Current state register: holds the current state of FSM (the
current state should be represented in binary form)
2. Next state logic: a combinational logic used to generate the
transition to the next state from the current state
– The next state is a function of current state and inputs to FSM
– A feedback mechanism is necessary in FSM
3. Output logic: a combinational circuit used to generate output
signals from the FSM.
•
Outputs are a function of the current state and possibly FSM’s input
Copyright S. Shirani
109
Finite-State Machine
Next State Logic
(combinational)
Current State
Register
Output Logic
(combinational)
output
input
clk
Copyright S. Shirani
110
Finite-State Machine
• If the output is a function of only the current state: Moore
FSM
• If the output depends on the input and state: Mealy FSM
• Behavior of an FSM is usually described either in the form of
a state transition table or a state transition diagram.
Copyright S. Shirani
111
Finite-State Machine
• To describe a FSM, an enumeration type for states, and a
process statement for the state register and the next-state logic
can be used.
• Example:
Input=0
s0
reset
s1
Input=1
Copyright S. Shirani
112
Finite-State Machine
Library ieee;
Use ieee.std_logic_1164.all;
Entity sm is
Port(clk, reset, input : in std_logic; output: out std_logic);
End sm;
Architecture arch of state_machine is
Type state_type is (s0, s1);
Signal state: state_type;
Begin
Process(clk, reset)
Begin
If reset=‘1’ then state <=s0;
Elsif (clk’event and clk=‘1’) then
Case state is
When s0 =>
state <= s1;
When s1 =>
If input=‘0’ then state <=s1;
Else state <=s0;
End if;
End case;
End if;
End process;
Output <=‘1’ when state=s1 else ‘0’;
End arch;
Copyright S. Shirani
113
Finite-State Machine
• An important issue when designing FSMs is state encoding:
assignment of binary numbers to states.
• For small designs or those in which there are not too tight
constraints in terms of resources, the common way is to let the
synthesis tool encode the state automatically.
• For bigger designs a kind of manual intervention is necessary
• Sequential state encoding: increasing binary numbers are
assigned to the states
– Exp: s0=“00”, s1=“01”, s2=“10”,
• Gray code or Johnson state encoding are other options.
• One-hot encoding: each state is assigned its own flip-flop, in
each state only one flip-flop can have value ‘1’.
Copyright S. Shirani
114
Finite-State Machine
• One-hot encoding is not optimal in terms of number of flipflops, but used very often by FPLD synthesis tools.
• Reasons:
– FPLDs have a high number of flip-flops available,
– A large number of flip-flops used for state representation leads to a
simpler next state logic.
Copyright S. Shirani
115
Moore Machines
• Moore state machine: outputs are a function of current state
only
Next State Logic
(combinational)
Current State
Register
b
a
c
Output Logic
(combinational)
d
clk
Copyright S. Shirani
116
Moore Machines (pseudo code)
Entity system is
Port (clk: std_logic; a: some_type; d: out some_type);
End system
Architecture moore1 of system is
Signal b,c: some_type;
begin
Next_state: process (a,c)
begin
b <=next_state_logic(a,c);
end process next_state;
State_reg: process(clk)
begin
if (clk’event and clk=‘1’) then
c<=b;
end process state_reg;
System_output: process(c)
begin
d<=output_logic(c)
end process system_output
end moore1
Copyright S. Shirani
117
Mealy Machines
• Mealy state machine: outputs are a function of current state
and system inputs both
Next State Logic
(combinational)
Current State
Register
b
a
c
Output Logic
(combinational)
d
clk
Copyright S. Shirani
118
Mealy Machines (pseudo code)
Entity system is
Port (clk: std_logic; a: some_type; d: out some_type);
End system
Architecture mealy1 of system is
Signal b,c: some_type;
begin
next_state: process (a,c)
begin
b <=next_state_logic(a,c);
end process next_state;
system_output: process(a,c)
begin
d<=output_logic(a,c)
end process system_output
state_reg: process (clk)
begin
if (clk’event and clk=‘1’) then
c<=b;
end process state_reg;
end mealy1
Copyright S. Shirani
119
Integer types
• Integer type: a type whose set of values fall within a specified
integer range
• Exp:
– Type index is integer range 0 to 15
– Type word_length is range 31 downto 0;
• Values belonging to an integer type are called integer literals
• The underscore character can be used freely in writing integer
literals and has no impact on the value of a literal
• Exp: 98_71_28 is the same as 987128
Copyright S. Shirani
120
Type conversion
• to_stdlogicvector(bit_vector): converts a bit vector to a
standard logic vector
• example: to_stdlogicvector(X”FFFF”)
• conv_std_logic_vector(integer, bits): converts an integer to a
standard logic vector
• example: conv_std_logic_vector(7,4) generates “0111”
• conv_integer(std_logic_vector): converts a standard logic
vector to an integer
• example: conv_integer(“0111”) produces 7
Copyright S. Shirani
121
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY memory IS
PORT( read_data
read_address
write_data
write_address
Memwrite
Clock
END memory;
:
:
:
:
:
:
OUT
IN
IN
IN
IN
IN
STD_LOGIC_VECTOR( 7 DOWNTO 0 );
STD_LOGIC_VECTOR( 2 DOWNTO 0 );
STD_LOGIC_VECTOR( 7 DOWNTO 0 );
STD_LOGIC_VECTOR( 2 DOWNTO 0 );
STD_LOGIC;
STD_LOGIC );
ARCHITECTURE behavior OF memory IS
-- define new data type for memory array
TYPE memory_type IS ARRAY ( 0 TO 7 ) OF STD_LOGIC_VECTOR( 7 DOWNTO 0 );
: memory_type;
SIGNAL memory
BEGIN
-- Read Memory and convert array index to an integer with CONV_INTEGER
read_data <= memory( CONV_INTEGER( read_address( 2 DOWNTO 0 ) ) );
-- Write Memory?
PROCESS
BEGIN
WAIT UNTIL clock 'EVENT AND clock = '1';
IF ( memwrite = '1' ) THEN
-- convert array index to an integer with CONV_INTEGER
memory( CONV_INTEGER( write_address( 2 DOWNTO 0 ) ) ) <= write_data;
END IF;
END PROCESS;
END behavior;
Copyright S. Shirani
122
Altera’s VHDL (Quartus)
Package
Library
Content
maxplus2
altera
Quartus primitives and macrofunctions
std_logic_1164
ieee
Standard for VHDL modeling and the std_logic and
std_logic_vector types
std_logic_arith
ieee
Singed and unsigned types, arithmetic and comparison
functions for use with singed and unsigned types and
the conversion functions conv_integer conv_singed,
conv_unsigned
std_logic_signed
ieee
Functions to use std_logic_vector types as if they are
singed types
std_logic_unsigned
ieee
Functions to use std_logic_vector types as if they are
unsinged types
lpm_components
lpm
LPM megafunctions supported by VHDL.
Copyright S. Shirani
123
Library of commonly used circuits
• Primitives: basic functional blocks used in circuit design
• Macrofunctions: collection of high-level building blocks that
can be used in logic designs
• Macrofunction usual names have the prefix a_ due to the fact
that VHDL does not support names that begin with digits.
Copyright S. Shirani
124
Primitives
• Primitives:
– Basic building blocks
– Package: maxplus2
– Library: altera
Primitive
Primitive Name
Buffer
Carry, Cascade, Exp, Global, Lcell, Soft,
Tri
Flip-Flop & latch
dff, dffe, jkff, KJFFF, SRFF, SRFFE, TFF,
TFFE, latch
Input and outputs
INOUT, IN, OUT
Logic
AND, NOR, BAND, NOT, BNAND, OR,
BNOR, XOR,…..
Copyright S. Shirani
125
Macrofunctions
• Macrofunctions:
– Collection of high-level building blocks that can be used in logic
designs
– All input ports have default signal values, so the designer can simply
leave unused inputs unconnected
– Macrofunction usual names have the prefix a_ due to the fact that
VHDL does not support names that begin with digits.
Copyright S. Shirani
126
Macrofunctions
Macrofunction
Name
Description
Adder
a_8fadd
a_7480
a_74283
8 bit full adder
Gated full adder
4 bit full adder with fast carry
Arithmetic logic unit
a_74181
a_74182
Arithmetic logic unit
Look ahead carry generator
Application specific
ntsc
NTSC video control signal generator
Buffer
a_74240
a_74241
Octal inverting 3-state buffer
Octal 3-state buffer
Comparator
a_8mcomp
a_7485
a_74688
8-bit magnitude comparator
4-bit magnitude comparator
8-bit identity comparator
Converter
a_74184
BCD-to-binary converter
Copyright S. Shirani
127
Macrofunctions
Macrofunction
Name
Description
Counter
Gray4
a_7468
a_7493
a_74191
a_74669
Gray code counter
Dual decade counter
4-bit binary counter
4-bit up/down counter with asynch. load
Synchr. 4-bit up/down counter
Decoder
a_16dmux
a_7446
a_74138
4-to-16 decoder
BCD-to-7 segment decoder
3-to-8 decoder
EDAC
a_74630
16-bit parallel error detection and correction
circuit
Encoder
a_74148
a_74348
8-to-3 encoder
8-to-3 priority encoder with 3-state outputs
Frequency divider
a_7456
Frequency divider
Copyright S. Shirani
128
Macrofunctions
Macrofunction
Name
Description
Latch
Inpltch
a_7475
a_74259
a_74845
Input latch
4-bit bistable latch
8 bit addressable latch with clear
8 bit bus interface D latch with 3 state outputs
Multiplier
Mult4
a_74261
4-bit parallel multiplier
2-bit parallel binary multiplier
Multiplexer
a_21mux
a_74151
a_74157
a_74356
2-to-1 multiplexer
8-to-1 multiplexer
Quad 2-to-1 multiplexer
8-to-1 data selector/multiplexer/register with 3 state outputs
Parity
generator/checker
a_74180
9-bit odd/even parity generator/checker
Copyright S. Shirani
129
Macrofunctions
Macrofunction
Name
Description
Register
a_7470
a_7473
a_74171
a_74173
a-74396
AND gated JK filp flop with preset and clear
Dual JK flip-flop with clear
Quad D flip-flop with clear
4-bit D register
Octal storage register
Shift register
Barrelst
a_7491
a_7495
a_74198
a_74674
8-bit barrel shifter
Serial-in serial out shift register
4-bit parallel access shift register
8 bit bidirectional shift register
16-bit shift register
Storage register
a_7498
4-bit data selector/storage register
Copyright S. Shirani
130
Macrofunctions
Macrofunction
Name
Description
SSI functions
Inhb
a_7400
a_7421
a_7432
a_74386
Inhibit gate
NAND2 gate
AND4 gate
OR2 gate
Quadruple XOR gate
True/Complement
I/O element
a_7487
4-bit true/complement I/O element
Quadruple complementary output elements
Copyright S. Shirani
131
Macrofunctions
Library ieee;
Use ieee_std_logic_1164.all;
Library altera;
Use altera.maxplus2.all;
Entity example is
Port(data, clock, clearn, presetn: in std_logic;
q_out: out std_logic;
a, b, c, gn: in std_logic;
d: in std_logic_vector(7 downto 0);
y, wn: out std_logic);
End example
Architecture arch of example is
Begin
dff1: dff port map (d=>data, q=>q_out clk=>clock, clrn=>clearn, prn=>presetn);
mux: a_74151 port map(c,b,a,d, gn, y, wn);
End arch;
Copyright S. Shirani
132
Library of Parameterized Modules
•
•
•
•
•
•
Library of Parameterized Modules (lpm) is a library of
macrofunctions that is included in Max+Plus II
Each module is parameterized: there are parameters and the
module can be used in different ways.
Modules in the library are technology independent.
The modules can be included in a schematic entry mode or in
VHDL code.
Package: lpm_components
Library: lpm
Copyright S. Shirani
133
lpm modules
Name
Description
Gates
lpm_and
lpm_inv
lpm_bustri
lpm_mux
lpm_clshift
lpm_or
lpm_constant
lpm_xor
lpm_decode
mux
busmux
Multi-bit and gate
Multi-bit inverter
Multi-bit three state buffer
Multi-input multi-bit multiplexer
Combinatorial logic shifter and barrel shifter
Multi-bit or gate
Constant generator
Multi-bit xor gate
Decoder
Single input multi-bit multiplexer
Two-input multi-bit multiplexer
Arithmetic
Components
lpm_compare
lpm_abs
lpm_counter
lpm_add_sub
lpm_divide
lpm_mult
Two-input multi-bit comparator
Absolute value
Multi-bit counter with various control options
Multi-bit adder subtractor
Parameterized Divider
Multi-bit multiplier
Copyright S. Shirani
134
lpm modules
Name
Description
Memory
altdpram*
lpm_latch
csfifo
lpm_shiftreg
dcfifo*
lpm_ram_dp
scfifo*
lpm_ram_dq
csdpram
lpm_ram_io
lpm_ff
lpm_rom
lpm_fifo
lpm_dff*
lpm_fifo_dc
lpm_tff*
Parameterized Dual-Port RAM
Parameterized Latch
Cycle shared first-in first-out buffer
Parameterized Shift Register
Parameterized Dual-Clock FIFO
Parameterized Dual-Port RAM
Parameterized Single-Clock FIFO
Synchronous or Asynchronous RAM with a separate I/O ports
Cycle shared dual port RAM
Synchronous or Asynchronous RAM with a single I/O port
Parameterized flip flop
Synchronous or Asynchronous ROM
Parameterized Single-Clock FIFO
Parameterized D-Type flip flop and Shift Register
Parameterized Dual-Clock FIFO
Parameterized T-Type flip flop
Other functions
clklock
pll
ntsc
Parameterized Phase-Locked Loop
Rising- and Falling-Edge Detector
NTSC Video Control Signal Generator
Copyright S. Shirani
135
Parameterized Modules
• An instance of a parameterized function is created with a
component instantiation statement and a generic map.
• Generic map assigns values to the parameters.
Copyright S. Shirani
136
Parameterized Modules
Library ieee;
Use ieee_std_logic_1164.all;
Library lpm;
Use lpm.lpm_components.all;
Entity reg24lpm is
Port(d: in std_logic_vector(23 downto 0); clk: in in std_logic;
q: out std_logic_vector(23 downto 0));
End reg24lpm;
Architecture arch of reg24lpm is
Begin
reg12a: lpm_ff
generic map (lpm_width =>12)
port map(data =>d(11 downto 0), clock => clk, q => q(11 downto 0));
reg12b: lpm_ff
generic map (lpm_width =>12)
port map(data =>d(23 downto 12), clock => clk, q => q(23 downto 0));
end arch;
Copyright S. Shirani
137
VHDL Synthesis of Multiply & Divide
• The lpm_mult function can be used to synthesize integer multiplication
• The function lpm_divide is also available for integer division.
• Syntax
COMPONENT lpm_mult
GENERIC (LPM_WIDTHA: POSITIVE;
LPM_WIDTHB: POSITIVE;
LPM_WIDTHS: POSITIVE;
LPM_WIDTHP: POSITIVE;
LPM_REPRESENTATION: STRING := "UNSIGNED";
LPM_PIPELINE: INTEGER := 0;
LPM_TYPE: STRING := "L_MULT";
LPM_HINT : STRING := "UNUSED");
PORT (dataa: IN STD_LOGIC_VECTOR(LPM_WIDTHA-1 DOWNTO 0);
datab: IN STD_LOGIC_VECTOR(LPM_WIDTHB-1 DOWNTO 0);
aclr, clken, clock: IN STD_LOGIC := '0';
sum: IN STD_LOGIC_VECTOR(LPM_WIDTHS-1 DOWNTO 0) := (OTHERS => '0');
result: OUT STD_LOGIC_VECTOR(LPM_WIDTHP-1 DOWNTO 0));
END COMPONENT;
Copyright S. Shirani
138
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
LIBRARY lpm;
USE lpm.lpm_components.ALL;
ENTITY mult IS
PORT( A, B
Product
END mult;
: IN STD_LOGIC_VECTOR( 7 DOWNTO 0 );
: OUT STD_LOGIC_VECTOR( 15 DOWNTO 0 ) );
ARCHITECTURE a OF mult IS
BEGIN
-- LPM 8x8 multiply function P = A * B
multiply: lpm_mult
GENERIC MAP( LPM_WIDTHA
=> 8,
LPM_WIDTHB
=> 8,
LPM_WIDTHS
=> 16,
LPM_WIDTHP
=> 16,
LPM_REPRESENTATION
=> "UNSIGNED" )
PORT MAP (
data => A,
datab => B,
result => Product );
END a;
Copyright S. Shirani
139
VHDL synthesis of memory
• The memory functions in LPM are lpm_ram_dq,
lpm_ram_dp, lpm_ram_io, and lpm_rom.
• The memory can be set to an initial value using a file with
extension .mif.
• lpm_ram_dq can implement asynchronous memory or
memory with synchronous inputs and/or outputs.
• The lpm_ram_dq function uses EABs in FLEX 10K and
Cyclone devices.
• The Quartus Compiler automatically implements suitable
portions of this function in EABs.
• Small blocks of special purpose memory can be synthesized
using registers.
Copyright S. Shirani
140
VHDL synthesis of memory
VHDL Component Declaration:
COMPONENT lpm_ram_dq
GENERIC (LPM_WIDTH: POSITIVE;
LPM_TYPE: STRING := "L_RAM_DQ";
LPM_WIDTHAD: POSITIVE;
LPM_NUMWORDS: POSITIVE;
LPM_FILE: STRING := "UNUSED";
LPM_INDATA: STRING := "REGISTERED";
LPM_ADDRESS_CONTROL: STRING := "REGISTERED";
LPM_OUTDATA: STRING := "REGISTERED";
LPM_HINT: STRING := "UNUSED");
PORT (data: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0);
address: IN STD_LOGIC_VECTOR(LPM_WIDTHAD-1 DOWNTO 0);
we: IN STD_LOGIC := '1';
inclock: IN STD_LOGIC := '1';
outclock: IN STD_LOGIC := '1';
q: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0));
END COMPONENT;
Copyright S. Shirani
141
VHDL synthesis of memory
•
•
•
•
LPM_WIDTH
Width of data[] and q[] ports.
LPM_WIDTHAD
Width of the address port.
LPM_NUMWORDS
Number of words stored in memory.
LPM_FILE
Name of the Memory Initialization
File (.mif) or Hexadecimal (Intel-Format) File (.hex) containing
ROM initialization data ("<filename>"), or "UNUSED". If omitted,
contents default to all 0's.
Copyright S. Shirani
142
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY memory IS
PORT( read_data
read_address
write_data
write_address
Memwrite
Clock
END memory;
:
:
:
:
:
:
OUT
IN
IN
IN
IN
IN
STD_LOGIC_VECTOR( 7 DOWNTO 0 );
STD_LOGIC_VECTOR( 2 DOWNTO 0 );
STD_LOGIC_VECTOR( 7 DOWNTO 0 );
STD_LOGIC_VECTOR( 2 DOWNTO 0 );
STD_LOGIC;
STD_LOGIC );
ARCHITECTURE behavior OF memory IS
-- define new data type for memory array
TYPE memory_type IS ARRAY ( 0 TO 7 ) OF STD_LOGIC_VECTOR( 7 DOWNTO 0 );
SIGNAL memory
: memory_type;
BEGIN
-- Read Memory and convert array index to an integer with CONV_INTEGER
read_data <= memory( CONV_INTEGER( read_address( 2 DOWNTO 0 ) ) );
PROCESS
-- Write Memory?
BEGIN
WAIT UNTIL clock 'EVENT AND clock = '1';
IF ( memwrite = '1' ) THEN
-- convert array index to an integer with CONV_INTEGER
memory( CONV_INTEGER( write_address( 2 DOWNTO 0 ) ) ) <= write_data;
END IF;
END PROCESS;
END behavior;
Copyright S. Shirani
143
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
LIBRARY lpm;
USE lpm.lpm_components.ALL;
ENTITY amemory IS
PORT( read_data
memory_address
write_data
Memwrite
clock,reset
END amemory;
:
:
:
:
:
OUT
IN
IN
IN
IN
STD_LOGIC_VECTOR( 7 DOWNTO 0 );
STD_LOGIC_VECTOR( 2 DOWNTO 0 );
STD_LOGIC_VECTOR( 7 DOWNTO 0 );
STD_LOGIC;
STD_LOGIC );
ARCHITECTURE behavior OF amemory IS
BEGIN
data_memory: lpm_ram_dq
-- LPM memory function
GENERIC MAP ( lpm_widthad
=> 3,
lpm_outdata
=> "UNREGISTERED",
lpm_indata
=> "REGISTERED",
lpm_address_control => "UNREGISTERED",
-- Reads in mif file for initial data values (optional)
lpm_file
=> "memory.mif",
lpm_width
=> 8 )
PORT MAP ( data => write_data, address => memory_address( 2 DOWNTO 0 ),
We => Memwrite, inclock => clock, q => read_data );
END behavior;
Copyright S. Shirani
144
Parameterized Modules
• Designer can create parameterized functions
• To create a parameterized logic function in VHDL, the
generic clause in the entity declaration must list all parameters
used in the architectural description and optional default value
Copyright S. Shirani
145
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY regn IS
GENERIC ( N : INTEGER := 8 ) ;
PORT ( R
: IN
STD_LOGIC_VECTOR(N-1 DOWNTO 0) ;
Rin, Clock
: IN
STD_LOGIC ;
Q
: OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0) ) ;
END regn ;
ARCHITECTURE Behavior OF regn IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL Clock'EVENT AND Clock = '1' ;
IF Rin = '1' THEN
Q <= R ;
END IF ;
END PROCESS ;
END Behavior ;
Figure 7.62
Code for an n-bit register with enableCopyright S. Shirani
146
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY shiftr IS -- left-to-right shift register with async reset
GENERIC ( K : INTEGER := 4 ) ;
PORT ( Resetn, Clock, w
: IN
STD_LOGIC ;
Q
: BUFFER STD_LOGIC_VECTOR(1 TO K) ) ;
END shiftr ;
ARCHITECTURE Behavior OF shiftr IS
BEGIN
PROCESS ( Resetn, Clock )
BEGIN
IF Resetn = '0' THEN
Q <= (OTHERS => '0') ;
ELSIF Clock'EVENT AND Clock = '1' THEN
Genbits: FOR i IN K DOWNTO 2 LOOP
Q(i) <= Q(i-1) ;
END LOOP ;
Q(1) <= w ;
END IF ;
END PROCESS ;
END Behavior ;
Figure 7.64
Code for the shift-register controllerCopyright S. Shirani
147
Download