Блокировка уровня чувствительности.
Этот раздел описывает блокировку уровня чувствительности на языке VHDL.
Рассмотрим пример описания блокировки:
signal input_foo, output_foo, ena : bit ;
...
process (ena, input_foo)
begin
if (ena = '1') then
output_foo <= input_foo ;
end if ;
end process ;
В этом примере, список чувствительности необходим, он указывает, что процесс выполняется всякий раз, когда сигналы ena или input_foo изменяются. Также, из-за того, что присвоение глобального сигнала output_foo скрыто в операторе условия , output_foo не может измениться (сохраняется его старое значение) если ena - '0'. Если ena становиться равным '1' output_foo немедленно изменяется, со значением input_foo это происходит всякий раз с изменением значение ena. Это и есть блокировка уровня чувствительности.
В технологиях, где блокировка уровня чувствительности не допустима, компилятор, транслирует первоначально сгенерированную блокировку в эквивалентную схему, используя комбинационный блок.
b1 : block (ena='1')
begin
output_foo <= GUARDED input_foo ;
end block ;
Оперативная память (RAM).
Имеются два основных типа компонентов оперативной памяти, которые могут создаваться при логическом синтезе: RAM с одним портом и отдельными строками для ввода и вывода данных, и RAM с одним портом и двунаправленными строками данных.
Оба этих типа оперативной памяти поддерживают синхронное или асинхронное чтение и запись. Синхронная запись использует сигнал от положительного фронта, и сигнал от отрицательного фронта для запрещения записи и разрешения, адресных входов, и сигналов данных. Процесс вывода различается между этими видами оперативной памяти, различие заключается в синхронизации или не синхронизации операции чтения адреса, с записью.
Выходные сигналы RAM можно также запирать также с помощью положительного фронта импульса синхронизации. Следующие два примера демонстрируют разность между синхронными и не синхронными RAM. Первый пример, RAM_EXAMPLE1, синхронизирует чтение адреса, в то время как второй пример, RAM_EXAMPLE2, не синхронизирует.
library IEEE,EXEMPLAR;
use IEEE.STD_LOGIC_1164.all;
use EXEMPLAR.EXEMPLAR_1164.all;
entity RAM_EXAMPLE1 is
port (DATA:
in std_logic_vector(7 downto 0);
ADDRESS:
in std_logic_vector(5 downto 0);
WE,INCLOCK,OUTCLOCK: in std_logic;
Q:
out std_logic_vector(7 downto 0));
end RAM_EXAMPLE 1;
architecture EX1 of RAM_EXAMPLE 1 is
type MEM_TYPE is array(63 downto 0) of
std_logic_vector(7 downto 0);
signal MEM: MEM_TYPE;
begin
L0: process
(INCLOCK,OUTCLOCK,WE,ADDRESS) begin
if (INCLOCK='1' and INCLOCK'event) then
if (WE='1') then
MEM(evec2int(ADDRESS)) <= DATA;
end if;
end if;
if (OUTCLOCK='1' and OUTCLOCK'event) then
q <= MEM(evec2int(ADDRESS));
end if;
end process;
end EX1;
library IEEE,EXEMPLAR;
use IEEE.STD_LOGIC_1164.all;
use EXEMPLAR.EXEMPLAR_1164.all;
entity RAM_EXAMPLE2 is
port (DATA:
in std_logic_vector(7 downto 0);
ADDRESS:
in std_logic_vector(5 downto 0);
WE,INCLOCK,OUTCLOCK: in std_logic;
Q:
out std_logic_vector(7 downto 0));
end RAM_EXAMPLE2;
architecture EX2 of RAM_EXAMPLE2 is
type MEM_TYPE is array (63 downto 0) of
std_logic_vector(7 downto 0);
signal MEM: MEM_TYPE;
signal ADDRESS_INT: std_logic_vector(5 downto 0);
begin
L0: process (INCLOCK,OUTCLOCK,WE,ADDRESS) begin
if (INCLOCK='1' and INCLOCK'event) then
ADDRESS_INT <= ADDRESS;
if (WE='1') then
MEM(evec2int(ADDRESS)) <= DATA;
end if;
end if;
if (OUTCLOCK='1' and OUTCLOCK'event) then
Q <= MEM(evec2int(ADDRESS_INT));
end if;
end process;
end EX2;
Эти модели используют пакет EXEMPLAR_1164 для подпрограммы evec2int(). Если вы желаете отмоделировать эту модель, нужно добавить библиотеку к соответствующей папке ресурсов моделирования проекта.
Регистры.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.