Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЛИС_Ответы_к_экзамену_8110.doc
Скачиваний:
19
Добавлен:
24.04.2019
Размер:
2.35 Mб
Скачать

Вопрос 14 - Двунаправленный порт. Назначение, область применения. Использование мегафункции lpm_bustri для проектирования двунаправленного порта.

Параметризированная мегафункция 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]);

Двунаправленный порт:

INCLUDE "lpm_bustri.inc";

CONSTANT wt = 8;

CONSTANT ewt = wt-1;

SUBDESIGN bustri

( in_en : INPUT = VCC;

out_en : INPUT = GND;

outdata[ewt..0] : INPUT;

indata[ewt..0] : OUTPUT;

in/out[ewt..0] : BIDIR;

)

--VARIABLE

--bidir_port : lpm_bustri WITH(LPM_WIDTH = wt);

BEGIN

(in/out[], indata[]) = lpm_bustri(outdata[],

in_en, out_en)

WITH(LPM_WIDTH = wt);

--bidir_port.data[] = outdata[];

--bidir_port.enabledt = out_en;

--bidir_port.enabletr = in_en;

--in/out[] = bidir_port.tridata[];

--indata[] = bidir_port.result[];

END;

Вопрос 15 - Реализация звена нерекурсивного фильтра типа tdf II с использованием мегафункции lpm_mult. Организация конвейерной обработки.

Параметризированная мегафункция lpm_mult:

FUNCTION lpm_mult

(

dataa[(LPM_WIDTHA - 1)..0], --входной порт множимого. Порт обязателен!

datab[(LPM_WIDTHB - 1)..0], --входной порт множителя. Порт обязателен!

sum[(LPM_WIDTHS - 1)..0], -- входной порт сумматора. Порт обязателен!

aclr, -- входной порт асинхронной очистки регистров конвейера. Порт не обязателен!

clock, -- входной порт тактовой частоты конвейера. Порт не обязателен!

clken -- входной порт разрешение тактовой частоты конвейера. Порт не обязателен!

)

WITH --Жирным шрифтом выделены параметры по-умолчанию

(

LPM_WIDTHA, --число разрядов шины dataa. Параметр обязателен!

LPM_WIDTHB, --число разрядов шины datab. Параметр обязателен!

LPM_WIDTHP, --число разрядов шины result. Параметр обязателен!

LPM_WIDTHS, --число разрядов шины sum. Параметр обязателен!

LPM_REPRESENTATION, --представление данных: "SIGNED", "UNSIGNED" или "UNUSED"

LATENCY, --то же, что и LPM_PIPELINE. НЕ ИСПОЛЬЗУЕТСЯ в новых проектах.

LPM_PIPELINE, --число тактов N задержки результата конвейером.N = 1, 2, 3, ..

INPUT_A_IS_CONSTANT, --на вход a подана константа. "YES", "NO“ или "UNUSED"

INPUT_B_IS_CONSTANT, --на вход b подана константа. "YES", "NO“ или "UNUSED"

USE_EAB, --использовать блоки памяти: "ON", "OFF” или "UNUSED"

MAXIMIZE_SPEED --обмен ресурсы-скорость. Целое число от 0 до 10. Установлено 6

) --(<6 – сокращение ресурсов, >6 – увеличение быстродействия)

RETURNS .

( result[(LPM_WIDTHP - 1)..0] ); --результат result[] = (dataa[] * datab[] + sum[]) * Z-N ;

-- Z-N - задержки результата конвейером на N тактов

Нерекурсивный фильтр с конечной импульсной характеристикой (КИХ) :

INCLUDE "lpm_mult.inc";

PARAMETERS

( widthx = 8, --число разрядов шины xn[]

widthy = 8, --число разрядов шины yn[]

widthc = 10, --число разрядов коэффициентов

widthp = 18, --число разрядов шины result[]

an = 100, --коэффициент an знаменателя ( изменить знак !!)

bn = 100 --коэффициент bn числителя

);

CONSTANT widths= widthp;

SUBDESIGN mult_b

( xn[widthx-1..0] : INPUT;

yn[widthy-1..0] : INPUT;

sum[widths-1..0] : INPUT;

clock : INPUT;

clken : INPUT = VCC;

result[widthp-1..0] : OUTPUT;

)

VARIABLE

mult_x : lpm_mult WITH (

LPM_WIDTHA = widthx,

LPM_WIDTHB = widthc,

LPM_WIDTHP = widthp,

LPM_WIDTHS = widths,

INPUT_B_IS_CONSTANT = "YES",

LPM_REPRESENTATION = "SIGNED",

USE_EAB = "OFF",

LPM_PIPELINE = 1,

MAXIMIZE_SPEED = 6);

mult_y : lpm_mult WITH (

LPM_WIDTHA = widthy,

LPM_WIDTHB = widthc,

LPM_WIDTHP = widthp,

LPM_WIDTHS = widths,

INPUT_B_IS_CONSTANT = "YES",

LPM_REPRESENTATION = "SIGNED",

USE_EAB = "OFF",

--LPM_PIPELINE = 1,

MAXIMIZE_SPEED = 6);

BEGIN

mult_x.(clock, clken, aclr) = (clock, clken, aclr);

result[] = mult_x.result[];

mult_x.dataa[] = xn[];

mult_x.datab[] = bn;

mult_x.sum[] = mult_y.result[];

mult_y.dataa[] = yn[];

mult_y.datab[] = an;

mult_y.sum[] = sum[];

END;