- •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
Figure A-18 Serial-to Parallet Converter—Counting Bits
Schematic
Serial-to-Parallel Converter—Shifting Bits
This example describes another implementation of the serial-to- parallel converter in the last example. This design performs the same function as the previous one but uses a different algorithm to do the conversion.
The previous implementation used a counter to indicate the bit of the output that was set when a new serial bit was read. In this implementation, the serial bits are shifted into place. Before the conversion occurs, a ’1’ is placed in the least-significant bit position. When that ’1’ is shifted out of the most significant position (position 0), the signal NEXT_HIGH_BIT is set to ’1’ and the conversion is complete.
The following example shows the listing of the second implementation. The differences are highlighted in bold. The differences relate to the removal of the ..._BIT_POSITION signals, the addition of
..._HIGH_BIT signals, and the change in the way NEXT_PARALLEL_OUT is computed.
A-56 |
Xilinx Development System |
Examples
package TYPES is
-- Declares types used in the rest of the design type STATE_TYPE is (WAIT_FOR_START,
READ_BITS, PARITY_ERROR_DETECTED, ALLOW_READ);
constant PARALLEL_BIT_COUNT: INTEGER := 8;
subtype PARALLEL_RANGE |
is INTEGER |
range 0 to (PARALLEL_BIT_COUNT-1); |
|
subtype PARALLEL_TYPE is |
|
BIT_VECTOR(PARALLEL_RANGE); |
|
end TYPES; |
|
use WORK.TYPES.ALL; |
-- Use the TYPES package |
entity SER_PAR is |
-- Declare the interface |
port(SERIAL_IN, CLOCK, |
RESET: in BIT; |
PARALLEL_OUT: out |
PARALLEL_TYPE; |
PARITY_ERROR, READ_ENABLE: out BIT); |
|
end SER_PAR; |
|
architecture BEHAVIOR of |
SER_PAR is |
-- Signals for stored values
signal CURRENT_STATE, NEXT_STATE: STATE_TYPE;
signal CURRENT_PARITY, NEXT_PARITY: BIT; signal CURRENT_HIGH_BIT, NEXT_HIGH_BIT: BIT;
signal CURRENT_PARALLEL_OUT, NEXT_PARALLEL_OUT: PARALLEL_TYPE;
begin
NEXT_ST: process(SERIAL_IN, CURRENT_STATE, RESET,
CURRENT_HIGH_BIT, CURRENT_PARITY, CURRENT_PARALLEL_OUT)
--This process computes all outputs, the next
--state, and the next value of all stored values
begin
PARITY_ERROR <= ’0’; -- Default values for all READ_ENABLE <= ’0’; -- outputs and stored values NEXT_STATE <= CURRENT_STATE;
NEXT_HIGH_BIT <= ’0’; NEXT_PARITY <= ’0’;
NEXT_PARALLEL_OUT <= |
PARALLEL_TYPE’(others=>’0’); |
||
if(RESET = ’1’) |
then |
-- |
Synchronous reset |
NEXT_STATE <= |
WAIT_FOR_START; |
||
else |
|
|
|
case CURRENT_STATE |
is -- |
State processing |
|
when WAIT_FOR_START =>
VHDL Reference Guide |
A-57 |
VHDL Reference Guide
if (SERIAL_IN = ’1’) then NEXT_STATE <= READ_BITS; NEXT_PARALLEL_OUT <=
PARALLEL_TYPE’(others=>’0’); end if;
when READ_BITS =>
if (CURRENT_HIGH_BIT = ’1’) then
if (CURRENT_PARITY = SERIAL_IN) then NEXT_STATE <= ALLOW_READ; READ_ENABLE <= ’1’;
else
NEXT_STATE <= PARITY_ERROR_DETECTED; end if;
else
NEXT_HIGH_BIT <= CURRENT_PARALLEL_OUT(0);
NEXT_PARALLEL_OUT <= CURRENT_PARALLEL_OUT(
1 to PARALLEL_BIT_COUNT-1) & SERIAL_IN;
NEXT_PARITY <= CURRENT_PARITY xor SERIAL_IN;
end if;
when PARITY_ERROR_DETECTED => PARITY_ERROR <= ’1’;
when ALLOW_READ =>
NEXT_STATE <= WAIT_FOR_START; end case;
end if;
end process NEXT_ST;
SYNCH: process
--This process remembers the stored values
--across clock cycles
begin
wait until CLOCK’event and CLOCK = ’1’; CURRENT_STATE <= NEXT_STATE;
CURRENT_HIGH_BIT <= NEXT_HIGH_BIT; CURRENT_PARITY <= NEXT_PARITY; CURRENT_PARALLEL_OUT <= NEXT_PARALLEL_OUT;
end process SYNCH;
PARALLEL_OUT <= CURRENT_PARALLEL_OUT;
end BEHAVIOR;
Note: The synthesized schematic for the shifter implementation is much simpler than that of the previous count implementation in the
A-58 |
Xilinx Development System |
Examples
example of the serial-to-parallel converter—counting bits. It is simpler because the shifter algorithm is inherently easier to implement.
Figure A-19 Serial-to-Parallel Converter—Shifting Bits
Schematic
With the count algorithm, each of the flip-flops holding the PARALLEL_OUT bits needed logic that decoded the value stored in the BIT_POSITION flip-flops to see when to route in the value of SERIAL_IN. Also, the BIT_POSITION flip-flops needed an incrementer to compute their next value.
In contrast, the shifter algorithm requires neither an incrementer nor flip-flops to hold BIT_POSITION. Additionally, the logic in front of most PARALLEL_OUT bits needs to read only the value of the previous flip-flop or ’0’. The value depends on whether bits are currently being read. In the shifter algorithm, the SERIAL_IN port needs to be connected only to the least significant bit (number 7) of the PARALLEL_OUT flip-flops.
These two implementations illustrate the importance of designing efficient algorithms. Both work properly, but the shifter algorithm produces a faster, more area-efficient design.
VHDL Reference Guide |
A-59 |
