- •Отчет о выполнении заданий:
- •Изменить текст программы lab1.Vhd так, чтобы реализовать одну из функций таблицы по заданию преподавателя.
- •12. Ввести в программу процесс, реализующий функцию на основе разложения Шеннона по одной или двум переменным по заданию преподавателя.
- •15. Оператор вычисления z в программе, созданной по п. 14, оформить как параллельное присвоение (т.Е. Как оператор в общей операторной части архитектурного тела).
- •16. Модифицировать программу п. 15 так, чтобы учитывались задержки, полагая задержки перехода 0-1 и 1-0 равными для всех элементов.
Цель работы: научится основам работы в среде Model Sim и, выполняя
пункты заданий, освоить базовые конструкции языка VHDL.
Отчет о выполнении заданий:
-
Изменить текст программы lab1.Vhd так, чтобы реализовать одну из функций таблицы по заданию преподавателя.
.После отладки программу сохранить в новом файле.
Порядок синтеза схемы по заданию пункта 8:
Таблица истинности заданной функции
1 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
000 |
001 |
010 |
011 |
100 |
101 |
110 |
111 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
На основании таблицы истинности заданной функции строится ее выражение , представленная в виде ДНФ:
z= (¬x2*¬x1*¬x0) + (¬x2*x1*x0) +(x2*¬x1*¬x0) +(x2*¬x1*x0)
---Программа для пункта 8
LIBRARY ieee;
LIBRARY work;
USE ieee.std_logic_1164.ALL;
USE work.util_1164.all;
USE STD.textio.ALL;
ENTITY lab1_p8 IS
END lab1_p8;
ARCHITECTURE test OF lab1_p8 IS
signal stim_integer:integer range 0 to 7;
signal z,x0,x1,x2:std_logic;
BEGIN
logic_unit:process(x0,x1,x2) --"Процесс вычисления функции заданной
--в таблице"
begin
--"Формула для заданной функции,
--представленная в ДНФ"
z<=((not x2) and (not x1) and (not x0)) or
((not x2) and x1 and x0) or (x2 and (not x1) and (not x0)) or
(x2 and (not x1) and x0);
end process;
Simulator:process --Процесс для тестирования схемы
variable i:integer range 0 to 7;
variable stim_vector:std_logic_vector(2 downto 0);
begin
for i in 0 to 7 loop
stim_integer<=i;
stim_vector:=to_vector(i,3);
x0<=stim_vector(0);
x1<=stim_vector(1);
x2<=stim_vector(2);
wait for 50 ns;
end loop;
assert false report "End of Simulation!"
severity note;
wait;
end process;
end test;
Результаты моделирования программы:
9. Перестроить программу таким образом, чтобы сигнал от генератора воздействий передавался на логическую схему в форме битового вектора.
--Изменения в программе для пункта 9
…
ARCHITECTURE test OF lab1_p9 IS
signal stim_integer:integer range 0 to 7;
signal z:std_logic;
signal input_vector:std_logic_vector(2 downto 0); --Входной сигнал представленный вектором
BEGIN
logic_unit:process(input_vector) --"Процесс вычисления заданной функции"
begin
--"Формула заданной функции,
--представленная в виде ДНФ"
--Сигнал берется из вектора по индексу
z<=((not input_vector(2)) and (not input_vector(1)) and (not input_vector(0))) or
((not input_vector(2)) and input_vector(1) and input_vector(0)) or
(input_vector(2) and (not input_vector(1)) and (not input_vector(0))) or
(input_vector(2) and (not input_vector(1)) and input_vector(0));
end process;
Simulator:process
variable i:integer range 0 to 7;
variable stim_vector:std_logic_vector(2 downto 0);
begin
for i in 0 to 7 loop
stim_integer<=i;
stim_vector:=to_vector(i,3);
input_vector(0)<=stim_vector(0);
input_vector(1)<=stim_vector(1);
input_vector(2)<=stim_vector(2);
wait for 50 ns;
end loop;
assert false report "End of Simulation!"
severity note;
wait;
end process;
end test;
Результат моделирования программы:
10. Перестроить программу таким образом, чтобы сигнал от генератора воздействий передавался на логическую схему в форме целого числа.
--Изменения в программе для пункта 10
…
ARCHITECTURE test OF lab1_p10 IS
signal stim_integer:integer range 0 to 7;
signal z:std_logic;
signal input_value:integer range 0 to 7; --Входной значение в формате integer
BEGIN
logic_unit:process(input_value) --"Процесс вычисления заданной функции"
--"Вектор в котором хранится
--преобразованное входное число"
variable input_vector:std_logic_vector(2 downto 0);
begin
input_vector:=to_vector(input_value,3); --"Преобразование входного кода(int) в
-- вектор размером в 3 бита"
--"Формула заданной функции,
--представленная в виде ДНФ"
z<=((not input_vector(2)) and (not input_vector(1)) and (not input_vector(0))) or
((not input_vector(2)) and input_vector(1) and input_vector(0)) or
(input_vector(2) and (not input_vector(1)) and (not input_vector(0))) or
(input_vector(2) and (not input_vector(1)) and input_vector(0));
end process;
Simulator:process
variable i:integer range 0 to 7;
begin
for i in 0 to 7 loop
input_value<=i; --Входное число = iterator(i)
wait for 50 ns;
end loop;
assert false report "End of Simulation!"
severity note;
wait;
end process;
end test;
Результаты моделирование программы:
11. Добавить в программу lab1.vhd новый процесс, который
а) реализует логическую функцию по п. 8 на основе табличного задания функции;
б)сравнивает реализацию логической функции в исходной и модифицированной формах. В случае обнаружения разницы моделирование прекращается и выдается сообщение об ошибке.
--Изменения в программе для пункта 11
…
ARCHITECTURE test OF lab1_p11 IS
signal stim_integer:integer range 0 to 7;
signal z,z1:std_logic;
signal input_value:integer range 0 to 7; --Входное число формата integer
TYPE truth_table IS ARRAY(0 to 7) OF std_logic; --Массив для значений функции
--"Инициализация массива значениями
--функции"
CONSTANT table_OF_function:truth_table:=('1','0','0','1','1','1','0','0');
BEGIN
logic_unit:process(input_value)
--"Вектор в который преобразуется
--входное число"
variable input_vector:std_logic_vector(2 downto 0);
begin
input_vector:=to_vector(input_value,3); --"Преобразование входного кода(int) в
-- вектор размером в 3 бита"
z<=((not input_vector(2)) and (not input_vector(1)) and (not input_vector(0))) or
((not input_vector(2)) and input_vector(1) and input_vector(0)) or
(input_vector(2) and (not input_vector(1)) and (not input_vector(0))) or
(input_vector(2) and (not input_vector(1)) and input_vector(0));
end process;
logic_unit2:process(input_value) --"Процесс вычисления значений функции
--используя массив значений функции"
begin
case input_value is --"В зависимости от значения входного
--числа выбираем нужное значение из массива"
when 0 => z1<=table_OF_function(0);
when 1 => z1<=table_OF_function(1);
when 2 => z1<=table_OF_function(2);
when 3 => z1<=table_OF_function(3);
when 4 => z1<=table_OF_function(4);
when 5 => z1<=table_OF_function(5);
when 6 => z1<=table_OF_function(6);
when 7 => z1<=table_OF_function(7);
when OTHERS =>null;
end case;
end process;
Simulator:process
variable i:integer range 0 to 7;
begin
for i in 0 to 7 loop
input_value<=i; --Входное число = iterator(i)
if z1=z then null; --"Контролируем что значения ф-ции
--полученные 2-мя способами одинаковы
--иначе генерация ошибки и остановка
--моделирования"
else assert false report "Error! Invalid value of function"
severity failure;wait;
end if;
wait for 50 ns;
end loop;
assert false report "End of Simulation!"
severity note;
wait;
end process;
end test;
Результат моделирования программы:
В случае несовпадения значений функции, вычисленных 2-мя способами диаграмма выглядит следующим образом: (здесь ошибка в момент, когда входной код равен 2)
Как видно из диаграммы при обнаружении различий в значениях функции процесс моделирования прекращается.