Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Семинар 7
Последовательный оператор цикла loop
Оператор loop используется для задания итерации набора последовательных выражений:
<необязательная_метка>:
<тип_цикла> loop
-- исполняемые операторы
end loop;
Существует три итерационных схемы (<тип_цикла>). Первая имеет форму:
for <переменная_цикла> in <диапазон>
Пример использования схемы:
factorial := 1;
for index in 2 to N loop
factorial := factorial * index;
end loop;
Тело loop исполняется N-1 раз, при этом идентификатор index в конце каждой итерации увеличивается на 1. Подразумевается, что идентификатор целочисленного типа и значения его лежат в диапазоне от 2 до N. Второй итерационной схемой является следующая:
while <условие>
Пример использования схемы:
j := 0;
sum := 10;
WH-LOOP: while j < 20 loop -- loop имеет метку WH_LOOP
sum := sum * 2;
j := j+3;
end loop;
Выражения в теле loop выполняются одно за другим, и эта последовательность повторяется, пока условие j < 20 истинно.
Третьей cхемой является конструкция, в которой итерационная схема не задается и выход из loop осуществляется с использованием выражений: exit (завершение выполнения и закрытие оператора цикла) или next (переход к следующей итерации цикла), например:
sum: = 1;
j := 0;
L2: loop --loop имеет метку
j: = j+21;
sum := SUM* 10;
exit when SUM > 100;
end loop L2;
В этом примере выражение exit заставляет выходить из петли L2 когда sum становится больше 100. При отсутствии выражения exit loop будет исполняться бесконечно.
Чаще всего операторы цикла используются при написании test bench. Рассмотрим использование данного оператора при моделировании работы постоянной памяти структуры 32х8.
Описание такой памяти приведено ниже:
-- Блоки памяти
-------------------------------------------------------------------------------
--Пример: Постоянная память формата 32х8
-----------------
--Подключение библиотек
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
--Описание портов ввода/вывода
entity ROM is
port( Clock : in std_logic; -- тактовый сигнал
Reset : in std_logic; -- сигнал сброса
Enable : in std_logic; -- сигнал разрешения
Read : in std_logic; -- сигнал чтения
Address : in std_logic_vector(4 downto 0); -- адрес
Data_out: out std_logic_vector(7 downto 0)
); -- данные
end ROM;
--Описание архитектуры проекта
architecture Behav of ROM is
-- объявление нового типа, соответствующего структуре памяти
type ROM_Array is array (0 to 31)
of std_logic_vector(7 downto 0);
-- объявление константы этого типа
constant Content: ROM_Array := (
0 => "00000001",-- содержимое памяти
1 => "00000010",
2 => "00000011",
3 => "00000100",
4 => "00000101",
5 => "00000110",
6 => "00000111",
7 => "00001000",
8 => "00001001",
9 => "00001010",
10 => "00001011",
11 => "00001100",
12 => "00001101",
13 => "00001110",
14 => "00001111",
OTHERS => "11111111");
begin
-- Описание процесса чтения
process(Clock, Reset, Read, Address)
begin
if( Reset = '1' ) then
Data_out <= "ZZZZZZZZ";
elsif( Clock'event and Clock = '1' ) then
if Enable = '1' then
if( Read = '1' ) then
Data_out <= Content(conv_integer(Address));
else
Data_out <= "ZZZZZZZZ";
end if;
end if;
end if;
end process;
end Behav;
При описании постоянной памяти вводится специальный тип данных ROM_Array, который представляет собой массив элементов типа std_logic_vector. Для задания значений этой памяти описывается константа данного типа Content.
Моделирование работы этого блока памяти проводится с помощью test bench. При этом необходимо перебрать все значения адресов памяти. Для этого целесообразно использовать оператор цикла:
-- Последовательные операторы. Операторы цикла
--------------------------------------------------------------------------------------
--Пример: моделирование работы постоянной памяти
-- Test Bench для постоянной памяти
-----------------
--Подключение библиотек
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
--Описание портов ввода/вывода
entity ROM_TB is
end ROM_TB;
--Описание архитектуры проекта
architecture TB of ROM_TB is
-- Моделируемое устройство
component ROM is
port( Clock : in std_logic;
Reset : in std_logic;
Enable : in std_logic;
Read : in std_logic;
Address : in std_logic_vector(4 downto 0);
Data_out: out std_logic_vector(7 downto 0)
);
end component;
-- Внутренние сигналы
signal T_Clock, T_Reset, T_Read, T_Enable: std_logic;
signal T_Address: std_logic_vector(4 downto 0);
signal T_Data_out: std_logic_vector(7 downto 0);
signal END_SIM: BOOLEAN:=FALSE;
-- флаг окончания моделирования
begin
-- Декларация компонента
U_ROM: ROM port map (T_Clock, T_Reset, T_Enable,
T_Read, T_Address, T_Data_out);
-- Генерация тактового сигнала
Clk_sig: process
begin
if END_SIM = FALSE then
T_Clock<='1'; -- clock cycle 10 ns
wait for 5 ns;
T_Clock<='0';
wait for 5 ns;
else wait;
end if;
end process;
-- Генерация сигналов для чтения данных
Read_sig: process
begin
-- Начальная установка
T_Enable <= '1';
T_Read <= '0';
T_Reset <= '1';
T_Address <= (others => '0');
-- Разрешение чтения
wait for 20 ns;
T_Reset <= '0';
T_Read <= '1';
-- Перебор всех адресов
for i in 0 to 31 loop
wait for 20 ns;
T_Address <= T_Address + '1';
end loop;
wait for 20 ns;
-- Установка флага окончания моделирования
END_SIM <= TRUE;
wait;
end process;
end TB;
Далее приводится описание оперативной памяти структуры 4х4. При описании используется тот же подход, что и в случае оперативной памяти, только вместо константы используется сигнал. Описание этого типа памяти приведено ниже:
-- Блоки памяти
-------------------------------------------------------------------------------
--Пример: оперативная память формата 4х4
-----------------
--Подключение библиотек
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
--Описание портов ввода/вывода
entity SRAM is
generic( width: integer:=4;
-- разрядность шины данных
addr: integer:=2); -- разрядность шины адреса
port( Clock: in std_logic; -- тактовый сигнал
Enable: in std_logic; -- сигнал разрешения
Read: in std_logic; -- сигнал чтения
Write: in std_logic; -- сигнал записи
Read_Addr: in std_logic_vector(addr-1 downto 0); -- адрес для чтения
Write_Addr: in std_logic_vector(addr-1 downto 0); -- адрес для записи
Data_in: in std_logic_vector(width-1 downto 0); -- данные записи
Data_out: out std_logic_vector(width-1 downto 0)
); -- данные чтения
end SRAM;
--Описание архитектуры проекта
architecture behav of SRAM is
-- объявление нового типа, соответствующего структуре памяти
type ram_type is array (0 to 2**addr-1) of
std_logic_vector(width-1 downto 0);
-- объявление сигнала этого типа
signal tmp_ram: ram_type;
begin
-- Описание процесса чтения
process(Clock, Read)
begin
if (Clock'event and Clock='1') then
if Enable='1' then
if Read='1' then
-- выдача данных на выход по адресу чтения
-- используется функция преобразования типов
Data_out <= tmp_ram(conv_integer(Read_Addr));
else
-- перевод выхода в третье состояние
Data_out <= (Data_out'range => 'Z');
end if;
end if;
end if;
end process;
-- Описание процесса записи
process(Clock, Write)
begin
if (Clock'event and Clock='1') then
if Enable='1' then
if Write='1' then
-- запись данных в память
tmp_ram(conv_integer(Write_Addr)) <= Data_in;
end if;
end if;
end if;
end process;
end behav;
Примеры описания сложных устройств
1) Схема формирования импульса заданной длительности приведена на рис.1.
Рис. 1 Структурная схема устройства формирования импульса заданной длительности
Моделирование работы этого устройства можно провести при помощи test bench.
Задание для студентов. Привести описание устройства, формирующего пачку импульсов, структурная схема которого приведена на рис. 2.
Рис.2 Структурная схема устройства формирования пачки импульсов
Синтезируемое подмножество языка VHDL
Язык VHDL широко распространился в качестве языка проектирования цифровых систем. Этому способствовали его использование в различных промышленных системах проектирования и стандартизация языковых версий. В настоящее время основным действующим стандартом является стандарт ANSI/IEEE Std 1076 1993, появившийся в 1993 г. и более известный как VHDL'93. Именно этот стандарт поддерживается в настоящее время в основных промышленных системах проектирования. В таких системах можно как проводить моделирование исходных спецификаций, так и синтезировать логические схемы по корректным VHDL программам. Однако синтез логических схем возможен не для всех конструкций языка VHDL. Конструкции языка, которые поддерживаются при синтезе, образуют синтезируемое подмножество языка. Иногда синтезируемое подмножество называют также синтезабельным подмножеством. И хотя имеется стандарт IEEE Std 1076.6 1999 на синтезируемость конструкций уровня RTL, при практическом использовании различных синтезаторов следует учитывать следующее важное обстоятельство различные синтезаторы «понимают» синтезируемое подмножество языка VHDL по разному.
Можно привести следующие общие рекомендации при разработке синтезируемых описаний:
1. Операции над типом real не поддерживаются при синтезе, поэтому его не следует использовать при описании.
2. Рекомендуется в описании не использовать циклы. Циклы поддерживаются, если цикловые переменные ограничены константами.
3. Определение фронта и спада сигнала при описании последовательностных схем проводить при помощи оператора if в теле оператора process. В теле оператора process допускается использовать только одно определение фронта сигнала.
4. Не допускается определение сигнала в разных операторах без использования решающих функций.