VHDL Basics
1. What is VHDL?
What is VHDL?
VHDL (VHSIC Hardware Description Language) is a hardware description language used to model, simulate, and synthesize digital systems at varying levels of abstraction. Originally developed in the 1980s under the U.S. Department of Defense's Very High-Speed Integrated Circuit (VHSIC) program, it has since become an IEEE standard (IEEE 1076) and a cornerstone of modern digital design.
Core Characteristics
VHDL is a concurrent language, meaning statements execute in parallel unless explicitly sequenced. This mirrors the behavior of physical hardware, where multiple components operate simultaneously. Key features include:
- Entity-Architecture Paradigm: Separates interface (entity) from implementation (architecture).
- Strong Typing: Enforces strict data type compatibility, reducing runtime errors.
- Hierarchical Design: Supports modularity through component instantiation.
- Multi-Level Abstraction: Models systems from gate-level to algorithmic behavior.
Mathematical Foundation
VHDL's semantics are rooted in discrete-event simulation, where time advances in quantized steps. The simulation cycle can be formalized as:
Signal assignments follow inertial delay semantics, rejecting pulses shorter than the specified delay:
Real-World Applications
VHDL dominates critical industries:
- ASIC/FPGA Design: Used by Xilinx, Intel, and Cadence tools for synthesis.
- Aerospace: DO-254 certification relies on VHDL for avionics verification.
- High-Energy Physics: Trigger systems in particle detectors (e.g., ATLAS at CERN) use VHDL for real-time processing.
Comparison to Verilog
While both languages serve similar purposes, VHDL's stricter typing and richer abstract modeling capabilities make it preferable for:
- Complex control systems
- Safety-critical applications requiring formal verification
- Mixed-signal modeling with VHDL-AMS extensions
1.2 History and Evolution of VHDL
Origins in the U.S. Department of Defense
VHDL (VHSIC Hardware Description Language) emerged in the early 1980s under the U.S. Department of Defense's Very High-Speed Integrated Circuit (VHSIC) program. The primary objective was to standardize the documentation and design of digital systems across defense contractors. Prior to VHDL, each contractor used proprietary methodologies, leading to inefficiencies in verification and interoperability.
Standardization and IEEE Adoption
In 1987, VHDL was formalized as IEEE Standard 1076, establishing it as a hardware description language with rigorous syntax and semantics. The IEEE standardization process introduced:
- Concurrent signal assignments for modeling parallel hardware behavior.
- Hierarchical design constructs via entities and architectures.
- Precise timing control through delay specifications.
The 1993 revision (IEEE 1076-1993) added significant enhancements, including shared variables and file I/O operations, enabling more complex system-level modeling.
Evolution with Analog and Mixed-Signal Extensions
VHDL-AMS (Analog and Mixed-Signal), standardized as IEEE 1076.1 in 1999, extended VHDL to support continuous-time systems. This allowed modeling of:
where Q represents charge and I(t) is time-varying current. The extension bridged digital and analog domains, critical for mixed-signal ASIC and MEMS design.
Modern Applications and Industry Impact
VHDL remains foundational in FPGA and ASIC development, with toolchains like Xilinx Vivado and Intel Quartus relying on its semantics for synthesis. Its deterministic simulation kernel ensures predictable behavior for safety-critical systems, such as aerospace avionics and medical devices.
Competition and Coexistence with Verilog
While Verilog gained traction due to its C-like syntax, VHDL's strong typing and modularity preserved its dominance in European defense and automotive sectors. The emergence of SystemVerilog prompted further VHDL updates, such as the 2019 revision (IEEE 1076-2019), which introduced interfaces and conditional compilation.
Applications of VHDL in Digital Design
High-Level Digital System Modeling
VHDL enables the abstract modeling of complex digital systems before physical implementation. By describing behavior at the register-transfer level (RTL), engineers can simulate and verify functionality early in the design cycle. This reduces costly errors in later stages. For example, a 32-bit processor's instruction pipeline can be modeled using concurrent processes, with each stage represented as a separate entity-architecture pair.
FPGA and ASIC Implementation
VHDL serves as the primary hardware description language for both Field Programmable Gate Arrays (FPGAs) and Application-Specific Integrated Circuits (ASICs). Synthesis tools convert VHDL code into optimized gate-level netlists. Modern FPGAs leverage VHDL to implement:
- High-speed serial interfaces (PCIe, Ethernet)
- Digital signal processing blocks (FIR filters, FFTs)
- Reconfigurable computing architectures
Formal Verification and Timing Analysis
VHDL's precise timing semantics allow for rigorous verification through:
where tsu is setup time, Tclk is clock period, tprop is propagation delay, and tskew is clock skew. Static timing analysis tools use VHDL's timing annotations to verify design constraints.
Mixed-Signal Simulation
VHDL-AMS (Analog and Mixed-Signal extensions) enables co-simulation of digital and analog components. This is critical for:
- Data converter interfaces (ADCs/DACs)
- Power management ICs
- Sensor front-end processing
Fault Simulation and Test Generation
VHDL models support fault injection for:
- Stuck-at fault coverage analysis
- Built-in self-test (BIST) development
- Automatic test pattern generation (ATPG)
Fault models are implemented using concurrent assertion statements and configuration management.
Protocol Implementation and Verification
Complex communication protocols (DDR memory interfaces, USB, SPI) are rigorously verified through VHDL testbenches. A typical verification environment includes:
- Bus Functional Models (BFMs)
- Protocol checkers
- Coverage-driven constrained random tests
Radiation-Hardened Space Electronics
VHDL's configuration management supports multiple implementations of radiation-hardened designs. Triple modular redundancy (TMR) can be implemented as:
entity TMR_voter is
port (
input1, input2, input3 : in std_logic;
output : out std_logic
);
end entity;
architecture behavioral of TMR_voter is
begin
process(input1, input2, input3)
begin
output <= (input1 and input2) or
(input2 and input3) or
(input1 and input3);
end process;
end architecture;
2. Basic VHDL Syntax Rules
Basic VHDL Syntax Rules
Lexical Elements
VHDL is case-insensitive, meaning Signal, signal, and SIGNAL are treated identically. The language consists of:
- Identifiers – Must start with a letter, followed by letters, digits, or underscores (e.g.,
clk_50MHz
). - Keywords – Reserved words like
entity
,architecture
, orprocess
. - Literals – Numeric (
16#FF#
for hexadecimal) or string values ("Hello"
). - Comments – Prefixed with
--
and extend to the end of the line.
Structural Components
VHDL designs are hierarchical, built using:
- Entities – Declare input/output ports (black-box interface).
- Architectures – Define internal behavior or structure of an entity.
- Packages – Contain shared declarations (types, constants).
-- Entity declaration
entity AND_GATE is
port (
A, B : in std_logic;
Y : out std_logic
);
end AND_GATE;
-- Architecture definition
architecture Behavioral of AND_GATE is
begin
Y <= A and B; -- Concurrent signal assignment
end Behavioral;
Concurrent vs. Sequential Statements
VHDL distinguishes between:
- Concurrent statements – Execute in parallel (e.g., signal assignments outside processes).
- Sequential statements – Execute in order (e.g., inside
process
blocks).
Example: Process Block
process(clk)
begin
if rising_edge(clk) then -- Sequential logic
Q <= D;
end if;
end process;
Data Types and Operators
VHDL enforces strict typing. Common types include:
std_logic
– 9-valued logic system ('0'
,'1'
,'Z'
, etc.).integer
– 32-bit signed integer by default.bit_vector
– Array ofbit
values.
Operators follow precedence rules, with logical (and
, or
), relational (=
, /=
), and arithmetic (+
, *
) operators.
Signals vs. Variables
- Signals – Represent physical wires; updated at delta cycles.
- Variables – Immediate assignment within processes.
Design Units and Libraries
VHDL files typically include:
- Library clauses –
library ieee; use ieee.std_logic_1164.all;
- Entity-architecture pairs – Fundamental building blocks.
- Configuration declarations – Bind architectures to entities.
Entities and Architectures
Entity Declaration
An entity in VHDL defines the interface of a hardware component, specifying its input and output ports. The syntax follows:
entity entity_name is
port (
signal_name : in|out|inout signal_type;
...
);
end entity_name;
Port directions include in (input), out (output), and inout (bidirectional). Signal types can be std_logic, std_logic_vector, or user-defined types. For example, a 4-bit adder entity would declare:
entity adder_4bit is
port (
A, B : in std_logic_vector(3 downto 0);
Cin : in std_logic;
Sum : out std_logic_vector(3 downto 0);
Cout : out std_logic
);
end adder_4bit;
Architecture Definition
An architecture describes the internal behavior or structure of an entity. Multiple architectures can be associated with one entity. The syntax is:
architecture arch_name of entity_name is
-- Declarations (signals, constants, components)
begin
-- Concurrent statements
end arch_name;
Behavioral vs. Structural
Architectures can be:
- Behavioral: Uses processes to describe functionality via algorithms.
- Structural: Interconnects sub-components like a schematic.
Example of a behavioral architecture for the 4-bit adder:
architecture behavioral of adder_4bit is
begin
process(A, B, Cin)
variable temp : std_logic_vector(4 downto 0);
begin
temp := ('0' & A) + ('0' & B) + ("000" & Cin);
Sum <= temp(3 downto 0);
Cout <= temp(4);
end process;
end behavioral;
Configuration Declarations
Configurations bind specific architectures to entities, enabling design flexibility. For instance:
configuration cfg_adder of adder_4bit is
for behavioral -- Selects the 'behavioral' architecture
end for;
end cfg_adder;
2.3 Libraries and Packages
Standard Libraries in VHDL
VHDL relies on predefined libraries to provide essential data types, functions, and operators. The IEEE Standard Libraries form the backbone of most digital designs:
- IEEE.std_logic_1164 – Defines the 9-valued logic system (
std_logic
,std_ulogic
) and resolution functions. - IEEE.numeric_std – Provides signed/unsigned arithmetic operations and type conversions.
- IEEE.math_real – Contains transcendental functions (log, sin, sqrt) for real-number simulations.
Package Structure and Scope
Packages extend libraries by encapsulating reusable components, constants, or functions. A package consists of:
- Declaration (
package PKG_NAME is
) – Public interface of types/subprograms. - Body (
package body PKG_NAME is
) – Private implementation details.
-- Example: Custom package for DSP operations
package dsp_utils is
constant FIR_TAP_MAX : integer := 64;
function sinc(x : real) return real;
end package;
package body dsp_utils is
function sinc(x : real) return real is
begin
if x = 0.0 then return 1.0;
else return sin(x)/x;
end if;
end function;
end package body;
Library Binding and Visibility
Libraries must be explicitly made visible using library
and use
clauses. Scoping rules follow a strict hierarchy:
library IEEE;
– Makes the library accessible.use IEEE.std_logic_1164.all;
– Imports all declarations from the package.- Selective import (
use IEEE.numeric_std.to_unsigned
) reduces namespace pollution.
User-Defined Libraries
For large projects, custom libraries improve modularity. The compilation workflow typically involves:
- Creating a library directory (
./libs/custom
) - Mapping in the simulator:
vlib ./libs/custom
- Compiling with
vcom -work custom ./src/utils.vhd
Common Pitfalls
- Namespace collisions when multiple packages define identical identifiers.
- Missing body implementations for declared subprograms.
- Simulation-synthesis mismatch from using non-standard packages (e.g.,
std_logic_arith
).
2.4 Data Types and Operators
Scalar Data Types
VHDL provides several fundamental scalar data types, each with distinct properties and use cases. The most commonly used types include:
- BIT - Represents binary values '0' and '1'. While simple, it lacks resolution functions and is not suitable for multi-driver scenarios.
- BOOLEAN - Takes values TRUE or FALSE, primarily used for conditional statements and comparisons.
- INTEGER - Signed 32-bit values by default (range -231 to 231-1). Useful for counters and indices.
- REAL - Floating-point numbers (IEEE 754). Not synthesizable but valuable for simulations.
- CHARACTER - ASCII characters, often used for testbenches and reporting.
- TIME - Physical time values with units (ps, ns, ms). Critical for timing simulations.
Composite Data Types
Composite types aggregate multiple elements into a single object:
- ARRAY - Homogeneous collection of elements, either constrained (fixed size) or unconstrained. Example:
type word is array (31 downto 0) of BIT;
- RECORD - Heterogeneous collection, similar to C structs. Example:
type register_t is record addr: INTEGER; data: BIT_VECTOR; end record;
Predefined and User-Defined Types
The STD_LOGIC_1164
package extends basic types with:
- STD_LOGIC - 9-valued logic system ('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-') for accurate hardware modeling.
- STD_LOGIC_VECTOR - Array of STD_LOGIC elements, the de facto standard for digital design.
User-defined types are created using:
type state_type is (IDLE, START, DATA, STOP);
type voltage_level is range 0.0 to 3.3 units
mV;
V = 1000 mV;
end units;
Operators and Overloading
VHDL operators are categorized by functionality:
Logical Operators
- AND, OR, NAND, NOR, XOR, XNOR, NOT - Bit-wise or Boolean operations.
- Example:
signal result : STD_LOGIC := A AND B;
Relational Operators
- =, /=, <, <=, >, >= - Return BOOLEAN results.
- Example:
if (count > MAX_VALUE) then ...
Arithmetic Operators
- +, -, *, /, mod, rem, ** - Mathematical operations with type-specific behavior.
- Note: Division is synthesizable only for powers of two.
Shift and Rotate Operators
- sll, srl, sla, sra, rol, ror - Introduced in VHDL-2008 for direct bit manipulation.
- Example:
shifted <= data srl 2; -- Shift right logical by 2 bits
Concatenation
The & operator combines signals or values:
signal byte : STD_LOGIC_VECTOR(7 downto 0);
byte <= nibble_high & nibble_low;
Operator Overloading
Functions can redefine operator behavior for custom types. The following overloads "+" for complex numbers:
function "+" (a, b : complex) return complex is
begin
return (a.re + b.re, a.im + b.im);
end function;
Type Conversion and Casting
Explicit conversion is often required between types. Common methods include:
- Type qualification:
STD_LOGIC_VECTOR'(x"FF")
- Conversion functions:
to_integer(unsigned(vec))
- Resizing:
resize(signed_val, new_size)
3. Entity Declaration
3.1 Entity Declaration
The entity declaration in VHDL defines the interface of a digital circuit, specifying its input and output ports along with their data types. It serves as the foundational block for modular design, enabling hierarchical system integration. The syntax follows a strict structure to ensure unambiguous hardware mapping during synthesis.
Syntax and Structure
An entity declaration begins with the entity keyword, followed by the entity name and a port clause:
entity entity_name is
port (
signal_name : direction data_type;
...
);
end entity_name;
Key Components
- Direction: Defines signal flow (in, out, inout, buffer).
- Data Type: Specifies the signal's representation (std_logic, integer, bit_vector, etc.).
- Port Modes:
- inout permits bidirectional signals (e.g., data buses).
- buffer allows internal feedback with read/write capability.
Practical Constraints
In synthesizable VHDL, entity ports must adhere to FPGA/ASIC technology limitations. For example:
- std_logic (9-valued logic) is preferred over bit for accurate hardware modeling.
- Unconstrained arrays (e.g., std_logic_vector) require explicit range definitions post-synthesis.
Advanced Use Cases
Entity declarations support generic parameters for configurable designs:
entity parametrized_adder is
generic (
WIDTH : integer := 8
);
port (
a, b : in std_logic_vector(WIDTH-1 downto 0);
sum : out std_logic_vector(WIDTH-1 downto 0)
);
end parametrized_adder;
Generics enable runtime adjustments to bit-widths or timing constraints, facilitating reusable IP cores. For multi-clock systems, entities may declare multiple clock domains with distinct port groups, though cross-domain synchronization remains a physical design challenge.
3.2 Architecture Body
The architecture body in VHDL defines the internal behavior or structure of an entity. It specifies how the inputs and outputs declared in the entity interact, whether through concurrent statements, sequential processes, or component instantiations. An architecture must be associated with exactly one entity, but an entity can have multiple architectures.
Syntax and Structure
The basic syntax of an architecture body is:
architecture architecture_name of entity_name is
[declarations]
begin
[concurrent statements]
end architecture_name;
The architecture_name can be any valid identifier, while entity_name must match the associated entity declaration. The declarative region between is and begin can include signals, constants, types, components, and subprograms.
Concurrent Statements
VHDL architectures primarily consist of concurrent statements that execute in parallel. These include:
- Signal assignments
- Process statements
- Component instantiations
- Generate statements
- Block statements
For example, a simple AND gate implementation would appear as:
architecture rtl of and_gate is
begin
output <= input1 and input2;
end rtl;
Process Blocks
Process blocks contain sequential statements that execute when signals in their sensitivity list change. They model sequential logic while maintaining the overall concurrent nature of the architecture:
architecture behavioral of d_flip_flop is
begin
process(clk)
begin
if rising_edge(clk) then
q <= d;
end if;
end process;
end behavioral;
Configuration Specifications
Architectures can include configuration specifications that define which entity-architecture pairs to use for component instantiations:
for all : and_gate use entity work.and_gate(rtl);
Design Styles
VHDL supports three primary architecture styles:
- Behavioral: Describes functionality using algorithmic approaches
- Dataflow: Uses concurrent signal assignments
- Structural: Composes designs from component instances
Advanced designs often combine these styles. For example, a processor architecture might use behavioral descriptions for the control unit while employing structural composition for the datapath.
Hierarchical Design
Architectures enable hierarchical design through component instantiation. This allows building complex systems from simpler components:
architecture structural of full_adder is
component half_adder is
port(a, b : in std_logic;
s, c : out std_logic);
end component;
signal s1, c1, c2 : std_logic;
begin
ha1 : half_adder port map(a, b, s1, c1);
ha2 : half_adder port map(s1, cin, sum, c2);
cout <= c1 or c2;
end structural;
Generic Parameters
Architectures can work with generic parameters passed from the entity, enabling parameterized designs:
architecture generic_arch of shift_register is
signal reg : std_logic_vector(width-1 downto 0);
begin
process(clk)
begin
if rising_edge(clk) then
reg <= reg(width-2 downto 0) & input;
end if;
end process;
output <= reg(width-1);
end generic_arch;
This flexibility makes VHDL architectures powerful for creating reusable, scalable hardware designs.
3.3 Configuration Declaration
A configuration declaration in VHDL defines the binding of architecture bodies to entity declarations, enabling modular and reusable design hierarchies. It specifies how different structural or behavioral implementations of an entity are selected during elaboration, providing fine-grained control over simulation and synthesis.
Syntax and Structure
The general syntax for a configuration declaration is:
configuration configuration_name of entity_name is
for architecture_name
[component_specification]
[binding_indication;]
end for;
end configuration_name;
Key elements include:
- configuration_name – A user-defined identifier for the configuration.
- entity_name – The entity being configured.
- architecture_name – The target architecture for binding.
- component_specification – Optional mappings for nested components.
- binding_indication – Explicit associations between components and their implementations.
Binding Rules and Hierarchical Configurations
Configurations support hierarchical binding, allowing nested components to be mapped to lower-level entities. The for...use clause specifies direct instantiation, while for...generate handles conditional or iterative structures.
configuration top_level_config of top_entity is
for structural_arch
for instance_name : component_name
use entity work.child_entity(child_arch);
end for;
end for;
end top_level_config;
Practical Applications
Configurations are critical in:
- Simulation variants – Swapping behavioral models for testbenches without modifying the main design.
- Technology mapping – Binding RTL descriptions to vendor-specific primitives (e.g., FPGA LUTs or ASIC cells).
- Design reuse – Isolating platform-specific implementations from generic logic.
Advanced Use: Configuration Libraries
Large-scale projects often store configurations in dedicated libraries, enabling dynamic selection via scripts or tool directives. For example, a single testbench can validate multiple architectures by toggling configurations:
-- In file sim_configs.vhd
configuration fast_sim of dut_entity is
for behavioral_arch end for;
end fast_sim;
configuration gate_level_sim of dut_entity is
for synth_arch end for;
end gate_level_sim;
Toolchains like ModelSim or Vivado then reference these configurations via command-line arguments or Tcl scripts.
3.4 Package Declaration and Body
Packages in VHDL serve as containers for reusable declarations, functions, procedures, and type definitions, enabling modular and maintainable code. A package consists of two parts: the declaration (interface) and the body (implementation).
Package Declaration
The package declaration defines the publicly accessible components, including:
- Type declarations
- Constant definitions
- Function and procedure prototypes
- Component declarations
A basic package declaration follows this structure:
package example_pkg is
-- Type declarations
type state_type is (IDLE, RUN, STOP);
-- Constants
constant MAX_VALUE : integer := 255;
-- Function prototype
function parity_check(data : std_logic_vector) return std_logic;
-- Component declaration
component d_flip_flop is
port (
clk : in std_logic;
d : in std_logic;
q : out std_logic
);
end component;
end package example_pkg;
Package Body
The package body contains the implementation of functions and procedures declared in the package. It may also include private constants or types not visible outside the package.
package body example_pkg is
-- Function implementation
function parity_check(data : std_logic_vector) return std_logic is
variable result : std_logic := '0';
begin
for i in data'range loop
result := result xor data(i);
end loop;
return result;
end function;
end package body example_pkg;
Key Considerations
- Visibility: Package declarations are visible to all design units that include them via
use work.example_pkg.all;
. - Separate Compilation: Packages must be compiled before they can be referenced by other design units.
- Overloading: Functions in packages support overloading based on parameter types.
- Dependencies: Package bodies may depend on other packages, requiring proper compilation order.
Advanced Usage Patterns
For complex designs, packages enable several powerful techniques:
- Type Abstraction: Centralized type definitions ensure consistency across multiple entities.
- Generic Components: Component declarations in packages facilitate design reuse.
- Testbench Utilities: Packages commonly contain verification procedures for testbenches.
- Algorithm Libraries: Mathematical functions can be encapsulated in packages for DSP applications.
The IEEE standard packages (std_logic_1164
, numeric_std
) demonstrate sophisticated package design, providing essential types and operations for digital design while maintaining strict type safety.
4. Behavioral Modeling with Processes
Behavioral Modeling with Processes
Behavioral modeling in VHDL describes the functionality of a digital system without specifying its structural implementation. The process statement is the primary construct for behavioral modeling, enabling sequential execution within a concurrent environment. Processes are sensitive to signals in their sensitivity list, executing whenever those signals change.
Process Syntax and Execution Flow
A process block follows this basic structure:
process(sensitivity_list)
-- Variable declarations
begin
-- Sequential statements
end process;
The sensitivity list defines which signal changes trigger the process. If omitted, the process runs indefinitely, requiring explicit wait statements for control. Inside the process, statements execute sequentially, but the process itself operates concurrently with other processes and concurrent statements.
Signal Assignment Within Processes
Signal assignments in processes follow postponed update semantics. When a signal is assigned, the new value is scheduled for the next delta cycle. This differs from variable assignments, which take effect immediately. Consider this flip-flop example:
process(clk)
begin
if rising_edge(clk) then
q <= d; -- Signal assignment
end if;
end process;
The assignment q <= d
occurs only when a rising clock edge is detected, but q
updates after a delta delay.
Variables vs. Signals in Processes
Variables, declared using variable
, have immediate assignment and local scope:
process(clk)
variable count : integer := 0;
begin
if rising_edge(clk) then
count := count + 1; -- Immediate update
q <= std_logic_vector(to_unsigned(count, 8));
end if;
end process;
Variables are useful for intermediate calculations, while signals represent hardware registers or wires.
Combinational vs. Sequential Processes
Processes can model either combinational or sequential logic:
- Combinational: Sensitivity list includes all input signals, no clock edge detection.
- Sequential: Sensitivity list includes only the clock (and optionally reset), with edge detection.
Example of a combinational multiplexer:
process(a, b, sel)
begin
if sel = '1' then
y <= a;
else
y <= b;
end if;
end process;
Practical Considerations
In real-world designs:
- Processes should be kept small and focused for readability and synthesis reliability.
- All signals read in the process must appear in the sensitivity list for combinational logic.
- Asynchronous resets require careful handling to avoid metastability.
For sequential logic, synchronous design practices recommend using only clock edges in the sensitivity list:
process(clk)
begin
if rising_edge(clk) then
if reset = '1' then
count <= 0;
else
count <= count + 1;
end if;
end if;
end process;
4.2 Structural Modeling with Components
Structural modeling in VHDL describes a digital system as a hierarchical interconnection of predefined components. Unlike behavioral modeling, which focuses on functionality, structural modeling emphasizes the physical arrangement and connectivity of submodules, making it ideal for large-scale designs where modularity is critical.
Component Declaration and Instantiation
A component in VHDL acts as a placeholder for an entity that will be instantiated later. The syntax for declaring a component mirrors that of an entity declaration:
-- Component declaration
COMPONENT and_gate
PORT (
a, b : IN STD_LOGIC;
y : OUT STD_LOGIC
);
END COMPONENT;
Instantiation binds the component to a specific instance with unique port mappings. Positional association maps signals in order, while named association explicitly pairs formal and actual parameters:
-- Positional association
U1: and_gate PORT MAP (input1, input2, output1);
-- Named association
U2: and_gate PORT MAP (
a => input3,
b => input4,
y => output2
);
Hierarchical Design Methodology
Structural modeling enables hierarchical decomposition of complex systems. A top-level entity instantiates lower-level components, which may themselves contain subcomponents. This approach:
- Enhances design reuse - Verified components can be redeployed across projects
- Simplifies verification - Each module can be tested independently
- Improves maintainability - Changes are localized to specific components
Configuration Specifications
Configurations resolve binding between component instances and entity-architecture pairs. They enable:
- Late binding of architectures to entities
- Selection of alternative implementations
- Technology-specific mappings (e.g., ASIC vs FPGA libraries)
CONFIGURATION structural_cfg OF top_level IS
FOR structural
FOR ALL: and_gate USE ENTITY work.and_gate(behavioral);
END FOR;
END FOR;
END CONFIGURATION;
Practical Considerations
When employing structural modeling:
- Signal resolution - Multiple drivers on a signal require resolved types (e.g.,
STD_LOGIC
instead ofSTD_ULOGIC
) - Generics propagation - Parameters must be explicitly passed through hierarchy levels
- Timing constraints - Interconnect delays accumulate across hierarchical boundaries
Modern synthesis tools typically flatten structural hierarchies during optimization, but the modeling approach remains valuable for human readability and team-based design partitioning.
4.3 Dataflow Modeling with Concurrent Statements
Concurrent Signal Assignments
Dataflow modeling in VHDL describes digital circuits using concurrent signal assignments, where statements execute in parallel rather than sequentially. Unlike behavioral modeling (process blocks), these assignments reflect hardware concurrency directly. The simplest form is a continuous assignment:
output <= input1 AND input2; -- Executes whenever input1 or input2 changes
This models a combinational AND gate, with the output updating immediately upon any input change. Signal assignments are order-independent; their execution depends solely on event-driven sensitivity.
Conditional Concurrent Assignments
The WHEN-ELSE
construct enables conditional dataflow descriptions, akin to multiplexers:
signal <= value1 WHEN condition1 ELSE
value2 WHEN condition2 ELSE
default_value;
This infers priority-encoded logic, where conditions are evaluated top-down. For example, a 4:1 mux can be implemented as:
output <= in0 WHEN sel = "00" ELSE
in1 WHEN sel = "01" ELSE
in2 WHEN sel = "10" ELSE
in3;
Selected Signal Assignments
For non-priority-based selection, WITH-SELECT-WHEN
provides a truth-table-like structure:
WITH sel SELECT
output <= in0 WHEN "00",
in1 WHEN "01",
in2 WHEN "10",
in3 WHEN OTHERS;
Unlike WHEN-ELSE
, this evaluates all cases simultaneously. The OTHERS
clause is mandatory to cover all possible combinations.
Practical Considerations
- Propagation Delays: Specify inertial or transport delays using
AFTER
clauses (e.g.,output <= input AFTER 5 ns
). - Unintended Latches: Ensure all conditional branches are covered to avoid inferred storage elements.
- Optimization: Synthesis tools may simplify or restructure concurrent logic for area/speed trade-offs.
Mathematical Expressions
Dataflow modeling supports arithmetic operations, but bit-width matching is critical. For a signed multiplier:
Implemented in VHDL as:
product <= std_logic_vector(signed(a) * signed(b));
Note that overflow handling requires explicit bit-width management (e.g., resize
operations).
5. VHDL Simulation Flow
5.1 VHDL Simulation Flow
VHDL simulation is a critical phase in digital design verification, ensuring that the described hardware behavior matches intended functionality before synthesis. The simulation flow consists of several stages, each requiring precise execution to validate correctness.
Compilation Phase
The first step involves compiling VHDL source files into an intermediate format understood by the simulator. The compiler performs lexical, syntactic, and semantic analysis, checking for language compliance and logical consistency. Errors at this stage typically include syntax violations, undefined signals, or type mismatches.
Elaboration Phase
Elaboration instantiates the design hierarchy, resolves generics, and establishes connectivity between components. The simulator constructs a flattened representation of the design, binding entities to architectures and resolving configurations. This phase ensures all inter-module references are valid.
Initialization and Execution
Before simulation begins, signals receive initial values as specified in the VHDL code. The simulator then processes events in discrete time steps, governed by delta cycles—a mechanism ensuring correct signal propagation order without advancing simulation time.
- Delta Cycle: A minimal simulation step where signals update without time progression.
- Time Advance: Occurs when no further delta cycles are needed, moving to the next scheduled event.
Waveform Generation and Debugging
During execution, signal transitions are recorded for waveform analysis. Debugging involves tracing signal values, breakpoints, and stepping through processes. Advanced simulators provide:
- Interactive probing of internal signals.
- Code coverage metrics to identify untested logic.
- Assertion-based verification for automatic error detection.
Practical Considerations
Optimizing simulation speed often requires trade-offs between detail level and performance. Techniques include:
- Using transport delays for pure propagation modeling.
- Limiting waveform storage to critical signals.
- Employing scripted testbenches for automated verification.
-- Example testbench structure
entity testbench is
end entity;
architecture sim of testbench is
signal clk : std_logic := '0';
begin
-- Clock generation
clk <= not clk after 10 ns;
-- Stimulus process
stimulus: process
begin
wait for 100 ns;
assert false report "Simulation complete" severity note;
wait;
end process;
end architecture;
5.2 Synthesis Basics and Constraints
Fundamentals of Synthesis
Synthesis is the process of converting a high-level VHDL description into a gate-level netlist optimized for a target FPGA or ASIC. Unlike simulation, synthesis disregards non-synthesizable constructs (e.g., wait for
statements) and focuses on hardware-realizable logic. The synthesis tool maps VHDL entities to primitives like LUTs, flip-flops, and DSP blocks, adhering to the target device's architecture.
where Ai is area, Pi is power, and Tcritical is the worst-case delay. The Lagrange multiplier λ balances timing vs. resource trade-offs.
Synthesis Constraints
Constraints guide synthesis tools to meet design objectives. Key constraint types include:
- Timing Constraints: Define clock frequencies, input/output delays, and false paths.
- Area Constraints: Limit resource usage (e.g., LUTs, BRAMs).
- Power Constraints: Specify dynamic/static power targets.
Timing Constraints Example
A clock constraint for a 100 MHz system with 1 ns jitter:
create_clock -period 10.0 -name sys_clk [get_ports clk]
set_clock_uncertainty 0.1 [get_clocks sys_clk]
Place-and-Route (P&R) Interaction
Post-synthesis, P&R tools assign logic to physical locations on the die. Constraints here include:
- I/O Placement: Pin assignments and bank voltage levels.
- Region Constraints: Hierarchical floorplanning (e.g.,
PBLOCK
in Xilinx).
Practical Considerations
Modern FPGAs use synthesis directives to control optimization. For example:
attribute use_dsp : string;
attribute use_dsp of my_mult : signal is "yes"; -- Forces DSP48E1 usage
Synthesis reports (.rpt files) analyze timing slack, resource utilization, and inferred hardware. Critical warnings (e.g., latch inference) must be addressed to avoid metastability.
Advanced Techniques
For high-performance designs:
- Retiming: Moves registers across combinational logic to balance delays.
- Pipeline Reordering: Optimizes stage depth for throughput vs. latency.
5.3 Testbenches and Verification
Testbenches are essential for verifying the functional correctness of VHDL designs before synthesis and implementation. Unlike synthesizable VHDL, testbenches are purely behavioral and rely on simulation to validate design behavior under controlled conditions. A well-constructed testbench emulates real-world stimuli, checks responses, and automates error detection.
Structure of a Testbench
A VHDL testbench consists of three primary components:
- Device Under Test (DUT): The VHDL entity being tested, instantiated within the testbench.
- Stimulus Generator: A process that applies input signals to the DUT, often using wait statements or clock synchronization.
- Response Checker: A process that compares the DUT's outputs against expected values, typically using assertions.
The following example demonstrates a basic testbench for a 2-input AND gate:
library IEEE;
use IEEE.std_logic_1164.all;
entity and_gate_tb is
end and_gate_tb;
architecture behavioral of and_gate_tb is
signal a, b : std_logic := '0';
signal y : std_logic;
component and_gate
port (a, b : in std_logic; y : out std_logic);
end component;
begin
DUT: and_gate port map (a => a, b => b, y => y);
stimulus: process
begin
a <= '0'; b <= '0'; wait for 10 ns;
assert y = '0' report "Test 1 failed" severity error;
a <= '0'; b <= '1'; wait for 10 ns;
assert y = '0' report "Test 2 failed" severity error;
a <= '1'; b <= '0'; wait for 10 ns;
assert y = '0' report "Test 3 failed" severity error;
a <= '1'; b <= '1'; wait for 10 ns;
assert y = '1' report "Test 4 failed" severity error;
wait;
end process;
end behavioral;
Advanced Verification Techniques
For complex designs, constrained random verification and functional coverage are employed to ensure comprehensive testing:
- Constrained Random Stimulus: Generates pseudo-random inputs within defined constraints to explore edge cases.
- Functional Coverage: Tracks which parts of the design have been exercised during simulation.
- Scoreboarding: Compares DUT outputs against a reference model in real-time.
The following equations govern the statistical verification completeness for a system with N possible states:
where M is the number of test cases executed. Achieving 99% fault coverage requires:
Waveform Analysis and Debugging
Modern VHDL simulators provide waveform viewers that display signal transitions over time. Key debugging techniques include:
- Setting breakpoints at specific simulation times
- Monitoring internal signals through hierarchy
- Using delta cycle visualization for concurrent process analysis
For large-scale verification, industry-standard methodologies like UVVM (Universal VHDL Verification Methodology) provide structured approaches to testbench development, including:
- Transaction-based verification
- Bus Functional Models (BFMs)
- Verification Component (VC) libraries
6. Finite State Machines (FSMs) in VHDL
6.1 Finite State Machines (FSMs) in VHDL
Concept and Classification of FSMs
Finite State Machines (FSMs) are computational models used to design sequential logic circuits. They consist of a finite number of states, transitions between these states, and actions associated with transitions or states. FSMs are broadly classified into two types:
- Moore Machines: Outputs depend solely on the current state.
- Mealy Machines: Outputs depend on both the current state and inputs.
The choice between Moore and Mealy depends on timing constraints and design requirements. Moore machines are inherently synchronous, while Mealy machines can exhibit asynchronous behavior if inputs change mid-cycle.
Mathematical Representation
An FSM can be formally defined as a 5-tuple:
where:
- S is a finite set of states.
- I is a finite set of inputs.
- O is a finite set of outputs.
- δ: S × I → S is the state transition function.
- λ: S × I → O (Mealy) or λ: S → O (Moore) is the output function.
VHDL Implementation Structure
FSMs in VHDL are typically implemented using a three-process architecture:
- State Register: Synchronizes state transitions with a clock edge.
- Next-State Logic: Computes the next state based on current state and inputs.
- Output Logic: Generates outputs (Moore: state-dependent; Mealy: state-and-input-dependent).
Moore Machine Example
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity moore_fsm is
Port ( clk, reset, input : in STD_LOGIC;
output : out STD_LOGIC);
end moore_fsm;
architecture Behavioral of moore_fsm is
type state_type is (S0, S1, S2);
signal current_state, next_state : state_type;
begin
-- State Register
process(clk, reset)
begin
if reset = '1' then
current_state <= S0;
elsif rising_edge(clk) then
current_state <= next_state;
end if;
end process;
-- Next-State Logic
process(current_state, input)
begin
case current_state is
when S0 =>
if input = '1' then next_state <= S1;
else next_state <= S0; end if;
when S1 =>
if input = '0' then next_state <= S2;
else next_state <= S1; end if;
when S2 => next_state <= S0;
end case;
end process;
-- Output Logic (Moore: depends only on state)
process(current_state)
begin
case current_state is
when S0 => output <= '0';
when S1 => output <= '0';
when S2 => output <= '1';
end case;
end process;
end Behavioral;
Optimization and Synthesis Considerations
Modern synthesis tools optimize FSMs by:
- Minimizing state transitions to reduce combinatorial logic.
- Encoding states efficiently (binary, one-hot, Gray code).
- Balancing between Mealy's responsiveness and Moore's stability.
One-hot encoding is preferred for FPGA implementations due to simpler routing, while binary encoding is more efficient for ASICs.
Practical Applications
FSMs are widely used in:
- Communication protocols (UART, SPI state handlers).
- Control units in processors (pipelining, cache controllers).
- Safety-critical systems (watchdog timers, error recovery).
Timing and Metastability
Asynchronous inputs can cause metastability in FSMs. A common mitigation strategy is dual-stage synchronization:
process(clk)
begin
if rising_edge(clk) then
sync_reg <= async_input; -- First stage
sync_input <= sync_reg; -- Second stage
end if;
end process;
The mean time between failures (MTBF) due to metastability is given by:
where tr is resolution time, fc is clock frequency, fd is input data rate, and T0, Ï„ are device-specific constants.
6.2 Generics and Generate Statements
Generics in VHDL
Generics provide a mechanism for parameterizing VHDL entities, allowing the same design to be reused with different configurations. They are declared in the entity declaration and can be assigned default values. Generics are evaluated at elaboration time, meaning they are resolved before simulation or synthesis begins.
entity parameterized_adder is
generic (
WIDTH : integer := 8
);
port (
a, b : in std_logic_vector(WIDTH-1 downto 0);
sum : out std_logic_vector(WIDTH-1 downto 0)
);
end entity parameterized_adder;
In this example, WIDTH is a generic that determines the bit-width of the adder. When instantiating this entity, the generic can be overridden:
adder_16bit: entity work.parameterized_adder
generic map (WIDTH => 16)
port map (a => input_a, b => input_b, sum => result);
Generate Statements
Generate statements allow for conditional or iterative instantiation of concurrent statements. There are two primary forms:
- For-generate: Replicates hardware structures iteratively
- If-generate: Conditionally includes hardware based on generic parameters
A for-generate statement creates multiple instances of a component or architecture:
gen_adder: for i in 0 to 3 generate
adder: entity work.full_adder
port map (
a => a_bus(i),
b => b_bus(i),
cin => carry(i),
sum => sum_bus(i),
cout => carry(i+1)
);
end generate gen_adder;
If-generate statements enable conditional hardware inclusion based on compile-time parameters:
gen_pipeline: if USE_PIPELINING generate
pipe_reg: process(clk) begin
if rising_edge(clk) then
q <= d;
end if;
end process;
end generate gen_pipeline;
Advanced Applications
Combining generics with generate statements enables powerful design patterns. A common application is parameterized memory structures:
entity ram_block is
generic (
DEPTH : integer := 1024;
WIDTH : integer := 32
);
port (
clk : in std_logic;
addr : in std_logic_vector(ceil_log2(DEPTH)-1 downto 0);
din : in std_logic_vector(WIDTH-1 downto 0);
dout : out std_logic_vector(WIDTH-1 downto 0)
);
end entity ram_block;
The ceil_log2 function would be implemented in a package to calculate the required address bus width. This approach allows the same RAM entity to be used for various memory configurations without rewriting the code.
Practical Considerations
When using generics and generate statements:
- Ensure generic values are valid for all possible instantiations
- Use constants or functions to calculate derived parameters
- Be aware of synthesis tool limitations regarding complex generate conditions
- Consider simulation performance when generating large structures
These constructs are particularly valuable in IP core development, where a single parameterized design can serve multiple applications with different performance, area, and power requirements.
6.3 File I/O Operations in VHDL
VHDL provides robust file I/O capabilities through the textio package, enabling reading from and writing to external files during simulation. This is particularly useful for testbench automation, logging simulation results, or loading test vectors dynamically.
File Declarations and Modes
Files in VHDL must be declared with a specific access mode:
- READ_MODE – Opens a file for reading (sequential access).
- WRITE_MODE – Opens a file for writing (overwrites existing content).
- APPEND_MODE – Opens a file for appending (preserves existing content).
File declarations use the file keyword with a type derived from text or custom file types:
-- Example: File declaration for reading and writing
file input_file : text open READ_MODE is "input_vectors.txt";
file output_file : text open WRITE_MODE is "results.log";
Reading from Files
The readline and read procedures extract data line-by-line. Numeric or string values are parsed using overloaded read functions:
process
variable file_line : line;
variable data_int : integer;
begin
while not endfile(input_file) loop
readline(input_file, file_line);
read(file_line, data_int); -- Parse integer from line
-- Process data_int (e.g., apply to DUT inputs)
end loop;
wait;
end process;
Writing to Files
The writeline and write procedures format and write data. Use to_string or type-specific formatting for non-string data:
process (clk)
variable file_line : line;
begin
if rising_edge(clk) then
write(file_line, now); -- Simulation time
write(file_line, string'(": "));
write(file_line, to_string(signal_value));
writeline(output_file, file_line);
end if;
end process;
Binary File Handling
For binary data, declare custom file types using bit_vector or std_logic_vector:
type binary_file is file of std_logic_vector(7 downto 0);
file bin_data : binary_file open READ_MODE is "data.bin";
Error Handling
File operations may raise exceptions (e.g., FILE_OPEN_ERROR). Use assert statements to validate operations:
assert not endfile(input_file)
report "End of file reached prematurely"
severity error;
Practical Considerations
- Path Specifications – Use absolute paths for portability across simulators.
- Buffering – Frequent file writes degrade simulation performance; batch data where possible.
- Simulator Support – Not all VHDL tools implement file I/O identically (e.g., Modelsim vs. GHDL).
7. Recommended VHDL Books
7.1 Recommended VHDL Books
- The Student's Guide to VHDL - 1st Edition | Elsevier Shop — VHDL is a language for describing digital electronic systems. A vital, efficient step in the system design process, VHDL allows for the design and simulation of a hardware system prior to it actually being manufactured. This new book provides a tutorial introduction to the fundamental modeling features of VHDL and shows how the features are used for the design of digital systems. Offering the ...
- Vhdl for Logic Synthesis, Third Edition [Book] - O'Reilly Media — Book description Making VHDL a simple and easy-to-use hardware description language Many engineers encountering VHDL (very high speed integrated circuits hardware description language) for the first time can feel overwhelmed by it. This book bridges the gap between the VHDL language and the hardware that results from logic synthesis with clear organisation, progressing from the basics of ...
- Digital Electronics With VHDL Design - amazon.com — The text presents, after covering the basics, modern design techniques using programmable logic devices and the VHDL hardware description language. The book also introduces Altera's Quartus II CAD software.
- The Designer's Guide to VHDL, 2nd Edition [Book] - O'Reilly Media — This best-selling comprehensive tutorial for the language and authoritative reference on its use in hardware design at all levels--from system to gates--has been revised to reflect the new IEEE standard, VHDL-2001.
- Book Content (VHDL) - Electrical & Computer Engineering Department ... — This channel is for: (1) engineering instructors looking for material to augment their live teaching; (2) K-12 teachers wishing to implement engineering modules in their classrooms; (3) makers that need an introduction to basic electrical engineering; or (4) anyone just curious about how computers work.
7.2 Online Resources and Tutorials
- KIT - ITIV - Study and Teaching - Courses - VHDL — The aim of VHDL-Online is to provide a learning system with a knowledge base that imparts VHDL knowledge to students and experienced engineers in self-study. ... combined circuits 251 2.4 Synthesis of sequential circuits 263 2.5 Optimization of constraints 269 2.6 Resource requirements for synthesis 274 ... standard 278 1.2 The package textio ...
- VHDL Tutorial 1: Introduction to VHDL - Engineers Garage — VHDL Tutorial - 5: Design, simulate and verify NAND, NOR,… VHDL Tutorial 6: Design and verify De Morgan's Theorem using… VHDL Tutorial 2: VHDL programs; VHDL Tutorial 3: Using MAX+II to compile, simulate & verify… VHDL Tutorial - 4: design, simulate and verify all digital… Xilinx Tutorial - Part 1
- VHDL Basics - Intel — VHDL stands for VHSIC Hardware Description Language. VHSIC stands for very High Speed Integrated Circuit. VHDL is an IEEE standard hardware description language. It is used for both simulation and Synthesis. In 1980 the U.S. department of defense started a program that eventually produced VHDL. The language was ratified as IEEE standard 1076 in ...
- PDF IEEE Standard VHDL Language Reference Manual - GovInfo — • The IEEE Standard VHDL Language Refinement Rationale. The Language Refinement Rationale explains the reasons for the adopted changes, both as compared to the baseline language (VHDL 7.2) and as compared to other changes that were proposed but not adopted. • The IEEE Standard VHDL Tutorial. The Tutorial makes extensive use of real
- VHDL Tutorial - Tpoint Tech - Java — History of VHDL. VHDL was developed by the Department of Defence (DOD) in 1980. 1980: The Department of Defence wanted to make circuit design self-documenting. 1983: The development of VHDL began with a joint effort by IBM, Inter-metrics, and Texas Instruments. 1985 (VHDL Version 7.2): The final version of the language under the government contract was released.
- PDF FREE RANGE VHDL - Milwaukee School of Engineering — The electronic version of this book can be downloaded free of charge from: ... Although there are many books and on-line tutorials dealing with VHDL, these sources are often troublesome for several reasons. Firstly, much of ... logical and intelligent introduction to basic VHDL concepts, you should be able to quickly and e ciently create useful ...
- TUTORIAL Aldec Active-HDL Simulation | PDF | Vhdl | Hardware ... - Scribd — This tutorial provides instructions for using Aldec Active-HDL to simulate a VHDL design. It describes how to create a new project, add VHDL files, compile the files, set the top-level entity for simulation, add signals to the waveform window, initialize and run the simulation, and save the simulation results. The tutorial is tested using Active-HDL versions 7.2 through 9.1 and guides the user ...
- PDF A Hardware Engineer 's Guide to VHDL - KFUPM — a VHDL overview, the second gives you some real examples of VHDL code use. In the VHDL Backgrounder, we aim to provide you with a general appreciation of what VHDL is, and how it is used in the design process. In the Designing Hardware using VHDL section, we 're going to familiarise you with the main features of VHDL, particularly design ...
- A VHDL Primer - Jayaram Bhasker.pdf - Google Drive — language. At the conclusion of this chapter, you will be able to write simple VHDL models. 2.1 Basic Terminology VHDL is a hardware description language that can be used to model a digital system. The digital system can be as simple as a logic gate or as complex as a complete electronic system. A hardware abstraction of this digital system
- PDF The VHDL Cookbook - Simon Fraser University — Contents iii Contents 1. Introduction 1-1..... 1.1. Describing Structure 1-2.....
7.3 VHDL Standards and Documentation
- 1076-2008 Ieee Standard Vhdl. Language Reference Manual [PDF ... — Overview 1.1 Scope This standard revises and enhances the VHDL language reference manual (LRM) by including a standard C language interface specification; specifications from previously separate, but related, standards IEEE Std 1164TM -1993 [B16],1 IEEE Std 1076.2TM -1996 [B11], and IEEE Std 1076.3TM -1997 [B12]; and general language ...
- 1076-2002 Ieee Standard Vhdl Language Reference Manual [PDF ... - Library — Design Automation Standards Committee of the IEEE Computer Society Approved 26 July 2002 American National Standards Institute Approved 21 March 2002 IEEE-SA Standards Board Abstract: VHSIC Hardware Description Language (VHDL) is defined. VHDL is a formal notation intended for use in all phases of the creation of electronic systems.
- VHDL Basics - Intel — VHDL stands for VHSIC Hardware Description Language. VHSIC stands for very High Speed Integrated Circuit. VHDL is an IEEE standard hardware description language. It is used for both simulation and Synthesis. In 1980 the U.S. department of defense started a program that eventually produced VHDL. The language was ratified as IEEE standard 1076 in ...
- PDF IEEE Standard VHDL Language Reference Manual - VHDL Language Reference ... — (This introduction is not part of IEEE Std 1076, 2000 Edition, IEEE Standards VHDL Language Reference Manual.) The VHSIC Hardware Description Language (VHDL) is a formal notation intended for use in all phases of the creation of electronic systems. Because it is both machine readable and human readable, it supports the
- PDF The VHDL Standard - ESA — The VHDL Standard An overview of activities, organizations and European tool efforts Author: C. Meersman, E2S n.v. ... objective is to help positioning the existing VHDL standards as well as the ongoing ... electronic repositories (which ones and how to access them) and an extensive list of ...
- PDF IEEE Standard VHDL Language Reference Manual - 0x04.net — IEEE Standard VHDL Language Reference Manual IEEE 3 Park Avenue New York, NY 10016-5997, USA 26 January 2009 IEEE Computer Society Sponsored by the Design Automation Standards Committee 1076 TM Authorized licensed use limited to: CALIFORNIA INSTITUTE OF TECHNOLOGY. Downloaded on February 27,2018 at 15:49:58 UTC from IEEE Xplore. Restrictions apply.
- PDF VHDL Handbook - University of Maryland, Baltimore County — The character set in VHDL'87 is 128 characters, in VHDL'93 it is 256 characters (see page 8, 56). The character set is divided into seven groups - Uppercase letters, Digits, Special characters, The space characters, Lo-wercase letters, Other special characters and format effector. Separators Separators are used to separate lexical elements.
- PDF QUICK START GUIDE TO VHDL - Montana State University — engineers that already know VHDL and need quick reference for syntax and examples of common circuits. This book assumes that the reader already understands digital logic (i.e., binary numbers, combinational and sequential logic design, ï¬nite state machines, memory, and binary arithmetic basics).
- A VHDL Primer - Jayaram Bhasker.pdf - Google Drive — language. At the conclusion of this chapter, you will be able to write simple VHDL models. 2.1 Basic Terminology VHDL is a hardware description language that can be used to model a digital system. The digital system can be as simple as a logic gate or as complex as a complete electronic system. A hardware abstraction of this digital system