VHDL uses a black-box approach, in which units of action which share a similar purpose are grouped together and abstacted to a higher level. In VHDL, the black box is referred to as
entity and the stuff that goes inside it is referred to as the
The entity simply lists the various inputs and outputs of the underlying circuitry. The syntax ofhe entity declaration shown below.
entity my_entity is port( port_name_1 : in std_logic; port_name_2 : out std_logic; port_name_3 : inout d_logic) ; -- do not forget this semicolon end my_entity; -- do not forget this semicolon
my_entitydefines the name of the entity.
port_name_xan identifier used to differentiate the various signals.
- The keywords
inoutspecifies the direction of the signal.
std_logicrefers to the type of the data.
Sometimes we have many similar and closely related inputs and outputs. These are commonly referred to as “bus signals” or “bundle” in computer lingo.
Bundle are easily described in VHDL entity. All that is needed is a new data type and a special notation. The
std_logic data type has now been replaced by the word
std_logic_vector to indicate that each signal name contains more than one signal The signals in the bundle can be listed in one of two orders which are specified by the
downto keywords, like the example below.
entity mux4 is port ( a_data : in std_logic_vector(0 to 7); b_data : in std_logic_vector(0 to 7); c_data : in std_logic_vector(0 to 7); d_data : in std_logic_vector(0 to 7); sel1,sel0 : in std_logic; data_out : out std_logic_vector(7 downto 0); end mux4;
The data type
std_logic and the data type
std_logic_vector becomes available to you soon after the declaration
library IEEE; use IEEE.std_logic_1164.all at the beginning of your code. As specified in the
std_logic_1164 package, the implementation of the
std_logic type (and the
std_logic_vector type) is a little more generous and includes 9 different values, specifically:
The reason for all these values is the desire for modeling three_state drivers, pull-up and pull-down outputs, high impedance state and a few others types of input/output. For more details refer to the IEEE 1164 Standard
The entity describes the interface or the external representation of the circuit. The architecture describes what the circuit actually does.
There can be any number of equivalent architectures describing a single entity.
An architecture can be written by means of three modeling techniques plus combination of these three: the data-flow model, the behavioral model, the structural model and the hybrid models. We will descibed them later.
Signal and Variable Assignments
The signal type is the software representation of a wire. The variable type, like in C or Python, is used to store local information.The constant is like a variable object type, the value of which cannot be changed.
A signal object can be of different types; we saw before, for example, that a signal object can be of type
std_logic or of other types like integer, custom types, etc. The same applies for variable objects.
Before using any signal or variable, it is mandatory to declare them. Signals are declared at the top of the architecture body, just before the keyword begin. Variables must be declared inside the process construct and are local.
when you want to assign a new value to an object of type signal you use the operator
<=. Alternatively, when you want to assign a new value to an object of type variable you will use the operator
library ieee; use ieee.std_logic_1164.all; --the ENTITY entity circuit1 is port( A,B,C : in std_logic; F,G : out std_logic); end circuit1; --the ARCHITECTURE architecture circuit1_arc of circuit1 is signal sig_1 : std_logic; --signal definition begin process (a,b,c) variable var_1 : integer; --variable definition begin F <= not (A and B amd C); --signal assignment sig_1 <= A; var_1 := 34; --variable assignment end process; G <= not (A and B); --concurrent assignment end circuit1_arc
A variable changes its value soon after the variable assignment is executed. Instead, a signal changes itsvalue “some time” after the signal assignment expression is evaluated.
In order to be able to introduce the use of a variable we had to employ the process construct.Inside a process, all instructions are executed consecutively from top to bottom. However the process itself will be executed concurrently with the rest of the code.
|declaration||inside entity or architecure(before
|changement||after the process ends||after the assignment (immediately)|