Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 11 / Отчет по лабораторной 1.doc
Скачиваний:
24
Добавлен:
01.05.2014
Размер:
150.53 Кб
Скачать

Цель работы: научится основам работы в среде Model Sim и, выполняя

пункты заданий, освоить базовые конструкции языка VHDL.

Отчет о выполнении заданий:

  1. Изменить текст программы 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)

Как видно из диаграммы при обнаружении различий в значениях функции процесс моделирования прекращается.

Соседние файлы в папке Лабораторная работа 11