Скачиваний:
81
Добавлен:
01.05.2014
Размер:
190.98 Кб
Скачать

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;

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;

-----------------------------------------------------------------------------

Временные диаграммы:

5. Введем в программу процесс, реализующий функцию на основе разложения Шеннона по одной переменной.

Разложение Шеннона:

Исходная функция:

Подформулы разложения:

В языке VHDL такое вычисление может быть представлено фрагментом:

if x1=0 then z <= <подформула, полученная из f заменой x1 на 0>;

else z <= <подформула, полученная из f заменой x1 на 1>;

end if;

С учетом этого, программа примет след. вид:

-----------------------------------------------------------------

LIBRARY ieee;

USE ieee.std_logic_1164.ALL;

USE work.util_1164.all;

USE STD.textio.ALL;

ENTITY lab1_12 IS

END lab1_12;

ARCHITECTURE test1 OF lab1_12 IS

SIGNAL stim_integer: integer;

SIGNAL z,z1,z2: std_logic;

BEGIN

logic_unit:process(stim_integer)

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) –- новый процесс, реализующий

-- разложение Шеннона

Variable stim_vector: std_logic_vector(2 downto 0);

begin

stim_vector := to_vector(stim_integer,3);

if (stim_vector(0) = '0') then

z2 <= ((not stim_vector(1)) and (not stim_vector(2))) or

((stim_vector(1)) and (stim_vector(2)));

else

z2 <= ((not stim_vector(1)) and (not stim_vector(2)));

end if;

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;

-----------------------------------------------------------------------------

Временные диаграммы:

6. Выполним описание той же логической функции, как и в предыдущем пункте, только с использованием оператора CASE.

Текст модифицированной программы:

-----------------------------------------------------------------

LIBRARY ieee;

USE ieee.std_logic_1164.ALL;

USE work.util_1164.all;

USE STD.textio.ALL;

ENTITY lab1_13 IS

END lab1_13;

ARCHITECTURE test1 OF lab1_13 IS

SIGNAL stim_integer: integer;

SIGNAL z,z1,z2: std_logic;

BEGIN

logic_unit:process(stim_integer)