Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.sm.bmstu.ru/sm5/n4/oba/zan6.html
Дата изменения: Thu Feb 15 17:43:26 2007
Дата индексирования: Mon Oct 1 18:56:42 2012
Кодировка: Windows-1251
СМ5 : Школа разработки аппаратуры цифровой обработки сигналов на ПЛИС
 

Школа разработки аппаратуры цифровой обработки сигналов на ПЛИС
Стешенко В.Б., Самохин А.В.


Занятие 6. Язык описания аппаратуры AHDL. (продолжение)

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

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

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

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

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

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


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.

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

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.

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


SUBDESIGN ahdlcnt

(
clk, load, ena, clr, d[15..0] : INPUT;
q[15..0] : OUTPUT;
)
VARIABLE
count[15..0] : DFF;
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[ ]).


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


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

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

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

  • назначает биты, выбирая для каждого бита либо T-триггер, либо D-триггер;
  • присваивает значения состояний;
  • применяет сложные методы логического синтеза для получения уравнений возбуждения.
  • По желанию пользователя можно задать в TDF-файле переходы в машине состояний с помощью объявления таблицы истинности.

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

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

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

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


    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+PLUS II присвоение битов и значений состояния. Однако пользователь может сделать это самостоятельно в объявлении цифрового автомата, если, например, он хочет, чтобы определенные биты были выходами цифрового автомата.

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

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


    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+PLUS II автоматически добавляет еще один бит и делает соответствующие присвоения этой синтезированной переменной для того, чтобы получилась машина с четырьмя состояниями. Такой цифровой автомат (state machine) требует, по крайней мере, двух битов.

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

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

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


    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 реализован автомат Мили с четырьмя состояниями и асинхронными выходами.


    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;


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


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

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

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

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

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

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


    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] = decoder.q[15..0];
    END;

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

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


     
    INCLUDE "4count";
    INCLUDE "16dmux";
    SUBDESIGN macro2
    (
    clk : INPUT;
    out[15..0] : OUTPUT;
    )
    VARIABLE
    q[3..0] : NODE;
    BEGIN
    (q[3..0], ) = 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;

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

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

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

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

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

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

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

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


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

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

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

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

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

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