Язык AHDL

Описание цифрового модуля на языке AHDL. Содержание конструкторского файла. Параметры и простые переменные в языках описания аппаратуры. Типы портов, узлов, групп, примитивы буферов и триггеров логического устройства. Создание конечного автомата.

Рубрика Программирование, компьютеры и кибернетика
Вид реферат
Язык русский
Дата добавления 16.01.2018
Размер файла 103,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

1. Структура текстового описания устройства

Описание цифрового устройства (модуля) на языке AHDL представляется в текстовом файле с расширением *.tdf (text design file - текстовый конструкторский файл). Файл содержит следующие разделы.

1. Предварительный раздел. Содержит вспомогательные операторы include, constant и др. Раздел в оригинальном описании названия не имеет. Все, что находится в этом разделе, считается расположенным за пределами разделов. Начинается с началом файла, заканчивается перед ключевым словом subdesign. Раздел не является обязательным.

2. Интерфейсный раздел (subdesign section). Содержит объявления входных и выходных портов (выводов) данного модуля. Начинается ключевым словом subdesign, за которым следует имя данного модуля. Такое же имя (без учета расширения) должно быть у создаваемого конструкторского файла. За именем располагается тело раздела, заключенное в круглые скобки. Раздел является обязательным.

3. Раздел переменных (variable section). Содержит объявления:

* узлов (внутренних линий);

* именованных буферов и триггеров, входящих в данный модуль;

* именованных экземпляров модулей низкого уровня, описанных в других конструкторских файлах и используемых в данном проекте в качестве компонентов;

* конечных автоматов, используемых в модуле;

* псевдонимов конечных автоматов.

Раздел начинается ключевым словом variable, заканчивается перед ключевым словом begin, начинающим логический раздел. Раздел не является обязательным.

4. Логический раздел (logic section). Содержит описание проекта. Описание состоит из логических уравнений и логических операторов. Раздел начинается ключевым словом begin, заканчивается ключевым словом end и точкой с запятой. Раздел является обязательным.

В качестве примера рассмотрим содержание конструкторского файла "example_00.tdf".

% = предварительный раздел = %

include "modul_01.inc";

constant def_addr = h"ff";

% = интерфейсный раздел =%

subdesign example_00

(

ina[7..0], addr[7..0], clk: input;

outa[7..0]: output;

)

% = раздел переменных = %

variable

a: node;

m1: modul_01;

% = логический раздел = %

begin

m1.clk = clk;

m1.reset = vcc;

m1.adr[7..0] = addr[7..0];

m1.in[7..1] = ina[7..1];

a = not ina[0];

m1.in[0] = a;

if (addr[7..0] = = def_addr) then

outa[7..0] = gnd;

else

outa[7..0] = m1.out[7..0];

end if;

end;

2. Параметры

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

Параметры объявляются в конструкторском файле описания параметризируемого модуля, а значения им присваиваются в конструкторском файле проекта, использующего модуль как компонент. Объявление параметров осуществляется с помощью оператора parameters, который может быть употреблен в файле произвольное количество раз. Этот оператор должен располагаться в предварительном разделе. Список объявляемых в операторе параметров, отделяемых друг от друга запятыми, заключается в круглые скобки. Имена параметров определяются разработчиком. Могут быть использованы имена, предопределенные фирмой Altera, например DEVICE_FAMILY - семейство микросхем. При объявлении параметру может быть присвоено необязательное значение по умолчанию, которое будет применено компилятором в случае, если при использовании модуля параметру не будет присвоено иное значение. Оператор заканчивается точкой с запятой.

Пример использования параметров:

parameters

(

width,

addr_w = 8,

device_family = "FLEX10K"

);

В приведенном примере первому параметру width не присвоено значения по умолчанию. Второму и третьему - присвоено. Значения параметров могут быть числовыми константами, арифметическими выражениями или строковыми константами. Присваиваемое значение можно выражать через другой параметр, значение которому присвоено ранее. Присваивание требуемого значения параметру осуществляется в разделе переменных файла, в котором используется параметризируемый модуль. Это делается с помощью ключевого слова with при объявлении экземпляра (instance) модуля.

Пример:

variable

reg1: lpm_rg with (width = 16);

begin

В приведенном примере объявлен один экземпляр модуля lpm_rg с именем reg1. При объявлении параметру width присвоено значение 16. После присвоения значения параметр может использоваться на протяжении всего текущего файла как именованная константа.

3. Переменные

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

Пример:

trig_a.d = datain;

trig_b.d = datain and strob;

В приведенном примере ко входу d триггера с именем trig_a подключен узел datain. Ко входу d триггера с именем trig_b подключен сигнал, являющийся результатом логической операции И ( and ) над сигналами datain и strob.

В языке AHDL возможно повторное присваивание переменной еще одного значения. Оно предполагает присоединение к входу второго сигнала вместе с предыдущим. Каким будет результирующее логическое значение данной переменной, если присоединенные сигналы будут разного логического уровня, определяется типом переменной, которой присваиваются сигналы. Необходимо отметить, что все логические уравнения, входящие в описание устройства реализуются в виде электрической схемы одновременно, а не последовательно во времени.

4. Простые типы переменных

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

1. Внешние порты являются входами и выходами устройства, описываемого в данном конструкторском файле. В случае, когда файл представляет описание верхнего уровня иерархии, эти порты будут являться внешними выводами микросхемы. Они объявляются в интерфейсном разделе (subdesign section) и могут быть следующих типов:

* input (входной вывод);

* output (выходной вывод);

* bidir (двунаправленный вывод);

* machine input (входной вывод конечного автомата);

* machine output (выходной вывод конечного автомата).

Последние два типа предназначены только для файлов нижнего уровня в проекте, т.е. не могут подключаться к выводам микросхемы. Порты типа input могут быть использованы в логических выражениях только справа от знака присваивания, а порты типа output - только слева. Порты типа bidir могут быть задействованы и в том и в другом вариантах.

При объявлении портов типа input и bidir им могут быть назначены значения "по умолчанию" vcc или gnd, следующие после знака операции присваивания. Эти значения будут использованы компилятором только в случае, когда данное устройство будет входить в конструкторский файл более высокого уровня иерархии, в котором рассматриваемые выводы окажутся по какой-либо причине неподключенными. Порты типа bidir предназначены для выводов, по которым сигналы, в зависимости от ситуации, либо поступают в устройство, либо выводятся из него. Внутренняя и внешняя логика работы устройства должна обеспечивать бесконфликтное функционирование этих режимов.

2. Внутренние порты используются для модулей нижнего уровня, применяемых в данном конструкторском файле. Они являются входными и выходными линиями этих модулей (блоков). Модули могут быть предопределенными примитивами языка AHDL (буферами и триггерами), компонентами библиотеки фирмы Altera (в оригинальном описании непараметризированными и параметризированными функциями) или устройствами, созданными разработчиком. Внутренние порты объявляются ранее в файлах описания самих модулей, где они выступают как внешние порты. В конструкторском же файле верхнего уровня они представляют собой выводы внутренних блоков, т. е. изначально присущие им атрибуты. Сами модули, вернее их именованные экземпляры, поскольку в одном устройстве может быть установлено несколько одинаковых модулей, объявляются в разделе переменных (variable section) конструкторского файла верхнего уровня.

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

Пример:

subdesign example_02

(

data, clock:input;

out:output;

)

variable

a_trig, b_trig: dff;

begin

a_trig.clk = clock;

b_trig.clk = clock;

a_trig.d = b_trig.q;

В приведенном выше примере в разделе переменных объявляются два экземпляра триггера типа dff (примитивы AHDL) с именами a_trig и b_trig. В логическом разделе к внутренним портам clk обоих триггеров подключается внешний входной порт всего устройства clock, объявленный в интерфейсном разделе. Выходной порт q триггера b_trig присоединяется к входному порту d триггера a_trig.

5. Узлы

Узлами (nodes) являются именованные внутренние линии передачи сигналов. Узлы, если в них есть необходимость, объявляются в разделе переменных. В приведенном выше примере example_02 линия соединения входа d триггера a_trig с выходом q триггера b_trig не является узлом, так как специально не объявлена и не снабжена именем. Узлы применяются для упрощения логических выражений.

Пример:

begin

outa = in1 and in2;

outb = not (in1 and in2);

Представленные два логических выражения можно записать иначе, объявив вспомогательный узел a типа node:

variable

a: node;

begin

a = in1 and in2;

outa = a;,

outb = not a;

Узлы могут быть двух типов: node и tri_state_node. Оба типа узлов, в отличие от портов, могут использоваться в логических выражениях и слева и справа от знака операции присваивания. Узлы типа node предназначены для создания обычных сигнальных линий. Узлы типа tri_state_node предназначены для создания линий с тремя состояниями. К узлам типа tri_state_node могут подключаться только следующие порты и примитивы языка AHDL:

* выход примитива tri (буфер с тремя состояниями на выходе);

* внешний порт типа input данного конструкторского файла;

* внутренние порты типа output и bidir модулей нижнего уровня, входящих в данных конструкторский файл;

* другие узлы типа tri_state_node данного файла.

Кроме этого типы узлов отличаются способом реализации компилятором многократного присваивания значений узлам. Для узлов типа node многократное присваивание, т.е. присоединение к узлу нескольких линий, воплощается компилятором аппаратно как монтажное И или монтажное ИЛИ над логическими значениями подключаемых сигналов. При этом операция И (and) выполняется, если значение по умолчанию для этого узла, определенное с помощью оператора defaults (см. ниже), равно vcc, а операция ИЛИ (or) - если значение по умолчанию равно gnd. (Если значение по умолчанию явно не определено в операторе defaults, то таким значением является gnd.) Многократное присваивание значений узлам типа tri_state_node обеспечивает подключение всех сигналов к узлу без каких-либо логических операций над ними. Поэтому присоединение к узлам типа tri_state_node нескольких выходов с тремя состояниями (выходы буферов tri) должно контролироваться схемой управления таким образом, чтобы одновременно обеспечивалось разрешение работы только одного из буферов (остальные должны быть в третьем состоянии).

6. Группы

Группы в языке AHDL являются наборами узлов, портов, примитивов или модулей, используемых в логических выражениях как единое целое. Если речь идет о группах одноименных узлов или портов, то подходящим для них названием является термин "шина".

В языке AHDL группы могут быть трех типов.

1. Одномерная группа одноименных элементов. Такая группа подобна одномерному массиву в языках программирования и объявляется похожим образом.

Пример:

сonstant

w = 4;

subdesign example_03

(

ina[3..0]: input;

qa[4..1]: output;

)

variable

tr[w-1..0]: dff;

begin

В приведенном примере в интерфейсном разделе объявлена одномерная группа из четырех портов типа input с именем ina и одномерная группа из четырех портов типа output с именем qa. Указанные при объявлении в квадратных скобках числа определяют верхнюю и нижнюю границы номеров элементов группы. Границы могут быть числами или арифметическими выражениями, содержащими ранее определенные числовые константы. Для обращения к отдельному элементу группы существует два способа:

* по имени группы и номеру в квадратных скобках (qa[3] = gnd; - присоединение к четвертой линии группы qa логического нуля);

* по имени группы, включающему в себя номер элемента, записываемого без разделяющего пробела (qa3 = gnd; - это присваивание эквивалентно предыдущему).

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

Для одновременного обращения ко всем элементам группы в выражениях (но не при объявлении группы) можно использовать квадратные скобки без указания индексов.

Пример:

outa[] = gnd;

В приведенном примере все элементы группы outa будут подключены к "земляной шине".

В логическом выражении можно обращаться к части элементов группы с подряд идущими номерами.

Пример:

variable

a[7..0]: node;

begin

a[7..4] = vcc;

a[3..0] = gnd;

2. Двухмерная группа одноименных элементов. Такая группа подобна двухмерному массиву в языках программирования.

Пример:

subdesign example_04

(

a[7..0][2..1]: input;

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

Пример:

ina[5][1] = clk;

ina5_1 = clk;

Приведенные выше две строки эквивалентны.

3. Временная (последовательная) группа. Такая группа специально не объявляется, а создается из отдельных узлов и обычных групп или их частей для использования в одном логическом выражении. Список объединяемых в такую группу элементов заключается в круглые скобки. Внутри списка элементы разделяются запятыми, при этом левый элемент списка будет старшим значащим битом, а правый - младшим.

Пример:

subdesign example_05

(

a[7..0]: output;

b[7..0]: input;

)

begin

a[] = (gnd, b0, gnd, b[4..1], vcc);

end;

В приведенном примере элементам одномерной группы a[ ] присвоены значения битов временной группы (gnd, b0, gnd, b[4..1], vcc). Положение битов в группе определяет следующую схему присоединения линий:

a[0] = vcc; --младший бит

a[1] = b[1];

a[2] = b[2];

a[3] = b[3];

a[4] = b[4];

a[5] = gnd;

a[6] = b[0];

a[7] = gnd; --старший бит

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

Пример:

subdesign example_06

(

a[7..0]: input;

b[4..0]: output;

)

begin

(b0,,,b[4..1],) = a[];

end;

В приведенном примере это сигналы a[6], a[5] и a[0]. При выполнении операций присваивания с участием групп необходимо выполнять рассмотренные ранее правила.

7. Примитивы

В языке AHDL в качестве готовых логических блоков могут быть использованы встроенные примитивы буферов и триггеров. Наиболее легко воспринимаемым способом их использования в описании устройства является объявление именованного экземпляра примитива в разделе переменных. После такого объявления в логическом разделе описания можно обращаться к портам (выводам) примитива.

Пример:

subdesign example5

(

data[3..0], clk: input;

outd: output;

)

variable

a: dff; %объявление экземпляра примитива %

begin

a.d=data[0]; %подключение порта d примитива %

a.clk=clk; %подключение порта clk%

outd=a.q; %подключение выходного порта q примитива %

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

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

* carry_sum - буфер переноса, обеспечивает аппаратное формирование переноса между соседними разрядами в устройствах типа сумматоров и счетчиков; примитив содержит два входа sin и cin (суммы и переноса) и два выхода sout и cout (выходных суммы и переноса);

* global - буфер глобальной цепи, обозначает что сигнал является глобальным синхронизирующим и должен распространяться по выделенной линии связи (global routing paths); содержит один вход in и один выход out; выход может подключаться к входам clk, clrn, prn, ena примитивов триггеров) или линиям разрешения чтения или записи памяти;

* lcell - буфер размещения логической ячейки, обеспечивает использование отдельной логической ячейки для сигнала; содержит один вход in и один выход out; буфер не может быть удален компилятором в ходе оптимизации схемы;

* soft - удаляемый буфер размещения логической ячейки, резервирует возможность использования логической ячейки, в случае, если компилятор установит целесообразность такого варианта; содержит один вход in и один выход out; в процессе компиляции или удаляется или заменяется на lcell;

* tri - буфер с третьим состоянием содержит сигнальный вход in, вход управления oe и выход out; если на вход oe подан высокий логический уровень (vcc), то выход out повторяет сигнал на входе in; если на входе oe установлен низкий логический уровень (gnd), то выход out переходит в третье состояние;

* opndrn - буфер с открытым стоком, содержит один вход in и один выход out; если на входе in установлен низкий логический уровень (gnd), то на выходе out также устанавливается уровень gnd; если на вход in подан высокий логический уровень (vcc) - на выходе устанавливается третье состояние.

В ранних версиях САПР фирмы Altera существовали и другие примитивы буферов, но в новых разработках их применять не следует.

2. Встроенные примитивы триггеров. Примитивы триггеров обеспечивают реализацию последовательностных устройств (устройств с памятью). В современных семействах FPGA фирмы Altera (ACEX 1K, Cyclone, FLEX 10K, HardCopy Stratix, Mercury, Stratix, Stratix II и Stratix GX) используется один примитив триггера - dffea. Все примитивы, определенные в языке AHDL, представлены в виде таблицы

Таблица 1

Имя примитива

Тип триггера

Входные порты

dffea

D-триггер с управлением и синхронной и асинхронной загрузкой

d, clk, clrn, prn, ena, adata, aload

dff

D-триггер

d, clk, clrn, prn

dffe

D-триггер с управлением и синхронной загрузкой

d, clk, clrn, prn, ena

tff

T-триггер

t, clk, clrn, prn

tffe

T-триггер с управлением и синхронной загрузкой

t, clk, clrn, prn, ena

jkff

JK-триггер

j, k, clk, clrn, prn

jkffe

JK-триггер с управлением и синхронной загрузкой

j, k, clk, clrn, prn, ena

srff

SR-триггер

s, r, clk, clrn, prn

srffe

SR-триггер с управлением и синхронной загрузкой

s, r, clk, clrn, prn, ena

latch

триггер-защелка

d, ena

Примитив DFF (D-триггер типа Flipflop).
Примитив функции: FUNCTION DFF (D, CLK, CLRN, PRN), RETURNS(Q);
Таблица 2

Входы

Выход

PRN

CLRN

CLK

D

Q

L

H

X

X

H

H

L

X

X

L

L

L

X

X

Запрещенное состояние (Illegal)

H

H

L

L

H

H

H

H

H

H

L

X

Qo

H

H

H

X

Qo

Qo = уровню Q перед тактовым импульсом.
Примитив DFFE
Прототип функции: FUNCTION DFFE (D, CLK, CLRN, PRN, ENA) RETURNS(Q);
Таблица 3

Входы

Выходы

CLRN

PRN

ENA

D

CLK

Q

L

H

X

X

X

L

H

L

X

X

X

H

L

L

X

X

X

Illegal

H

H

L

X

X

Qo

H

H

H

L

L

H

H

H

H

H

H

H

X

X

L

Qo

Примитив TFF (Триггер Т-типа, Flipflop)
Прототип функции: FUNCTION FFE (T, CLK, CLRN, PRN) RETURNS(Q);
Таблица 4

Входы

Выходы

PRN

CLRN

CLK

T

Q

L

H

X

X

H

H

L

X

X

L

L

L

X

X

Illegal

H

H

L

Qo

H

H

H

Toggle

H

H

L

X

Qo

Toggle - переключательный (счетный) режим

Примитив TFFE

Прототип функции: FUNCTION TFFE (T, CLK, CLRN, PRN, ENA) RETURNS(Q);

Таблица 5

Входы

Выход

CLRN

PRN

ENA

T

CLK

Q

L

H

X

X

X

L

H

L

X

X

X

H

L

L

X

X

X

Illegal

H

H

L

X

X

Qo

H

H

H

L

Qo

H

H

H

H

Toggle

H

H

X

X

L

Qo

Примитив JKFF (Триггер JK-типа, Flipflop)

Прототип функции: FUNCTION JKFF (J, K, CLK, CLRN, PRN) RETURNS(Q);

язык файл триггер автомат

Таблица 6

Входы

Выход

PRN

CLRN

CLK

J

K

Q

L

H

X

X

X

H

H

L

X

X

X

L

L

L

X

X

X

Illegal

H

H

L

X

X

Qo

H

H

L

L

Qo

H

H

H

L

H

H

H

L

H

L

H

H

H

H

Toggle

Примитив JKFFE
Прототип функции: FUNCTION JKFFE (J, K, CLK, CLRN, PRN, ENA) RETURNS(Q);
Таблица 7

Входы

Выход

ENA

PRN

CLRN

CLK

J

K

Q

X

L

H

X

X

X

H

X

H

L

X

X

X

L

X

L

L

X

X

X

Illegal

X

H

H

L

X

X

Qo

H

H

H

L

L

Qo

H

H

H

H

L

H

H

H

H

L

H

L

H

H

H

H

H

Toggle

L

H

H

X

X

X

Qo

Примитив SRFF (Триггер SR-типа, Flipflop)
Прототип функции: FUNCTION SRFF (S, R, CLK, CLRN, PRN) RETURNS(Q);
Таблица 8

Входы

Выход

PRN

CLRN

CLK

S

R

Q

L

H

X

X

X

H

H

L

X

X

X

L

L

L

X

X

X

Illegal

H

H

L

X

X

Qo

H

H

L

L

Qo

H

H

H

L

H

H

H

L

H

L

H

H

H

H

Illegal

Примитив SRFFE
Прототип функции: FUNCTION SRFF (S, R, CLK, CLRN, PRN, ENA) RETURNS(Q);
Таблица 9

Входы

Выход

ENA

PRN

CLRN

CLK

S

R

Q

X

L

H

X

X

X

H

X

H

L

X

X

X

L

X

L

L

X

X

X

Illegal

X

H

H

L

X

X

Qo

H

H

H

L

L

L

Qo

H

H

H

H

L

H

H

H

H

L

H

L

H

H

H

H

H

Illegal

L

H

H

X

X

X

Qo

Примитив LATCH
Прототип функции: FUNCTION LATCH (D, ENA) RETURNS(Q);
Таблица 10

Входы

Выход

ENA

D

Q

L

X

Qo

H

L

L

H

H

H

Порты d и clk всех триггеров и порт ena триггера-защелки должны быть обязательно подключены в устройстве. Все триггеры содержат единственный выходной порт q. Входные порты, в случае использования примитивов триггеров без объявления именованных экземпляров должны указываться в порядке, приведенном в таблице.

Входные порты d, t, j, k, s, r триггеров предназначены для подключения сигнальных линий данных. Порт clk предназначен для подачи сигнала синхронизации на триггеры. Триггеры перебрасываются в состояние, определяемое линиями данных, по переднему (возрастающему) фронту сигнала clk. При этом для триггеров с управлением синхронной загрузкой на входе ena должен быть установлен активный (высокий) уровень. В противном случае синхронная загрузка блокируется. Для триггера-защелки вход ena обеспечивает режим прозрачности при высоком уровне (сигнал на выходе триггера равен входному) и режим хранения при низком уровне.

Вход clrn предназначен для асинхронного сброса триггера (установки 0 на выходе). Активный уровень этого входа - низкий (gnd). Вход prn обеспечивает асинхронную установку триггера (1 на выходе ). Активный уровень этого входа также gnd. Вход aload триггера dffea при уровне 1 включает режим асинхронной загрузки триггера данными со входа adata. Этот режим несовместим с активными уровнями (0) на входах clrn и prn. Входные порты d и clk триггеров, а также вход ena триггера-защелки должны быть обязательно подключены к каким-либо линиям устройства.

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

Пример:

subdesign example6

(

clock, oe, data:input;

outa:output;

)

begin

outa=dffea(data,clock,,,oe,,);

В приведенном примере использован один триггер типа dffea. Выход триггера подключен к внешнему выходному порту outa. Вход d триггера подключен к внешнему входному порту data (первый элемент в списке), а вход clk - к внешнему порту clock (второй элемент ). Входы clrn и prn, следующие по списку, оставлены неподключенными, так же как и последние по списку входы adata и aload. Вход ena, пятый по счету, подключен к внешнему входному порту oe.

8. Модули

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

Для применения модуля (функции) в текущем проекте необходимо следующее.
1. Наличие файла *.tdf с описанием модуля на языке AHDL. Этот файл должен быть помещен в папку подключаемой библиотеки пакета САПР или находиться в папке текущего проекта.
2. В предварительном разделе проекта должен быть помещен прототип модуля (оператор prototype ) или с помощью оператора include подключен файл *.inc используемого модуля (собственно тоже содержащий прототип модуля ). Прототип описывает имена и последовательности перечисления внутренних входных и выходных портов модуля.
3. В разделе переменных необходимо объявить именованные экземпляры модуля, аналогично объявлению экземпляров примитивов. Если модуль параметризированный, то при его объявлении параметрам, например разрядности регистров, присваиваются необходимые значения.
4. В логическом разделе следует произвести подключение выходных внутренних портов модуля и обеспечить присваивание сигналов входным внутренним портам в соответствии с решаемой задачей.
Пример:
include "4count";
include "16dmux";
include "lpm_ff";
subdesign example7
(
clock: input;
outena: input;
out[15..0]: output;
)
variable
counter: 4count;
decoder: 16dmux;
outreg:lpm_ff with (lpm_width = 16);
begin
counter.clk = clock;
counter.dnup = gnd;
outreg.clock = clock;
outreg.enable = outena;
decoder.(d,c,b,a) = counter.(qd,qc,qb,qa);
outreg.data[15..0] = decoder.q[15..0];
out[15..0] = outreg[15..0];
end;
В приведенном примере в предварительном разделе операторами include в проект включены файлы "4count.inc" и "16dm ux.inc" из библиотеки фирмы Altera "..\quartus\libraries\others\maxplus2\" и "lpm_ff.inc" из библиотеки "..\quartus\libraries\megafunctions\storage\". Далее в разделе переменных объявлен один экземпляр модуля "4count" (4-разрядный двоичный счетчик ) с именем counter; один экземпляр модуля "16dmux" (дешифратор 4-разрядного адреса ) с именем decoder и один экземпляр параметризированного модуля "lpm_ff" (регистр с масштабируемой разрядностью ) с именем outreg. Экземпляры модулей и примитивов называются также переменными, поскольку объявляются в разделе переменных. При объявлении регистра outreg с помощью ключевого слова with и списка в круглых скобках его параметру lpm_width (разрядность регистра) присвоено конкретное значение 16.
В логическом разделе первые четыре строки подключают ко внутренним входным портам экземпляров модулей counter и outreg сигнальные линии clk и outena и логическую константу gnd. Пятая строка подключает выходы переменной counter ко входам переменной decoder, шестая - выходы переменной decoder ко входам переменной outreg и седьмая - выходы переменной outreg к внешним портам устройства out. Модули, так же как и примитивы, можно использовать с помощью способа "вызов по ссылке ", т. е. без объявления переменных. В этом случае при обращении к внутренним портам модуля необходимо строго придерживаться последовательности перечисления входных портов, указанной в прототипе или использовать явное указание имен портов для присваивания им значений. В этом случае предыдущий пример может быть представлен следующим образом:
include "4count";
include "16dmux";
include "lpm_ff";
subdesign example7_1
(
clock:input;
outena:input;
out[15..0]:output;
)
variable
temp_a[3..0]:node;
temp_b[15..0]:node;
begin
(temp_a[3..0],)=4count(clock,,,,,gnd,,,,);
temp_b[15..0]=16dmux(temp_a[]);
out[]=lpm_ff(temp_b[],clock,outena,,,,,,)
with
(lpm_width=16, lpm_fftype="dff");
end;
В приведенном примере в первой строке логического раздела четырем линиям группы temp_a[3..0] присваиваются сигналы четырех первых из пяти выходных портов ( qd,qc,qb,qa и cout ) счетчика 4count. Пятый выходной порт счетчика count остается неподключенным, для него во временной группе слева от знака присваивания оставлено пустое место после запятой. На первый вход счетчика (см. список, следующий за именем счетчика ) подается сигнал с внешнего порта clock - это первый элемент в списке. Следующие четыре входных порта остаются неподключенными - это пустые места между запятыми. На шестой входной порт подана константа gnd. Последние четыре входных порта также не подключены. Во второй строке логического раздела 16 линий группы temp_b[15..0] подключаются к 16-ти же выходам дешифратора 16dmux, а на четыре входа дешифратора поданы сигналы с линий группы temp_a[] (список после имени дешифратора ) и т. д.
Приведенный пример требует для своего прочтения наличия информации об именах внутренних входных и выходных портов модулей и последовательностях их перечисления. Эта информация содержится в прототипах модулей (функций). Ниже представлены прототипы модулей, используемых в примере.
function 4count(clk,clrn,setn,ldn,cin,dnup,d,c,b,a)
returns(qd,qc,qb,qa,cout);
function 16dmux(d,c,b,a)
returns(q[15..0]);
function lpm_ff(data[lpm_width-1..0],clock,enable,
sclr,sset,sload,aclr,aset,aload)
with(lpm_width,lpm_avalue,lpm_svalue,lpm_fftype)
returns(q[lpm_width-1..0]);
В прототипе после ключевого слова function следует имя модуля и список его внутренних входных портов в установленной разработчиком модуля последовательности. После ключевого слова returns следует список выходных портов модуля, также в установленной последовательности. Если модуль подготовлен как параметризированный (настраиваемый ), то внутри прототипа после ключевого слова with должен быть приведен список всех его параметров. Следует отметить, что не все параметры требуют обязательного присваивания им конкретного значения при использовании модуля в проекте. В приведенном примере для модуля lpm_ff обязательным параметром является только lpm_width.
Как видно из приведенного выше примера не все входные или выходные порты модуля могут быть подключены в проекте. В списке перечисления для неподключенных портов оставляются пустые места между запятыми обязательно. Их имена должны быть указаны в техническом описании модуля, сопровождающем библиотеку.
9. Конечные автоматы
Конечный автомат (state machine) - это цифровое устройство с памятью, выходные сигналы которого зависят от предыстории поступления входных сигналов. Примером простого конечного автомата может служить устройство, обеспечивающее деление частоты следования входных импульсов, например на 10. У такого автомата должно быть 10 состояний, один вход и один выход. Переход из одного состояния в другое должен происходить, например, с приходом каждого очередного возрастающего фронта входного сигнала. При переходе из девятого состояния в десятое на выходе должна появляться логическая единица, которая вновь превращается в логический нуль при переходе из десятого состояния в первое (начальное). При всех остальных переходах значение выходного сигнала не изменяется.
В AHDL конечный автомат характеризуется конечным набором состояний, каждому из которых дается свое имя. Любое состояние автомата представляется уникальным набором значений на выходах внутренних триггеров (кодом состояния), хранящих состояния автомата. Необязательно, чтобы все триггеры были подключены к выходам автомата. Переход из состояния в состояние происходит при требуемой комбинации входных сигналов с приходом сигнала синхронизации (clk). В AHDL конечный автомат кроме информационных управляющих входов, определяющих его функционирование в соответствии с замыслом разработчика, содержит три предопределенных управляющих входа:
* clk - вход сигнала синхронизации триггеров (активным, т.е. изменяющим состояние триггеров, является возрастающий фронт );
* reset - вход асинхронного сброса автомата - принудительного перевода его в исходное состояние (активный уровень - vcc );
* ena - вход разрешения работы автомата (активный уровень - vcc ).
Вход clk должен быть обязательно подключен. Входы reset и ena не являются обязательными. Если они не будут явно подключены в проекте, то на них компилятором будут поданы логические значения, обеспечивающие нормальное функционирование автомата.
Для создания конечного автомата на языке AHDL необходимо выполнить следующие шаги:
* в разделе переменных объявить конечный автомат и его состояния;
* в логическом разделе поместить выражения, обеспечивающие поступление предопределенных сигналов управления в автомат;
* в логическом разделе с помощью операторов case или table описать логику переходов между состояниями автомата, а также поставить в соответствие тем состояниям, для которых это необходимо, логические значения выходов автомата.
Простейшее объявление конечного автомата должно содержать имя автомата, сопровождаемое двоеточием и ключевым словом machine. За ключевым словом machine должен следовать список состояний, заключенный в круглые скобки и предваряемый ключевыми словами with states. Первое состояние в списке является исходным для автомата, оно устанавливается по сигналу reset.

Пример:

subdesign example8

(

clock:input; --сигнал синхронизации

f_on:input; --внешний сигнал включения

outf:output; --выход автомата

)

variable

fcont:machine with states(f0,f1,f2,f3);

begin

fcont.clk=clock; --подключение сигнала синхр.

fcont.ena=f_on; --подача сигнала включения

table

fcont => fcont, outf;

f0 => f1, gnd;

f1 => f2, gnd;

f2 => f3, vcc;

f3 => f0, gnd;

end table;

В приведенном примере реализован простейший автомат, обеспечивающий деление на четыре частоты следования импульсов синхронизации, поступающих на внешний входной порт clock. Выходные импульсы автомата, появляющиеся в четыре раза реже синхронизирующих, подаются на внешний порт outf. Автомат объявлен в разделе переменных с именем fcont и четырьмя состояниями: f0,f1,f2 и f3. Первые две строки логического раздела подключают внешние входные порты clock и f_on к предопределенным управляющим входам автомата clk и ena. Следующий далее оператор table описывает переходы между состояниями, а также соответствующие новым состояниям значения выходного порта outf.

Согласно приведенному описанию автомата, для перехода из любого текущего состояния в следующее не требуется каких-либо управляющих сигналов. Переходы осуществляются с приходом возрастающего фронта сигнала clk. Поскольку все конечные автоматы, синтезируемые компилятором MAX+Pius II, являются синхронными, явное указание сигнала clk в качестве логической переменной внутри оператора table (или иного оператора, описывающего переходы между состояниями автомата) не требуется. При синтезе такого автомата компилятор выделит минимальное количество триггеров (запоминаемых битов), требуемое для выбранного семейства микросхем. В частности при реализации примера в микросхеме семейства MAX3000 это будут два триггера.

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

Пример:

subdesign example9

(

clock:input;

f_on:input;

outb[3..0]:output; --выходы автомата

)

variable

fcont:machine of bits(ba,bb,bc,bd)

with states(

f0=b"0001",

f1=b"0010",

f2=b"0100",

f3=b"1000"

);

begin

fcont.clk=clock; --подключение сигнала синхронизации

fcont.ena=f_on; --подача сигнала включения

outb[]=(ba,bb,bc,bd);

table

fcont => fcont;

f0 => f1;

f1 => f2;

f2 => f3;

f3 => f0;

end table;

end;

В приведенном примере реализован автомат, который, в отличие от предыдущего, в каждом состоянии подает логическую единицу на соответствующий этому состоянию выход (так работает автомат "бегущие огни"). Поскольку в таком устройстве необходимы 4 выхода, то автомат с помощью ключевых слов of bits и списка в круглых скобках объявлен с четырьмя именованными битами хранения состояний ba,bb,bc и bd. Эти биты (триггеры) в логическом разделе подключены к 4 выходным портам outb[3..0]. Кроме этого, при объявлении состояний автомата им поставлены в соответствие требуемые значения кодов состояний (b"0001",b"0010" и т. д.), т.е. наборов бит для хранения состояний. Эти коды автоматически присваиваются объявленной группе битов (ba,bb,bc,bd), что позволяет не включать значения выходов автомата в каждую строку оператора table.

Размещено на Allbest.ru

...

Подобные документы

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

    реферат [2,2 M], добавлен 23.01.2014

  • Устройство управления и синхронизации в структуре микропроцессора. Порядок синтеза конечного автомата (КА) для устройства управления ЭВМ. Алгоритм функционирования КА, заданный с помощью графа, функции переходов. Состояние триггеров в микросхеме.

    методичка [1019,0 K], добавлен 28.04.2009

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

    дипломная работа [1,8 M], добавлен 18.08.2013

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

    курсовая работа [3,4 M], добавлен 05.02.2013

  • Понятие, последовательность построения и схемная реализация цифрового автомата. Описание форм представления функций алгебры логики. Принципы минимизации функций выходов и переходов автомата, их перевода в базис. Сведенья о программе Electronics Workbench.

    курсовая работа [2,0 M], добавлен 27.10.2010

  • Разработка структурной схемы системы. Выбор и обоснование не указанных в задании элементов. Анализ временных параметров системы. Разработка файла конфигурации для системы сбора-обработки данных на языке AHDL. Моделирование цифровой части системы.

    курсовая работа [1,1 M], добавлен 26.10.2014

  • Общая характеристика и преимущество использования двоично-десятичных чисел с плавающей точкой. Разработка цифрового автомата. Функциональное назначение выводов корпуса МК51, арифметико-логического устройства, портов. Примеры деления данных чисел.

    курсовая работа [719,3 K], добавлен 12.09.2015

  • Построение праволинейной грамматики, автоматной грамматики по полученным результатам. Построение недетерминированного конечного автомата. Сведение недетерминированного конечного автомата к детерминированному. Описание программы и контрольного примера.

    курсовая работа [674,9 K], добавлен 13.06.2012

  • Создание программы для перевода кодов с языка Pascal на язык Си. Обработка программ операторами case, assign, rewrite и write. Способы объявления файла, комментария, переменных, логических и арифметических выражений. Виды синтаксических анализаторов.

    курсовая работа [461,0 K], добавлен 03.07.2011

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

    курсовая работа [3,2 M], добавлен 13.06.2015

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

    курсовая работа [210,8 K], добавлен 05.12.2013

  • Составление формальной грамматики, недетерминированный конечный автомат. Построение конечного автомата, программное моделирование работы конечного автомата. Граф детерминированного автомата, Синтаксическая диаграмма. Блок-схемы, примеры разбора строк.

    курсовая работа [486,2 K], добавлен 19.11.2010

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

    курсовая работа [903,9 K], добавлен 14.07.2012

  • Синтез цифрового автомата с комбинационной частью на логических элементах. Реализация спроектированного автомата в виде иерархического блока со схемой замещения на библиотечных компонентах в режиме SPICE–проектов. Разработка абстрактных символов.

    курсовая работа [831,2 K], добавлен 23.09.2013

  • Особенности реализации алгоритма проверки логического следования методом резолюции. Реализация проекта на логическом языке Prolog и на функциональном языке Haskell: сравнительная характеристика. Знакомство с листингом программы на необходимых языках.

    курсовая работа [57,0 K], добавлен 14.07.2012

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

    курсовая работа [19,0 K], добавлен 24.05.2012

  • Понятие и специфические особенности языка программирования Си, история его создания. Интегрированная система Borland C. Процесс программирования с помощью данного языка. Графические примитивы в языках программирования. Преобразования на плоскости.

    курс лекций [782,2 K], добавлен 04.10.2011

  • Установка "Microsoft SQL SERVER 2012". Создание файла данных, журнала транзакций, таблиц, запросов и фильтров, диаграмм и триггеров, табличных форм и отчетов. Подключение файла данных к проекту. Создание простых и сложных ленточных форм для работы с ними.

    курсовая работа [1,9 M], добавлен 13.12.2013

  • Проектирование арифметико-логических устройств (АЛУ). Отладка описания логических схем на языке VHDL. Классификация АЛУ по способу представления чисел, характеру использования элементов и узлов. Список стандартных функций АЛУ, его описание на языке VHDL.

    лабораторная работа [633,4 K], добавлен 11.03.2014

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

    курсовая работа [306,1 K], добавлен 24.06.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.