Частина тексту файла (без зображень, графіків і формул):
/
Звіт
до лабораторної роботи №1
з дисципліни «Реконфігуровані комп’ютери»
на тему: «Розробка порівнювача 32х розрядних чисел засобами мови VHDL»
Львів-2014
Лабораторна робота #1
На тему: Розробка порівнювача 32х розрядних чисел засобами мови VHDL
Мета:
Розробити схему порівняння 32-ох розрядних чисел. Все це реалізувати на Verilog (бажано), без використання уже вбудованого порівняльного елемента (тобто - створити свій порівняльний елемент, описати його логіку роботи). А на виході елемента отримати три сигнали: рівне, менше, або більше.При створенні схеми можна зробити синхронну, чи асинхронну.
Виконання роботи:
Маючи залишкові знання із мови VHDL я вирішив працювати саме з нею. Оскільки використовувати готові елементи порівнювання на більше-менше не можна, мені довелось придумати спосіб їх заміни. За умовою мій спецобчислювач складається із двох вхідних портів по 32 біти і одного вихідного на чотири біти ( для отримання результату).
constant equal:bit_vector(3 downto 0):="1111"; -- Числа, що ввелись є рівними
constant low:bit_vector(3 downto 0):="0000"; -- А є меншим ніж число B
constant high:bit_vector(3 downto 0):="0001"; -- А є більшим ніж число B
Мій компаратор базується на функції конкатенації і вибірки з кейсу результатів, котрі підходять. З двох чисел я виділяю по два старших біта і обєдную їх, опісля чого шукаю відповідну комбінацію в «кейсі» і виводжу результат.
Наповнення CASE:
when "0000"=>Result<=equal;
when "0101"=>Result<=equal;
when "1010"=>Result<=equal;
when "1111"=>Result<=equal;
when "0001"=>Result<= low;exit;
when "0010"=>Result<= low;exit;
when "0011" =>Result<=low; exit;
when "0100" =>Result<=high; exit;
when "0110" =>Result<=low; exit;
when "0111" =>Result<=low;exit;
when "1000" =>Result<=high;exit;
when "1001" =>Result<=high; exit;
when "1011" =>Result<=low; exit;
when "1100" =>Result<=high;exit;
when "1101" =>Result<=high; exit;
when "1110" =>Result<=high; exit;
Повний VHDL код компаратора:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity CALC is
port(
A : in BIT_VECTOR(31 downto 0);
B : in BIT_VECTOR(31 downto 0);
Clock:in bit;
RESULT : inout BIT_vector(3 downto 0)
);
end CALC;
architecture CALC of CALC is
constant equal:bit_vector(3 downto 0):="1111";
constant low:bit_vector(3 downto 0):="0000";
constant high:bit_vector(3 downto 0):="0001";
begin
PROCESS(A,B)
variable temp1:bit_VECTOR(3 downto 0);
BEGIN
for CNTR IN 31 downto 0 loop
if cntr=0 THEN EXIT;
end if;
temp1:=A(cntr downTO (cntr-1)) & B(cntr DOWNTO (cntr-1));
case temp1 is
when "0000"=>Result<=equal;
when "0101"=>Result<=equal;
when "1010"=>Result<=equal;
when "1111"=>Result<=equal;
when "0001"=>Result<= low;exit;
when "0010"=>Result<= low;exit;
when "0011" =>Result<=low; exit;
when "0100" =>Result<=high; exit;
when "0110" =>Result<=low; exit;
when "0111" =>Result<=low;exit;
when "1000" =>Result<=high;exit;
when "1001" =>Result<=high; exit;
when "1011" =>Result<=low; exit;
when "1100" =>Result<=high;exit;
when "1101" =>Result<=high; exit;
when "1110" =>Result<=high; exit;
when others=>Result<="0101";
end case;
end loop;
-- enter your statements here --
END PROCESS;
end CALC;
Наповнення TestBench:
calc_32:process
begin
wait for 50 ns;
A<="00000000000000000000000000000001";
B<="00000000000000000000000000000000";
wait for 50 ns;
A<="00000000000000000000000000000010";
B<="00000000000000000000000101010101";
wait for 50 ns;
A<="11111111111111111111111111111111";
B<="11111111111111111111111111111111";
wait for 50 ns;
A<="11111111111111111111111111111111";
B<="11111111111111111111111111111111";
end process;
Моделювання:
/
При A=0 та B=0 результат F, тобто числа рівні.При A=1 та B=0 результат 1, тобто число А є більшим.При A=2 та B=155 результат 0, тобто число А є меншим.
Висновок: на даній лабораторній роботі я навчився використовувати засоби мови VHDL для створення спецобчислювача, що порівнює 32х розрядні числа.Створив даний спецобчислювач і протестував його роботу.