======VHDL, Ультракороткая справка - конспект======
=====Структура модуля (объекта)=====
* entity - объявление входов и выходов модуля
* architecture - описание внутренней структуры модуля и его поведения.
====Entity====
entity entity_name is
port (signal_names: mode signal_type;
signal_names: mode signal_type;
signal_names: mode signal_type);
end entity_name;
Entity:
entity Inhibit is -- Comments
port (X,Y : in BIT;
Z : out BIT);
end Inhibit;
* entity_name - имя объекта
* signal_names - список внешних сигналов
* mode - направление передачи сигнала
* in - входной сигнал
* out - выходной сигнал, не доступен внутри объекта.
* buffer - выходной сигнал, но доступен внутри объекта.
* inout - вывод с 3-мя состояниями.
* signal_type - тип сигнала
====Architecture====
architecture architecture_name of entity_name is
type declarations
signal declarations
constant declarations
function declarations
procedure declarations
component declarations
begin
concurrent_statement;
concurrent_statement;
...
concurrent_statement;
end architecture_name;
architecture Inhibit_arch of Inhibit is
begin
Z <= '1' when X = '1' and Y = '0' else '0';
end Inhibit_arch
Тело архитектуры представляет собой ряд параллельных операторов - concurrent_statement. Все параллельные операторы в теле архитектуры исполняются одновременно!
Самым главным параллельным оператором является оператор component. Для каждого оператора component в теле архитектуры создается копия объекта, которая должна иметь уникальную метку label.
label: component_name port map(signal1, signal2, ... signalN);
label: component_name port map(port1=>signal1, port2=>signal2, ... portN=>signalN);
=====Предопределенные типы и операторы=====
bit, bit_vector, boolean, character, integer, real, severity_level, string, time
type STD_ULOGIC is (
'U', -- Uninitialized
'X', -- Forcing Unknown
'0', -- Forcing 0
'1', -- Forcing 1
'Z', -- High Impedance
'W', -- Weak Unknown
'L', -- Weak 0
'H', -- Weak 1
'-', -- Don't Care
);
subtype STD_LOGIC is resolved STD_ULOGIC;
type STD_LOCIC_VECTOR is array (natural range <>) of STD_LOGIC; -- безразмерный массив
subtype natural is integer range 0 to highest-integer;
subtype positive is integer range 1 to highest-integer;
====User-Defined типы====
type type_name is (value_list)
subtype subtype_name is type_name start to end;
subtype subtype_name is type_name start downto end;
constant constant_name: typename := value;
type type_name is array (start to end) of element_type;
type type_name is array (start downto end) of element_type;
type type_name is array (range_type) of element_type;
type type_name is array (range_type range start to end) of element_type;
type type_name is array (range_type range start downto end) of element_type;
B := ('1', '0', '0', '1', '1', '1', '0', '1'); -- Массивы литералы
B := (1=>'0', 5=>'0', 6=>'0', others=>'1'); -- Тоже самое
===Примеры===
type traffic_light_state is (reset, stop, wait, do);
subtype twoval_logic is std_logic range '0' to '1';
subtype fourval_logic is std_logic range 'X' to 'Z';
subtype negint is integer range -2147483647 to '-1';
subtype bitnum is integer range 31 downto 0;
constant BUS_SIZE: integer := 32; -- bus width
constant MSB: integer := BUS_SIZE-1; -- bit number of MSB
constant Z: character := 'Z'; -- synonym for Hi-Z value
type byte is array (7 downto 0) of STD_LOGIC;
constant WORD_LEN: integer := 32;
type word is array (WORD_LEN-1 downto 0) of STD_LOGIC;
type statecount is array (traffic_light_state) of integer;
====Операторы для Integer====
* +, -, *, / - сложение, вычитание, умножение, деление
* mod - деление по модулю
* rem - остаток от деления по модулю
* abs - абсолютное значение
* ** - возведение в степень
====Операторы для Boolean====
* and - И
* or - ИЛИ
* nand - И-НЕ
* nor - ИЛИ-НЕ
* xor - Исключающее ИЛИ
* xnor - Исключающее ИЛИ-НЕ
* not - инверсия
=====Функции и процедуры=====
function function_name (
signal_names: signal_type;
...
signal_names: signal_type
) return return_type is
type declarations
constant declarations
function definitions
procedure definitions
begin
sequential_statement;
sequential_statement;
...
sequential_statement;
end function_name;
architecture Inhibit_archf of Inhibit is
functino ButNot(A,B: bit) return bit is
begin
if B = '0' then return A;
else return '0';
endif;
end ButNot
begin
Z <= ButNot(X,Y);
end Inhibit_archf
====Функции приведения типов====
function CONV_INTEGER (X: STD_LOGIC_VECTOR) return INTEGER is
variable RESULT: INTEGER;
begin
RESULT := 0;
for i in X'range loop
RESULT := RESULT*2;
case X(i) is
when '0' | 'L' => null;
when '1' | 'H' => RESULT := RESULT + 1;
when others => null;
end case
end loop;
return RESULT;
end CONV_INTEGER;
function CONV_STD_VECTOR(ARG: INTEGER; SIZE: INTEGER)
return STD_LOGIC_VECTOR is
variable result: CONV_STD_VECTOR(SIZE-1 downto 0);
variable temp: integer;
begin
temp := ARG;
for i in 0 to SIZE-1 loop
if (temp mod 2) = 1 then result(i) := '1';
else result(i) := '0';
end if;
temp := temp / 2;
end loop;
end CONV_STD_VECTOR;
=====Library and Package=====
При создании проекта автоматически создается библиотека work, неявно в начале файла помещается "library work;". Можно поменять - library (library_clause), например
library ieee;
Package - файл, содержащий определения элементов, которые могут быть использованы другими программами. Пакет может включать сигналы, типы, константы, функции, процедуры, объявления компонентов.
Подключение пакета, всего или отдельного определения:
use ieee.std_logic1164.all;
use ieee.std_logic1164.std_ulogic;
* ieee - библиотека
* std_logic1164 - файл в библиотеке
* all или std_ulogic - определения в этом файле.
package package_name is
type declarations -- Объявления доступные снаружи пакета
signals declarations
constant declarations
component declarations
function declarations
procedure declarations
end package_name;
package body package_name is
type declarations -- Локальные объявления, видны только внутри
constant declarations
function definitions
procedure definitions
end package_name;
=====1 - Структурное проектирование, Component=====
component component_name
port (signal_name: mode signal_type;)
signal_name: mode signal_type;)
...
signal_name: mode signal_type;)
end component;
====Пример проверки на простое число:====
library IEEE;
use IEEE.std_logic_1164.all;
entity prime is
port (N: in STD_LOGIC_VECTOR (3 downto 0);
F: out STD_LOGIC);
end prime;
architecture prime1_arch of prime is
signal N3_L, N2_L, N1_L: STD_LOGIC;
signal N3L_N0, N3L_N2L_N1, N2L_N1_N0, N2_N1L_N0: STD_LOGIC;
component INV port (I: in STD_LOGIC, O: out STD_LOGIC); end component;
component AND2 port (I0,I1: in STD_LOGIC, O: out STD_LOGIC); end component;
component AND3 port (I0,I1,I2: in STD_LOGIC, O: out STD_LOGIC); end component;
component OR4 port (I0,I1,I2,I3: in STD_LOGIC, O: out STD_LOGIC); end component;
begin
U1: INV port map (N(3), N3_L);
U2: INV port map (N(2), N2_L);
U3: INV port map (N(1), N1_L);
U4: AND2 port map (N3_L, N(0), N3L_N0);
U5: AND3 port map (N3_L, N2_L, N(1), N3L_N2L_N1);
U6: AND3 port map (N2_L, N(1), N(0), N2L_N_N0);
U7: AND3 port map (N(2), N1_L, N(0), N2_N1L_N0);
U8: OR4 port map (N3L_N0, N3L_N2L_N1, N2L_N1_N0, N2_N1L_N0, F);
end prime1_arch;
====Пример инвертора шины:====
library IEEE;
use IEEE.std_logic_1164.all;
entity businv is
generic (WIDTH: positive);
port(X: in STD_LOGIC_VECTOR (WIDTH-1 to 0);
Y: out STD_LOGIC_VECTOR (WIDTH-1 to 0) );
end businv;
architecture businv_arch of businv is
component INV port(I: STD_LOGIC; O: out STD_LOGIC); end component;
begin
g1: for b in WIDTH-1 downto 0 generate
U1: INV port map(X(b), Y(b));
end generate;
end businv_arch;
Использование:
library IEEE;
use IEEE.std_logic_1164.all;
entity businv_example is
port(IN8: in STD_LOGIC_VECTOR (7 to 0);
OUT8: out STD_LOGIC_VECTOR 7 to 0);
IN16: in STD_LOGIC_VECTOR (15 to 0);
OUT16: out STD_LOGIC_VECTOR 15 to 0);
IN32: in STD_LOGIC_VECTOR (32 to 0);
OUT32: out STD_LOGIC_VECTOR (32 to 0) );
end businv_example;
architecture businv_ex_arch of businv_example is
component businv
generic (WIDTH: positive);
port(X: in STD_LOGIC_VECTOR (WIDTH-1 to 0);
Y: out STD_LOGIC_VECTOR (WIDTH-1 to 0) );
end component;
begin
U1: businv generic map (WIDTH=>8) port map (IN8, OUT8);
U2: businv generic map (WIDTH=>16) port map (IN16, OUT16);
U3: businv generic map (WIDTH=>32) port map (IN32, OUT32);
end businv_ex_arch;
=====2 - Потоковое проектирование, оператор "=>" =====
Это Описание схемы в терминах потока данных и выполняемых схемой операций над этими данными.
Параллельный сигнальный оператор присваивания:
signal_name <= expression;
signal_name <= expression when boolean_expression else
expression when boolean_expression else
...
expression;
Пример проверки на простое число:
architecture prime2_arch of prime is
signal N3L_N0, N3L_N2L_N1, N2L_N1_N0, N2_N1L_N0: STD_LOGIC;
begin
N3L_N0 <= not N(3) and N(0);
N3L_N2L_N1 <= not N(3) and not N(2) and N(1) ;
N2L_N1_NO <= not N(2) and N(1) and N(0);
N2_N1L_N0 <= N(2) and not N(1) and N(0);
F <= N3L_N0 or N3L_N2L_N1 or N2L_N1_NO or N2_N1L_N0;
end prime2_arch;
или с условиями
architecture prime3_arch of prime is
signal N3L_N0, N3L_N2L_N1, N2L_N1_N0, N2_N1L_N0: STD_LOGIC;
begin
N3L_N0 <= '1' when N(3)='0' and N(0)='1' else 0;
N3L_N2L_N1 <= '1' when N(3)='0' and N(2)='0' and N(1)='1' else 0;
N2L_N1_NO <= '1' when N(2)='0' and N(1)='1' and N(0)='1' else 0;
N2_N1L_N0 <= '1' when N(2)='1' and N(1)='0' and N(0)='1' else 0;
F <= N3L_N0 or N3L_N2L_N1 or N2L_N1_NO or N2_N1L_N0;
end prime3_arch;
или с использованием select
architecture prime4_arch of prime is
begin
with N select
F <= '1' when "0001",
'1' when "0010",
'1' when "0011" | "0101" | "0111",
'1' when "1011" | "1101",
'0' when others;
end prime4_arch;
или с использованием конвертации в Integer
architecture prime5_arch of prime is
begin
with CONV_INTEGER(N) select
F <= '1' when 1 | 2 | 3 | 5 | 7 | 11 | 13,
'0' when others;
end prime5_arch;
=====3 - Поведенческое проектирование, Process=====
process (signal_name, ... signal_name)
type declarations
variable declarations -- вместо сигналов, локальная видимость
constant declarations
function definitions
procedure definitions
begin
sequential_statement;
...
sequential_statement;
end process;
Процесс всегда либо выполняется, либо приостановлен. Перечень сигналов (sensitivitty_list) задает условия, когда процесс выполняется. Первоначально процесс остановлен.
ОПЕРАТОРЫ выполняются внутри ПРОЦЕССА ПОСЛЕДОВАТЕЛЬНО!
Оператор <= в процессе - это последовательный оператор присваивания! Для переменных это оператор := .
variable ariable_name: vatiable_type;
signal_name <= expression
variable_name := expression
Пример:
architecture prime6_arch of prime is
begin
process(N)
variable N3L_N0, N3L_N2L_N1, N2L_N1_N0, N2_N1L_N0: STD_LOGIC;
begin
N3L_N0 := not N(3) and N(0);
N3L_N2L_N1 := not N(3) and not N(2) and N(1) ;
N2L_N1_NO := not N(2) and N(1) and N(0);
N2_N1L_N0 := N(2) and not N(1) and N(0);
F <= N3L_N0 or N3L_N2L_N1 or N2L_N1_NO or N2_N1L_N0;
end process;
end prime6_arch;
тоже с приведением к Integer
architecture prime7_arch of prime is
begin
process(N)
variable NI: INTEGER;
begin
NI = CONV_INTEGER(N);
if NE=1 or NI=2 then F <= '1';
elsif NI=3 or NI=5 or NI=7 or NI=11 or NI=13 then F <= '1';
else F <= '';
end if;
end process;
end prime7_arch;
тоже с оператором выбора
case expression is
when choises => sequential_statement;
...
when choises => sequential_statement;
end case
architecture prime8_arch of prime is
begin
process(N)
variable NI: INTEGER;
begin
case CONV_INTEGER(N) is
when 1 => F <= '1';
when 2 => F <= '1';
when 3 | 5 | 7 | 11 | 13 => F <= '1';
when others F <= '0';
end case;
end process;
end prime8_arch;
====Последовательные циклы в процессе====
loop
sequential_statement;
...
sequential_statement;
end loop;
for identifier in range loop
sequential_statement;
...
sequential_statement;
end loop;
exit - выход на след. оператор после цикла.
next - переход на след итерацию в цикле.
while boolean_expression loop
sequential_statement;
...
sequential_statement;
end loop;
====Задержки в процессе====
Задержка 4нс при переходе выхода из 0 в 1, и 3нс при переходе из 1 в 0:
Z <= '1' after 4 ns when X='1' and Y='0' else '0' after 3ns;
entity InhibitTestBench is
end InhibitTestBench;
architecture InhibitTestBench_arch of InhibitTestBench is
component Inhibit port (X,Y: in BIT; Z: out BIT); end component;
signal XT,YT,ZT: BIT;
begin
U1: Inhibit port map (XT,YT,ZT);
process
begin
XT<= '0'; XT <= '0';
wait for 10 ns;
XT<= '0'; XT <= '1';
wait for 10 ns;
XT<= '1'; XT <= '0';
wait for 10 ns;
XT<= '1'; XT <= '1';
wait; -- безусловная остановка процесса
end process;
end InhibitTestBench_arch;