Вы находитесь на странице: 1из 3

KiT#27(1)_Olia.

qxd 1/14/03 4:29 PM Page 72

Êîìïîíåíòû è òåõíîëîãèè, ¹ 1’2003 Ñîôò

Øïàðãàëêà äëÿ ïåðåõîäà


îò AHDL ê VHDL

Èîñèô Êàðøåíáîéì Âñòóïëåíèå Quartus с его встроенным симулятором) довольно


затруднительно.
Ik@lmail.loniis.spb.su Когда-то в популярной книжке по математике бы- В случае применения ModelSim для аналогичного
ла напечатана такая шутка. Математик задал Физику проекта, выполненного на VHDL, мы получим, на-
Ìèõàèë Êîñòêèí задачу: «Имеем чайник, воду, плиту и спички. Как пример, 30 файлов с выходными данными. Причем,
получить кипяток?» Физик ответил — «Поставить в случае необходимости, можно записать в файл
kostkin@asicdesign.ru чайник на плиту, налить воду, зажечь плиту и вски- и состояния автомата на требуемых участках диа-
пятить воду». «Правильно», сказал Математик, граммы, или на всех участках диаграммы, а также со-
«а вот более сложная задача — чайник с водой уже стояния внутренних сигналов проекта и т. д. Резуль-
стоит на плите, что нужно сделать в этом случае?» таты моделирования можно сравнить с математиче-
Физик ответил: чего, мол, проще, надо зажечь огонь ской моделью обработки данных и сделать вывод
и готово. «Нет, — сказал Математик, — надо вылить о работоспособности разрабатываемого проекта.
из чайника воду, и тогда мы придем задаче, которую Существуют программы-перекодировщики, ко-
уже умеем решать». То же происходит и в реальной торые автоматически переводят файлы из AHDL
жизни, когда есть необходимость перевести старый в VHDL или в Verilog. Примером такой программы
проект из AHDL в VHDL. Можно просто взять и сде- может служить Xport.exe. Этот перекодировщик ус-
лать проект заново, а можно попытаться переписать пешно переводит файлы из одного формата в дру-
строчку за строчкой. Для того, чтобы этот процесс гой, но при перекодировке в выходном файле он
произошел быстрее, можно прибегнуть к данной не делает параметрических функций. То есть, если
шпаргалке. в AHDL-файле проект выполнен с параметрами, ко-
торые позволяют его гибко использовать, то при пе-
рекодировке, в выходном VHDL-файле эти параме-
Íåîáõîäèìîñòü ïåðåõîäà
тры ввести будет уже невозможно, и они будут же-
îò ÿçûêà AHDL ê VHDL
стко заданы в соответствии с теми значениями,
Сравнение проектирования на AHDL и VHDL которые были установлены в момент перекодиров-
приведено в статье Г. Варфоломеева [1]. В данной ки. Именно поэтому ручная перекодировка в боль-
статье достаточно подробно описаны все аспекты пе- шинстве случаев будет более предпочтительной.
рехода с AHDL на VHDL. Хочется добавить только
следующее: в случае применения ModelSim в каче-
Øïàðãàëêà
стве инструмента моделирования при проведении
симуляции появляется возможность читать данные Для того чтобы было проще перейти от AHDL
из файла и это данные выдавать на проверяемый к VHDL, попробуем сопоставить известным и хоро-
проект в качестве входных воздействий. Очень пол- шо изученным в AHDL-выражениям аналогичные
но и подробно о таких методах отладки и проверки выражения в VHDL. Тогда-то мы и придем к задаче,
проектов, написанных на VHDL, можно прочитать которую уже умеем решать. Данная статья не явля-
в учебнике [2]. Ссылки на подобные решения можно ется учебным пособием, описывающим язык VHDL.
также найти, например, на сайтах www.asicdesign.ru Ее цель — облегчить переход к программированию
и www.actel.ru. Результаты моделирования тоже на VHDL для тех разработчиков, которые уже име-
могут быть записаны в файл. Допустим, что про- ют опыт работы на AHDL.
ект представляет собой многоканальный HDLC- Рассмотрим структуру AHDL-файла. Он может
контроллер. Число каналов — 30. Данные, которые содержать следующие части:
необходимо пропустить через HDLC-контроллер, 1. Title Statement (optional).
представляют собой, по меньшей мере, последова- 2. Include Statement (optional).
тельность из 10 байт в каждом канале. Ядро кон- 3. Constant Statement (optional).
троллера при обработке каждого канала имеет 4. Define Statement (optional).
не менее 10 состояний автомата. В итоге получаем: 5. Parameters Statement (optional).
30×10×10 = 3000 участков на диаграмме симуляции 6. Function Prototype Statement (optional).
для проверяемого устройства. Разбираться с такой 7. Options Statement (optional).
диаграммой (в случае применения AHDL и про- 8. Assert Statement (optional).
граммного средства разработки MaxPlus или 9. Subdesign Section.

72 www.finestreet.ru
KiT#27(1)_Olia.qxd 1/14/03 4:29 PM Page 73

Êîìïîíåíòû è òåõíîëîãèè, ¹ 1’2003 Ñîôò


10. Variable Section (optional). В VHDL константы желательно разме-
ENTITY __entity_name IS
11.1. If Generate Statement (optional). щать в конструкции PACKAGE. Выраже- GENERIC(… );
11.2. Node Declaration (optional). ние из AHDL-файла, например: PORT( __input_name, __input_name : IN STD_LOGIC;
11.3. Instance Declaration (optional). __input_vector_name : IN STD_LOGIC_VECTOR
(__high downto __low);
11.4. Register Declaration (optional). CONSTANT DATA_WIDTH = Data_width; __bidir_name, __bidir_name : INOUT STD_LOGIC;
11.5. State Machine Declaration (optional). __output_name, __output_name : OUT STD_LOGIC);
11.6. Machine Alias Declaration (optional). заменяем на выражение для VHDL, при этом END __entity_name;
11.7. Assert Statement (optional). необходимо учесть тип данных константы:
12. Logic Section. И, далее, добавим следующую часть кода,
12.1. Defaults Statement (optional). constant constant_name : type := value; описывающего архитектуру:
В части файла, называемой Logic Section,
находятся следующие выражения, которые 4. Выделим часть 4 AHDL-файла, в которой ARCHITECTURE a OF __entity_name IS
могут следовать в файле в любом порядке описываются параметры, применяемые SIGNAL __signal_name : STD_LOGIC;
SIGNAL __signal_name : STD_LOGIC;
и повторяться произвольное число раз: для данного файла — Parameters Statement.
BEGIN
1. Boolean Equation В VHDL настраиваемые параметры Entity -- Process Statement
2. Case Statement имеют название GENERIC и инициализи- -- Concurrent Procedure Call
3. For Generate Statement руются при использовании компонента. -- Concurrent Signal Assignment
4. If Generate Statement Выражение из AHDL-файла, например: -- Conditional Signal Assignment
-- Selected Signal Assignment
5. If Then Statement
-- Component Instantiation Statement
6. In-Line Logic Function Reference PARAMETERS ( Data_width = 32, Data_len = 8 ); -- Generate Statement
7. Truth Table Statement END a;
8. Assert Statement заменяем на выражение для VHDL,
Далее попробуем заменять каждую часть при этом необходимо учесть тип данных 8. Выделим часть 10 AHDL-файла, Variable
AHDL-файла на соответствующее выражение параметров. Для VHDL параметры могут Section, в которой описываются перемен-
для VHDL-файла. относиться ко всему файлу, тогда они свя- ные для данного проекта, например:
1. Пропустим Title Statement, так как аналога заны с ENTITY и выглядят, например, так:
в VHDL-файле нет и вместо этого восполь- VARIABLE
reset, Inp_shift_rg8 : node;
зуемся символом комментария «--» и напи- ENTITY Adder IS phase_cnt_tx : lpm_counter with ( lpm_width = 4,
шем: GENERIC -— Interface constants, can be modified by configuration lpm_direction = «UP» ) ;
(MaxValue_g : integer := 255); tx_process : machine with states ( idle_tx, trm_shift
PORT );
-- My project… и т. д. (A : in Integer range 0 to MaxValue_g;
B : in Integer range 0 to MaxValue_g;
Y : out Integer range 0 to MaxValue_g);
и т. д.
2. Для VHDL-файла заголовочными являют- END ENTITY Adder; Поступаем следующим образом:
ся файлы, описывающие, с какими библио- А.То, что в AHDL-файле называлось NODE,
теками придется работать компилятору, 5. Выделим часть 8 AHDL-файла, Assert теперь назовем SIGNAL и поместим либо
а не описания библиотечных и «самодель- Statement, в которой описываются сообще- в ARCHITECTURE (см. п. 7), либо вынесем
ных» компонентов проекта. Типичный вид ния, выдаваемые при компиляции файла. в отдельный файл PACKAGE. Это позво-
части VHDL-файла, описывающего библи- Выражение из AHDL-файла, например: лит уменьшить объем основного файла
отеки: проекта.
ASSERT Б. Библиотечные и «самодельные» компонен-
library ieee; REPORT « CNT_WIDTH равен — %, DATAB_WIDTH ты в VHDL заменяются декларированием
use ieee.std_logic_1164.all; равно — %» CNT_WIDTH, DATAB_WIDTH
use ieee.std_logic_arith.all ; SEVERITY INFO;
соответствующего компонента.
use ieee.std_logic_unsigned.all ; Пример файла PACKAGE.
use work.uart_signals.all ;
заменяем на выражение для VHDL, при этом
USE std.standard.ALL;
USE std.textio.All; необходимо учесть тип данных, которые library ieee;
use ieee.std_logic_1164.all;
проверяются в выражении ASSERT, напри-
use ieee.std_logic_arith.all ;
Поэтому часть AHDL-файла, пункт 2, мер вот так: use ieee.std_logic_unsigned.all ;
Include Statement, в которой дано описание
ASSERT A_s = '1' PACKAGE uart_signals IS
библиотечных и «самодельных» компонентов
REPORT «A_s /= '1', it is « & Bit2Strg_c(A_s)
для данного проекта, переносится в конструк- SEVERITY NOTE; COMPONENT__component_name
цию PACKAGE, где компоненты описывают- PORT(__input_name, __input_name : IN STD_LOGIC;
__bidir_name, __bidir_name : INOUT
ся, например, так: При этом параметр после SEVERITY опре- STD_LOGIC;
деляет уровень сообщения (NOTE, ERROR __output_name, __output_name : OUT
COMPONENT DFFE или другие), которое генерируется при выпол- STD_LOGIC);
PORT (d : IN STD_LOGIC; END COMPONENT;
нении команды ASSERT, что позволяет, наст- ………
clk : IN STD_LOGIC;
clrn : IN STD_LOGIC := '1'; роив симулятор необходимым образом, либо SIGNAL
prn : IN STD_LOGIC := '1'; выдать сообщение, указывающее пользовате- phase_cnt_tx_sclr,
ena : IN STD_LOGIC; …
лю о том, что при заданном условии команда rx_process_idle : STD_LOGIC;
q : OUT STD_LOGIC );
END COMPONENT; ASSERT выполнилась, либо остановить симу- END uart_signals;
ляцию, если выполнение команды ASSERT
Собственно раздел PACKAGE может быть происходит при возникновении ошибки. Если компонент имеет параметры, тогда он
размещен в одном файле с entities. 6. Выделим часть 9 AHDL-файла, Subdesign декларируется так:
То-же самое относится и к части 6 AHDL- Section, в которой описывается название
файла — Function Prototype Statement. Вмес- проекта, например: COMPONENT __component_name
GENERIC(__parameter_name : string := __default_value;
то декларирования прототипа функции, при-
__parameter_name : integer := __default_value);
нятого в AHDL, в VHDL объявляется компо- SUBDESIGN __design_name
PORT( __input_name: IN STD_LOGIC; …. );
(
нент, так, как указано выше. clk, …);
END COMPONENT;
3. Выделим часть 3 AHDL-файла, в которой
описываются константы, применяемые и заменим эту часть на соответствующее В. Несколько сложнее обстоит дело с деклара-
для данного файла — Constant Statement. выражение в VHDL: цией сигналов статических автоматов.

www.finestreet.ru 73
KiT#27(1)_Olia.qxd 1/14/03 4:29 PM Page 74

Êîìïîíåíòû è òåõíîëîãèè, ¹ 1’2003 Ñîôò


Вот часть кода, описывающего работу ста- сти от выполнения или невыполнения усло- аналогично выражению «IF — THEN»,
тического автомата: вий __expression_1 или __expression_2. для выражения CASE могут быть приме-
В VHDL выражение «IF — THEN» имеет нены те же самые правила. Если это выра-
type State_Typ is (RST, RedOn, YelOn, GrnOn); несколько иное значение, чем в AHDL, по- жение не входит в какое-либо выражение
signal State_s : State_Typ; этому аналогом данного выражения в VHDL PROCESS (см. объявление PROCESS вы-
begin
будет являться выражение, называемое ше), то такое выражение AHDL заменяет-
Explicit_Lbl : process Concurrent_signal: ся на выражение VHDL, называемое
begin Selected signal:
wait until Clk'event and Clk = '1';
__label:
if Reset = '1' and State_s = GrnOn then
__signal <= __expression WHEN __boolean_expression ELSE
Red <= '0'; __label:
__expression WHEN __boolean_expression ELSE
Yellow <= '0'; WITH __expression SELECT
__expression;
Green <= '0'; __signal <= __expression WHEN __constant_value,
State_s <= RST; __expression WHEN __constant_value,
Если речь идет об обработке сигналов «вну- __expression WHEN __constant_value,
elsif Reset = '0' and три» выражения PROCESS:
(State_s = RST or State_s = GrnOn) then
Red <= '1';
Если речь идет об обработке сигналов
Yellow <= '0'; __process_label: «внутри» выражения PROCESS, то тогда ана-
PROCESS
Green <= '0';
VARIABLE __variable_name : STD_LOGIC;
логично изложенному выше применяется
State_s <= RedOn;
BEGIN функция «CASE __expression IS» такого же
elsif State_s = ….. WAIT UNTIL __clk_signal = '1'; вида, что и в AHDL.
-— Signal Assignment Statement
-— Variable Assignment Statement
13. В части AHDL-файла, называемой Logic
end if;
end process Explicit_Lbl;
-— Procedure Call Statement Section, могут находиться выражения, назы-
end Explicit_a;
-— If Statement ваемые таблицами истинности. Выражение
-— Case Statement
-— Loop Statement
из AHDL, соответствующее таблице истин-
Как видно из приведенного примера, необ- END PROCESS __process_label; ности, выглядит следующим образом:
ходимо указать тип данных для сигнала
State_s и перечислить те состояния, которые то тогда возможно применение выраже- TABLE
__node_name, __node_name => __node_name,
он принимает. ния «IF __expression THEN», такого же ви- __node_name;
9. В части AHDL-файла, называемой Logic да, что и в AHDL. Отличия будут только __input_value, __input_value => __output_value,
Section, могут находиться выражения If в выражении __expression. В AHDL все пе- __output _value;
__input_value, __input_value => __output_value,
Generate Statement. Данная часть AHDL- ременные NODE имеют один и тот же тип __output _value;
файла аналогична следующему выражению данных, который можно сопоставить с ти- END TABLE;
в VHDL: пом данных SYGNAL в VHDL. Назовем
сигнал, который будет проверяться в вы- Данному выражению нет прямой аналогии
__generate_label: ражении «IF __expression THEN», именем в VHDL, поэтому необходимо воспользовать-
IF __expression GENERATE
__statement;
my_sygnal и проверим его на соответствие ся выражениями типа Concurrent_signal,
END GENERATE; высокому уровню. Выражение в AHDL бу- «IF — THEN» или CASE, в зависимости от то-
дет выглядеть так: го, входит ли таблица истинности в выраже-
10. В части AHDL-файла, называемой Logic ние PROCESS или нет.
Section, могут находиться булевы выраже- IF my_sygnal = = 1 THEN
...
ния типа:
Çàêëþ÷åíèå
Поскольку в AHDL имеется только один
__node_name = __node_name & __node_name; тип данных для сигналов, и при проверке сиг- Языки AHDL и VHDL относятся к одной
__node_name = __node_name # __node_name;
__node_name = __node_name $ __node_name;
нала ему автоматически приписывается зна- группе языков описания аппаратуры. Имен-
чение True в том случае, если данный сигнал но поэтому большую часть выражений языка
из AHDL заменяются в VHDL на следую- имеет высокий уровень, выражение может AHDL можно перевести непосредственно
щие выражения для сигналов: выглядеть и так: в выражения языка VHDL. Однако полного
соответствия между выражениями в этих
__sygnal_name <= __ sygnal_name AND __sygnal_name; IF my_sygnal THEN двух языках, к сожалению, нет. Поэтому часть
__sygnal_name <= __sygnal_name OR __sygnal_name; ...
__sygnal_name <= __sygnal_name XOR __sygnal_name;
выражений языка AHDL, которым нет пря-
Для VHDL имеется несколько типов дан- мой аналогии в VHDL, придется перерабаты-
а для переменных аналогичные выраже- ных, поэтому для данных типа SYGNAL вы- вать в аналогичные по смыслу конструкции
ния будут выглядеть так: ражение будет выглядеть так: языка VHDL. Поскольку VHDL по отноше-
нию к AHDL является языком более высокого
__variable_name := __variable_name AND __variable_name; IF my_sygnal = '1' THEN уровня, то необходимо также учитывать и до-
__variable_name := __variable_name OR __variable_name; …
__variable_name := __variable_name XOR __variable_name;
полнительные факторы, такие как, например,
а для данных типа BOOLEAN выражение разные типы данных, отличия в описании
11. В части AHDL-файла, называемой Logic будет выглядеть так: статических автоматов и др. Однако доста-
Section, могут находиться выражения точно хотя бы один раз преодолеть все эти
«IF — THEN». Выражение из AHDL «IF — IF my_bool THEN трудности, чтобы потом сказать: «от AHDL

THEN» выглядит следующим образом: до VHDL всего один шаг».
12. В части AHDL-файла, называемой Logic
IF __expression_1 THEN Section, могут находиться выражения
__statement_1; Ëèòåðàòóðà
ELSIF __expression_2 THEN
CASE. Выражение CASE в AHDL:
__statement_2; 1. Глеб Варфоломеев. Проектирование в сис-
ELSE CASE __expression IS теме Max+Plus II: VHDL против AHDL //
__statement_3; WHEN __constant_value =>
END IF; __statement; «Компоненты и Технологии». 2002. № 7.
__statement; 2. Ben Cohen. VHDL Coding Styles and
WHEN OTHERS =>
В AHDL данное выражение заставляет вы- __statement; Methodologies. Second Edition. Kluwer acad-
полняться выражения __statement_1, __state- __statement; emic publishers. Boston-Dordrecht-London.
END CASE;
ment_2 или __statement_3 только в зависимо- 1999.

74 www.finestreet.ru

Вам также может понравиться