Фильтр низкой частоты на ПЛИС EPF10K20RC240-4 семейства FLEX10K фирмы Altera, страница 5

                                            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 Алёшином Р.И.

---Семисегментный индикатор