1.23.Раздел интерфейса проекта (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.24.Раздел переменных проекта (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.24.1.Объявление объектов (Instance Declarations) Каждое использование или реализация конкретной логической функции может быть произведено как объявлением переменной в разделе описания переменных, так и процедурой реализации объекта. После указанного объявления входные и выходные порты каждой логической функции можно использовать также как и порты проектируемого текстового файла проекта.
При необходимости реализации объекта мега- или макрофункции надо убедиться в существовании соответствующего ей файла с описанием ее логического функционирования. Затем используется оператор 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.24.2.Объявление узлов (Node Declarations) 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.24.3.Объявление регистров (Register Declarations) Объявлениерегистров используется для определения регистров, включая 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.24.4.Объявление конечных автоматов (State Machine Declarations) Конечный автомат создается определением его имени, состояний и в необязательном порядке его битами в разделе описания переменных.
Следующий пример демонстрирует описание конечного автомата: 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.24.5.Объявления псевдоимен конечных автоматов (Machine Alias Declaration) Используя процедуру объявления псевдоимени конечного автомата в разделе описания переменных, можно описать псевдоимя для данного, описанного или импортированного из другого файла конечного автомата. После указанной процедуры можно пользоваться псевдоименем конечного автомата наравне с его исходным. Например: 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 не могут использоваться в файлах проектов верхнего уровня.
|