Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Architectureone offf IS. Elsif clk'eventandclk = '1' THEN. Architecture two of ff IS. Листинг 4. 3. Architecture three of rs_ff IS




ARCHITECTUREone OFff IS

Base_ff: PROCESS (Clk, Reset, R, S, D, Load)

           BEGIN

                          IF Reset = '1' THEN    Q < = '0';

ELSIF Clk'eventANDClk = '1' THEN

IF R = '1' THEN          Q < = '0';

                                          ELSIF S = '1' THEN Q < = '1';

                                          ELSIF Load = '1' THEN Q < = D;

END IF;

END IF;

END PROCESS Base_ff;

END one;

 

Поведение триггера можно описать, опираясь не только на последовательные операторы, но и на параллельные. В качестве примера приведем архитектурное тело описания поведения триггера RS-триггера с динамическим управлением, имеющего вход асинхронного сброса (листинг 4. 2).

 

Листинг 4. 2 ОписаниеRS-триггера с динамическим управлением

ARCHITECTURE two OF ff IS

SIGNAL Q_int: std_logic;

BEGIN

       -- комбинационная часть элемента

Q_int < = '0' WHEN R = '1' ELSE '1' WHEN S = '1' ELSE Q;

-- собственно элемент памяти с динамическим управлением

Q < = '0' WHEN Reset = '1' ELSE Q_int WHEN Clk'event AND

Clk = '1' ELSE Q;

END two;

 

Несмотря на синтаксическую правильность фрагмента, чаще используется процессное представление тактирующей части регистровых схем (второй оператор в программе). Выбор процессного представления диктуется его адекватной трактовкой практически любой компилирующей или моделирующей САПР, а также соответствием описания структуре логических ячеек ПЛИС. При процессном представлении, внутри оператора PROCESS обычно пользуются операторами условия (IF ) и выбора ( CASE ). В качестве примера рассмотрим архитектурное тело при процессном описании поведения RS-триггера (листинг 4. 3).

Листинг 4. 3

ARCHITECTURE three OF RS_FF IS

-- architecture " three" of entity ff

SIGNAL Q_int: std_logic;

BEGIN

       ff: PROCESS (Clk, Reset, En, Q_int)

       BEGIN

                   IF Reset = '1' THEN Q < = '0';

ELSIFClk'event AND Clk = '1' THEN

IF En = '1' THEN Q < = Q_int;

END IF;

ELSE Q < = Q;

END IF;

END PROCESS base_ff;

 

Q_int < = '0' WHEN R = '1' ELSE '1' WHEN S = '1' ELSE

D WHEN Load = ‘1’ ELSE Q;

 

END three;

Целесообразность подобного описания связана с тем, что в операторе PROCESS у последовательного оператора условия IF окончание оператора ELSE является опционным и может опускаться, а у параллельного оператора в форме условного присваивания окончание оператора ELSE является обязательным. Подобное кажущееся несущественным отличие при синтезе комбинационных фрагментов может (в случаях соответствующих описаний фрагментов) порождать появление у них на выходах «неожиданных» триггеров-защелок (LATH). Хотя современные системы синтеза цифровых устройств обычно выдают соответствующие предупреждения (warning) о введении подобных триггеров, наверное, лучше взять за правило избегать возможностей появления подобных ситуаций.

Регистр – это набор триггеров, объединенных общими цепями управления. Описание многоразрядных схем с памятью (регистров) практически не отличается от описания одиночных триггеров. Соответственно регистры в программах удобно представлять процессами, список чувствительности которых включает управляющие сигналы, а в теле процесса находятся операторы присваивания, определяющие состояние триггеров регистра после изменений управляющих сигналов. Логика анализа условий выполнения операторов в теле этого процесса не отличается от такой же логики для одиночных триггеров. Состояния триггеров отражаются переменными или сигналами. Можно использовать групповое (скалярное) представление всего кода состояния или индивидуальные имена для отдельных триггеров регистра, однако чаще используется групповое представление. Представление в виде битового вектора (bit_vector или std_logic_vector) обеспечивает сочетание простоты описания групповых действий над содержимым регистра с простотой выделения информации о состоянии отдельных разрядов.  В ряде случаев удобно использовать для представления содержимого регистра ограниченные целые и перечислимые типы данных. Такое представление может обеспечить большую наглядность и улучшить понимаемость программ. Примеры использования перечислимого типа имеются в следующем разделе.

При создании регистровых схем необходимо уделять внимание наличию или отсутствию синхронизации входных сигналов и ее типу (асинхронная схема, статическое или динамическое тактирование), а также  способам задания входных, выходных сигналов и внутренних состояний при описании многоразрядных схем (счетчиков, регистров сдвига и т. д. ). Для определения этих переменных или сигналов в многоразрядных схемах можно использовать понятие вектора или ограниченного целого (с диапазоном изменения, связанным с разрядностью схемы). Последовательностная схема образуется, если в операторе присваивания сигналу, представляющему триггера регистра, присутствует выражение, интерпретируемое при синтезе как комбинационная схема, выход которой подключен к информационному входу триггера, а входными сигналами являются другие триггера регистра. К этому типу схем относятся счетчики и такие схемы регистров, как регистры сдвига и другие.

Целесообразным вариантом построения регистровых схем следует считать построение описания в форме двух параллельных операторов. Первый оператор – оператор PROCESS, описывающий собственно многоразрядную память. Память имеет информационные входы, связанные с выходами  комбинационной схемы, вход тактирования, , а также при необходимости может содержать цепи асинхронного сброса и предустановки и разрешения изменений состояния. Второй параллельный оператор – параллельный условный оператор назначения сигнала, реализующий требуемое функционирование схемы регистра или счетчика. В качестве примера рассмотрим 4-разрядный регистр сдвига влево, вправо с занесением начального значения, имеющий вход асинхронного сброса (листинг 4. 4).

 

Листинг 4. 4

 

ENTITY Reg_Shift IS -- entity declaration

PORT (                 -- port statement

Clk, Reset             : IN std_logic;

Load, Left, Right: IN std_logic;

En                         : IN std_logic;

D_in                     : IN std_logic_vector(3 DOWNTO 0);

Q                          : BUFFER std_logic_vector(3 DOWNTO 0)

);

END Reg_Shift;

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...