Главная
Новости рынка
Рубрикатор



Архив новостей -->



 



   

В. Стешенко, А. Самохин

Школа разработки аппаратуры цифровой обработки сигналов на ПЛИС
Занятие 6. Язык описания аппаратуры AHDL (продолжение)

Последовательностная логика в AHDL

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

Объявление регистров

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

Для подсоединения примера примитива, макрофункции или цифрового автомата к другой логике в TDF-файле можно использовать порты. Порт примера описывается в следующем формате: “<имя примера>.<имя порта>”.

Имя порта — это вход или выход примитива, макрофункции или цифрового автомата, что является синонимом имени вывода в файлах проектов (GDF-файл), “*.WDF” и других.

На врезке 1 приводится файл bur_reg.tdf, содержащий байтовый регистр, который фиксирует значения на входах d по выходам q на фронте синхроимпульса, когда уровень загрузки высокий.

Врезка 1

SUBDESIGN bur_reg
             (
                     clk, load, d[7..0]  :  INPUT;
                     q[7..0]  : OUTPUT;
              )
      VARIABLE
            ff[7..0]  :  DFFE;
      BEGIN
            ff[].clk = clk;
            ff[].ena = load;
            ff[].d = d[];
            q[] = ff[].q
      END;

Как видно из файла, регистр объявлен в секции VARIABLE как D-триггер с разрешением (DFFE). В первом булевом уравнении в логической секции происходит соединение входа тактового сигнала подпроекта к портам тактового сигнала триггеров ff[7..0]. Во втором уравнении отпирающий тактовый сигнал соединяется с загрузкой. В третьем уравнении входы данных подпроекта соединяются с портами данных триггеров ff[7..0]. В четвёртом уравнении выходы подпроекта соединяются с выходами триггеров. Все четыре уравнения оцениваются одновременно.

Можно также в секции VARIABLE объявить T-, JK- и SR-триггеры и затем использовать их в логической секции. При использовании T-триггеров придётся в третьем уравнении изменить порт d на t. При использовании JK- и SR-триггеров вместо третьего уравнения придётся записать два уравнения, в которых происходит соединение портов j и k или s и r с сигналами. При загрузке регистра по заданному фронту глобального тактового сигнала фирма Altera рекомендует использовать вход разрешения одного из регистров: DFFE, TFFE, JKFFE или SRFFE, чтобы контролировать загрузку регистра.

Можно объявить регистровые выходы, если объявить выходы подпроекта как D-триггеры в секции VARIABLE.

Приведённый на врезке 2 файл reg_out.tdf обеспечивает те же функции, что и предыдущий (bur_reg.tdf), но имеет регистровые выходы.

Врезка 2

SUBDESIGN reg_out
             (
                     clk, load, d[7..0]  :  INPUT;
              q[7..0]  : OUTPUT;
              )
      VARIABLE
                     q[7..0]  :  DFFE;
      BEGIN
                     q[].clk = clk;
                     q[].ena = load;
                     q[] = d[];
      END;

При присвоении значения регистровому выходу в логической секции это значение формирует входные d-сигналы регистров. Выход регистра не изменяется до тех пор, пока не придёт фронт синхросигнала. Для определения тактирующего сигнала регистра нужно использовать описание в формате “<имя выходного вывода>.clk” для входа тактирующего сигнала регистра в логической секции. Глобальный синхросигнал можно реализовать примитивом GLOBAL или выбором в диалоговом окне компилятора Logic Synthesis (логический синтез) опции Automatic Global Clock.

Каждый отпирающий D-тригер, объявленный в секции VARIABLE, возбуждает выход с таким же именем, поэтому можно обращаться к q выходам объявленных триггеров без использования q-порта этих триггеров.

Создание счётчиков

Счётчиками называются последо-вательностные логические схемы для счёта тактовых импульсов. В некоторых счётчиках реализован счёт вперед и назад (реверсивные счётчики), в некоторые счётчики можно загружать данные, а также обнулять их. Счётчики обычно определяют как D-триггеры (DFF и DFFE) и используют операторы IF.

На врезке 3 приведён файл ahdlcnt.tdf, который реализует 16-бит загружаемый счётчик со сбросом.

Врезка 3

SUBDESIGN ahdlcnt
             (
                     clk, load, ena, clr, d[15..0]  :  INPUT;
      q[15..0]  : OUTPUT;
              )
      VARIABLE
                     count[15..0]  :  DFFE;
      BEGIN
                     count[].clk = clk;
                     count[].clrn = !clr;
                     IF load THEN
                                 count[].d = d[];
                     ELSIF ena THEN
count[].d = count[].q + 1;
                   ELSE
count[].d = count.q;
                   END IF;
                   q[] = count[];
      END;

В данном файле в секции VARIABLE объявлены 16 D-триггеров, и им присвоены имена от count0 до count15. В операторе IF определяется значение, загружаемое в триггеры по фронту синхросигнала (например, если загрузка запускается VCC, то триггерам присваивается значение d[ ]).

Цифровые автоматы с памятью (state mashine)

Цифровые автоматы так же, как таблицы истинности и булевы уравнения, легко реализуются в языке AHDL. Язык структурирован, поэтому пользователь может либо сам назначить биты и значения состояний, либо предоставить эту работу компилятору системы MAX+plus.

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

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

  • назначает биты, выбирая для каждого либо T-триггер, либо D-триггер;
  • присваивает значения состояний;
  • применяет сложные методы логического синтеза для получения уравнений возбуждения.

По желанию пользователя можно задать в TDF-файле переходы в машине состояний с помощью объявления таблицы истинности.

В языке AHDL для задания цифрового автомата нужно включить в TDF-файл следующие элементы:

  • объявление цифрового автомата (в секции VARIABLE);
  • булевы уравнения управления (в логической секции);
  • переходы между состояниями (в логической секции).

Цифровые автоматы в языке AHDL можно также экспортировать и импортировать, совершая обмен между файлами типа TDF и (GDF-файл) или “*.WDF”; при этом входной или выходной сигнал задаётся как порт цифрового автомата в секции SUBDESIGN.

Цифровой автомат задают в секции VARIABLE путём объявления имени цифрового автомата, его состояний и, возможно, выходных битов.

На врезке 4 приведён файл simple.tdf, который реализует функцию D-триггера.

Врезка 4

SUBDESIGN simple
       (
          clk     :  INPUT;
          reset  :  INPUT;
          d  :  INPUT;
          q  :  OUTPUT;
        )
VARIABLE
      ss     :  MACHINE WITH STATES  (s0, s1);
BEGIN
          ss.clk = clk;
          ss.reset = reset;
          CASE ss IS
           WHEN s0 Ю
                q = GND;
                IF d THEN
                     ss = s1;
                END IF;
           WHEN s1 Ю
                q = VCC;
                IF !d THEN
                     ss = s0;
                END IF;
           END CASE;
END;

В данном файле в секции VARIABLE объявлен цифровой автомат (state machine) ss. Состояния автомата определяются как s0 и s1. Биты состояний не определены.

Сигналы Clock, Reset и Enable управляют триггерами регистра состояний в цифровом автомате. Эти сигналы задаются булевыми уравнениями управления в логической секции.

В предыдущем примере (файл simple.tdf) синхросигнал цифрового автомата (Clock) формируется входом clk. Асин-хронный сигнал сброса цифрового автомата (Reset) формируется входом reset, имеющим высокий активный уровень. Для подключения сигнала отпирания (Enable) нужно добавить в данный файл проекта строку “ena : INPUT;” в секцию SUBDESIGN, а также добавить в логическую секцию булево уравнение “ss.ena = ena;”.

Для задания выходных значений можно использовать операторы IF и CASE. В приведённом выше примере (файл simple.tdf) значение выхода q устанавливается равным GND, если цифровой автомат ss находится в состоянии s0, и равным VCC, когда она находится в состоянии s1. Эти присваивания делаются в предложениях WHEN оператора CASE.

Выходные значения можно также задавать в таблицах истинности, как будет описано в разделе “Присвоение битов и значений в машине состояний”.

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

В приведённом выше примере (файл simple.tdf) переходы для каждого состояния определены в предложениях WHEN оператора CASE.

Бит состояния — это выход триггера, используемый для хранения одного бита значений цифрового автомата. В большинстве случаев для минимизации логических ресурсов следует предоставить компилятору системы MAX+plusII присвоение битов и значений состояния. Однако пользователь может сделать это самостоятельно в объявлении цифрового автомата, если, например, он хочет, чтобы определённые биты были выходами цифрового автомата.

Если выходы цифрового автомата зависят только от его состояния, их можно задать в предложении WITH STATES объявления цифрового автомата. Это сделает их менее подверженными ошибкам. Кроме того, в некоторых случаях для логических операций потребуется меньше логических ячеек.

На врезке 5 приведён пример, в котором реализован автомат Мура с четырьмя состояниями.

Врезка 5

SUBDESIGN moore1
(
 clk  :  INPUT;
 reset  :  INPUT;
        y  :  INPUT;
 z  :  OUTPUT;
)
VARIABLE       % current current %
               % state output %
      ss  : MACHINE OF BITS (z)
                           WITH STATES (s0 = 0,
                                        s1 = 1,
                                        s2 = 1,
                                        s3 = 0);
      BEGIN
                    ss.clk = clk;
                    ss.reset = reset;
                    TABLE
                    % current current next %
                    % state input state %
                          ss,    Y     Ю    ss;
                          s0,    0     Ю    s0;
                          s0     1     Ю    s2;
                          s1,    0     Ю    s0;
                          s1,    1     Ю    s2;
                          s2,    0     Ю    s2;
                          s2     1     Ю    s3;
                          s3,    0     Ю    s3;
                          s3,    1     Ю    s1;
                   END TABLE;
       END;

Здесь состояния определены в объявлении цифрового автомата. Переходы между состояниями определены в таблице next_state, которая задана в объявлении таблицы истинно-сти. В данном примере машина имеет четыре состояния и только один бит состояния z. Компилятор системы MAX+plusII автоматически добавляет ещё один бит и делает соответствующие присвоения этой синтезированной переменной для того, чтобы получилась машина с четырьмя состояниями. Такой цифровой автомат (state machine) требует, по крайней мере, 2 бит.

Если значения состояний используются как выходы (как в файле moore1.tdf), для проекта потребуется меньше логических ячеек, но, возможно, они потребуют больше логики, чтобы возбудить входы триггера. В этом случае модуль логического синтезатора компилятора, возможно, не сможет полностью минимизировать автомат.

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

Этот альтернативный метод использован в файле moore2.tdf на врезке 6.

Врезка 6

SUBDESIGN moore2
          (
           clk  :  INPUT;
           reset  :  INPUT;
           Y  :  INPUT;
           z  :  OUTPUT;
)
VARIABLE
ss  :  MACHINE WITH STATES (s0, s1, s2, s3);
zd  :  NODE;
BEGIN
             ss.clk = clk;
             ss.reset = reset;
             z = DFF(zd, clk, VCC, VCC);
TABLE
%     current       current       next        next %
%     state         input         state       output %
         ss,        y   Ю        ss,         zd;
         s0,        0   Ю        s0,         0;
         s0         1   Ю        s2,         1;
         s1,        0   Ю        s0,         0;
         s1,        1   Ю        s2,         1;
         s2,        0   Ю        s2,         1;
         s2,        1   Ю        s3,         0;
         s3,        0   Ю        s3,         0;
         s3,        1   Ю        s1,         1;
END TABLE;
END;

В данном примере вместо того, чтобы задать выходы присвоением значений состояниям в объявлении цифрового автомата, в объявление таблицы истинности добавлен один столбец под названием “next output (следующий выход)”. В этом методе для синхронизации выходов синхросигналом используется D-триггер, вызов которого записан с помощью непосредственной ссылки.

В языке AHDL возможна реализация цифрового автомата с асин-хронными выходами. Выходы такого типа автоматов всегда изменяются, когда изменяются входы, независимо от состояния синхросигнала.

В файле mealy.tdf (врезка 7) реализован автомат Мили с четырьмя состояниями и асинхронными выходами.

Врезка 7

     SUBDESIGN mealy
            (
                         clk  :  INPUT;
                         reset  :  INPUT;
                         Y  :  INPUT;
                         z  :  OUTPUT;
             )
     VARIABLE
                 ss  :  MACHINE WITH STATES (s0, s1, s2, s3);
      BEGIN
                         ss.clk = clk;
                         ss.reset = reset;
                         TABLE
% current       current       current        next %
% state         input         output         state %
         ss,          y   Ю        z,       ss;
         s0,          0   Ю        0,       s0;
         s0           1   Ю        1,       s1;
         s1,          0   Ю        1,       s1;
         s1,          1   Ю        0,       s2;
         s2,          0   Ю        0,       s2;
         s2,          1   Ю        1,       s3;
         s3,          0   Ю        0,       s3;
         s3,          1   Ю        1,       s0;
                         END TABLE;
           END;

Реализация иерархического проекта

В иерархической структуре проекта TDF-файлы, написанные на языке AHDL, можно использовать вместе с другими файлами проектов. На нижнем уровне проекта могут быть макрофункции, поставляемые фирмой Altera или разработанные пользователями.

В системе MAX+plusII есть большая библиотека, представляющая собой блоки высокого уровня, используемые для создания проекта с иерархической логикой.

В языке AHDL существуют два способа макрофункции:

  • объявить переменную типа <macrofunction> в объявлении примеров INSTANCE в секции VARIABLE и использовать порты примера макрофункции в логиче-ской секции. В этом способе важное значение имеют имена портов;
  • использовать для макрофункции непосредственную ссылку в логической секции файла TDF. В этом способе важен порядок портов.

Входы и выходы макрофункций перечисляются в описании прототипов функций (FUNCTION PROTOTYPE). Прототипы функций можно записать в отдельный файл и указать его в своём файле с помощью директивы INCLUDE. Такие Include-файлы создаются автоматически для данного проекта с помощью команды Create Default Include File. Include-файл вставляется вместо вызывающей его директивы INCLUDE. Для всех макрофункций системы MAX+plusII Include-файлы должны находить-ся в каталоге \maxplus2\max2inc.

На врезке 8 приведён файл macro1.tdf, который реализует 4-бит счётчик, подсоединённый к дешифратору 4 бит x 16 бит. Соответствующие макрофункции вызываются объявлениями примеров в секции VARIABLE.

Врезка 8

INCLUDE "4count";
INCLUDE "16dmux";

SUBDESIGN macro2
(
   clk         :  INPUT;
   out[15..0]  :  OUTPUT;
)
VARIABLE
   q[3..0]     :  NODE;
BEGIN
   (q[3..-], ) =  4count  (clk, , , , , GND, , , , );
%

   out[15..0]  = 16dmux (.(d, c, b, a)=q[3..0]);
% equivalent in-line ref. with positional port association %
% out[15..0]  = 16dmux (q[3..0]);
END;

В данном файле используются директивы INCLUDE для импортирования прототипов функций для двух макроофункций фирмы Altera: 4count и 16dmux. В секции VARIABLE объявляются две переменные: counter и decoder — как примеры этих макрофункций. В логической секции определяются входные порты для обеих макрофункций в формате “<имя переменной-примера>.<имя порта>” (Они ставятся в левой части булевых уравнений, а выходные порты — справа). Порядок портов в прототипе функции не важен, так как имена портов в логической секции перечисляются явно.

На врезке 9 приведён файл macro2.tdf, выполняющий те же функции, что и предыдущий, но макрофункции в нём вызываются непосредственной ссылкой.

Врезка 9

INCLUDE "4count";
INCLUDE "16dmux";

SUBDESIGN macro1
(
   clk         :  INPUT;
   out[15..0]  :  OUTPUT;
)
VARIABLE
   counter  :  4count;
   decoder  :  16dmux;
BEGIN
   counter.clk = clk;
   counter.dnup = GND;
   decoder.(d,c,b,a) = counter.(qd,qc,qb,qa);
   out[15..0] = deckder.q[15..0];
END;

Вызов макрофункций 4count и 16dmux осуществляется в логической секции непосредственной ссылкой (в правой части булевых уравнений).

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

  • создать логику для макрофункции в файле проекта;
  • определить порты макрофункции в объявлении прототипа функции.

Прототип функции даёт краткое описание функции: её имя, а также входные, выходные и двунаправленные порты. Можно также использовать машинные порты для макрофункций, которые импортируют или экспортируют цифровой автомат.

Объявление прототипов функций может быть размещено в Include-файле, который вызывается в пользовательском файле. Используя команду Create Default Include File, можно автоматически создавать Include-файл с прототипом функции для любого файла проекта.

  • вставить в файл пример макрофункции с помощью объявления примера в секции VARIABLE или с помощью непосредственной ссылки в тексте;
  • использовать макрофункцию в файле.

Для использования макрофункции её нужно либо включить в описание прототипа функции в TDF-файле, либо указать в директиве INCLUDE файла TDF имя Include-файла, содержащего прототип этой макрофункции.

Управление синтезом

Можно ограничить логический синтез с помощью замены переменных типа узел (NODE) примитивами SOFT и LCELL. Переменные NODE и примитивы LCELL обеспечивают наилучшее управление логическим синтезом. Примитивы SOFT обеспечивают более слабое управление логическим синтезом.

Переменные NODE, которые объявляются в секции VARIABLE, накладывают слабые ограничения на логический синтез. Во время синтеза модуль логического синтеза компилятора системы MAX+plusII заменяет каждый пример использования переменной NODE логикой, которую она представляет. Затем происходит минимизация логики до одной логиче-ской ячейки. Этот метод обычно приводит к ускорению работы схемы, но в результате может получиться слишком сложная логика или же её трудно свести к одной ячейке.

Буферы SOFT обеспечивают лучшее управление использованием ресурсов, чем переменные NODE. Модуль логического синтезатора выбирает, когда заменить примеры использования примитивов SOFT примитивами LCELL.

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

Наиболее сильное управление процессом логического синтеза обеспечивается примитивами LCELL. Модуль логического синтезатора минимизирует всю логику, которая запускает примитив LCELL, таким образом, чтобы можно было свести её к одной логической ячейке. Примитивы LCELL реализуются в виде одной логической ячейки (их нельзя убрать из проекта, даже если они имеют единственный вход). Если проект минимизирован до такой степени, что один примитив LCELL имеет единственный вход, в этом случае вместо примитивов LCELL можно использовать примитивы SOFT, которые убираются в процессе логического синтеза.

Следующее занятие будет посвящено примеру реализации алгоритмов фильтрации и демодуляции на ПЛИС.

Тел.: 263 6736
E-mail: stesheenk@sm.bmstu.ru


фотоаппараты и фотокамеры





Реклама на сайте
тел.: +7 (495) 514 4110. e-mail:admin@eust.ru
1998-2014 ООО Рынок микроэлектроники