Язык AHDL

Операторы и элементы языка аппаратуры фирмы Altera AHDL. Зарезервированные идентификаторы: шины, символы, строковые и символьные имена. Структура описания проекта на языке AHDL. Создание текстового выходного файла. Использование логики и констант.

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

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

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

Oператор Define должен быть расположен за пределами других разделов языка AHDL.

3.6 Определение параметров (оператор Parameters)

Оператор Parameters позволяет определять один и более параметров, управляющих экземпляром (an instance) параметрической мега- или макрофункции. Следующий пример демонстрирует использование оператора Parameters:

PARAMETERS

(

FILENAME = "myfile.mif", -- optional default value follows "=" sign

WIDTH,

AD_WIDTH = 8,

NUMWORDS = 2^AD_WIDTH

);

При использовании оператора Parameters необходимо соблюдать следующие правила:

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

Параметры в списке отделяются друг от друга запятыми; имена параметров отделяются от необязательных значений по умолчанию символом (=). В примере, показанном выше, только параметр WIDTH не имеет предопределенного значения.

Имена параметров могут представлять собой либо имена, определенные пользователем, либо имена, предопределенные фирмой Altera .

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

Оператор Parameters заканчивается символом (;).

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

Параметр может быть использован лишь после того, как он был определен.

Имена параметров должны быть уникальными.

Имя параметра не должно содержать пробелов. Для разделения слов и лучшего восприятия необходимо пользоваться символом подчеркивания.

Оператор Parameters может использоваться произвольное количество раз в рамках одного текстового файла проекта.

Oператор Parameters должен быть расположен за пределами других разделов языка AHDL.

Параметры, используемые для определения других параметров, должны быть определены ранее.

Использование круговых ссылок недопустимо. Следующий пример демонстрирует использование недопустимой круговой ссылки:

PARAMETERS

(

FOO = BAR;

BAR = FOO;

);

На этапе компиляции текстового файла проекта, компилятор осуществляет поиск значений параметров в следующей последовательности:

Производится анализ экземпляра (an instance) логической функции. Например, в текстовом файле проекта, в объекте (an instance), созданном путем объявления объекта (Instance Declaration) или подставляемой ссылкой (in-line reference), можно определить те параметры, которые будут использоваться, а также в необязательном порядке определить их значения. В графическом файле проекта (GDF - Graphic Design File) можно выбрать символ и, используя команду Edit Ports/Parameters из меню Symbol, присвоить значения параметров для этого объекта.

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

Производится анализ глобальных значений параметров проекта по умолчанию, определенных командой Global Project Parameters из меню Assign. Эти значения хранятся в файле установок и конфигурации (Assignment&Configuration file - .acf) проекта.

Просматриваются необязательные значения по умолчанию, указываемые в разделе Parameters текстового файла проекта (TDF), или с помощью примитива PARAM в графическом файле проекта, описывающем логическую функцию. Эти значения по умолчанию используются только в том файле, в котором они приводятся и не распространяются на подпроекты, входящие в данный проект.

3.7 Определение прототипов логических функций (оператор Function Prototype)

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

Входные порты мега- и макрофункций не имеют значений по умолчанию, как это имеет место в файлах графического редактора MAX+PLUSII. Поэтому входные значения неиспользуемых портов должны быть указаны явно. Кроме того в секции Subdesign могут быть указаны значения по умолчанию для двунаправленных портов. Заметим, что для выходных портов нельзя определить значения по умолчанию.

Перед созданием объекта (an instance) мега- или макрофункции необходимо убедиться в существовании соответствующего ей файла проекта, описывающего ее логическое функционирование. Затем с помощью оператора Function Prototype описываются порты функции и создается экземпляр (an instance) логической функции путем объявления объекта (Instance Declaration) или подставляемой ссылки (in-line reference),

Следующие примеры демонстрируют использование операторов Function Prototype. Первый пример демонстрирует описание параметризируемой функции, а второй - не параметризируемой функции:

FUNCTION lpm_add_sub (cin, dataa[LPM_WIDTH-1..0], datab[LPM_WIDTH-1..0], add_sub)

WITH (LPM_WIDTH, LPM_REPRESENTATION, LPM_DIRECTION, ADDERTYPE,

ONE_INPUT_IS_CONSTANT)

RETURNS (result[LPM_WIDTH-1..0], cout, overflow);

FUNCTION compare (a[3..0], b[3..0])

RETURNS (less, equal, greater);

Оператор Function Prototype имеет следующие характеристики:

За ключевым словом FUNCTION следует имя функции. В примерах показанных выше использованы имена функций lpm_add_sub и compare.

За именем функции следует список входных портов. В первом примере, показанном выше, входными портами являются cin, dataa[LPM_WIDTH-1..0] и datab[LPM_WIDTH-1..0]; во втором примере входными портами являются a3,a2,a1,a0,b3,b2,b1 и b0.

В параметризируемой функции за списком параметров следует ключевое слово WIDTH и список имен параметров. Список заключен в круглые скобки; имена отделены друг от друга запятыми.

За списком выходных и двунаправленных портов функции следует ключевое слово RETURNS.В первом примере, показанном выше, выходными портами являются result[LPM_WIDTH-1..0], count и overflow;во втором примере - less, equal и greater.

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

При импортировании и экспортировании конечных автоматов, используемый файлом оператор Function Prototype должен использовать автоматный порт (определяемый ключевым словом MACHINE) для указания того, какие входы и выходы являются конечными автоматами. Пример:

FUNCTION ss_def (clock, reset, count)

RETURNS (MACHINE ss_out);

Оператор Function Prototype заканчивается символом (;).

Oператор Function Prototype должен быть расположен за пределами других разделов языка AHDL и кроме того он должен располагаться до экземпляра логической функции созданной путем объявления объекта или подставляемой ссылки (in-line reference).

Для экземпляра примитива также следует использовать механизм объявления объекта (Instance Declaration) или подставляемую ссылку (in-line reference). Однако, в отличие от мега- и макрофункций логика функционирования примитива предопределена, таким образом нет необходимости определять логику функционирования примитива в отдельном файле проекта. Кроме того нет необходимости использовать оператор Function Prototype, за исключением тех случаев, когда нужно изменить порядок следования портов примитива.

Следующий пример демонстрирует прототип функции, существующий по умолчанию для примитива JKFF:

FUNCTION JKFF (j, k, clk, clrn, prn)

RETURNS (q);

Данный пример показывает модифицированный прототип функции для примитива JKFF:

FUNCTION JKFF (k, j, clk, clrn, prn)

RETURNS (q);

Альтернативой использования оператора Function Prototype в файле проекта является применение оператора Include для подключения файлов с расширением .inc, содержащих прототипы используемых функций. Кроме того MAX+PLUSII имеет в своем составе команду Create Default Include File в меню File, которая автоматически создает файл с расширением .inc, содержащий прототип функции для текущего файла проекта.

Прототипы функций для всех мега- и макрофункций хранятся в файлах с расширением .inc в директориях \maxplus2\max2lib\mega_lpm и \maxplus2\max2inc соответственно. Контекстно-зависимая подсказка для всех поставляемых фирмой Altera мега-, макрофункций и примитивов, выводит содержимое соответствующих им прототипов функций.

3.8 Определение порядка следования битов (оператор Options)

Оператор Options предназначен для определения значения опции BIT0, указывающего в отношении группы, является ли бит с наименьшим номером битом с наибольшим весом (MSB - Most Significant Bit), битом с наименьшим весом (LSB - Least Significant Bit) или с весом, зависящим от места расположения индекса данного бита при описании группы. Использование данной опции позволяет избежать генерации сообщений предупредительного характера, если бит с наименьшим номером в группе используется не в качестве бита с наименьшим весом, что предполагается по умолчанию. При описании группы с размерностью, определенной диапазоном чисел, левое число представленного диапазона (заметим, что оно может быть и наименьшим и наибольшим в данном диапазоне) всегда представляет собой индекс бита с наибольшим весом (MSB - Most Significant Bit); соответственно правое число представленного диапазона (заметим также, что оно может быть и наименьшим и наибольшим числом указанного диапазона) всегда представляет собой индекс бита с наименьшим весом (LSB - Least Significant Bit). Если упомянутый диапазон чисел представлен в возрастающем порядке и при этом не установлена опция BIT0=MSB, то будет сгенерировано предупреждающее сообщение .Если использована опция BIT0=MSB и упомянутый диапазон представлен в убывающем порядке, то также будет сформировано предупреждающее сообщение. При установке опции BIT0=ANY можно определять размерности групп диапазонами чисел, представленных как в возрастающем, так и в убывающем порядке без генерации предупреждающих сообщений.

Оператор Options начинается ключевым словом OPTIONS, за которым следует опция BIT0 и ее установка. Оператор Options заканчивается символом (;).

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

OPTIONS BIT0 = MSB;

В данном примере бит с наименьшим номером в группе определен как бит, имеющий наибольший вес (MSB).Другими возможными вариантами являются LSB - наименьший вес и ANY - вес, зависящий от расположения бита с наименьшим номером при описании группы.

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

3.9 Контроль арифметических выражений (оператор Assert)

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

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

ASSERT (WIDTH > 0)

REPORT "Ширина (%) должна быть положительным целым" WIDTH

SEVERITY ERROR

HELP_ID INTVALUE;

-- for internal Altera use only

Оператор Assert имеет следующие характеристики:

За ключевым словом ASSERT следует арифметическое выражение, в необязательном порядке заключенное в круглые скобки. Когда выражение принимает значение `ложь', строка - сообщение, следующая за ключевым словом REPORT, выводится в текстовом процессоре .При отсутствии условного выражения строка сообщения выводится безусловно.

За ключевым словом REPORT следует строка сообщения и необязательные параметры, представленные переменными. Строка сообщения заключается в двойные кавычки и может содержать символы % , которые замещаются значениями соответствующих переменных. Если ключевое слово REPORT не используется и при этом значение выражения арбитражного характера принимает значение `ложь', то в текстовом процессоре выдается следующее сообщение:

<severity>: Line <line number>, File <filename>: Assertion failed

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

За необязательным ключевым словом SEVERITY следует уровень строгости ERROR, WARNING или INFO. По умолчанию предполагается уровень строгости ERROR.

Ключевое слово HELP_ID и строка - подсказка поддерживается в некоторых поставляемых фирмой Altera функциях и зарезервировано для внутреннего использования фирмой Altera.

Оператор Assert заканчивается символом (;).

Оператор Assert может использоваться внутри раздела Logic или за пределами других разделов языка AHDL.

3.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 являются выводами устройства. В файлах более низких уровней иерархии все типы портов являются точками входа и выхода данного файла, но не устройства в целом.

3.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, <primitive>, <megafunction>, <macrofunction> или <state machine declaration>. В примере, показанном выше, внутренними переменными являются a, b и c, имеющие тип NODE; temp является экземпляром макрофункции halfadd; и tsnode является объектом типа TRI_STATE_NODE.

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

В файле с расширением .fit для текущего проекта могут иметь место имена, сгенерированные компилятором и имеющие в своем составе знак тильда (~).

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

Символ тильды зарезервирован исключительно для имен генерируемых компилятором; использовать их для обозначения выводов, узлов и групп (шин) запрещено.

3.11.1 Объявление объектов (Instance Declarations)

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

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

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

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

При использовании процедуры объявления объекта в разделе описания переменных производится описание переменной типа

<primitive>, <megafunction> или <macrofunction>.

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

<имя экземпляра>.<имя порта>

Например, если необходимо использовать в данном файле проекта функции 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”.

3.11.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 данного файла проекта.

3.11.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;

3.11.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^<количество битов состояний>

3.11.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 не могут использоваться в файлах проектов верхнего уровня.

3.12 Раздел тела проекта (Logic)

Раздел Logic определяет логическое функционирование текстового файла проекта (TDF) и является собственно его телом.

Раздел Logic заключается в ключевые слова BEGIN и END. За ключевым словом END следует символ (;), заканчивающий раздел. Если используется оператор Defaults, то он должен предшествовать всем другим операторам в этом разделе.

AHDL является параллельным языком. Компилятор анализирует поведенческую модель, описанную в разделе Logic, параллельно. Выражения, осуществляющие множественные присваивания объекту, имеющему тип NODE или переменной, объединяются в соответствии с функцией монтажное ИЛИ.

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

Булевские выражения.

Управляющие булевские выражения.

Оператор Case.

Оператор Defaults.

Оператор If Then.

Оператор If Generate

Оператор If Generate

Оператор таблицы истинности

Раздел Logic может также содержать оператор Assert.

3.12.1 Задание исходных значений (Defaults Statment)

Оператор Defaults позволяет определять значения по умолчанию, применяемые в таблицах истинности, а также в операторах If Then и Case. Поскольку активно- высокие сигналы автоматически имеют значения по умолчанию GND, то оператор Default необходим лишь в случае использования активно-низких сигналов.

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

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

BEGIN

DEFAULTS

a = VCC;

END DEFAULTS;

IF y & z THEN

a = GND;% a активный низкий %

END IF;

END;

Оператор Defaults имеет следующие характеристики:

Значения по умолчанию заключаются в ключевые слова DEFAULTS и END DEFAULTS. Оператор заканчивается символом (;).

Тело оператора Defaults состоит из одного или более логических выражений, присваиваемых константам или переменным. В примере, показанном выше, значение по умолчанию VCC присваивается переменной a.

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

Оператор Default активизируется в том случае, когда какая-либо переменная, включенная в список оператора Default в каком-либо из операторов, оказывается неопределенной. В примере, показанном выше, переменная a оказывается неопределенной, если y и z имеют значения логического нуля; таким образом активизируется выражение (a = VCC) в операторе Default.

При использовании оператора Default необходимо соблюдать следующие правила:

В разделе Logic допускается использовать не более одного оператора Default и кроме того при его использовании он должен располагаться сразу за ключевым словом BEGIN.

Если в операторе Default в отношении одной и той же переменной производятся многократные присваивания, то все присваивания за исключением последней игнорируются.

Оператор Default не может использоваться для присваивания значения X (безразлично) переменным.

Многократные присваивания значений узлу, имеющему тип NODE, объединяются в соответствии с функцией логическое ИЛИ, за исключением того случая, когда значением по умолчанию для этой переменной является VCC. Следующий пример текстового файла проекта (TDF) иллюстрирует значения по умолчанию для двух переменных: a с значением по умолчанию GND и bn с значением по умолчанию VCC:

BEGIN

DEFAULTS

a = GND;

bn = VCC;

END DEFAULTS;

IF c1 THEN

a = a1;

bn = b1n;

END IF;

IF c2 THEN

a = a2;

bn = b2n;

END IF;

END;

Этот пример эквивалентен следующему выражению:

a = c1 & a1 # c2 & a2;

bn = (!c1 # b1n) & (!c2 # b2n);

Переменные, имеющие активно низкий уровень и участвующие в многократных присваиваниях, должны иметь значение по умолчанию VCC. В следующем примере reg[].clrn имеет значение по умолчанию VCC:

SUBDESIGN 5bcount

(

d[5..1]: INPUT;

clk: INPUT;

clr: INPUT;

sys_reset: INPUT;

enable: INPUT;

load: INPUT;

q[5..1]: OUTPUT;

)

VARIABLE

reg[5..1] : DFF;

BEGIN

DEFAULTS

reg[].clrn = VCC;

END DEFAULTS;

reg[].clk = clk;

q[] = reg[];

IF sys_reset # clr THEN

reg[].clrn = GND;

END IF;

!reg[].prn = (load & d[]) & !clr;

!reg[].clrn = load & !d[];

reg[] = reg[] + (0, enable);

END;

3.12.2 Булевские выражения (Boolean Equations)

Булевские выражения используются в разделе Logic текстового файла проекта на языке AHDL для представления соединений узлов, входных и выходных потоков сигналов через входные и выходные выводы, примитивы, макро- и мегафункции и конечные автоматы.

Следующий пример демонстрирует сложное булевское выражение:

a[] = ((c[] & -B"001101") + e[6..1]) # (p, q, r, s, t, v);

Левая часть выражения может быть символическим именем, именем порта или именем группы. Для инвертирования выражения в левой части выражения можно пользоваться операцией NOT (!). Правая часть равенства представлена булевским выражением, вычисляемым в порядке, описанном в разделе “Приоритеты булевских операторов и операций отношения”.

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

В примере, показанном выше, булевское выражение в правой части равенства вычисляется в соответствии со следующими правилами:

Двоичное число B”001101” меняет знак и принимает вид B”110011”. Унарная операция (-) имеет наивысший приоритет.

B”110011” объединяется по И с группой c[]. Эта операция имеет второй уровень приоритета, потому что она заключена в круглые скобки.

Результат групповой операции, проведенной на втором шаге, прибавляется к группе e[6..1].

Результат, полученный на третьем шаге, объединяется по ИЛИ с группой (p, q, r, s, t, v). Это выражение имеет наименьший уровень приоритета.

Результат операции присваивается группе a[ ].

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

В отношении булевских выражений используются следующие правила:

Множественные присваивания, осуществляемые в отношении переменной объединяются в соответствии с монтажным ИЛИ (#), исключая тот случай, когда значением по умолчанию для этой переменной является VCC.

Узлы в левой части булевского выражения однозначно соответствуют узлам в правой части .

Если значение одиночного узла, VCC или GND присваиваются группе, то значение узла или константы копируется до размерности группы . Например, (a, b) = e эквивалентно a = e и b = e.

Если и левая и правая части выражения представляют собой группы одинакового размера, то каждый член группы, расположенной в правой части, соответствует тому члену группы в левой части, который расположен на той же позиции .Например, (a, b) = (c, d) эквивалентно a = c и b = d.

При сложении двух групп в правой части булевского выражения с использованием операции (+) можно добавить символ “0” слева каждой группы для знакового расширения. Этот метод может быть использован для получения дополнительного бита сигнала переноса в группе, расположенной в левой части выражения. В следующем примере группы count[7..0] и delta[7..0] представлены в знакорасширенном формате для получения значения бита переноса, обозначенного символическим именем cout в левой части выражения:

(cout, answer[7..0]) = (0, count[7..0]) + (0, delta[7..0])

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

a[4..1] = b[2..1]

В данном выражении биты отображаются в следующем порядке:

a4 = b2

a3 = b1

a2 = b2

a1 = b1

Группа узлов или чисел не может быть присвоена одиночному узлу.

Если число в правой части выражения присваивается группе, расположенной в левой части выражения, то число усекается или расширяется путем распространения знака до соответствия размеру группы в левой части. Если при этом происходит усечение значащих битов, то компилятор выдает сообщение об ошибке. Каждый член в правой части выражения присваивается соответствующему члену в левой части выражения по порядку. Например, (a, b) = 1 эквивалентно a = 0; b =1;

Запятые могут использоваться для резервирования места под неупомянутые элементы группы в булевских выражениях Следующий пример демонстрирует использование запятых для резервирования места под отсутствующие элементы группы (a, b, c, d) :

(a, , c, ) = B"1011";

В данном примере элементам a и c присваивается значение “1”.

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

3.12.3 Управляющие булевские выражения (Boolean Control Equations)

Управляющие булевские выражения используются в разделе Logic для определения значений сигналов Clock, Reset и Clock Enable в конечных автоматах.

Следующий пример демонстрирует использование управляющих булевских выражений:

ss.clk = clk1;

ss.reset = a & b;

ss.ena = clk1ena;

Управляющие булевские выражения имеют следующие характеристики:

Значения сигналов Clock, Reset и Clock Enable для всякого конечного автомата могут быть определены с использованием следующего формата: <имя конечного автомата>.<имя порта>.В примере, показанном выше, значения этих входов определены для конечного автомата с именем ss.

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

Тактирующему сигналу <имя конечного автомата>.clk должно быть присвоено значение.

Если в качестве начального значения конечного автомата выбрано ненулевое значение, то должен использоваться сигнал начальной установки <имя конечного автомата>.reset; в противном случае использование этого сигнала необязательно.

Использовать тактирующий сигнал <имя конечного автомата>.ena необязательно.

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

3.12.4 Оператор проверки списка (Case.)

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

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

CASE f[].q IS

WHEN H"00" =>

addr[] = 0;

s = a & b;

WHEN H"01" =>

count[].d = count[].q + 1;

WHEN H"02", H"03", H"04" =>

f[3..0].d = addr[4..1];

WHEN OTHERS =>

f[].d = f[].q;

END CASE;

Оператор Case имеет следующие характеристики:

Булевское выражение, группа или конечный автомат располагаются между ключевыми словами CASE и IS (в примере, показанном выше, это f[ ].q).

Оператор Case завершается ключевыми словами END CASE за которыми следует символ (;).

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

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

Если значение булевского выражения, стоящего за ключевым словом CASE, соответствует какому - либо альтернативному варианту, то все операторы, следующие за соответствующим символом (=>) активизируются. В примере, приведенном выше, если f[ ].q равно h”01”, то активизируется булевское выражение count[ ].d = count[ ].q + 1.

Если значение булевского выражения, стоящего за ключевым словом CASE не равно ни одному из альтернативных вариантов, то активизируется альтернативный вариант, стоящий за ключевыми словами WHEN OTHERS. В примере, показанном выше, если значение f[ ].q не равно H”00”, H'01” или H”CF”, то активизируется выражение f[ ].d = f[].q.

Оператор Defaults определяет значение по умолчанию для тех случаев, когда ключевые слова WHEN OTHERS не используются.

Если оператор Case используется для определения переходов конечного автомата, то ключевые слова WHEN OTHERS не могут использоваться для выхода из недопустимых состояний. Если состояния конечного автомата определяются n -мерным кодом и при этом автомат имеет 2^n состояний, то использование ключевых слов WHEN OTHERS является допустимым.

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

3.12.5 Оператор проверки логического выражения (If Then.)

Оператор If Then содержит список операторов, выполняемых в том случае, если булевское выражение, расположенное между ключевыми словами IF и THEN, принимает истинное значение .

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

IF a[] == b[] THEN

c[8..1] = H "77";

addr[3..1] = f[3..1].q;

f[].d = addr[] + 1;

ELSIF g3 $ g4 THEN

f[].d = addr[];

ELSE

d = VCC;

END IF;

Оператор If Then имеет следующие характеристики:

Между ключевыми словами IF и THEN располагается булевское выражение, в зависимости от значения которого выполняется или не выполняется список операторов, располагающийся за ключевым словом THEN. Каждый оператор в этом списке оканчивается символом (;).

Между ключевыми словами ELSEIF и THEN располагается дополнительное булевское выражение а за ключевым словом THEN также располагается список операторов, выполняемых в зависимости от значения булевского выражения. Эти необязательные ключевые слова и операторы могут повторяться многократно.

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

Ключевое слово ELSE, за которым следует один или более операторов, схоже по своему значению с ключевыми словами WHEN OTHERS в операторе Case. Если ни одно из булевских выражений не приняло истинное значение, то выполняются операторы, следующие за ключевым словом ELSE. В примере, показанном выше, если ни одно из булевских выражений не приняло истинного значения, то выполняется оператор d = VCC. Использование ключевого слова ELSE не является обязательным.

Значения булевских выражений, следующих за ключевыми словами IF и ELSEIF оцениваются последовательно.

Оператор If Then заканчивается ключевыми словами END IF за которыми следует символ (;).

Оператор If Then может генерировать логические схемы, которые слишком сложны для компилятора. Если оператор If Then содержит сложные булевские выражения, то учет инверсии каждого из этих выражений вероятно приведет к еще более сложным булевским выражениям. Например, если a и b сложные выражения, то инверсия этих выражений может быть еще более сложной.

Оператор If:Интерпретация компилятором:

IF a THENIF a THEN

c = d;c = d;

END IF;

ELSIF b THENIF !a & b THEN

c = e;c = e;

END IF;

ELSE IF !a & !b THEN

c = f;c = f;

END IF;END IF;

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

3.12.6 Оператор проверки логического выражения (If Generate )

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

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

IF DEVICE_FAMILY == "FLEX8K" GENERATE

c[] = 8kadder(a[], b[], cin);

ELSE GENERATE

c[] = otheradder(a[], b[], cin);

END GENERATE;

Оператор If Generate имеет следующие характеристики:

Между ключевыми словами If Generate заключается арифметическое выражение, значение которого подвергается оценке. За ключевым словом GENERATE следует список операторов, каждый из которых заканчивается символом (;). Операторы активизируются в том случае, если арифметическое выражение принимает истинное значение.

За ключевыми словами ELSE GENERATE следует один или более операторов, которые активизируются в случае, если арифметическое выражение принимает ложное значение.

Оператор If Generate заканчивается ключевыми словами END GENERATE, за которыми следует символ (;).

Оператор If Generate может использоваться в разделе Logic и в разделе Variable.

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

Оператор If Generate особенно часто используется с операторами For Generate, что позволяет различным образом обрабатывать особые ситуации, например, младший значащий бит в многокаскадном умножителе. Этот оператор может также использоваться для тестирования значений параметров, как показано в последнем примере.

3.12.7 Оператор цикла (For Generate)

Следующий пример показывает использование итерационного оператора For Generate:

CONSTANT NUM_OF_ADDERS = 8;

SUBDESIGN 4gentst

(

a[NUM_OF_ADDERS..1], b[NUM_OF_ADDERS..1],

cin : INPUT;

c[NUM_OF_ADDERS..1], cout : OUTPUT;

)

VARIABLE

carry_out[(NUM_OF_ADDERS+1)..1] : NODE;

BEGIN

carry_out[1] = cin;

FOR i IN 1 TO NUM_OF_ADDERS GENERATE

c[i] = a[i] $ b[i] $ carry_out[i];% Полный сумматор %

carry_out[i+1] = a[i] & b[i] # carry_out[i] & (a[i] $ b[i]);

END GENERATE;

cout = carry_out[NUM_OF_ADDERS+1];

END;

Оператор For Generate имеет следующие характеристики:

Между ключевыми словами FOR и GENERATE заключаются следующие параметры:

Временная переменная, представляющая собой символическое имя. Эта переменная используется лишь в пределах оператора For Generate и заканчивает свое существование после того, как компилятор обработает этот оператор. В примере, показанном выше такой переменной является переменная i. Это имя не может использоваться в качестве имени константы, параметра или узла в пределах данного проекта.

За ключевым словом IN следует диапазон, ограниченный двумя арифметическими выражениями. Арифметические выражения разделяются между собой ключевым словом TO. В примере, показанном выше арифметическими выражениями являются 1 и NUM_OF_ADDRESS. Границы диапазона могут содержать выражения, состоящие только из констант и параметров; использование переменных при этом недопустимо.

За ключевым словом GENERATE следует один или более логических операторов, каждый из которых заканчивается символом (;).

Оператор If Generate заканчивается ключевыми словами END GENERATE, за которыми следует символ (;).

3.12.8 Использование ссылок на прототипы функций (In-Line Logic Function Reference)

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

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

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

Следующие примеры демонстрируют прототипы функций compare и lpm_add _sub. Функция compare имеет входные порты a[3..0] и b[3..0], а также выходные порты less, equal, greater; функция lpm_add_sub имеет входные порты dataa[LPM_WIDTH-1..0], cin и add_sub, а также выходные порты result[LPM_WIDTH-1..0], cout и overflow.

FUNCTION compare (a[3..0], b[3..0])

RETURNS (less, equal, greater);

FUNCTION lpm_add_sub (cin, dataa[LPM_WIDTH-1..0], datab[LPM_WIDTH-1..0], add_sub)

WITH (LPM_WIDTH, LPM_REPRESENTATION)

RETURNS (result[LPM_WIDTH-1..0], cout, overflow);

Подставляемые ссылки (in-line logic function references) для функций compare и lpm_add_sub указываются в правой части показанного ниже выражения:

(clockwise, , counterclockwise) = compare(position[], target[]);

sum[] = lpm_add_sub (.datab[] = b[], .dataa[] = a[])

WITH (LPM_WIDTH = 8)

RETURNS (.result[]);

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

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

В списке сигналов имена портов могут иметь позиционное соответствие, либо соответствие по имени:

В примере, показанном выше и демонстрирующем использование функции compare, имена переменных position[] и target[] имеют позиционное соответствие портам a[3..0] и b[3..0]. При использовании позиционного соответствия можно применять запятые для резервирования места под выходы, не подсоединяемые к конкретным переменным. В функции compare выход equal не подключается к переменным, поэтому необходимо использовать запятую для резервирования его места в правой части выражения.

В примере, показанном выше и демонстрирующем использование функции lpm_add_sub, входы .datab[] и .dataa[] соединяются соответственно с переменными b[] и a[] путем установления соответствия по имени. Соответствие между переменными и портами устанавливается посредством использования символа (=).

Имена портов должны иметь следующий формат .<имя порта> как в правой, так и в левой части подставляемой ссылки, использующей способ установления соответствия портов переменным по имени.

Установление соответствия портов переменным по имени возможно лишь в правой части подставляемой ссылки. В левой части подставляемой ссылки всегда используется позиционное соответствие.

В параметризируемой функции, за ключевым словом WITH и списком имен параметров следует список входных портов. Этот список заключается в круглые скобки, а имена параметров разделяются запятыми. Декларируются лишь те параметры, которые используются объектом; значения параметров отделяются от имен параметров посредством символа равенства. В примере, показанном выше и демонстрирующим использование функции lpm_add_sub, параметру LPM_WIDTH присвоено значение 8. Если какому-либо параметру не присвоено никакого значения, то компилятор осуществляет поиск значений для этих параметров в том порядке, который описан в разделе “Оператор Parameters”.

...

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

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

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

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

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

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

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

  • Элементы языка Object Pascal: идентификаторы, константы, переменные, выражения. Структура проекта Delphi. Операторы и метки. Типы данных языка OPascal. Статические и динамические массивы. Записи с вариантными полями. Совместимость и преобразование типов.

    курс лекций [385,4 K], добавлен 18.02.2012

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

    курсовая работа [37,7 K], добавлен 03.05.2012

  • История разработки языка программирования Си. Программа на Си как одна или несколько единиц компиляции (файлов), стадии работы компилятора. Идентификаторы и ключевые слова, типы констант. Форма Бекуса-Наура описания синтаксиса формальных языков.

    презентация [257,7 K], добавлен 05.01.2014

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

    курсовая работа [132,5 K], добавлен 28.06.2009

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

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

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

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

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

    дипломная работа [276,6 K], добавлен 26.01.2011

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

    учебное пособие [135,0 K], добавлен 17.02.2012

  • История создания и применение языка Basic. Стандартные математические и строковые функции. Операции и выражения языка. Блоки данных и подпрограммы. Операторы управления, цикла, ввода-вывода и преобразования информации. Константы, переменные, массивы.

    контрольная работа [2,3 M], добавлен 04.05.2015

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

    контрольная работа [31,2 K], добавлен 12.12.2009

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

    курсовая работа [704,6 K], добавлен 21.02.2015

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

    презентация [396,3 K], добавлен 12.11.2012

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

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

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

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

  • Составление Win32 App проекта - простейшего текстового редактора, который позволяет выполнять такие операции: редактирование текста, копирование и вставку из одного окна проекта в другое окно проекта. Методы вызова диалогов сохранения и открытия файла.

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

  • Информационные технологии и защиты данных. Методы защиты информации. Виды информационной безопасности и умышленные угрозы. Программирование на языке Turbo Pascal. Типы числовых данных. Функции ввода и вывода. Логические операторы, символьные переменные.

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

  • Ознакомление со структурой языка программирования Turbo-Pascal 7.0, его алфавитом, выражениями и простейшими конструкциями (метками, идентификаторами). Способы описания арифметических, вещественных, логических и символьных операций в программной среде.

    реферат [68,2 K], добавлен 07.02.2011

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