- •Предисловие
- •1. Структура проекта на ahdl
- •Оператор options
- •Оператор assert
- •Раздел variable используется для описания и/или генерации переменных, используемых в разделе Logic.
- •Раздел Variable может также содержать операторы If Generate, которые могут быть использованы для генерирования объектов, узлов, регистров, конечных автоматов, и псевдоимен конечных автоматов.
- •2. Элементы языка ahdl
- •2.1. Зарезервированные слова и идентификаторы
- •2.2. Символы
- •2.3. Строковые и символьные имена
- •2.4. Числа
- •2.5. Арифметические и логические выражения
- •2.6. Встроенные оценочные функции
- •2.7. Шины (группы), диапазоны и поддиапазоны шин
- •3. Примитивы и мегафункции
- •3.1. Обращение к примитивам и мегафункциям
- •1. Непосредственное обращение
- •2. Использование элемента как переменной
- •3.2. Примитивы
- •Примитивы триггеров
- •3.3. Библиотека параметризуемых функций (lpm)
- •1. Пример использования lpm_and, _or, _xor, _inv функций
- •2. Пример использования функции lpm_decode
- •3. Пример использования функций lpm_mux, busmux, mux
- •Пример использования функций lpm_counter, _latch, _ff,
- •5. Пример использования функций lpm_add_sub, _compare, _mult
- •6. Пример использования функции lpm_ram_dq
- •4. Описание логических схем
- •4.1. Операторы Оператор if then
- •Оператор case
- •Оператор defaults
- •Оператор if generate
- •Оператор for generate
- •Оператор truth table
- •4.2. Конечные автоматы
- •5. Основы проектирования плис с
- •Текстовой редактор
- •Литература
- •Прототипы примитивов буферов
- •Приложение 2 Прототипы примитивов триггеров
- •Приложение 3 Прототипы мегафункций
- •Содержание
- •Основы языка описания аппаратуры
- •Методические указания
- •630092, Г. Новосибирск, пр. К. Маркса, 20
1. Пример использования lpm_and, _or, _xor, _inv функций
INCLUDE “lpm_and.inc”; INCLUDE “lpm_or.inc”; INCLUDE “lpm_xor.inc”; INCLUDE “lpm_inv.inc” SUBDESIGN example1 ( a[3..0][1..0] : INPUT; f_and[1..0],f_or[1..0],f_xor[1..0] : OUTPUT; f_inv[1..0] : OUTPUT; ) VARIABLE b[1..0] : NODE; BEGIN f_and[]=lpm_and(.data[][]=a[][]) WITH (LPM_SIZE=4,
LPM_WIDTH=2) RETURNS (.result[]);
f_or[]=lpm_or(.data[][]=a[][]) WITH (LPM_SIZE=4, LPM_WIDTH=2) RETURNS (.result[]);
f_xor[]=lpm_xor(.data[][]=a[][]) WITH (LPM_SIZE=4, LPM_WIDTH=2) RETURNS; (.result[]);
b[]=f_and[]
f_inv[]=lpm_inv(.data[]=b[]) WITH (LPM_WIDTH=2)
RETURNS (.result[])
END;
2. Пример использования функции lpm_decode
INCLUDE “lpm_decode.inc”;
SUBDESIGN example2
( en,a[2..0] : INPUT;
dec[7..0] :OUTPUT;
)
BEGIN dec[]=lpm_decode(.data[]=a[],.enable=en) WITH (LPM_WIDTH=3, LPM_DECODES=8) RETURNS (.eq[]); END;
3. Пример использования функций lpm_mux, busmux, mux
INCLUDE “lpm_mux.inc”;
INCLUDE “busmux.inc”;
INCLUDE “mux.inc”;
SUBDESIGN example3
( aa[3..0][1..0],select[1..0] : INPUT;
a[7..0],b[7..0],sel,sel_mux[2..0] : INPUT;
oout[1..0] : OUTPUT;
out[7..0],out_mux : OUTPUT;
) BEGIN oout[]=lpm_mux(.data[][]=aa[][],.sel[]=select[]) WITH (LPM_SIZE=4, LPM_WIDTH=2, LPM_WIDTHS=2)
RETURNS (.result[]);
out[]=busmux(.dataa[]=a[],.datab[]=b[],.sel=sel) WITH (WIDTH=8) RETURNS (.result[]);
out_mux=mux(.data[]=a[],.sel[]=sel_mux[]) WITH (WIDTH=8, WIDTHS=3)
RETURNS (.result);
END;
-
Пример использования функций lpm_counter, _latch, _ff,
_shiftreg, _bustri
INCLUDE “lpm_counter.inc”;
INCLUDE “lpm_latch.inc”;
INCLUDE “lpm_ff.inc”;
INCLUDE “lpm_shiftreg.inc”;
INCLUDE “lpm_bustri.inc”;
CONSTANT width_data = 8;
SUBDESIGN example4
( clock : INPUT; reset : INPUT; enable,en_clock : INPUT; data[7..0] : INPUT; set,load : INPUT; data_latch[width_data-1..0] : OUTPUT; data_ff[width_data-1..0],shift,count[2..0] : OUTPUT; en_data : INPUT; ZZ[2..0] : BIDIR; ) BEGIN shift=lpm_shiftreg(.clock=clock, .enable=enable, .data[]=data[], .load=set, .aclr=reset) WITH (LPM_WIDTH=8, LPM_DIRECTION=”RIGHT”)
RETURNS (.shiftout);
data_latch[]=lpm_latch(.data[]=data[], .gate=load)
WITH (LPM_WIDTH=width_data)
RETURNS (.q[]);
data_ff[]=lpm_ff(.data[]=data[], .clock=clock,.aclr=reset, .aset=load)
WITH (LPM_WIDTH=width_data)
RETURNS (.q[]);
count[]=lpm_counter(.clock=clock, .clk_en=en_clock, .aclr=reset) WITH (LPM_WIDTH=3)
RETURNS (.q[]);
ZZ[]=lpm_bustri(.data[]=count[],.enabledt=en_data) WITH(LPM_WIDTH=3)
RETURNS(.tridata[]) END;
5. Пример использования функций lpm_add_sub, _compare, _mult
INCLUDE “lpm_add_sub.inc”;
INCLUDE “lpm_compare.inc”;
INCLUDE “lpm_mult.inc”;
SUBDESIGN example5
( a[3..0],b[3..0] : INPUT;
as[3..0] : OUTPUT;
add_sub : INPUT;
comp1, comp2 : OUTPUT;
mult[7..0] : OUTPUT;
) BEGIN as[]=lpm_add_sub(.dataa[]=a[],.datab[]=b[],.add_sub=add_sub)
WITH (LPM_REPRESENTATION=”UNSIGNED”,
LPM_WIDTH=4)
RETURNS (.result[]);
(comp1,comp2)=lpm_compare(.dataa[]=a[],.datab[]=b[])
WITH (LPM_REPRESENTATION=”UNSIGNED”,
LPM_WIDTH=4)
RETURNS (.aeb,.agb)
mult[]=lpm_mult(.dataa[]=a[],.datab[]=b[]) WITH (LPM_REPRESENTATION=”UNSIGNED”,
LPM_WIDTHA=4, LPM_WIDTHB=4, LPM_WIDTHP=8,
LPM_WIDTHS=4) RETURNS (.result[]); END;