- •About This Manual
- •Additional Resources
- •Manual Contents
- •Conventions
- •Typographical
- •Online Document
- •Using Foundation Express with VHDL
- •Hardware Description Languages
- •Typical Uses for HDLs
- •Advantages of HDLs
- •About VHDL
- •Foundation Express Design Process
- •Using Foundation Express to Compile a VHDL Design
- •Design Methodology
- •Design Descriptions
- •Entities
- •Entity Generic Specifications
- •Entity Port Specifications
- •Architecture
- •Declarations
- •Components
- •Concurrent Statements
- •Constant Declarations
- •Processes
- •Signal Declarations
- •Subprograms
- •Type Declarations
- •Examples of Architectures for NAND2 Entity
- •Configurations
- •Packages
- •Using a Package
- •Package Structure
- •Package Declarations
- •Package Body
- •Resolution Functions
- •Data Types
- •Type Overview
- •Enumeration Types
- •Enumeration Overloading
- •Enumeration Encoding
- •Enumeration Encoding Values
- •Integer Types
- •Array Types
- •Constrained Array
- •Unconstrained Array
- •Array Attributes
- •Record Types
- •Record Aggregates
- •Predefined VHDL Data Types
- •Data Type BOOLEAN
- •Data Type BIT
- •Data Type CHARACTER
- •Data Type INTEGER
- •Data Type NATURAL
- •Data Type POSITIVE
- •Data Type STRING
- •Data Type BIT_VECTOR
- •Unsupported Data Types
- •Physical Types
- •Floating-Point Types
- •Access Types
- •File Types
- •Express Data Types
- •Subtypes
- •Expressions
- •Overview
- •Operators
- •Logical Operators
- •Relational Operators
- •Adding Operators
- •Unary (Signed) Operators
- •Multiplying Operators
- •Miscellaneous Arithmetic Operators
- •Operands
- •Operand Bit-Width
- •Computable Operands
- •Aggregates
- •Attributes
- •Expressions
- •Function Calls
- •Identifiers
- •Indexed Names
- •Literals
- •Numeric Literals
- •Character Literals
- •Enumeration Literals
- •String Literals
- •Qualified Expressions
- •Records and Fields
- •Slice Names
- •Limitations on Null Slices
- •Limitations on Noncomputable Slices
- •Type Conversions
- •Sequential Statements
- •Assignment Statements and Targets
- •Simple Name Targets
- •Indexed Name Targets
- •Slice Targets
- •Field Targets
- •Aggregate Targets
- •Variable Assignment Statements
- •Signal Assignment Statements
- •Variable Assignment
- •Signal Assignment
- •if Statements
- •Evaluating Conditions
- •Using the if Statement to Infer Registers and Latches
- •case Statements
- •Using Different Expression Types
- •Invalid case Statements
- •loop Statements
- •Basic loop Statement
- •while...loop Statements
- •for...loop Statements
- •Steps in the Execution of a for...loop Statement
- •for...loop Statements and Arrays
- •next Statements
- •exit Statements
- •Subprograms
- •Subprogram Always a Combinatorial Circuit
- •Subprogram Declaration and Body
- •Subprogram Calls
- •Procedure Calls
- •Function Calls
- •return Statements
- •Procedures and Functions as Design Components
- •Example with Component Implication Directives
- •Example without Component Implication Directives
- •wait Statements
- •Inferring Synchronous Logic
- •Combinatorial Versus Sequential Processes
- •null Statements
- •Concurrent Statements
- •Overview
- •process Statements
- •Combinatorial Process Example
- •Sequential Process Example
- •Driving Signals
- •block Statements
- •Nested Blocks
- •Guarded Blocks
- •Concurrent Versions of Sequential Statements
- •Concurrent Procedure Calls
- •Concurrent Signal Assignments
- •Simple Concurrent Signal Assignments
- •Conditional Signal Assignments
- •Selected Signal Assignments
- •Component Instantiation Statements
- •Direct Instantiation
- •generate Statements
- •for...generate Statements
- •Steps in the Execution of a for...generate Statement
- •Common Usage of a for...generate Statement
- •if...generate Statements
- •Register and Three-State Inference
- •Register Inference
- •The Inference Report
- •Latch Inference Warnings
- •Controlling Register Inference
- •Inferring Latches
- •Inferring Set/Reset (SR) Latches
- •Inferring D Latches
- •Inferring Master-Slave Latches
- •Inferring Flip-Flops
- •Inferring D Flip-Flops
- •Inferring JK Flip-Flops
- •Inferring Toggle Flip-Flops
- •Getting the Best Results
- •Understanding Limitations of Register Inference
- •Three-State Inference
- •Reporting Three-State Inference
- •Controlling Three-State Inference
- •Inferring Three-State Drivers
- •Inferring a Simple Three-State Driver
- •Three-State Driver with Registered Enable
- •Three-State Driver Without Registered Enable
- •Writing Circuit Descriptions
- •How Statements Are Mapped to Logic
- •Design Structure
- •Adding Structure
- •Using Variables and Signals
- •Using Parentheses
- •Using Design Knowledge
- •Optimizing Arithmetic Expressions
- •Arranging Expression Trees for Minimum Delay
- •Sharing Common Subexpressions
- •Changing an Operator Bit-Width
- •Using State Information
- •Propagating Constants
- •Sharing Complex Operators
- •Asynchronous Designs
- •Don’t Care Inference
- •Using Don’t Care Default Values
- •Differences Between Simulation and Synthesis
- •Synthesis Issues
- •Feedback Paths and Latches
- •Fully Specified Variables
- •Asynchronous Behavior
- •Understanding Superset Issues and Error Checking
- •Foundation Express Directives
- •Notation for Foundation Express Directives
- •Foundation Express Directives
- •Translation Stop and Start Pragma Directives
- •synthesis_off and synthesis_on Directives
- •Resolution Function Directives
- •Component Implication Directives
- •Foundation Express Packages
- •std_logic_1164 Package
- •std_logic_arith Package
- •Using the Package
- •Modifying the Package
- •Data Types
- •UNSIGNED
- •SIGNED
- •Conversion Functions
- •Arithmetic Functions
- •Example 10-1: Binary Arithmetic Functions
- •Example 10-2: Unary Arithmetic Functions
- •Comparison Functions
- •Example 10-3: Ordering Functions
- •Example 10-4: Equality Functions
- •Shift Functions
- •ENUM_ENCODING Attribute
- •pragma built_in
- •Type Conversion
- •numeric_std Package
- •Understanding the Limitations of numeric_std package
- •Using the Package
- •Data Types
- •Conversion Functions
- •Resize Function
- •Arithmetic Functions
- •Comparison Functions
- •Defining Logical Operators Functions
- •Shift Functions
- •Rotate Functions
- •Shift and Rotate Operators
- •std_logic_misc Package
- •ATTRIBUTES Package
- •VHDL Constructs
- •VHDL Construct Support
- •Design Units
- •Data Types
- •Declarations
- •Specifications
- •Names
- •Identifiers and Extended Identifiers
- •Specifics of Identifiers
- •Specifics of Extended Identifiers
- •Operators
- •Shift and Rotate Operators
- •xnor Operator
- •Operands and Expressions
- •Sequential Statements
- •Concurrent Statements
- •Predefined Language Environment
- •VHDL Reserved Words
- •Examples
- •Moore Machine
- •Mealy Machine
- •Read-Only Memory
- •Waveform Generator
- •Smart Waveform Generator
- •Definable-Width Adder-Subtracter
- •Count Zeros—Combinatorial Version
- •Count Zeros—Sequential Version
- •Soft Drink Machine—State Machine Version
- •Soft Drink Machine—Count Nickels Version
- •Carry-Lookahead Adder
- •Carry Value Computations
- •Implementation
- •Serial-to-Parallel Converter—Counting Bits
- •Input Format
- •Implementation Details
- •Serial-to-Parallel Converter—Shifting Bits
- •Programmable Logic Arrays
VHDL Reference Guide
end rtl;
Register Name |
Type |
Width |
Bus |
MB |
AR |
AS |
SR |
SS |
ST |
|
|
|
|
|
|
|
|
|
|
TMP_Q_reg |
Flip-flop |
1 |
- |
- |
Y |
N |
N |
N |
Y |
|
|
|
|
|
|
|
|
|
|
TMP_Q_reg
Async-reset: RESET
Sync-toggle: TOGGLE
Figure 7-22 Toggle Flip-Flop with Enable and Asynchronous Reset
Getting the Best Results
This section provides tips for improving the results you achieve during flip-flop inference. The following topics are covered.
•Minimizing flip-flop count
•Correlating synthesis results with simulation results
Minimizing Flip-Flop Count HDL descriptions should build only as many flip-flops as the design requires.
Circuit Description Inferring Too Many Flip-Flops The following example shows a description that infers too many flip-flops. The inference report is shown following the example. The figure “Circuit with Six Inferred Flip-Flops” shows the inferred flip-flops.
7-40 |
Xilinx Development System |
Register and Three-State Inference
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity count is
port (CLK, RESET : in std_logic; AND_BITS, OR_BITS, XOR_BITS : out std_logic );
end count;
architecture rtl of count is begin
process
variable COUNT : std_logic_vector (2 downto 0); begin
wait until (CLK’event and CLK = ’1’); if (RESET = ’1’) then
COUNT <= ”000”; else
COUNT <= COUNT + 1; end if;
AND_BITS <= COUNT(2) and COUNT(1) and COUNT(0); OR_BITS <= COUNT(2) or COUNT(1) or COUNT(0); XOR_BITS <= COUNT(2) xor COUNT(1) xor COUNT(0);
end process;
end rtl;
The following example has only one process, which contains a wait statement and six output signals. Foundation Express infers six flipflops, one for each output signal in the process.
•COUNT(2:0) (three inferred flip-flops)
•AND_BITS (one inferred flip-flop)
•OR_BITS (one inferred flip-flop)
•XOR_BITS (one inferred flip-flop)
However, because the outputs AND_BITS, OR_BITS, and XOR_BITS depend solely on the value of variable COUNT, and variable COUNT is registered, these three outputs do not need to be registered. Therefore, assign AND_BITS, OR_BITS, and XOR_BITS within a process
VHDL Reference Guide |
7-41 |
VHDL Reference Guide
that does not have a wait statement (see the next section, “Circuit Description Inferring Correct Number of Flip-Flops”).
Register Name |
Type |
Widt |
Bus |
MB |
AR |
AS |
SR |
SS |
ST |
|
|
h |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AND_BITS_reg |
Flip-flop |
1 |
- |
- |
N |
N |
N |
N |
N |
|
|
|
|
|
|
|
|
|
|
COUNT_reg |
Flip-flop |
3 |
Y |
N |
N |
N |
N |
N |
N |
|
|
|
|
|
|
|
|
|
|
OR_BITS_reg |
Flip-flop |
1 |
- |
- |
N |
N |
N |
N |
N |
|
|
|
|
|
|
|
|
|
|
XOR_BITS_reg |
Flip-flop |
1 |
- |
- |
N |
N |
N |
N |
N |
|
|
|
|
|
|
|
|
|
|
Figure 7-23 Circuit with Six Inferred Flip-Flops
Circuit Description Inferring Correct Number of Flip-Flops To avoid inferring extra flip-flops, assign the output signals from within a process that does not have a wait statement.
The following example shows a description with two processes, one with a wait statement and one without. The registered (synchronous) assignments are in the first process, which contains the wait statement. The other (asynchronous) assignments are in the second process. Signals communicate between the two processes.
This description style lets you choose the signals that are registered and those that are not. The inference report is shown following the example. The figure “Circuit with Three Inferred Flip-Flops” shows the resulting circuit.
7-42 |
Xilinx Development System |
Register and Three-State Inference
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity count is
port(CLK, RESET : in std_logic;
AND_BITS, OR_BITS, XOR_BITS : out std_logic); end count;
architecture rtl of count is
signal COUNT : std_logic_vector (2 downto 0); begin
reg : process begin
wait until (CLK’event and CLK = ’1’); if (RESET = ’1’) then
COUNT <= ”000”; else
COUNT <= COUNT + 1; end if;
end process reg;
combine : process(count) begin
AND_BITS <= COUNT(2) and COUNT(1) and COUNT(0); OR_BITS <= COUNT(2) or COUNT(1) or COUNT(0); XOR_BITS <= COUNT(2) xor COUNT(1) xor COUNT(0);
end process combine; end rtl;
Register Name |
Type |
Widt |
Bus |
MB |
AR |
AS |
SR |
SS |
ST |
|
|
h |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
COUNT_reg |
Flip-flop |
3 |
Y |
N |
N |
N |
N |
N |
N |
|
|
|
|
|
|
|
|
|
|
COUNT_reg (width 3)
set/reset/toggle: none
VHDL Reference Guide |
7-43 |
VHDL Reference Guide
Figure 7-24 Circuit with Three Inferred Flip-Flops
This technique of separating combinatorial logic from registered or sequential logic in your design is useful when describing finite state machines. See these in the “Examples” appendix.
•“Moore Machine”
•“Mealy Machine”
•“Count Zeros—Sequential Version””
•“Soft Drink Machine—State Machine Version”
Correlating Synthesis Results with Simulation Results Using delay specifications with registered values can cause the simulation to behave differently from the logic Foundation Express synthesizes. For example, the description in the following example contains delay information that causes Foundation Express to synthesize a circuit that behaves unexpectedly (the post-synthesis simulation results do not match the pre-synthesis simulation results).
component flip_flop (D, CLK : in std_logic; Q : out std_logic );
end component;
process (A, CLK); signal B: std_logic;
begin
B <= A after 100ns;
F1: flip_flop port map (A, CLK, C),
F2: flip_flop port map (B, CLK, D); end process;
In the above example, B changes 100 nanoseconds after A changes. If the clock period is less than 100 nanoseconds, output D is one or
7-44 |
Xilinx Development System |
