Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Сафоненко ЗУ

.docx
Скачиваний:
9
Добавлен:
02.11.2016
Размер:
260.91 Кб
Скачать

Министерство образования и науки Российской Федерации

НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ МЭИ

Кафедра ВМСиС

ЛАБОРАТОРНАЯ РАБОТА № 4

по дисциплине

«Современные методы проектирования цифровых систем»

Тема: «Проектирование микросхемы памяти»

Выполнил: Сафоненко Д.П

Группа: А-07м-16

Москва, 2016

Выполнение работы

  1. Создание текстового описания модуля проекта на языке VHDL:

1.1) Описание микросхемы памяти КР573РФ5

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_UNSIGNED.CONV_INTEGER;

use IEEE.STD_LOGIC_ARITH.CONV_STD_LOGIC_VECTOR;

entity k573rf5 is

generic (

-- Динамические параметры микросхемы

t_aa:time:=450 ns; -- Время выборки адреса

t_cs:time:=450 ns; -- Время выбора

t_aceo:time:=150 ns; -- Время выборки сигнала разрешения по выходу

t_dis_cs:time:=120 ns; -- Время восстановления высокого сопротивления после сигнала CS

t_dis_ceo:time:=120 ns; -- Время восстановления высокого сопротивления после сигнала CEO

-- Параметры микросхемы

A_WIDTH:integer:=11; -- Ширина шины адреса

MEM_WORDS:integer:=2048; -- Количество слов

MEM_WLENGTH:integer:=8 -- Количество разрядов в слове

);

-- Выводы микросхемы

Port ( A : in STD_LOGIC_VECTOR (A_WIDTH-1 downto 0);

CS : in STD_LOGIC;

CEO : in STD_LOGIC;

DO : out STD_LOGIC_VECTOR (MEM_WLENGTH-1 downto 0):=(others=>'Z')

);

end k573rf5;

architecture Behavioral of k573rf5 is

type mem is array ( 0 to MEM_WORDS-1) of std_logic_vector(0 to MEM_WLENGTH-1);

shared variable pzu: mem;

shared variable upAfter: time:=0 ns;

shared variable downAfter: time:=0 ns;

shared variable badAdr: boolean:=false;

shared variable timeUp: time:=0 ns;

shared variable timeDown: time:=0 ns;

shared variable atest: time:=0 ns;

begin

------------------------начало-Заполнение-ПЗУ-------------

process

variable i: integer;

begin

for i in 0 to MEM_WORDS-1 loop

if (i mod 2=0) then

pzu(i):="H0H0H0H0";

else

pzu(i):="HHHH0000";

end if;

end loop;

DO<="HHHHHHHH";

wait;

end process;

----------------------конец-Заполнение-ПЗУ----------------

------------------------начало-Считывание------------------

process(CS,CEO,A)

begin

if (A'event)and(CEO='0')and(CS='0') then

upAfter := t_aa;

if(badAdr) then

DO<="XXXXXXXX" after upAfter;

else

DO<=pzu(conv_integer(A)) after upAfter;

timeUp:=now+upAfter;

end if;

end if;

if falling_edge(CS) then

if(CEO='0') then

upAfter := t_cs;

if(badAdr) then

DO<="XXXXXXXX" after upAfter;

else

DO<=pzu(conv_integer(A)) after upAfter;

timeUp:=now+upAfter;

end if;

end if;

end if;

if falling_edge(CEO) then

if(CS='0') then

if t_aceo-CEO'last_event > t_cs-CS'last_event then

upAfter := t_aceo;

else

upAfter := t_cs-(CS'last_event-CEO'last_event);

end if;

if(badAdr) then

--DO<="XXXXXXXX" after upAfter;

DO<="HHHHHHHH" after upAfter;

else

DO<=pzu(conv_integer(A)) after upAfter;

timeUp:=now+upAfter;

end if;

end if;

end if;

if rising_edge(CS) then

downAfter := t_dis_cs;

DO<=(others=>'H') after downAfter;

timeDown:=now+downAfter;

end if;

if rising_edge(CEO) then

downAfter := t_dis_ceo;

DO<=(others=>'H') after downAfter;

timeDown:=now+downAfter;

end if;

end process;

----------------конец-Считывание-----------------------------------------------

process(A)

begin

badAdr:=false;

for i in 0 to A_WIDTH - 1 loop

if A(i) /= '0' and A(i) /= '1' then

badAdr:=true;

end if;

end loop;

if badAdr and (now>1 ns) and (CS='0') then

report time'image(now) & ": Некорректные сигналы на адресных входах" severity ERROR;

end if;

if (CS='0')and(now>1 ns)and(CS'last_event < t_cs or CEO'last_event < t_aceo or atest+t_aa > now) then

report time'image(now) & ": Некорректная расстановка сигналов: Изменение адреса в момент считывания" severity ERROR;

end if;

atest := now;

end process;

-------------------------начало-Проверка--------------------------------

process(CS)

begin

if (now<timeUp)and(now>1 ns) and (CS='1') then

report time'image(now) & ": Некорректная расстановка сигналов: Изменение CS=1 в момент считывания" severity ERROR;

end if;

if (now<timeDown)and(now>1 ns) and (CS='0') then

report time'image(now) & ": Некорректная расстановка сигналов: Изменение CS=0 в момент отключения выходов" severity ERROR;

end if;

if badAdr and (now>1 ns) and (CS='0') then

report time'image(now) & ": Некорректные сигналы на адресных входах" severity ERROR;

end if;

end process;

process(CEO)

begin

if (now<timeUp)and(now>1 ns) and (CEO='1') then

report time'image(now) & ": Некорректная расстановка сигналов: Изменение CEO в момент считывания" severity ERROR;

end if;

if (now<timeDown)and(now>1 ns) and (CEO='0') then

report time'image(now) & ": Некорректная расстановка сигналов: Изменение CEO в момент отключения выходов" severity ERROR;

end if;

end process;

------------------конец-Проверка-----------------------------------------------

end Behavioral;

2) Создание тестирующей программы (Test Bench)

LIBRARY ieee;

USE ieee.std_logic_1164.ALL;

-- Uncomment the following library declaration if using

-- arithmetic functions with Signed or Unsigned values

--USE ieee.numeric_std.ALL;

ENTITY TBZU IS

END TBZU;

ARCHITECTURE behavior OF TBZU IS

-- Component Declaration for the Unit Under Test (UUT)

COMPONENT k573rf5

PORT(

A : IN std_logic_vector(10 downto 0);

CS : IN std_logic;

CEO : IN std_logic;

DO : OUT std_logic_vector(7 downto 0)

);

END COMPONENT;

--Inputs

signal A : std_logic_vector(10 downto 0) := (others => '0');

signal CS : std_logic := '0';

signal CEO : std_logic := '0';

--Outputs

signal DO : std_logic_vector(7 downto 0);

-- No clocks detected in port list. Replace <clock> below with

-- appropriate port name

-- constant <clock>_period : time := 10 ns;

BEGIN

-- Instantiate the Unit Under Test (UUT)

uut: k573rf5 PORT MAP (

A => A,

CS => CS,

CEO => CEO,

DO => DO

);

-- Stimulus process

ADDREC_proc: process

begin

CS <= '1';

CEO <= '1';

wait for 100 ns;

CS <= '0';

wait for 120 ns;

CEO <= '0';

wait for 500 ns;

A <="01010010101";

wait for 500 ns;

A <="01010010110";

wait for 500 ns;

A <="01010011110";

wait for 500 ns;

A <="01011110101";

wait for 500 ns;

end process;

END;

3) Функциональная верификация (Behavioral simulation). Полученная диаграмма.

Справочные данные