Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Library ieee;. USE ieee. Std_logic_1164. ALL;. USE ieee. Std_logic_arith. ALL;. USE ieee. Std_logic_unsigned. ALL;. Architecture a of reg_shift_r IS




LIBRARY ieee;

USE ieee. std_logic_1164. ALL;

USE ieee. std_logic_arith. ALL;

USE ieee. std_logic_unsigned. ALL;

ENTITY Reg_Shift_R IS -- entity declaration

GENERIC ( m: INTEGER );

PORT (                     

Reset, Clk             : IN std_logic;

Load, En_Right   : IN std_logic;

D_in                     : IN std_logic_vector(2**m - 1 DOWNTO 0);

Bit_Multi              : OUT std_logic

);

END Reg_Shift_R;

 

ARCHITECTURE a OF Reg_Shift_R IS

SIGNAL Q          : std_logic_vector(2**m - 1 DOWNTO 0);

SIGNAL Q_int   : std_logic_vector(2**m - 1 DOWNTO 0);

BEGIN

base: PROCESS (Reset, Clk, Q, Q_int)

       BEGIN

                   IF Reset = '1' THEN Q < = ( OTHERS => '0');

ELSIF Clk'eventANDClk = '1' THEN

IF Load = '1' OR En_Right = ’1’ THEN Q < = Q_int;

ELSE Q < = Q;

END IF;

ELSE Q < = Q;

END IF;

END PROCESS base;

 

Q_int < = D_in WHEN Load = '1' ELSE '1' & Q(2**m - 1 DOWNTO 1) WHEN En_Right = '1' ELSE Q;

Bit_Multi < = Q(0);

 

END;

 

Программа (листинг 6. 2), описывающая регистр сдвига влево Reg_Shift_ L, выполнена аналогично предыдущей программе. Основной особенностью является необходимость иметь разрядность в два раза большую разрядности входных данных. Выполнение этого требования может быть реализовано различными способами. Один из них заключается во введении фиктивного внутреннего массива Q_tmp, используемого при вводе исходных данных и объединяемого с основным при помощи операции катенации данных &.

Листинг 6. 2

LIBRARY ieee;

USE ieee. std_logic_1164. ALL;

USE ieee. std_logic_arith. ALL;

USE ieee. std_logic_unsigned. ALL;

ENTITY Reg_Shift_L IS

GENERIC ( m: INTEGER );

PORT (                     

Reset, Clk             : IN std_logic;

Load, En_Left            : IN std_logic;

D_in                     : IN std_logic_vector(2**m - 1 DOWNTO 0);

Q                          : BUFFER std_logic_vector(2*(2**m) - 1 DOWNTO 0)

);

END Reg_Shift_L;

 

ARCHITECTURE a OF Reg_Shift_L IS

SIGNAL Q_int   : std_logic_vector(2*(2**m) - 1 DOWNTO 0);

SIGNAL Q_tmp : std_logic_vector(2**m-1 DOWNTO 0);

BEGIN

base: PROCESS (Reset, Clk, Q, Q_int)

       BEGIN

                   IF Reset ='1' THEN Q < = ( OTHERS => '0');

ELSIF Clk'event ANDClk = '1'THEN

IF Load= '1' OR En_Left = '1' THEN Q < = Q_int;

ELSE Q < = Q;

END IF;

ELSE Q < = Q;

END IF;

END PROCESS base;

 

Q_tmp < = ( OTHERS => '0');

Q_int < = Q_tmp & D_in WHEN Load= '1' ELSE Q(2*(2**m)-2 DOWNTO 0) & '0'

                                WHEN En_Left = '1' ELSE Q;

 

END;

 

Программа счетчика тактов умножения (листинг 6. 3), в соответствии с рекомендациями раздела 4, содержит два параллельных оператора. Особенностью реализации счетчиков, предназначенных для внутренних целей (подсчета тех или иных событий), является их описание в форме вычитающих. Подобная организация позволяет более экономно построить фрагмент, отвечающий за определение достижения заданной границы счета (в случае вычитания это всегда все нули). Счетчик дополнен схемой определения границы, это PROCESS по имени Zero, формирующий выходной сигнал Equal_Zero.

 

Листинг 6. 3

LIBRARY ieee;

USE ieee. std_logic_1164. ALL;

USE ieee. std_logic_arith. ALL;

USE ieee. std_logic_unsigned. ALL;

 

ENTITYCount_Bit IS

GENERIC ( m: INTEGER );

PORT (

    Clk, En    : IN std_logic;

    Load         : IN std_logic;

       Equal_Zero: OUT std_logic

 );

END Count_Bit;

 

ARCHITECTURE AcntTakt OF Count_Bit IS

SIGNAL Count   : std_logic_vector (m-1 DOWNTO 0);

SIGNAL Count_Int: std_logic_vector (m-1 DOWNTO 0);

BEGIN

       RegCmd: PROCESS ( Clk, Count, Count_Int)

       BEGIN

                   IF Clk = '1' AND Clk' EVENT THEN Count < = Count_Int;

                   END IF;

       END PROCESS RegCmd;

 

Count_Int < = ( OTHERS => '1') WHEN Load = '1' ELSE Count - '1' WHEN En = '1' ELSE Count;

 

Zero: PROCESS ( Clk, Count)

                   VARIABLE i: INTEGER;

                   BEGIN

                              Equal_Zero < = '1';

                              FOR i IN m-1 DOWNTO 0 LOOP

                                          IF (Count(i) = '1' ) THEN Equal_Zero < = '0'; EXIT;

                                     END IF;

                              END LOOP;

       END PROCESS Zero;

 

END AcntTakt;

 

Программа регистра, суммирующего частные произведения (листинг 6. 4), приведена ниже. Вариант функционального описания регистра-аккумулятора требуется в  данном случае для того, чтобы обеспечить возможность его компиляции и синтеза при произвольной разрядности данных. Этот вариант имеет имя и интерфейс, полностью совпадающие с библиотечным вариантом реализации регистра-аккумулятора фирмы Altera.

 

Листинг 6. 4

LIBRARY ieee;

USE ieee. std_logic_1164. ALL;

USE ieee. std_logic_arith. ALL;

USE ieee. std_logic_unsigned. ALL;

 

 

ENTITY Reg_Accum IS

GENERIC (m: INTEGER );

PORT (         

       Reset, Clk            : IN std_logic;

       En                   : IN std_logic;            

       D_in                     : IN std_logic_vector(2*(2**m)-1 DOWNTO 0);

       Q                          : BUFFER std_logic_vector(2*(2**m)-1 DOWNTO 0)

);

END Reg_Accum;

 

ARCHITECTURE a OFReg_Accum IS

SIGNAL Q_int   : std_logic_vector(2*(2**m)-1 DOWNTO 0);

 

BEGIN

       base: PROCESS (Clk, Reset, Q, Q_int)

       BEGIN

                   IF Reset = '1' THEN Q < = ( OTHERS => '0');

                   ELSIF Clk'event AND Clk = '1' THEN Q < = Q_int;

                   ELSE        Q < = Q;

                   END IF;

       END PROCESS base;

 

       Q_int < = Q + D_in WHEN En = '1' ELSE Q;

 

END;

 

При разработке систем перед проектировщиком достаточно часто встает проблема: использовать в проекте свою разработку того или иного блока или воспользоваться стандартной библиотекой. Каждый из вариантов решения имеет свои плюсы и минусы.

При ориентации на структурные компоненты библиотеки параметризованных модулей системы QUARTUS II обычно удаётся получить компонент с максимальным быстродействием для данного вида ПЛИС. Прототипы и назначения портов этих модулей можно найти, используя  пункты HELP/MEGAFUNCTIONS/LPM системы QUARUS II. Конструкции GENERIC MAP и PORT MAP оператора вхождения компонента должны учитывать конкретный вариант подключения библиотечного элемента. Недостатком ориентации на стандартную библиотеку определенной фирмы может являться невозможность использования проекта с ПЛИС других фирм. В некоторых случаях библиотечный элемент является функционально избыточным, не видны функциональные действия внутри модуля и т. п.

Программа, описывающая устройство управления, выполняется традиционными средствами (автоматически с помощью САПР). В предыдущем пятом разделе подробно обсуждались все аспекты реализации подобных автоматов и поэтому здесь не рассматриваются.

Программа верхнего уровня иерархии (листинг 6. 5), описывающая общую схему умножителя, приводится ниже. Структура и состав таких программ достаточно традиционны и совпадают с приведенными в разделе 3 данных указаний. В декларации ENTITY заданы внешние управляющие сигналы – начальный сброс (Reset), тактовый сигнал (Clk), запуск одиночной операции умножения (Start), а также входные и выходные информационные сигналы. Новым элементом является элемент настройки GENERIC (m: INTEGER: = 2 ); в котором и назначается разрядность умножителя. Хотя и возможно такое формирование настроек, чтобы было возможно построение устройств с целых чисел (2, 3, 4, 5), в данном проекте выбрано формирование настроек, обеспечивающих реализацию умножителей с разрядностью, являющейся степенью числа 2 (т. е. 2, 4, 8, 16, 32, …), что чаще всего и требуется в реальных разработках.

Раздел объявления компонентов архитектурного тела представляет используемые типовые операционные узлы: сдвигающие регистры (Reg_Shift_L и Reg_Shift_R), накапливающий сумматор (Reg_Accum), счетчик тактов (Count_Bit), а также специально разработанный компонент – устройство управления (Cnt_Avt).

Главная часть архитектурного телав примересодержит операторы вхождений компонентов, то есть задает их соединения и один оператор, описывающий схему И для сигналов Bit_Multi и En.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...