2.5.3. Язык проектирования электронных устройств VHDL VHDL - язык моделирования дискретных электронных устройств, утвержденный в 1987 г. в качестве международного стандарта IEEE 1076. Основная версия языка IEEE 1076 VHDL предназначена для моделирования дискретных устройств преимущественно на уровнях вентильном, RTL и корпусов микросхем. Язык VHDL успешно используется и при синтезе устройств. В дальнейшем стандарт корректировался и расширялся, новые версии приняты в 1993 и 1999 гг. Так, версия 1999 г., получившая индекс ШЕЕ 1076.1, содержит средства описания аналоговых и смешанных моделей. Эти описания вместе с базовым вариантом языка VHDL образуют язык VHDL-AMS. VHDL - не единственный язык проектирования радиоэлектронной аппаратуры. Так, для проектирования интегральных схем широко применяется Verilog, находят применение языки Cupl, Palasm и другие, но для сквозного проектирования на всех требуемых для СБИС уровнях функционального проектирования (выше схемотехнического) предназначены только VHDL и Verilog. В VHDL имеются средства для поведенческих и структурных описаний [10]. Описание схемы на языке VHDL включает две части. Первая часть - описание схемы как компонента некоторой над-системы, т.е. это прежде всего описание интерфейсов схемы с внешней средой. Вид этой части, называемой сущностью - entity (здесь и далее принято выделение служебных слов языка VHDL полужирным шрифтом, а нетерминальных символов - курсивом): entity имя_сущности is декларации end имя_сущности; Назначение второй части- описание внутренних свойств схемы (структуры или функций), она называется архитектурным телом: architecture имя_ахитектурного_тела of имя_сущности is [декларации] begin описание _схемы_или_алгоритма end имя_архитектурного_тела; У одной схемы (сущности) может быть несколько архитектурных тел, так как могут быть описаны разные аспекты (структура или алгоритмы) и версии объекта, причем на разных иерархических уровнях. Различают структурное и поведенческое описания сущностей. В декларации структурного описания перечисляются сигналы на входах и выходах схемы в виде следующего предложения: port (список_идентификаторов_входных_сигналов: in тип; списокидентификаторов_ выходных_ сигналов: out тип); Фактически списки идентификаторов - это списки сигналов или, что то же самое, имен цепей, соединяющих схему с внешним окружением. Словом in отмечен список входных сигналов, словом out - список выходных сигналов, словом inout помечается список цепей, которые могут быть как входными, так и выходными. Но кроме сигналов связь с внешним окружением может характеризоваться и рядом других величин, примерами которых могут служить такие параметры, как температура, количество выводов компонента схемы, временные задержки и т.п. Для их описания используется декларация generic: generic (список_параметров); Конкретные значения параметров могут быть заданы непосредственно в этой декларации, например: generic (Tl: Time := 20 ns; T2: Time := 5 ns; numb: integer := 12); где Time и integer - типы соответствующих данных. В декларациях архитектурного тела объявляются типы, фигурирующие в данном архитектурном теле. Ими могут быть используемые типы компонентов (объекты), параметры и сигналы. В декларации могут входить также описания процедур, функций, типов данных. В качестве примера рассмотрим структурное представленной на рис. 2.26: entity schema is port (a,b,c,d,e: in BIT; y: out BIT); end schema; Рис. 2.26. Фрагмент логической схемы architecture str of schema is component AND_OR generic (delay 1: Time); port (i1,i2,i3,i4: in BIT; a: out BIT); end component AND_OR; component OR2 generic (delay2: Time); port (i1,i2: in BIT; a: out BIT); end component OR2; signal zl,z2: BIT; begin описание схемы, El: AND_OR generic map (delay 1 := 4ns); port map (a,c,b,c,zl); E2: AND_OR ; generic map (delayl := 5 ns); port map (d,c,e,c,z2); E3:OR2 generic map (delay2 := 3 ns); port map (zl,z2,y); end str; Из примера следует, что в декларации port перечисляются формальные сигналы, а в port map - фактические сигналы, причем последовательность перечисления в обоих местах должна быть согласованной. Допускается и произвольный порядок перечисления при использовании в port map списка с ключевой записью. Например, для ЕЗ последнего примера такой список имеет вид port map (a=>y, 11 =>zl, i2=>z2); Аналогична роль деклараций generic map, используемых в том случае, если конкретные значения параметров различны для разных экземпляров компонентов. Сигналы в цепях, не являющихся входными или выходными для описываемой схемы, должны быть перечислены в декларации архитектурного тела после слова signal. Структурные описания для сложных объектов являются иерархическими. Только структурных описаний недостаточно для задания объекта, нужно описывать также поведение (функции объекта). Поведенческое описание, как минимум, должно быть задано для сущностей нижнего иерархического уровня. Однако в практике проектирования СБИС превалирует нисходящий стиль, следовательно, проектирование начинается с разработки алгоритмов (поведенческих описаний) верхнего иерархического уровня. В описаниях поведения фигурируют типы данных, операторы, процессы, процедуры, функции и т.п. Семантика простых типов данных понятна уже из их названий: INTEGER (целые числа), REAL (действительные числа, их нужно записывать с десятичной точкой), BIT (со значениями 0 и 1), BOOLEAN (со значениями TRUE и FALSE), BIT_VECTOR (строка битов), POSITIVE (положительные целые числа), NATURAL (натуральные числа), CHARACTER ( символы кода ASCII), STRING (строка символов). Отметим, что после символа «--»(двойной дефис) следует примечание. Константы в VHDL описываются следующим образом: constant имя: тип : = значение; Например: constant numb: integer := 1025; или constant col: string := "black"; Переменные декларируются следующим образом: variable имя: тип; Начальные значения переменных могут быть заданы в декларациях, например: signal reg: BIT_VECTOR := "1001100101"; variable vol: real := 5.4; Значения величин типа BIT и CHARACTER, так же как и отдельных элементов массивов BIT_VECTOR и STRING, обрамляются апострофами, а сочетания из более чем одного значения этих массивов заключаются в кавычки. Типы могут быть введены разработчиком модели с помощью описаний следующего вида: type идентификатор is (список значений); (2.8) Например, конечное множество значений задается в виде перечислимого типа type octal_digits is ('О1, Т, '2', '3', '4', '5', '6', 7'); type color is («red», «green», «blue»); Список значений в (2.8) может иметь одну из следующих форм. • В случае скалярных величин - диапазон возможных значений в виде range минимальное ^значение to максимальное _значение; Например: range 1 to 10; или range 10 downto 1; Другой пример - задание часто используемого типа Time: type Time is range -1E9 to 1E9 units fs; ps= 1000 fs; ns=1000ps; us=1000ns; ms=1000us; sec= 1000 ms; min=60sec; hr=60min; end units; Аналогично с помощью конструкции units задаются измерения других физических величин. • В случае массива array (диапазон_индексов) of тип_элементов_массива; Например, вектор из 16 действительных чисел: array (0 to 15) of real; Отметим, что границы диапазонов значений величин или индексов могут быть представлены не только конкретными числовыми значениями, но и в параметрическом виде, если предварительно определены их значения с помощью декларации generic. • В случае записи record список_идентификаторов_и_их_типов; end record; Например: record Day: INTEGER range 1 to 31; Month: month_list; - - month_list-ранее описанный тип; Year: INTEGER range 1900 to 2100; end record; В VHDL применяются операторы присваивания, назначения сигнала, управления, вызова процедур и ряд других. В арифметических выражениях, встречающихся в операторах, используются знаки операций «+» (сложение), «-» (вычитание), «*» (умножение), «/»(деление), mod (деление по модулю), rem (остаток), «**> (возведение в степень), abs (абсолютная величина); в логических выражениях - not (НЕ отрицание), and (И -конъюнкция), or (ИЛИ -дизъюнкция), nand (И-НЕ), nor (ИЛИНЕ), хог (исключающее ИЛИ). Знак «&» использован для указания операции конкатенации. Знаки отношений составляют множество {=, /=, <, <=,>,>=}. Прежде всего рассмотрим, в чем состоит различие между оператором присваивания :=, известным из других алгоритмических языков, и оператором назначения сигнала <=. (Очевидно, что интерпретация символа «<= » как «присваивание значения сигнала» или того же знака как отношения «меньше или равно» определяется из контекста.) Особенность оператора <= в том, что присвоение значений сигналам всегда происходит с задержкой, большей нуля, хотя, если задержка не указана, то она является пренебрежимо малой, например: у <= xl and х2 - задержка на малую величину > 0; у <= xl and x2 after 200 ns ~ задержка на 200 нc. (2.9) Поэтому использование операторов присваивания и назначения сигналов в одной и той же ситуации может дать разные результаты. Например: A: = B or X; С:= A and Z; (2.10) Пусть В = 0, Z=l и в рассматриваемый момент времени X переключается из 0 в 1. После выполнения этих двух операторов С становится равным 1. В случае А < =В о г Х ; С <=А and Z; (2.11) в (2.11) используется старое значение А. Поэтому поскольку старое значение А есть 0, то сигнал С в данный момент времени остается равным 0. Другими словами, в случае (2.10) имеем последовательное выполнение операторов, а в случае (2.11) параллельное, не зависящее от того, в каком порядке операторы записаны. Следует различать понятия инерционной и транспортной задержек. В (2.9) подразумевается инерционная задержка, т.е. у примет после 200 нc новое значение xl and x2, равное 1 только в том случае, если значение xl and x2 оставалось равным 1 в течение этих 200 нc. При транспортной задержке, которая указывается в виде у <= transport xl and x2 after 200 ns; сигнал проходит на выход независимо от его длительности. Примеры других операторов. • Условный оператор: if условие then операторы; else операторы; end if; По отношению к сигналам можно использовать и параллельные формы условного оператора. Форма when: сигнал <= список; где каждая строка списка имеет вид выражение when условие else причем в последней строке else отсутствует, a when может отсутствовать. Например: у <= al and a2 when J = 1 else al and not a2 when J = 2 else al when J= 3; Форма select: with переменная select сигнал <= список; где каждая строка списка имеет вид выражение when значение переменной В том же примере имеем with J select у <= al and а2 when 1, al and not a2 when 2, al when 3; • Оператор выбора: case выражение is список_действий end case; В списке действий столько строк, сколько имеется альтернативных действий. Каждая строка имеет вид when значение_ выражения —> оператор; Например: case J is when 1 => у <= al and a2 when 2 => у <= al and not a2; when 3 => у <= al; end case; • Оператор цикла: for переменная in диапазон_переменной loop операторы end loop; или: метка while отношение loop операторы end loop метка; • Оператор ожидания: wait on список сигналов until условие for значение времени; Возможны сокращенные формы: wait on список сигналов; wait until условие; wait for значение времени; т.е. подразумевается задержка до изменения какого-либо сигнала го списка, до выполнения условия или до исчерпания времени соответственно. • Оператор generate. Структурные описания сложных схем могут стать чрезмерно громоздкими, если все экземпляры компонентов описывать по отдельности. Чтобы устранить этот недостаток, в язык введен оператор generate, порождающий копии компонентов. Например, если схема состоит го 10 экземпляров двухвходового компонента Device, то ее архитектурное тело может выглядеть следующим образом: architecture example of schema is component Device port (il,i2: in BIT; y: out BIT); end component; signal X1 ,X2,Y: BIT_VECTOR (0 to 9); begin for i in 0 to 9 generate En: Device port map (il=>Xl(i),i2=>X2(i),y=>Y(i)); end generate; end example; Моделирование в VHDL осуществляется событийным методом. Реализуется этот метод благодаря не только учету задержек, но и специальным механизмам, таким, как оператор processили охраняемые блоки. Process - это блок, выполняемый только тогда, когда происходи изменения его входных параметров. Структура этого блока: [метка:] process [(список параметров)] тело_процесса — здесь описываются вложенные в процесс -- типы и операторы end process [метка]; Охраняемый (guarded) блок имеет вид метка: block (охранное выражение) begin операторы end block метка; Операторы блока выполняются только при истинном значении охранного выражения. При поведенческом описании сущностей архитектурное тело представляет собой алгоритмы, реализуемые в схеме. Подразумевается, что все операторы в архитектурном теле выполняются параллельно (последовательное выполнение имеет место внутри процессов и подпрограмм). Рассмотрим пример поведенческого описания схемы, приведенной на рис. 2.26. Первый вариант: architecture alg of schema is signal zl,z2: BIT; begin zl <= not ((a and c) or (b and c)); z2 <= not ((d and c) or (e and c)); у <=not (zl or z2); end alg; Второй вариант с использованием оператора process: architecture alg of schema is signal zl,z2: BIT; begin process (a,b,d,e,c) begin zl <= not ((a and c) or (b and c)); z2 <= not ((d and c) or (e and c)); у <= not (zl or z2); end process; end alg; Третий вариант, в котором сигналы a, b, d, е представлены в виде элементов двоичного вектора X: entity schema is port (с: in BIT; X: in BIT_VECTOR (1 to 4); y: out ВIT); end schema; architecture alg of schema is signal zl,z2: BIT; begin zl<=not((X(l)and c)or(X(2)and c)); z2<=not((X(3)and c)or(X(4)and c)); y<=not (z1 or z2); end alg; Приведенный ниже пример D-триггера - это пример использования охраняемого блока. D-триггер при R = ‘1’ переходит в состояние '0', иначе, если С =’1’Г, на выходе Q устанавливается значение входного сигнала S. D:block(C =’1’or R =’1’) begin Q <= guarded '0' when R =’1’ else S when С = '1' else Q; end block D; В языке VHDL допускаются смешанные описания, имеющие место в том случае, если в архитектурном теле одновременно присутствуют как операторы поведенческого моделирования, так и элементы структурного описания. Например: architecture unit of schema is component add port (xl,x2: in BIT; у: out BIT); end component; signal b: BIT; begin b<=not a; El: add port map (a,b,d); end unit; При моделировании структурное описание компонента El заменяется его поведенческим описанием, которое также должно быть разработано. Форма представления процедур и функций в VHDL аналогична формам, используемым во многих алгоритмических языках. Вид описания процедуры: procedure имя (список_параметров) is описания _типов; begin тело end имя; Описание функции: function имя (список параметров) return тип функции is begin тело end имя; (2.12) В теле функции имеется оператор return выражение, это выражение и задает возвращаемое значение функции. В пакеты оформляются части описаний, используемые неоднократно в разных местах VHDL-модели. Пакет имеет форму: package имя is описание _типов_и/или_функций end имя; При этом код функций помещается в тело пакета: package body имя is описание _процедур_и/или_функций end имя; Описание функций имеет вид (2.12). Если описываются только типы, тело пакета не требуется. Если пакет нужно использовать в некоторой сущности, то перед ее описанием (перед фразой entity) достаточно сделать ссылку на пакет в виде use имя_пакета; Например, в следующей записи отражено использование библиотек компонентов IEEE, DW03 и широко распространенных пакетов IEEE. std_logic_l 164. all, IEEE. std_logic_arith. all и DW03.DW03_components.all: library IEEE, DW03; useIEEE.std_logic_1164.all; useIEEE..std_logic_arith.all; use DW03.DW03_components. all; entity unitl is port (.... В VHDL имеются стандартные (предопределенные) атрибуты: S'LAST_VALUE - предыдущее (перед последним изменением) значение сигнала S; S'STABLE (Т) - принимает значение true, если сигнал S не изменялся в течение времени Т; S'DELAYED (Т) - значение сигнала S в момент времени t -Т, где t - текущее время; S'EVENT - принимает значение true, если с сигналом S произошло событие (сигнал изменился); A'RANGE, A'LEFT, A'RIGHT - диапазон, нижняя и верхняя границы массива А; и некоторые другие. В частности, эти стандартные значения позволяют лаконично описывать некоторые важные ситуации. Например, выражения Х= ‘1’ and not X'STABLE или Х= ‘1’ and X'EVENT , оказываются истинными в момент положительного фронта сигнала X, и, следовательно, с помощью любого из этих выражений можно представлять события, происходящие по положительному фронту сигнала. Если вместо X =’1’ записать X = '0', то эти выражения будут соответствовать отрицательному фронту сигнала X. Как уже отмечалось, в программах моделирования на VHDL используется событийный метод. Можно выделить две фазы моделирования. На первой из них устанавливаются исходные значения переменных и сигналов, настраиваются внешние сигналы, модельное время устанавливается в нуль. Вторая фаза моделирование до истечения установленного времени Т. Рассмотрим примеры моделей схем на языке VHDL. Пример 1. Генератор синхросигналов. entity clock is generic (tl: Time:=10ns;t2:Time:=10ns); port (c: out BIT := '0'); --tl и t2 в сумме составляют период синхросигналов, ~ начальное значение сигнала с есть низкий уровень, т.е. ‘0’. end clock; architecture gen of clock is generic (N:integer:=1000); -- N есть число периодов колебаний на отрезке -- моделирования; begin A: process begin for i in 1 to N loop с <='1'; wait for tl; c<='0'; wait fort2; end loop; end process A; . end gen; Пример 2. Возможный вариант описания D-триггера (сигнал R - установка в 0, при С = 1 на выходе Q устанавливается значение входа S): entity FF is port (R,S,C: in BIT; Q: out BIT); end FF; architecture func of FF is begin work: process (R,C) begin if R=’1’ thenQ<='0';elsif C=’1’ then Q<=S; else Q<=Q; end if; end process work; end func; П p и м e p 3. Повторение примера 2, но установка состояния S происходит по положительному фронту сигнала С. В этом случае можно сохранить предыдущую модель, лишь заменив второе условие в операторе if на выражение not C'STABLE and С = ' 1’ П р и м е р 4. Требуется описать операции записи данных в восьмиразрядный регистр 1 со входа А по переднему фронту тактового сигнала С и далее данных из регистра 1 в регистр 2 по заднему фронту того же сигнала (в этом примере иллюстрируется представление сигналов битовыми векторами): entity REG is port(A: in BIT_VECTOR(0 to 7); C: in BIT; Z: out BIT_VECTOR(0 to 7)); end REG; architecture alg of REG is signal B: BIT_VECTOR(0 to 7); begin m: block((C = 'I 1 and not C'STABLE) or (C= '0' and not C'STABLE)) В <= guarded A after tl when C=’1’ and not C'STABLE; Z <= guarded В after t2 when C= '0' and not C'STABLE; end block m; end alg; П p и M e p 5. Конвертор параллельного кода в последовательный entity converter is generic (tact: Time); port (paral: in BIT_VECTOR (0 to 7); clock: in BIT; seq: out BIT); end converter; architecture alg of converter is begin A: process ,, variable delay: Time := tact; ~ описывается переменная delay типа Time с начальным -- значением tact. begin wait until clock =’1’; for iinparal'range loop seq <= transport paral(i) after delay; delay:= delay+tact; end loop; seq <= transport '0' after delay; end process A; end alg; П p и M e p 6. Автомат Мура (рис. 2.27), где П - память (12-разрядный регистр), КС - комбинационная схема. entity Moore is generic (Т: Time:=25 ns; N: integer:=12; M: integer:=9); port (X: in BIT_VECTOR (1 to N); C: in BIT; F: out BIT_VECTOR (1 to M)); end Moore; X F C Рис.2.27. Автомат Мура Architecture cont of Moore is signal Rl, R2: BIT_VECTOR (1 to N); begin i; process (R2) begin F <= CC2 (R2); end process; -- Идентификаторами СС1 и СС2 обозначены функции, -- описывающие поведение -- соответствующих КС, описания функций здесь не приведены process (С) begin R2<=CC1(R2,X) after T; end process; end cont; П p и M e p 7. Мультиплексор, схема и таблица функционирования которого приведены на рис. 2.28 [68]. entity mpx is port (X: in BIT_VECTOR (1 to 4); A: in BIT_VECTOR (1 to 2); y: out BIT); end mpx; -- архитектурное тело algl - первоначальное поведенческое -- описание, выражающее алгоритм функционирования -- устройства. X1 X2 X3 X4 MUX4 Y A1 A2 Рис. 2.28. Изображение мультиплексора и его функциональность architecture alg of mpx is begin process begin with A select у <= x(l) when «00», x(2) when «01», x(3) when «10», x(4) when «11»; end; end algl; -- архитектурное тело alg2 - поведенческое описание в стиле ~ потока данных, полученное после выбора элементщй базы и -- определенной конкретизации схемных решений. architecture alg2 of mpx is signal mal,ma2: BIT_VECTOR (1 to 2); signal: my: BIT_VECTOR (1 to 4); begin for i in 1 to 2 loop mal(i) <= not A(i) after 3 ns; ma2(i) <= not mal(i) after 3 ns; end loop; my(l) <= not (x(l) and ma 1(1) and ma 1(2)) after 5 ns; my(2) <= not (x(2) and mal(l) and ma2(2)) after 5 ns; my(3) <= not (x(3) and ma2(l) and mal(2)) after 5 ns; my(4) <= not (x(4) and ma2(l) and ma2(2)) after 5 ns; у <= not (my(l) and my(2) and my(3) and my(4)) after 5 ns end alg2; ~ архитектурное тело schema - структурное описание, ~ выражающее логическую схему устройства. architecture schema of mpx is component ANDN3 port (a.b.c: in BIT; z: out BIT); end component; component ANDN4 port (a,b.c,d: in BIT; z: out BIT); end component; Рнс. 2.29. Логическая схема мультиплексора component INV port (x: in BIT; у: out BIT); end component; signal mal,ma2: BIT_VECTOR (1 to 2); signal: my: BIT_VECTOR(1 to 4); el: ANDN3 port map (x(l),mal(l),ma2(l),my(l)); e2:ANDN3 port map (x(2),mal(l),ma2(2),my(2)); e3:ANDN3 port map (x(3),mal(2),ma2(l),my(3)); e4: ANDN3 port map (x(4),mal(2),ma2(2),my(4)); e5:ANDN4 port map (my(l),my(2),my(3),my(4),y); e6:INV port map (A(l),mal(l)); e7:INV port map (mal(l),ma2(l)); e8:INV port map (A(2),mal(2)); e9:INV ' port map (mal(2),ma2(2)); end schema; П р и м е р 8 . В этом примере рассматривается возможный вариант модели двоичного сумматора, на входы которого подаются двухразрядные двоичные слагаемые А и В, на выходе получается трехразрядное двоичное число Y. Главное назначение примера - иллюстрация применения пакета (package). В примере используется операция сложения целых десятичных чисел, что требует перевода слагаемых А и В из двоичной системы в десятичную, а полученной суммы из десятичной системы в двоичную. Для перевода используются функции tran2_10 и tranlO_2. Эти функции объединены в пакет tran. entity add is port (A: in BIT_VECTOR (0 to 1); B: in BIT_VECTOR (0 to 1); Y: out BIT_VECTOR (0 to 2)); end add; package tran is function tran2_l0 (signal X1, X2: BIT) return integer; function tranlO_2 (signal X: integer) return BIT_VECTOR; end tran; package body tran is function tran2_10 (signal XI, X2: BIT) return integer is variable Z: integer := 0; — функция преобразования двухразрядных двоичных чисел в ~ десятичные; -- аргументы XI и Х2 соответственно ~ младший и старший разряды двоичного числа begin if XI = ' 1 ’ then X:=1; else X := 0; end if; if X2 = ' 1 ’ then X:=X+2; else X := X; end if; return X; end tran2_10; . function tranlO_2 (signal X: integer) return BIT_VECTOR is variable Y: BIT_VECTOR (0 to 2); variable tl: integer := 0; variable t2: integer := 0; --функция преобразования десятичных чисел в диапазоне —от 0 до 7 в трехразрядные двоичные числа begin t1:=X; for i in 2 downto 0 loop t2:=tl/(2**i); tl:=tlrem(2**i); ift2=l then Y(i) :=' 1 '; else Y(i) := '0' ; end if; end loop; return Y; end tranlO_2; end tran; architecture sum of add is use tran.all; signal aint, bint: integer range 0 to 3; signal yint: integer range 0 to 7; begin aint <= tran2_10 (A(0), A(l)); bmt<=tran2_10(B(0),B(l)); yint <= aint + bint; Y<=tranlO_2(yint); end sum; Пример9. В этом примере рассматривается важная особенность языка VHDL, заключающаяся в возможности использования в одном архитектурном теле смешанных структурных и поведенческих (structure and dataflow) описаний. Смешанные описания удобны, когда проектируется сложная схема из компонентов, для которых уже определены VHDL-модели в виде сущностей (entities). Пусть требуется разработать VHDL-модель восьмиразрядного комбинационного сумматора. Логика работы схемы одного разряда сумматора задана в виде табл. 2.12. Тогда модель одноразрядного сумматора может быть представлена в следующем виде: Таблица 2.12 А 0 0 0 0 1 1 1 1 entity adder is port (А, В, С1: in BIT; В 0 0 1 1 0 0 1 1 С1 0 1 0 1 0 1 0 1 SUM 0 1 1 0 1 0 0 1 С2 0 0 0 1 0 1 1 1 SUM, C2: out BIT); end adder; - А и В - слагаемые, С1 - перенос из соседнего младшего разряда, — SUM - сумма, С2 - перенос в соседний старший разряд architecture opr of adder is begin SUM <=AxorBxorCl; C2 <= (A and B) or (A and Cl) or (Cl and В); end opr; Теперь модель восьмиразрядного сумматора получается со ссылкой на компонент adder и с помощью оператора generate: entity add_8 is port (X, Y: in BIT_VECTOR (7 downto 0); CO: in BIT; C7: out BIT; RES: out BIT_VECTOR (7 downto 0); end add_8; -- X и Y - слагаемые, RES - сумма architecture cont of add 8 is component adder SUM, C2: out BIT); end component; signal C: BIT_VECTOR (7 downto); begin for i in 7 downto 0 loop if i = 0 generate FF: adder port map (X(0), Y(0), C0, RES(0), C(0)); end generate; if i /= 0 generate FF: adder port map (X(i), Y(i), C(i-l), RES(i), C(i)); end generate; end loop; C7<=C(7); end cont;