Меню сайта
Поиск
Форма входа
Категории раздела
Учеба [4]
Электроника [1]
Компы [0]
Hi-Tech [0]
Прочее [1]
Мини-чат
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Воскресенье, 19.05.2024, 04:02
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход
Антиботанский сервак
Главная » Статьи » Учеба

Операторы языка VHDL (спижжено и Иванца)

Операторы языка VHDL

1.1.      Последовательные операторы

1.1.1.  Операторы присваивания

Эти операторы уже затрагивались ранее. Сейчас подробнее рассмотрим последовательное сигнальное присваивание (необходимо отличать последовательное сигнальное присваивание от параллельного присваивания). Синтаксическая формула оператора присваивания значения сигналу имеет вид:

 

<приемник> <= [<модель задержки>] <прогноз поведения>;

 

модель задержки

TRANSPORT | [REJECT <выражение времени>] INERTIAL

прогноз поведения

<значащее выражение> [AFTER <выражение времени>]

 

Приемник – сигнал, представленный простым именем или компонентом агрегатного сигнала. Прогноз поведения (в стандартах VHDL — Wave-form, временная диаграмма) задает порядок изменения сигнала после события, инициирующего исполнение этого оператора. При этом временные интервалы для определения переходов задаются относительно времени возникновения инициирующего события.

Значащее событие – любое выражение, дающее результат того же типа, что и приемник.

Транспортная задержка – все изменения сигнала источника будут передаваться приемнику.

Инерционная задержка – передача сигнала осуществляется только в случае, если входной сигнал будет сохранять соответствующий уровень в течение заданного отрезка времени.

Инерционная задержка моделирует работу реальной схемы, т.е. учет емкостей входа, невозможность мгновенного изменения электрических сигналов. Транспортная задержка используется на этапе моделирования алгоритма.

 

Инерционная задержка

x <= INERTIAL Y AFTER 3 ns;

x <= '1' AFTER 3 ns, '0' AFTER 20 ns, 'Z' AFTER 50 ns;

 

Транспортная задержка

x <= TRANSPORT Y AFTER 3 ns;

 

1.1.2.  Параллельное присваивание

 

[<метка>:] <безусловное параллельное присваивание>

|[<метка>:] <условное присваивание>

|[<метка>:] <присваивание по выбору>

 

По синтаксису и правилам исполнения безусловное параллельное присваивание совпадает с последовательным присваиванием сигналу. Варианты различаются по локализации в программе и характеризуются различными условиями исполнения. Наиболее существенные различия:

параллельное присваивание локализуется в общем разделе архитектурного тела, а последовательное – только в теле процесса;

последовательное присваивание сигналу выполняется после того, как инициировано исполнение процесса и выполнены все предшествующие операторы в теле процесса;

оператор параллельного присваивания выполняется сразу (с точки зрения модельного времени) после изменения сигналов в правой части этого оператора.

В обоих случаях результаты присвоения сначала фиксируются в драйвере сигнала и передаются сигналу, т. е. изменения могут влиять на другие операторы, только после исполнения всех операторов и процессов, инициированных одним событием, или через интервал модельного времени, заданный опцией AFTER.

Условное присваивание и присваивание по выбору во многом сходны с условным оператором и оператором выбора, соответственно – описанные действия выполняются при определенных условиях. Различие, кроме единых для всех параллельных и последовательных операторов свойств, состоит в том, что условный оператор и оператор выбора являются составными, т. е. условие может задавать в них исполнение последовательности действий, а в операторах присваивания – только присвоение одного значения.

 

a       Условное присваивание

<приемник> <= [GUARDED] [TRANSPORT] [<модель задержки>] «<прогноз поведения> WHEN <условие> ELSE »

<прогноз поведения>;

 

GUARDED, TRANSPORT – опции, обозначающие соответственно охраняемый и транспортный.

Пример. Двухвходовый буфер с тремя состояниями на выходе может быть представлен следующим оператором:

 

Z_out <= TRANSPORT

x0 AFTER 2ns WHEN (adr='0' and en='l') ELSE

xl AFTER 2ns WHEN (adr='l' and en='l') ELSE

'Z' AFTER 5ns;

 

Пример 2.

q <= 3 WHEN high = '1' ELSE       

     2 WHEN mid  = '1' ELSE       

     1 WHEN low  = '1' ELSE       

     0;  

 

b       Присваивание по выбору

 

WITH <ключевое выражение> SELECT

<приемник><=[QUARDED][TRANSPORT] [<модель задержки>]

«<прогноз поведения> WHEN <вариант>,»

<прогноз поведения> WHEN <вариант>;

 

Буфер с тремя состояниями, представленный в предыдущем примере:

 

WITH a&b  SELECT

Z_out<= TRANSPORT x0 AFTER 2ns WHEN "01",

xl AFTER 2ns WHEN "11",

'Z' AFTER 5ns WHEN OTHERS;

 

Пример 2. Мультиплексор 4-1.

   WITH s SELECT      

   output    <=   d0 WHEN 0,

                  d1 WHEN 1,

                  d2 WHEN 2,

                  d3 WHEN 3;

                    

Важно отметить, что если условный оператор IF и оператор выбора CASE не могут выполняться над данными, вырабатываемыми модулями, представленными различными операторами процесса, то условное присваивание и присваивание по выбору позволяют описывать такие ситуации.

1.1.3.  Оператор условия и оператор выбора

Оператор условия IF и оператор выбора САSЕ позволяют описывать совокупности действий, некоторые из которых исполняются при возникновении определенных условий в реальном устройстве и при моделировании, а иные при тех же условиях не исполняются.

 

IF <булевское выражение > ТНЕN

<оператор> «<оператор> »

«ELSIF <булевское выражение> THEN

<оператор> «<оператор> »

»

[ ELSE <оператор> «<оператор> » ]

END IF;

 

Условие должно иметь булевский тип BOOLEAN. В одном операторе IF может быть одна (ни одной) или более частей ELSIF. Ключевое слово ELSIF следует отличать от слов ELSE. Часть ELSЕ может быть только одна или ни одной.

 

Пример. RS-триггер.

IF s='1' THEN q<='1';

ELSIF r='1'THEN q<='0';

END IF;

 

 

CASE <ключевое выражение> IS

WНЕN<вариант>«|<вариант>»=><оператор> « <оператор>»

«WHEN<вариант>«|<вариант>»=><оператор>«<оператор>»»

END САSЕ;

 

вариант

<константное выражение> | <диапазон> I OTHERS

 

Оператор CASE выбирает один из вариантов, которые определяются ключевым выражением. Выражение должно быть дискретного типа или типа одноразмерного массива символов, значения которых могут быть представлены как строки или строка битов. Вариант должен быть такого же типа, как и выражение. Все возможные выборы должны быть перебраны. Для случая OTHERS должно быть такое значение, которое не соответствует предыдущим альтернативам.

 

CASE month IS

    WHEN feb =>

 

     IF leap THEN

     days <= 29;

     ELSE

             days <= 28;

     END IF;

 

    WHEN apr | jun | sep | nov => days <= 30;

    WHEN jul TO aug => days <= 31;

    WHEN OTHERS => days <= 31;

END CASE;

 

1.1.4.  Оператор повторения

 

[<метка цикла:] [<итерационная схема>] LOOP

<оператор> « <оператор> »

END LOOP [<метка цикла>];

 

итерационная схема

WHILE <условие> | FOR <идентификатор> IN <диапазон>

 

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

Общая ошибка: употребление параметра цикла снаружи оператора цикла.

 

loop1: FOR i IN 0 TO 9 LOOP

EXIT loopl WHEN A(i)>20;

NEXT WHEN A(i)>10;

sum:=sum +A(i); 

END LOOP loop1;

IF i = 20 THEN — ошибка! Параметр цикла снаружи цикла.

 

1.1.5.  Оператор next

 

[<метка>:] NEXT [<метка цикла>] [WHEN <условие>];

 

Оператор NEXT употребляется для завершения итераций цикла. При этом блокируется выполнение всех последующих операторов в текущем цикле.

 

 

1.1.6.  Оператор EXIT

 

[<метка>:] EXIT [<метка цикла>] [WHEN <условие>];

 

Оператор EXIT употребляется, чтобы завершить выполнение и, закрыть оператор цикла. Если условие (condition) есть TRUE, то осуществляется выход из цикла.

 

1.1.7.  Оператор NULL

 

NULL

 

Оператор NULL не представляет действий. Он употребляется, чтобы точно специфицировать, что нет действий. Типичное применение - в операторе case, чтобы определить действия во всех случаях.

 

1.2.      Параллельные операторы

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

 

 

1.2.1.  Оператор блока

Оператор блока BLOCK, подобно оператору PROCESS, является составным оператором, тело которого включает несколько операторов, но, в данном случае, параллельных. Операторы тела блока, как и другие параллельные операторы, обеспечивают возможность представления параллелизма в моделируемой системе. Эти операторы инициируются не по последовательному, а по событийному принципу, а результаты их исполнения становятся доступны другим операторам как включенным в блок, так и размещенным в других блоках или "индивидуально", только после исполнения всех операторов, инициированных одним событием.

В этом смысле операторы, включенные в блок, не отличаются от "индивидуальных" параллельных операторов.

Объединение операторов в блоки обеспечивает следующие возможности:

структуризация текста описания, т. е. возможность явного и наглядного выделения совокупности операторов, описывающих законченный функциональный узел;

возможность объявления в блоке локальных типов, сигналов, подпрограмм и некоторых других локальных объектов;

возможность приписывания всем или некоторым операторам блока общих условий инициализации.

Упрощенные правила записи оператора блока определены таким образом

 

<метка блока>: BLOCK [(охранное выражение)] [IS]

[<раздел деклараций блока> ]

BEGIN

<раздел операторов блока>

END BLOCK [<метка блока>];

 

Наиболее специфическими аспектами блочной организации являются понятия охранного выражения и охраняемого оператора присваивания.

Охранное выражение – это любое выражение логического типа, аргументами которого являются сигналы. Любое изменение сигналов, входящих в охранное выражение, вызывает вычисление значения этого выражения и присвоение полученного значения предопределенной переменной QUARD. Область действия переменной QUARD — все тело блока, и она может использоваться как обычная логическая переменная во вложенных операторах блока. Охраняемый оператор присваивания использует значение переменной QUARD без явного указания условия в программе. Если QUARD = '0', то исполнение операторов присваивания, содержащих ключевое слово QUARDED, в таком блоке запрещено.

Рассмотрим одноразрядный сумматор.

 

ENTITY add1_e IS

PORT (b1, b2, enable : IN BIT;

c1, s1 : out BIT);

END add1_e;

 

ARCHITECTURE struct OF add1_e is

BEGIN

 

p0: BLOCK (enable = '1')

BEGIN   

s1<= GUARDED (b1 XOR b2);

c1<= GUARDED (b1 AND b2);

END BLOCK p0;

 

END struct;

 

Охранным выражением блока является выражение enable = 1. Если это выражение принимает значение TRUE (истина), то охраняемые конструкции (назначения сигналов) выполняются, т.е. одноразрядный сумматор складывает числа, если же значение выражения является FALSE (ложь), то охраняемые назначения сигналов не выполняются, т.е. сумматор не складывает числа b1, b2. Охрана назначения сигналов, осуществляется указанием ключевого слова GUARDED.

 

В качестве другого примера охраняемого блока приведем пример   описания D-триггера с асинхронным сбросом в виде блока с охранным выражением (clk = ‘1’ or clr = ‘1’).

 

D_LATCH: block (clk ='1' or clr = '1')

begin

Q <= guarded '0' when clr = '1';

else D when clk = '1';

else Q;

end block D_LATCH;

 

В данном примере clk - вход синхронизации, clr - асинхронный сброс, D - вход данных, Q - выход триггера. Когда охранное выражение имеет значение ложь, то сигнал Q в левой части сохраняет свое прежнее значение. Cигнал асинхронного сброса имеет приоритет по отношению к сигналу clk.

1.2.2.  Оператор генерации

Данный оператор используется для генерации схем, имеющих регулярные элементы. Например, сумматоров. Синтаксис оператора генерации:

<метка> : for <параметр генерации> generate

    <параллельные операторы>

end generate;

 

или

<метка>: if <условие генерации> generate

    <параллельные операторы>

end generate;

Различия параллельного оператора генерации и последовательных операторов for, if.

1.     Оператор генерации – параллельный оператор, for, if – последовательные операторы.

2.      Оператор генерации не имеет фраз else, elsif.

3.     Для оператора генерации необходима метка.

4.     Внутри оператора генерации могут применяться только параллельные операторы. Внутри последовательных операторов for, if могут применяться только последовательные операторы.

Пример. В качестве примера опишем создание регистра на основе D-триггера.

entity reg is

port (clk : in Bit;

      d: in BIT_VECTOR (3 DOWNTO 0);

      Q: out BIT_VECTOR (3 DOWNTO 0));

end entity reg;

   

architecture STRUCT of reg is

 

component D_FF

  port (D, clk : in BIT; Q: out BIT);

end component D_FF;

 

begin

  Gen : for i in  0 to 3 generate

         D_FF_i : D_FF port map (d(i), clk, q(i));

    end generate;

end STRUCT;

 

entity D_FF is

port (D,clk : in BIT;

      Q : out BIT);

end entity D_FF;

   

architecture F of D_FF is

begin

    process(clk)

    begin

      if clk = '1' and clk'Event

        then Q <= D;

      end if;

    end process;

end architecture F; 

 

Категория: Учеба | Добавил: Foboss (11.01.2011)
Просмотров: 7886 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Copyright MyCorp © 2024
Создать бесплатный сайт с uCoz