A body associated with an entity declaration to describe the internal organization or operation of a design entity. An architecture body is used to describe the behavior, data flow, or structure of a design entity.
architecture architecture_name of entity_name is
architecture_declarations
begin
concurrent_statements
end [ architecture ] [ architecture_name ];
Architecture assigned to an entity describes internal relationship between input and output ports of the entity. It consists of two parts: declarations and concurrent statements.
First (declarative) part of an architecture may contain declarations of types, signals, constants, subprograms (functions and procedures), components, and groups. See respective topics for details.
Concurrent statements in the architecture body define the relationship between inputs and outputs. This relationship can be specified using different types of statements: concurrent signal assignment, process statement, component instantiation, concurrent procedure call, generate statement, concurrent assertion statement and block statement. It can be written in different styles: structural, dataflow, behavioral (functional) or mixed.
The description of a structural body is based on component instantiation and generate statements. It allows to create hierarchical projects, from simple gates to very complex components, describing entire subsystems. The connections among components are realized through ports. Example 1 illustrates this concept for a BCD decoder.
The Dataflow description is built with concurrent signal assignment statements. Each of the statements can be activated when any of its input signals changes its value. While these statements describe the behavior of the circuit, a lot of information about its structure can be extracted form the description as well. Example 2 contains this type of description for the same BCD decoder as in the previous example.
The architecture body describes only the expected functionality (behavior) of the circuit, without any direct indication as to the hardware implementation. Such description consists only of one or more processes, each of which contains sequential statements (Example 3).
The architecture body may contain statements that define both behavior and structure of the circuit at the same time. Such architecture description is called mixed (Example 4).
Example 1
architecture Structure of
Decoder_bcd is
signal S: Bit_Vector(0 to 1);
component AND_Gate
port(A,B:in
Bit; D:out Bit);
end component;
component Inverter
port(A:in
Bit; B:out Bit);
end component;
begin
Inv1:Inverter
port map(A=>bcd(0),
B=>S(0));
Inv2:Inverter
port map(A=>bcd(1),
B=>S(1));
A1:AND_Gate
port map(A=>bcd(0),
B=>bcd(1), D=>led(3));
A2:AND_Gate
port map(A=>bcd(0),
B=>S(1), D=>led(2));
A3:AND_Gate
port map(A=>S(0),
B=>bcd(1), D=>led(1));
A4:AND_Gate port map(A=>S(0),
B=>S(1), D=>led(0));
end Structure;
The components Inverter and AND_Gate are instantiated under the names
Inv1, Inv2, A1, A2, A3 and A4. The connections among the components
are realized by the use of signals S(0), S(1) declared in the
architecture's declarative part.
Example 2
architecture Dataflow of
Decoder_bcd is
begin
led(3) <= bcd(0) and bcd(1);
led(2) <= bcd(0) and
(not bcd(1));
led(1) <= (not
bcd(0)) and bcd(1);
led(0) <= (not
bcd(0)) and (not bcd(1));
end Dataflow;
All the four statements here are executed concurrently and each of
them is activated individually when any of its input signals changes
its value.
Example 3
architecture procedural of
Decoder_bcd is
signal S: bit_vector (3 downto 0);
begin
P1: process
(bcd, S)
begin
case
bcd is
when
"00" => S <= "0001" after
5 ns;
when
"01" => S <= "0010" after
5 ns;
when
"10" => S <= "0100" after
5 ns;
when
"11" => S <= "1000" after
5 ns;
end case;
led <= S;
end process;
end procedural;
The clause "after 5 ns" here allows to introduce time delay
of the circuit. The assignment of a new value to the led signal will
be done only after 5 nanoseconds of the simulated time.
Example 4
architecture Mixed of
Decoder_bcd is
signal S: Bit_Vector(0 to 2);
component Inverter
port(A: in
Bit; B: out Bit);
end component;
begin
Inv1: Inverter port map
(A=>bcd(0), B=>S(0));
Inv2: Inverter port map
(A=>bcd(1), B=>S(1));
P: process (S, bcd)
begin
led(0) <= S(0) and
S(1) after 5 ns;
led(1) <= S(0) and
bcd(1) after 5 ns;
led(2) <= bcd(0) and
S(1) after 5 ns;
led(3) <= bcd(0) and
bcd(1) after 5 ns;
end process;
end Mixed;
Above, two Inverter component instantiation statements define the
circuit responsible for determining the value of the signal S. This
signal is read by behavioral part i.e. the process statement P. In
this process, the values computed by the and operation are assigned
to the led output port.
Single entity can have several architectures, but architecture cannot be assigned to different entities.
Architecture may not be used without an entity.
All declarations defined in an entity are fully visible and accessible within each architecture assigned to this entity.
Different types of statements (i.e. processes, blocks, concurrent signal assignments, component instantiations, etc.) can be used in the same architecture.