|Summary |Design Units |Sequential Statements |Concurrent Statements |Predefined Types |Declarations |
|Resolution and Signatures |Reserved Words |Operators |Predefined Attributes |Standard Packages |
These statements are for use in Architectures.
Used to group concurrent statements, possibly hierarchically.
label : block [ ( guard expression ) ] [ is ]
[ generic clause [ generic map aspect ; ] ]
[ port clause [ port map aspect ; ] ]
[ block declarative items ]
begin
concurrent statements
end block [ label ] ;
clump : block
begin
A <= B or C;
D <= B and not C;
end block clump ;
maybe : block ( B'stable(5 ns) ) is
port (A, B, C : inout std_logic );
port map ( A => S1, B => S2, C => outp );
constant delay: time := 2 ns;
signal temp: std_logic;
begin
temp <= A xor B after delay;
C <= temp nor B;
end block maybe;
Used to do have sequential statements be a part of concurrent processing.
label : process [ ( sensitivity_list ) ] [ is ]
[ process_declarative_items ]
begin
sequential statements
end process [ label ] ;
-- input and output are defined a type 'word' signals
reg_32: process(clk, clear)
begin
if clear='1' then
output <= (others=>'0');
elsif clk='1' then
output <= input after 250 ps;
end if;
end process reg_32;
-- assumes use IEEE.std_logic_textio.all
printout: process(clk) -- used to show state when clock raises
variable my_line : LINE; -- not part of working circuit
begin
if clk='1' then
write(my_line, string'("at clock "));
write(my_line, counter);
write(my_line, string'(" PC="));
write(my_line, IF_PC);
writeline(output, my_line);
counter <= counter+1;
end if;
end process printout;
process_declarative_items are any of:
subprogram declaration
subprogram body
type declaration
subtype declaration
constant, object declaration
variable, object declaration
file, object declaration
alias declaration
attribute declaration
attribute specification
use clause
group template declaration
group declaration
BUT NOT signal_declaration, all signals must be declared outside the process.
sig1 <= sig2 and sig3; -- considered here as a sequential statement
-- sig1 is set outside the process upon exit or wait
A process may be designated as postponed in which case it starts in the
same simulation cycle as an equivalent non postponed process,
yet starts after all other non postponed processes have suspended
in that simulation cycle.
A sequential procedure call statement may be used and its behavior is that of an equivalent process. [ label : ] [ postponed ] procedure name [ ( actual_parameters ) ] ; trigger_some_event ; Check_Timing(min_time, max_time, clk, sig_to_test); Note that a procedure can be defined in a library package and then used many places. A process can not be similarly defined in a package and may have to be physically copied. A process has some additional capability not available in a concurrent procedure.
A sequential assertion statement may be used and its behavior is that of an equivalent process. [ label : ] [ postponed ] assertion_statement ;
A sequential signal assignment statement is also a concurrent signal assignment statement. Additional control is provided by the use of postponed and guarded. [ label : ] sequential signal assignment statement [ label : ] [ postponed ] conditional_signal_assignment_statement ; [ label : ] [ postponed ] selected_signal_assignment_statement ; The optional guarded causes the statement to be executed when the guarded signal changes from False to True.
A conditional assignment statement is also a concurrent signal assignment statement. target <= waveform when choice; -- choice is a boolean expression target <= waveform when choice else waveform; sig <= a_sig when count>7; sig2 <= not a_sig after 1 ns when ctl='1' else b_sig; "waveform" for this statement seems to include [ delay_mechanism ] See sequential signal assignment statement
A selected assignment statement is also a concurrent signal
assignment statement.
with expression select target <=
waveform when choice [, waveform when choice ] ;
with count/2 select my_ctrl <=
'1' when 1, -- count/2 = 1 for this choice
'0' when 2,
'X' when others;
Get a specific architecture-entity instantiated component.
part_name: entity library_name.entity_name(architecture_name)
port map ( actual arguments ) ;
optional (architecture_name)
part_name: component_name
port map ( actual arguments ) ;
Given entity gate is
port (in1 : in std_logic ;
in2 : in std_logic ;
out1 : out std_logic) ;
end entity gate;
architecture circuit of gate is ...
architecture behavior of gate is ...
A101: entity WORK.gate(circuit)
port map ( in1 => a, in2 => b, out1 => c );
-- when gate has only one architecture
A102: entity WORK.gate
port map ( in1 => a, in2 => b, out1 => c );
-- when order of actual arguments is used
A103: entity WORK.gate
port map ( a, b, c );
Given an entity
entity add_32 is -- could have several architectures
port (a : in std_logic_vector (31 downto 0);
b : in std_logic_vector (31 downto 0);
cin : in std_logic;
sum : out std_logic_vector (31 downto 0);
cout : out std_logic);
end entity add_32;
Create a simple component interface
component add_32 -- use same port as entity
port (a : in std_logic_vector (31 downto 0);
b : in std_logic_vector (31 downto 0);
cin : in std_logic;
sum : out std_logic_vector (31 downto 0);
cout : out std_logic);
end component add_32;
Instantiate the component 'add_32' to part name 'PC_incr'
PC_incr : add_32 port map (PC, four, zero, PC_next, nc1);
Create a component interface, changing name and renaming arguments
component adder -- can have any name but same types in port
port (in1 : in std_logic_vector (31 downto 0);
in2 : in std_logic_vector (31 downto 0);
cin : in std_logic;
sum : out std_logic_vector (31 downto 0);
cout : out std_logic);
end component adder;
Instantiate the component 'adder' to part name 'PC_incr'
PC_incr : adder -- configuration may associate a specific architecture
port map (in1 => PC,
in2 => four,
cin => zero,
sum => PC_next,
cout => nc1);
Make copies of concurrent statements
label: for variable in range generate -- label required
block declarative items \__ optional
begin /
concurrent statements -- using variable
end generate label ;
label: if condition generate -- label required
block declarative items \__ optional
begin /
concurrent statements
end generate label ;
band : for I in 1 to 10 generate
b2 : for J in 1 to 11 generate
b3 : if abs(I-J)<2 generate
part: foo port map ( a(I), b(2*J-1), c(I, J) );
end generate b3;
end generate b2;
end generate band;