
- •Лабораторная работа №1 «Описание комбинационных схем в языке vhdl»
- •Variable I:integer;
- •Variable stim_vector: std_logic_vector(2 downto 0);
- •Variable I:integer;
- •Variable stim_vector: std_logic_vector(2 downto 0);
- •Variable I:integer;
- •Variable stim_vector: std_logic_vector(2 downto 0);
- •Variable stim_vector: std_logic_vector(2 downto 0);
- •Variable I:integer;
- •Variable stim_vector: std_logic_vector(2 downto 0);
- •Variable stim_vector: std_logic_vector(2 downto 0);
- •Variable stim_vector: std_logic_vector(2 downto 0);
- •Variable I:integer;
- •Variable stim_vector: std_logic_vector(2 downto 0);
- •Variable stim_vector: std_logic_vector(2 downto 0);
- •Variable stim_vector: std_logic_vector(2 downto 0);
- •Variable I:integer;
- •Variable I:integer;
- •Variable stim_vector: std_logic_vector(2 downto 0);
- •Variable I:integer;
- •Variable stim_vector: std_logic_vector(2 downto 0);
- •Variable I:integer;
- •Variable stim_vector: std_logic_vector(2 downto 0);
- •Выводы по работе
Variable stim_vector: std_logic_vector(2 downto 0);
begin
stim_vector := to_vector(stim_integer,3);
z<=((not stim_vector(0)) and (not stim_vector(1)) and (not stim_vector(2))) or
(stim_vector(0) and (not stim_vector(1)) and (not stim_vector(2))) or (
(not stim_vector(0)) and stim_vector(1) and stim_vector(2));
END process;
logic_unit_new:process(stim_integer)
Variable stim_vector: std_logic_vector(2 downto 0);
begin
stim_vector := to_vector(stim_integer,3);
case stim_vector is
when "000"=> z1<='1';
when "001"=> z1<='1';
when "110"=> z1<='1';
when OTHERS => z1<='0';
end case;
END process;
logic_unit_new2:process(stim_integer) -- тот же процесс, что и в пред. пункте
-- только с использованием case
Variable stim_vector: std_logic_vector(2 downto 0);
VARIABLE x0,x1,x2: std_logic;
begin
stim_vector := to_vector(stim_integer,3);
x0 := stim_vector(0);
x1 := stim_vector(1);
x2 := stim_vector(2);
case x0 is
when '0'=> z2<=(((not x1) and (not x2)) or (x1 and x2));
when '1'=> z2<=((not x1) and (not x2));
when OTHERS => z2 <= '0';
end case;
END process;
compare:process(z,z1)
begin
if z/=z1 then
ASSERT false REPORT "Signal z and z1 is not equal! Modelling is stop!"
SEVERITY failure;
end if;
END process;
Stimulator: PROCESS
Variable I:integer;
BEGIN
FOR i IN 0 TO 15 LOOP
stim_integer <= i;
WAIT for 50 ns;
END LOOP;
ASSERT false REPORT "End of Stimulation !"
SEVERITY note;
WAIT;
END PROCESS;
END test1;
-----------------------------------------------------------------------------
Временные диаграммы:
7. Вызовем к работе файл, созданный по пункту 1. Преобразуем фрагмент программы, обеспечивающей описание функции в форме логических уравнений, в двухуровневую последовательность И-ИЛИ форму, определив выходы логических элементов «И» как сигналы.
Текст модифицированной программы:
-----------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE work.util_1164.all;
USE STD.textio.ALL;
ENTITY lab1_14 IS
END lab1_14;
ARCHITECTURE test1 OF lab1_14 IS
SIGNAL stim_integer: integer;
SIGNAL z,y1,y2,y3,x0,x1,x2: std_logic;
BEGIN
logic_unit:process(x0,x1,x2) –- процесс, отвечающий за описание функции
-- в форме логических уравнений, в двухуровневую
-- последовательную И-ИЛИ форму
begin
y1 <= (not x0) and (not x1) and (not x2);
y2 <= x0 and (not x1) and (not x2);
y3 <= (not x0) and x1 and x2;
z <= y1 or y2 or y3;
END process;
Stimulator: PROCESS
Variable I:integer;
Variable stim_vector: std_logic_vector(2 downto 0);
BEGIN
FOR i IN 0 TO 15 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 Stimulation !"
SEVERITY note;
WAIT;
END PROCESS;
END test1;
-----------------------------------------------------------------------------
Временные диаграммы:
Как видно из временных диаграмм, результат отличается от полученного ранее в 1 пункте данной работы. Это обусловлено тем, что присвоение значений используемым в процессе сигналам происходит сразу после завершения процесса, а не во время его выполнения.
8. В программе, представленной в предыдущем пункте, оператор вычисления Z оформим как параллельное присваивание.
Для этого перенесем этот оператор в общую операторную часть архитектурного тела.
Получится след. текст программы:
-----------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE work.util_1164.all;
USE STD.textio.ALL;
ENTITY lab1_15 IS
END lab1_15;
ARCHITECTURE test1 OF lab1_15 IS
SIGNAL stim_integer: integer;
SIGNAL z,y1,y2,y3,x0,x1,x2: std_logic;
BEGIN
logic_unit:process(x0,x1,x2)
begin
y1 <= (not x0) and (not x1) and (not x2);
y2 <= x0 and (not x1) and (not x2);
y3 <= (not x0) and x1 and x2;
END process;
z <= y1 or y2 or y3; -- перенесенный оператор вычисления Z
Stimulator: PROCESS