Введение в стандарт IEEE. Справочное руководство по языку VHDL (Пересмотр стандарта IEEE. 1076-1987), страница 5

Блокировка уровня чувствительности.

     Этот раздел описывает блокировку уровня чувствительности на языке 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(). Если вы желаете отмоделировать эту модель, нужно добавить библиотеку к соответствующей папке ресурсов моделирования проекта.

Регистры.