Практические задания по VHDL. Задание 1.

Как всем известно выучить язык программирования без практики нельзя, и VHDL (хоть это не язык программирования) имеет такое-же свойство. Поэтому я решил выложить задания с ответами, которые я получал в прошлом семестре на курсе «Техническая информатика» в университете города Дармштадт(Германия).

Задания переведены с немецкого языка мной, а литературного таланта я не имею, поэтому если присутствуют какие-нибудь ошибки, или названия переведены не корректно, прошу написать это в комментариях.
В качестве IDE используется Xilinx ISE.

Практическое задание 1.


Задание 1.1
Начертите блок схему полного сумматора, используя два полусумматора и один логический ИЛИ-элемент.
Отметьте входы(А, В, Сin) а так же выходы (S,Cout).

Задание 1.2
Теперь спроектируйте полный сумматор при помощи VHDL.
Добавьте к вашему проекту новый VHDL-модуль(Project → NewSource...) с названием FADD. Для названия входов и выходов используйте названия из подпункта 1.1. Следующим шагом вам надо создать 2 полусумматора. Для этого добавьте в раздел Architecture вашего FADD описание компонента полусумматор HADD. Благодаря этому описанию у вас появилась возможность создать два объекта полусумматора в теле FADD. Соедините выходы и входы FADD с выходами и входами ваших полусумматоров и смоделируйте внутреннее соединение при помощи сигналов(signal). Логическое ИЛИ можно реализировать при помощи команды or, которая работает на уровне сигналов.

Задание 1.3
Используйте New Source Wizard чтобы сгенерировать Testbench для вашего сумматора. Для генерации теста визард использует шаблон, который предназначен для цепи, управляемой тактами. Однако полный сумматор построен комбинаторно, поэтому визарду не возможно входы сумматора идентифицировать как такт. Поэтому сигнал такта описывается как clock, а части в которых присутствуют сигналы надо из удалить. Для симуляции работы сумматора и для поиска ошибок будет полезным использовать экстремальные значения для входных значений. Вводные значения могут быть изменены внутри процесса при помощи команды wait for. Придумайте такие входные значения и расширте ваш тест. В конце симулируйте ваш сумматор в ISim и проверте правильность используя получившийся график.

Задание 2.1
Начертите блок схему 4-х битового сумматора Ripple-Carry, используя полные сумматоры из прошлого задания. Отметьте входы как Аi и Bi а выходы как Cj, где i={0,1,2,3} а j={0,1,2,3,4}. Индексы задают место в битовом векторе сигналов, а индекс 0 показываетLeast Significant Bit .

Задание 2.2
Теперь спроектируйте Ripple-Carry сумматор при помощи VHDL.
Добавьте к вашему проекту новый VHDL-модуль(Project → NewSource...) с названием FADD4. Входы и выходы являются шиной (Bus), поэтому нужно задать Most Significant Bit (MSB) и Least Significant Bit (LSB). Это можно сделать нажатием на Bus-Checkbox и выбрать 3 для MSB и 0 для LSB. Создадим два входа с именем A и B. Создадим выход с именем C и MSB=4 и LSB=0.
Добавте теперь описание компонента FADD. Создайте нужное количество объектов FADD и соедините их исходя из вашей блок схемы.

Задание 2.3
Создайте Testbench используя визард. Придумайте значения которыми можно проверить работоспособность вашего сумматора и измените тест в соответствии с этими значениями. В конце симулируйте работу вашего сумматора в ISim проверте правильность используя получившийся график.

Решение:

Задание 1.1


Задание 1.2

library IEEE ;
use IEEE.STD_LOGIC_1164.ALL;

entity fadd is
     Port (a : in STD_LOGIC;
           b : in STD_LOGIC;
           cin : in STD_LOGIC;
           s : out STD_LOGIC;
           cout : out STD_LOGIC);
end fadd;

architecture Behavioral of fadd is
component hadd is
    Port ( a : in STD_LOGIC;
           b : in STD_LOGIC;
           s : out STD_LOGIC;
           c : out STD_LOGIC);
end component;

signal hadd1_s_2_hadd2_b : std_logic;
signal hadd1_cout_2_or : std_logic;
signal hadd2_cout_2_or : std_logic;

begin
      hadd1 : hadd port map (
              a => a,
              b => b,
              s => hadd1_s_2_hadd2_b,
              c => hadd1_cout_2_or);

      hadd2 : hadd port map (
              a => cin ,
              b => hadd1_s_2_hadd2_b ,
              s => s,
              c => hadd2_cout_2_or); 

              cout <= hadd1_cout_2_or or hadd2_cout_2_or;
end Behavioral;


Задание 1.3

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY fadd_testbench IS
END fadd_testbench;

ARCHITECTURE behavior OF fadd_testbench IS

−− Component Declaration for the Unit Under Test (UUT)

      COMPONENT fadd
      PORT(
           a : IN std_logic;
           b : IN std_logic;
           cin : IN std_logic;
           s : OUT std_logic;
           cout : OUT std_logic);
      END COMPONENT;

−− Inputs

      signal a : std_logic := ’ 0 ’;
      signal b : std_logic := ’ 0 ’;
      signal cin : std_logic := ’ 0 ’;

−− Outputs

      signal s : std_logic ;
      signal cout : std_logic;
      
BEGIN

−− Instantiate the Unit Under Test (UUT)

      uut : fadd PORT MAP (
               a = a,
               b = b,
               cin = cin,
               s = s,
               cout = cout);

−− Stimulusprocess

      stim_proc : process
      begin
               a <= ’0’; b <= ’0’ ; cin <= ’0’;
               wait for 10 ns;

               a <= ’0’; b <= ’0’ ; cin <= ’1’;
               wait for 10 ns;

               a <= ’0’; b <= ’1’ ; cin <= ’0’;
               wait for 10 ns;

               a <= ’0´; b <= ’1’ ; cin <= ’1’;
               wait for 10 ns;

               a <= ’1’; b <= ’0’ ; cin <= ’0’;
               wait for 10 ns;

               a <= ’1’; b <= ’0’ ; cin <= ’1’;
               wait for 10 ns;

               a <= ’1’; b <= ’1’ ; cin <= ’0’;
               wait for 10 ns;

               a <= ’1’; b <= ’1’ ; cin <= ’1’;
               wait;
      end process;
END;

Симуляция:
  • +2
  • 10 марта 2011, 21:10
  • nepank

Комментарии (3)

RSS свернуть / развернуть
Может стоит это тоже в раздел ПЛИС перенести?
0
Добавил.

У меня один вопрос, существует ли тут возможность создать спойлер, для того, чтоб в него решение засунуть?
0
Попробуй Ди в личке спросить.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.