zabika.ru   1 ... 15 16 17 18 19

1.4.10Раздел Subdesign

Раздел Subdesign определяет входные, выходные и двунаправленные порты данного проекта.

Следующий пример демонстрирует использование раздела Subdesign:
SUBDESIGN top

(

foo, bar, clk1, clk2 : INPUT = VCC;

a0, a1, a2, a3, a4 : OUTPUT;

b[7..0] : BIDIR;

)

Раздел Subdesign имеет следующие характеристики:


                  • За ключевым словом SUBDESIGN следует имя подпроекта. Имя подпроекта должно совпадать с именем текстового файла проекта. В данном примере подпроект имеет имя top.

                  • Список сигналов заключается в круглые скобки.

                  • Сигналы представляются символическими именами с определением их типа (например, INPUT)

                  • Имена сигналов отделяются друг от друга запятыми .За именами следует двоеточие, далее тип сигналов и символ (;).

                  • Возможными типами портов являются : INPUT, OUTPUT, BIDIR, MACHINE INPUT или MACHINE OUTPUT.В примере, показанном выше, сигналы foo, bar, clk1 и clk2, а сигналы a0, a1, a2, a3 и a4 являются выходами. Шина b[7..0] является двунаправленной.

                  • Ключевые слова MACHINE INPUT и MACHINE OUTPUT используются для импорта и экспорта конечных автоматов между текстовыми файлами проектов и другими файлами проектов. Однако типы портов MACHINE INPUT и MACHINE OUTPUT не могут использоваться в текстовых файлах проектов верхнего уровня.

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



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

1.4.11Раздел Variable


Необязательный раздел Variable используется для описания и/или генерации переменных, используемых в разделе Logic. Переменные языка AHDL сходны с переменными, используемыми в языках высокого уровня; они используются для определения внутренней логики.

Следующий пример демонстрирует использование раздела Variable:
VARIABLE

a, b, c : NODE;

temp : halfadd;

ts_node : TRI_STATE_NODE;

IF DEVICE_FAMILY == "FLEX8000" GENERATE

8kadder : flex_adder;

d, e : NODE;

ELSE GENERATE

7kadder : pterm_adder;

f, g : NODE;

END GENERATE;
Раздел Variable может включать следующие операторы и конструкции:


                  • Описание объектов.

                  • Описание узлов.

                  • Описание регистров.

                  • Описание конечных автоматов.

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





                  • Раздел Variable может также содержать операторы If Generate, которые могут быть использованы для генерирования объектов, узлов, регистров, конечных автоматов, и псевдоимен конечных автоматов.

                  • Раздел Variable имеет следующие характеристики:




                  • Раздел начинается с ключевого слова VARIABLE.

                  • Определенные пользователем символические имена переменных отделяются друг от друга запятыми, а от соответствующего им типа символом двоеточия. Допустимыми типами переменных являются: NODE, TRI_STATE_NODE,
                    , ,
                    или . В примере, показанном выше, внутренними переменными являются a, b и c, имеющие тип NODE; temp является экземпляром макрофункции halfadd; и tsnode является объектом типа TRI_STATE_NODE.

                  • Каждая строка определения переменных заканчивается символом (;).



                  • В файле с расширением .fit для текущего проекта могут иметь место имена, сгенерированные компилятором и имеющие в своем составе знак тильда (~). Если производится обратная аннотация присоединений, осуществленных в файле с расширением .fit, то эти имена появятся в файле установок и конфигурации (.acf).Символ тильды зарезервирован исключительно для имен генерируемых компилятором; использовать их для обозначения выводов, узлов и групп (шин) запрещено.

1.4.11.1Описание объектов.


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

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

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

При использовании процедуры объявления объекта в разделе описания переменных производится описание переменной типа
,
или . Для параметрических мега- и макрофункций объявление включает список параметров, используемых объектом и в необязательном порядке, значения этих параметров. После определения переменной порты объекта функции можно использовать с применением следующего формата:
<имя экземпляра>.<имя порта>
Например, если необходимо использовать в данном файле проекта функции adder и compare, нужно выполнить следующие описания экземпляров в разделе описания переменных:
VARIABLE

comp : compare;

adder : lpm_add_sub WITH (LPM_WIDTH = 8);

Переменные comp и adder являются объектами функций compare и lpm_add_sub, имеющих следующие входы и выходы:

a[3..0], b[3..0] : INPUT; -- входы компаратора

less, equal, greater :OUTPUT;--выходы компаратора
a[8..1], b[8..1] : INPUT; -- входы сумматора

sum[8..1] : OUTPUT;--выходы сумматора
Таким образом, в секции Logic можно использовать следующие порты переменных comp и adder:
comp.a[], comp.b[], comp.less, comp.equal, comp.greater

adder.dataa[], adder.datab[], adder.result[]
Эти порты могут использоваться в любом операторе также как и узлы.

Поскольку все примитивы имеют только один выход можно использовать имя примитива без указания имени его выходного порта (например, без .q или .out) в правой части выражений. Аналогично, если примитив имеет лишь один вход (т.е. все примитивы за исключением примитивов JKFF, JKFFE, SRFF и SRFFE), то можно использовать имя примитива без указания имени его входного порта в левой части выражений (т.е., без .d, .t или .in).

На этапе компиляции компилятор осуществляет поиск значений параметров мега- и макрофункций в порядке, описанном в разделе “Оператор Parameters”.

1.4.11.2Описание узлов.


AHDL поддерживает два типа узлов : NODE и TRI_STATE_NODE.

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

И NODE и TRI_STATE_NODE схожи с типами портов INPUT, OUTPUT и BIDIR, описываемых в разделе Subsection, в том, что и те и другие представляют проводники, по которым распространяются сигналы.

                  • В файле с расширением .fit для текущего проекта могут иметь место имена, сгенерированные компилятором и имеющие в своем составе знак тильда (~). Если производится обратная аннотация присоединений, осуществленных в файле с расширением .fit, то эти имена появятся в файле установок и конфигурации (.acf). Символ тильды зарезервирован исключительно для имен генерируемых компилятором; использовать их для обозначения выводов, узлов и групп (шин) запрещено.



Следующий пример демонстрирует процедуру определения узла:
SUBDESIGN node_ex

(

a, oe : INPUT;

b : OUTPUT;

c : BIDIR;

)

VARIABLE

b : NODE;

t : TRI_STATE_NODE;

BEGIN

b = a;

out = b % следовательно out = a %

t = TRI(a, oe);

t = c; % t есть шина c и a %

END;
NODE и TRI_STATE_NODE отличаются тем, что многократное присваивание значений этим объектам дает различные результаты:


                  • Многократные присваивания узлам типа NODE объединяют сигналы в соответствии с функцией монтажное И или монтажное ИЛИ. Значения переменных по умолчанию, определенные в операторах Default детерминируют поведение: значение по умолчанию VCC предопределяет выполнение функции монтажное И над несколькими значениями, присваиваемыми к данному узлу; соответственно значение по умолчанию GND предопределяет выполнение функции монтажное ИЛИ.

                  • Если только одна переменная присвоена узлу типа TRI_STATE_NODE , то он ведет себя также как и узел типа NODE .


Следующие примитивы и сигналы могут быть подключены к узлам типа TRI_STATE_NODE:


                  • Примитивы TRI.

                  • Порты типа INPUT файла проекта с файлами проекта более высокого уровня иерархии.

                  • Порты типа OUTPUT и BIDIR файла проекта с файлом проекта более низкого уровня иерархии.

                  • Порты типа BIDIR данного файла проекта.


                  • Другие узлы типа TRI_STATE_NODE данного файла проекта.

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


Объявление регистров используется для определения регистров, включая D, T, JK и SR триггеры (DFF, DFFE, TFF, TFFE, JKFF, JKFFE, SRFF и SRFFE) и защелки (LATCH). Следующий пример демонстрирует описание регистра:
VARIABLE

ff : TFF;
Именем объекта, представляющего собой Т - триггер, является ff. После данного объявления можно использовать входной и выходной порты объекта ff с использованием следующего формата:
ff.t

ff.clk

ff.clrn

ff.prn

ff.q
Поскольку все примитивы имеют только один выход можно использовать имя примитива без указания имени его выходного порта (например, без .q или .out) в правой части выражений. Аналогично, если примитив имеет лишь один вход (т.е. все примитивы за исключением примитивов JKFF, JKFFE, SRFF и SRFFE), то можно использовать имя примитива без указания имени его входного порта в левой части выражений (т.е., без .d, .t или .in).

Например, прототип функции для примитива DFF имеет вид : FUNCTION DFF(d, clk, clr, prn) RETURNS (q); . В следующем текстовом файле проекта выражение a = b эквивалентно a.d = b.q:
VARIABLE

a, b : DFF;

BEGIN

a = b;

END;

1.4.11.4Объявление конечных автоматов.


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

Следующий пример демонстрирует описание конечного автомата:
VARIABLE

ss : MACHINE

OF BITS (q1, q2, q3)

WITH STATES (

s1 = B"000",

s2 = B"010",

s3 = B"111");

Имя конечного автомата в данном примере ss. Биты состояний q1, q2 и q3 являются выходами регистров данного автомата. Состояниями данного конечного автомата являются s1, s2 и s3, каждому из которых присвоено числовое значение представленное битами q1, q2 и q3.


Процедура объявления конечного автомата имеет следующие характеристики:


                  • Конечный автомат имеет символическое имя. В примере, показанном выше, именем конечного автомата является ss.

                  • За именем конечного автомата следует двоеточие и далее ключевое слово MACHINE.

                  • Необязательное указание имен битов состояний производится с использованием ключевого слова OF BITS, за которым следует список имен битов, отделенных друг от друга запятыми ;список должен быть заключен в круглые скобки. В примере, показанном выше, определены имена битов состояний q1, q2 и q3.

                  • Состояния определяются ключевыми словами WITH STATES, за которым следует список имен состояний отделенных друг от друга запятыми ;этот список также должен быть заключен в круглые скобки. В примере, показанном выше определены имена состояний s1, s2 и s3.

                  • Первое состояние указанное в списке состояний за ключевыми словами WITH STATES является состоянием Reset для конечного автомата.
                  • В необязательном порядке именам состояний могут быть присвоены числовые значения, следующие за знаком (=) после соответствующего имени состояния. В примере, показанном выше, состоянию с именем s1 присвоено числовое значение B”000”, состоянию с именем s2 присвоено числовое значение B”001” и s3 присвоено значение B”010”.


                  • Предусмотрена возможность определения псевдонима имени конечного автомата, объявленного в данном текстовом файле проекта или импортируемого из другого файла.

                  • Символ (;) заканчивает конструкцию определения конечного автомата.




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

<количество состояний> = 2^<количество битов состояний>

1.4.11.5Объявления псевдоимен конечных автоматов.


Используя процедуру объявления псевдоимени конечного автомата в разделе описания переменных, можно описать псевдоимя для данного, описанного или импортированного из другого файла конечного автомата. После указанной процедуры можно пользоваться псевдоименем конечного автомата наравне с его исходным. Например:
FUNCTION ss_def (clock, reset, count)

RETURNS (MACHINE ss_out);

VARIABLE

ss : MACHINE;

BEGIN

ss = ss_def (sys_clk, reset, !hold);

IF ss == s0 THEN

ELSIF ss == s1 THEN

END;
Процедура объявления псевдоимени конечного автомата имеет следующие характеристики:


                  • Псевдоним представляет собой символическое имя. За псевдонимом следует символ двоеточия и далее ключевое слово MACHINE. В примере, показанном выше, символическое имя ss является псевдонимом конечного автомата.

                  • Предусмотрена возможность импортирования и экспортирования конечных автоматов между текстовыми файлами проектов, а также другими файлами проектов путем определения входных и выходных портов с использованием ключевых слов MACHINE INPUT или MACHINE OUTPUT в разделе Subdesign.


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

                  • Декларация псевдонима конечного автомата заканчивается символом (;).




                  • Порты типов MACHINE INPUT и MACHINE OUTPUT не могут использоваться в файлах проектов верхнего уровня.




<< предыдущая страница   следующая страница >>