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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|