- •Предисловие
- •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
Литература
-
Антонов А.П. Язык описания цифровых устройств AlteraHDL. Практический курс. – М.: Радиософт, 2001.
-
Стешенко В.Б. ПЛИС фирмы ALTERA: проектирование устройств обработки сигналов. – М.: ДОДЭКА, 2000.
-
Стешенко В.Б. ПЛИС фирмы ALTERA: элементная база, система проектирования и языки описания аппаратуры. – М.: ДОДЭКА, 2002.
-
Бибило П.Н. Основы VHDL языка. – М.: СОЛОН-Р, 2000.
-
Бибило П.Н. Синтез логических схем с использованием языка VHDL – М.: СОЛОН-Р, 2002.
-
Соловьев В.В. Проектирование цифровых систем на основе программируемых логических интегральных схем. – М.: Горячая линия – Телеком, 2001.
-
Техническая документация фирмы Altera.
-
www.altera.ru
-
www.altera.com
Приложение 1
Прототипы примитивов буферов
Примитив буфера |
Прототип примитива буфера |
CARRY |
FUNCTION CARRY (in) RETURNS (out); |
CASCADE |
FUNCTION CASCADE (in) RETURNS (out); |
EXP |
FUNCTION EXP (in) RETURNS (out); |
GLOBAL |
FUNCTION GLOBAL (in) RETURNS (out); |
LCELL |
FUNCTION LCELL (in) RETURNS (out); |
SOFT |
FUNCTION SOFT (in) RETURNS (out); |
OPNDRN |
FUNCTION OPNDRN (in) RETURNS (out); |
TRI |
FUNCTION TRI (in, oe) RETURNS (out); |
Приложение 2 Прототипы примитивов триггеров
Примитив триггера |
Прототип примитива триггера |
DFF |
FUNCTION DFF (D, CLK, CLRN, PRN) RETURNS (Q) |
DFFE |
FUNCTION DFFE (D, CLK, CLRN, PRN, ENA) RETURNS (Q) |
TFF |
FUNCTION TFF (D, CLK, CLRN, PRN) RETURNS (Q) |
TFFE |
FUNCTION TFFE (T, CLK, CLRN, PRN, ENA) RETURNS (Q) |
JKFF |
FUNCTION JKFF (J, K, CLK, CLRN, PRN) RETURNS (Q) |
JKFFE |
FUNCTION JKFFE (J, K, CLK, CLRN, PRN, ENA) RETURNS (Q) |
SRFF |
FUNCTION SRFF (S, R, CLK, CLRN, PRN) RETURNS (Q) |
SRFFE |
FUNCTION SRFFE (S, R, CLK, CLRN, PRN, ENA) RETURNS (Q) |
LATCH |
FUNCTION LATCH (D, ENA) RETURNS (Q) |
Приложение 3 Прототипы мегафункций
Мегафункция |
Прототип мегафункции |
lpm_constant |
FUNCTION lpm_constant ( ) WITH (LPM_WIDTH, LPM_CVALUE) RETURNS (result[LPM_WIDTH-1..0]); |
Продолжение прил. 3
Мегафункция |
Прототип мегафункции |
lpm_abs |
FUNCTION (data[LPM_WIDTH-1..0]) WITH (LPM_WIDTH, ADDERTYPE) RETURNS (result[LPM_WIDTH-1..0], overflow); |
lpm_and |
FUNCTION lpm_and (data[LPM_SIZE-1..0][LPM_WIDTH-1..0]) WITH (LPM_WIDTH, LPM_SIZE) RETURNS (result[LPM_WIDTH-1..0]) |
lpm_or |
FUNCTION lpm_or (data[LPM_SIZE-1..0][LPM_WIDTH-1..0] WITH (LPM_WIDTH, LPM_SIZE) RETURNS (result[LPM_WIDTH-1..0]; |
lpm_xor |
FUNCTION lpm_xor (data[LPM_SIZE-1..0][LPM_WIDTH-1..0]) WITH (LPM_WIDTH, LPM_SIZE) RETURNS (result[LPM_WIDTH-1..0]); |
lpm_inv |
FUNCTION lpm_inv (data[LPM_WIDTH-1..0]) WITH (LPM_WIDTH) RETURNS (result[LPM_WIDTH-1..0]); |
lpm_mux |
FUNCTION lpm_mux (data[LPM_SIZE-1..0][LPM_WIDTH-1..0], sel[LPM_WIDTHS-1..0], clock, aclr) WITH (LPM_WIDTH, LPM_SIZE, LPM_WIDTHS, LPM_ PIPELINE) RETURNS (result[LPM_WIDTH-1..0]); |
busmux |
FUNCTION busmux (dataa[(width) - (1)..0], datab[(width) - (1)..0], sel) WITH (WIDTH) RETURNS (result[(width) - (1)..0]); |
mux |
FUNCTION mux (data[(width) - (1)..0], sel[(widths) - (1)..0]) WITH (WIDTH, WIDTHS) RETURNS (result); |
lpm_decode |
FUNCTION lpm_decode (data[LPM_WIDTH-1..0], enable, clock, aclr) WITH (LPM_WIDTH, LPM_DECODES, LPM_PIPELINE) RETURNS (eq[LPM_DECODES-1..0]); |
lpm_clshift |
FUNCTION lpm_clshift (data[LPM_WIDTH-1..0], distance[LPM_WIDTHDIST-1..0], direction) WITH (LPM_WIDTH, LPM_WIDTHDIST, LPM_SHIFT-TYPE) RETURNS (result[LPM_WIDTH-1..0], underflow, overflow); |
Продолжение прил. 3
Мегафункция |
Прототип мегафункции |
|
lpm_bustri
|
FUNCTION lpm_bustri (data[LPM_WIDTH-1..0], enabletr, enabledt) WITH (LPM_WIDTH) RETURNS (tridata[LPM_WIDTH-1..0], result[LPM_WIDTH-1..0]); |
|
lpm_compare |
FUNCTION lpm_compare (dataa[LPM_WIDTH-1..0], datab[LPM_WIDTH-1..0], clock, aclr) WITH (LPM_WIDTH, LPM_REPRESENTATION, LPM_PIPELINE, CHAIN_SIZE, ONE_INPUT_IS_CONSTANT) RETURNS (alb, aeb, agb, ageb, aneb, aleb); |
|
lpm_add_sub |
FUNCTION lpm_add_sub (cin, dataa[LPM_WIDTH-1..0], datab[LPM_WIDTH-1..0], add_sub, clock, aclr, clkn) WITH (LPM_WIDTH, LPM_REPRESENTATION, LPM_DIRECTION, ONE_INPUT_IS_CONSTANT, LPM_PIPELINE, MAXIMIZE_SPEED) RETURNS (result[LPM_WIDTH-1..0], cout, overflow); |
|
lpm_divide |
FUNCTION lpm_divide (numer[LPM_WIDTHN-1..0], denom[LPM_WIDTHD-1..0], clock, aclr, clken) WITH (LPM_WIDTHN, LPM_WIDTHD, LPM_PIPELINE, LPM_NREPRESENTATION, LPM_DREPRESENTATION) RETURNS (quotient[LPM_WIDTHN-1..0], remain [LPM_ WIDTHD-1..0]; |
|
lpm_mult |
FUNCTION lpm_mult (dataa[(LPM_WIDTHA-1)..0], datab[(LPM_WIDTHB-1)..0], sum[(LPM_WIDTHS-1)..0], aclr, clock) WITH (LPM_WIDTHA, LPM_WIDTHB, LPM_WIDTHP, LPM_WIDTHS, LPM_REPRESENTATION, LPM_PIPELINE, LATENCY, INPUT_A_IS_CONSTANT, INPUT_B_IS_CONSTANT, USE_EAB, MAXIMIZE_ SPEED) RETURNS (result[LPM_WIDTHP-1..0]); |
|
lpm_latch |
FUNCTION lpm_latch (data[LPM_WIDTH-1..0], gate, aclr, aset, aconst) WITH (LPM_WIDTH, LPM_AVALUE) RETURNS (q[LPM_WIDTH-1..0]); |
Продолжение прил. 3
Мегафункция |
Прототип мегафункции |
|
lpm_ff
|
FUNCTION lpm_ff (data[LPM_WIDTH-1..0], clock, enable, sclr, sset, sload, aclr, aset, aload) WITH (LPM_WIDTH, LPM_AVALUE, LPM_SVALUE, LPM_PVALUE, LPM_FFTYPE) RETURNS (q[LPM_WIDTH-1..0]); |
|
lpm_shiftreg |
FUNCTION lpm_shiftreg (data[LPM_WIDTH-1..0], clock, enable, shiftin, load, sclr, sset, aclr, aset) WITH (LPM_WIDTH, LPM_DIRECTION, LPM_AVALUE, LPM_SVALUE) RETURNS (q[LPM_WIDTH-1..0], shiftout); |
|
lpm_counter |
FUNCTION lpm_counter (data[LPM_WIDTH-1..0], clock, clk_en, cnt_en, updown, cin, aclr, aset, aconst, aload, sclr, sset, sconst, sload) WITH (LPM_WIDTH, LPM_DIRECTION, LPM_ MODU- LUS, LPM_AVALUE, LPM_SVALUE, CARRY_ CNT_EN, LABWIDE_SCLR) RETURNS (q[LPM_WIDTH-1..0], cout, eq[15..0]); |
|
lpm_rom |
FUNCTION lpm_rom (address[LPM_WIDTHAD-1..0], inclock, outclock, memenab) WITH (LPM_WIDTH, LPM_WIDTHAD, LPM_NUM- WORDS, LPM_FILE, LPM_ADDRESS_CONTROL, LPM_OUTDATA) RETURNS (q[LPM_WIDTH-1..0]); |
|
lpm_ram_dq |
FUNCTION lpm_ram_dq (data[LPM_WIDTH-1..0], address[LPM_WIDTHAD-1..0], inclock, outclock, we) WITH (LPM_WIDTH, LPM_WIDTHAD, LPM_NUM- WORDS, LPM_FILE, LPM_INDATA, LPM_AD- DRESS_ CONTROL, LPM_OUTDATA) RETURNS (q[LPM_WIDTH-1..0]); |
|
lpm_ram_io |
FUNCTION lpm_ram_io (address[LPM_WIDTHAD-1..0], we, inclock, outclock, outenab, memenab) WITH (LPM_WIDTH, LPM_WIDTHAD, LPM_ NUM- WORDS, LPM_FILE, LPM_INDATA, LPM_AD- DRESS_CONTROL, LPM_OUTDATA) RETURNS (dio[LPM_WIDTH-1..0]) |
Продолжение прил. 3
Мегафункция |
Прототип мегафункции |
csdpram |
FUNCTION csdpram (dataa[LPM_WIDTH-1..0], datab[LPM_WIDTH-1..0], addressa[LPM_WIDTHAD- 1..0], addressb[LPM_WIDTHAD-1..0], wea, web, clock, clockx2) WITH (LPM_WIDTH, LPM_WIDTHAD, LPM_ NUM- WORDS, FILE) RETURNS (qa[LPM_WIDTH-1..0], qb[LPM_WIDTH-1..0], busy); |
lpm_ram_dp |
FUNCTION lpm_ram_dp (wren, data[LPM_WIDTH-1..0], wraddress[LPM_WIDTHAD-1..0], wrclock. wrclken, rden, rdaddress[LPM_WIDTHAD-1..0], rdclock, rdclken) WITH (LPM_WIDTH, LPM_WIDTHAD, LPM_NUM- WORDS, LPM_FILE, LPM_INDATA, LPM_AD- DRESS_CONTROL, LPM_RDADDRESS_CONTROL, LPM_OUTDATA, USE_EAB) RETURNS (q[LPM_WIDTH-1..0]); |
csfifo |
FUNCTION csfifo (data[(LPM_WIDTH)-(1)..0], wreq, rreq, clock, clockx2, clr, sclr, threshlevel [CEIL(LOG2 (LPM_NUMWORDS))-1..0]) WITH (LPM_WIDTH, LPM_NUMWORDS) RETURNS (q[(LPM_WIDTH)-(1)..0], threshold, empty, full, usedw[CEIL(LOG2(LPM_NUMWORDS))-1..0]); |
lpm_fifo |
FUNCTION lpm_fifo (data[(LPM_WIDTH)-1..0], wrreq, rdreq, clock, aclr, sclr) WITH (LPM_WIDTH, LPM_NUMWORDS, LPM_WIDTHU, LPM_SHOWAHEAD, UNDERFLOW_CHECKING, OVERFLOW_CHECKING, ALLOW_RWCYCLE_WHEN_FULL, USE_EAB) RETURNS (q[(LPM_WIDTH)-1..0], empty, full, usedw[LPM_WIDTHU-1..0] |
Окончание прил. 3
Мегафункция |
Прототип мегафункции |
lpm_fifo_dc |
FUNCTION lpm_fifo_dc (data[LPM_WIDTH-1..0], rdreq, wrreq, rdclock, wrclock, aclr) WITH (LPM_WIDTH, LPM_NUMWORDS, LPM_WIDTHU, LPM_SHOWAHEAD, UNDERFLOW_CHECKING, OVERFLOW_CHECKING, ALLOW_RWCYCLE_WHEN_FULL, USE_EAB, DELAY_RDUSEDW, DELAY_WRUSEDW, RDSYNC_DELAYPIPE, WRSYNC_DELAYPIPE) RETURNS (q[LPM_WIDTH-1..0], rdempty, rdfull, wrempty, wrfull, rdusedw[LPM_WIDTHU-1..0], wrusedw[LPM_WIDTHU-1..0]); |
ntsc |
FUNCTION ntsc (clock, reset) RETURNS (csync, hd, vd, fld, blank, burst); |
clklock
|
FUNCTION (inclk) WITH (CLOCKBOOST, INPUT_FREQUENCY) RETURNS (outclk); |
PLL |
FUNCTION PLL (a, b, nset) RETURNS (nup, tri_up, ndown, tri_down); |