setn : INPUT = VCC;
data[width-1..0] : INPUT;
q[number-1..0][width-1..0] : OUTPUT ;)
VARIABLE
tr[number-1..0][width-1..0] :dffe;
BEGIN
tr[][].(CLK, PRN, CLRN, ENA) = (clk, setn, !reset, clock_en);
q[][]=tr[][].q;
tr[0][].d=data[];
FOR i IN 0 TO number-2 GENERATE
tr[i+1][].d=tr[i][].q;
END GENERATE;
END;
Регистр
-- Выполнил студент гр. 310 Алёшином Р.И.
-- Программа регистра
SUBDESIGN registr
( reset :INPUT = GND;
setn :INPUT = VCC;
clok_en :INPUT = VCC;
clk :INPUT ;
dataa[7..0] :INPUT ;
result[7..0] :output; )
VARIABLE
tr[7..0] :dffe;
BEGIN
tr[].(CLK, CLRN, PRN, ENA) = (clk, !reset, setn, clok_en);
(tr[].d) = (dataa[]);
result[] = (tr[].q);
END;
Двухвходовых сумматор.
При сложении двух 8-ми разрядных чисел получается 9-ти разрядное число, по этому будем использовать 9-ти разрядный выход.
--- Выполнил студент гр. 310 Алёшином Р.И.
--- Програма реализации сумматора, стоящего перед перемножителем
SUBDESIGN summ_dop
( clock_en : INPUT = VCC;
reset : INPUT = GND;
clk : INPUT ;
setn : INPUT = VCC;
dataa[7..0] : INPUT;
datab[7..0] : INPUT;
result[8..0] : OUTPUT;)
VARIABLE
--a[1..0] : NODE;
tr[8..0] : dffe;
BEGIN
tr[].(CLK, CLRN, PRN, ENA) = (clk, !reset, setn, clock_en);
(tr[].d) = (( dataa[7], dataa[] ) + ( datab[7], datab[]));
result[] = ( tr[].q);
END;
3-х входовый основной сумматор.
Так как максимальный старший разряд будет 16-м, значит выходные отсчеты будут браться с 16-го до 9-го.
--- Выполнил студент гр. 310 Алёшином Р.И.
--- Оконечный сумматор
SUBDESIGN summ_osnov
( clk : INPUT ;
clock_en : INPUT = VCC;
reset : INPUT = GND;
setn : INPUT = VCC;
dataa[16..0] : INPUT;
datab[16..0] : INPUT;
datac[16..0] : INPUT;
datad[16..0] : INPUT;
-- каждая пара входов увеличивает разрядность выходных
-- данных на 1, следовательно
result[18..0] : OUTPUT; )
VARIABLE
tr[18..0] : dffe;
BEGIN
tr[].(CLK, CLRN, PRN, ENA) = (clk, !reset, setn, clock_en);
(tr[].d) = ((dataa[16], dataa[16], dataa[]) + (datab[16], datab[16],datab[])+
(datac[16], datac[16], datac[]) + (datad[16], datad[16],datad[]));
result[] = ( tr[].q);
END;
Умножитель.
Реализован с помощью встроенной функции MegaWizard Plug-In Manager.
Умножитель имеет только один вход, так как коэффициент умножений задан заранее.
В того чтобы программу можно было использовать для любых значений коэффициентов в качестве параметра задан множитель, для исключения гонок был добавлен регистр на основе dffe триггеров.
-- Выполнил студент гр. 310 Алёшином Р.И.
-- Программа умножителя
INCLUDE "lpm_mult.inc";
PARAMETERS
( koefficient = H"115" );
SUBDESIGN umnoj
( dataa[8..0] : INPUT;
result[16..0] : OUTPUT;
setn : INPUT = VCC;
clk : INPUT ;
reset : INPUT = GND;
clock_en : INPUT; )
VARIABLE
lpm_mult_component : lpm_mult WITH (
LPM_WIDTHA = 9,
LPM_WIDTHB = 8,
LPM_WIDTHP = 17,
LPM_WIDTHS = 17,
INPUT_B_IS_CONSTANT = "YES",
LPM_REPRESENTATION = "SIGNED",
USE_EAB = "OFF",
MAXIMIZE_SPEED = 6 );
a[16..0] : NODE;
tr[16..0] : dffe;
BEGIN
a[16..0] = lpm_mult_component.result[16..0];
tr[].(CLRN, CLK, PRN, ENA) = (!reset, clk, setn, clock_en);
lpm_mult_component.dataa[8..0] = dataa[8..0];
lpm_mult_component.datab[7..0] = koefficient;
result[] = tr[].q;
tr[].d = a[];
END;
Устройство формирования единичного импульса
--- Выполнил студент гр. 310 Алёшином Р.И.
--- Программа устранения дребезга контактов и
--- формирование одиночного импульса се
SUBDESIGN drebezg
(
PB2 : INPUT ;
PB1 : INPUT ;
clk : INPUT ;
ce : OUTPUT;
)
VARIABLE
tr : dff ;
BEGIN
tr.(d,clk,clrn) = (VCC, dff(VCC, VCC, PB1, PB2), !ce);
ce = dff(tr.q, clk, , );
END;
7 -Сегментный индикатор
--- Выполнил студент гр. 310 Алёшином Р.И.
---Семисегментный индикатор
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.