.Проектирование устройств и систем с высокоскоростными соединениями
.pdfstate<=DATA0; en_fifo<='1';
when DATA0 => state<=DATA1;
when DATA1 => state<=DATA2; en_fifo<='0';
when DATA2 =>
if symbol_counter=7 then state<=EF;
else
symbol_counter<=symbol_counter+1; state<=DATA0;
en_fifo<='1'; end if;
when EF=> state<=IDLE;
symbol_counter<=(others=>'0'); when IDLE=>
state<=SF; when others =>
null; end case;
end if;
end process
CONVERTOR: -- Процесссогласованияразделителейкадраипользовательских process(TXOUTCLK,reset_n) -- данных с интерфейсом передатчика
begin
if reset_n='0' then TXDATA<=(others=>'0'); buff<=(others=>'0'); TXCHARISK0<='0'; TXCHARISK1<='0';
elsif rising_edge(TXOUTCLK) then case state is
when SF => TXCHARISK0<='1';
TXCHARISK1<='1';
TXDATA<="1011110010111100"; --разделительK28_5K28_5 when DATA0 =>
TXCHARISK0<='0';
TXCHARISK1<='0';
TXDATA(15 downto 0) <=data_in24(15 downto 0); buff(7 downto 0)<= data_in24(23 downto 16);
when DATA1 =>
171
TXDATA(7 downto 0) <=buff(7 downto 0); TXDATA(15 downto 8)<= data_in24(7 downto 0); buff<= data_in24(23 downto 8);
when DATA2 => TXDATA<= buff;
when EF=> TXCHARISK0<='1';
TXCHARISK1<='0';
TXDATA<="0000000000011100"; -- разделительK28_0 D0_0 when IDLE=>
TXCHARISK1<='1';
TXDATA<="1011110011111101"; -- разделительK29_7 K28_5 when others =>
null; end case;
END IF; end process;
end conv_12_to_8;
Процесс STATE_MACHINE реализует таблицу переходов синхронного конечного автомата (рис. 6.38, синхронизация по отрицательному фронту TXOUTCLK), являющегося устройством управления узла conv_12_to_8. В процессе также формируется выходной сигнал en_fifo, инициирующий копирование данных в узле FIFO_Tx.
symbol_counter /= 512
reset_n
SF |
DATA0 |
DATA1 |
DATA2 |
IDLE EF
idle=1
Рис. 6.38. Устройство управления узла conv_12_to_8
Процесс CONVERTOR реализует таблицу выходов автомата устройства управления узла conv_12_to_8. В состояниях SF, EF и IDLE формируются коды соответствующих К-символов,
172
а сигналы TXCHARISK0 и TXCHARISK1 устанавливаются в 0. Состояния DATA0, DATA1 и DATA2 соответствуют этапам схемы преобразования (см. рис. 6.37).
На рис. 6.39 приведена структурная схема приемной части пользовательского протокола проекта #3. Узел TestGen введен для отладки проекта средствами моделирования и формирует сигнал, инициирующий чтение данных пользователя из приемного буфера fifo_rx. На рис. 6.40 приведена трехэтапная схема, по которой узел conv_8_to_12 преобразует очередные три 16-раз- рядных слова, поступающие из PCS MGT, в четыре 12-разряд- ных слова данных пользователя.
Рис. 6.39. Структурная схема приемной части пользовательского протокола проекта #3
Рис. 6.40. Схема преобразования 3 символов по 16 разрядов в 4 символа по 12 разрядов
173
Единственный процесс (STATE_MACHINE) узла conv_8_to_12 реализует таблицу переходов синхронного автомата (рис. 6.41, синхронизация по положительному фронту RXUSRCLK2), являющегося его устройством управления. В процессе формируется выходной сигнал fifo_en, разрешающий запись в FIFO_Rx пользовательских данных, сгруппированных в состояниях data_0, data_1 и data_2 и фиксируемых на выходе data_out24.
Рис. 6.41. Устройство управления узла conv_8_to_12
Синтезируемая VHDL-модель узла conv_8_to_12 приведена ниже.
VHDL программа-спецификация узла conv_8_to_12
library IEEE;
use IEEE.STD_LOGIC_1164.all; entity conv_8_to_12 is
port(
reset_n : in STD_LOGIC; RXUSRCLK2 : in STD_LOGIC;
RXDATA : in STD_LOGIC_VECTOR(15 downto 0); RXCHARISK0,RXCHARISK1: in STD_LOGIC; RXDISPERR0,RXDISPERR1: in STD_LOGIC; fifo_en : out STD_LOGIC;
data_out24 : out STD_LOGIC_VECTOR(23 downto 0)
);
end conv_8_to_12;
architecture conv_8_to_12 of conv_8_to_12 is
constant K28_5_RDm : STD_LOGIC_VECTOR(7 downto 0) := "10111100";
174
constant K28_0_RDm : STD_LOGIC_VECTOR(7 downto 0) := "00011100"; constant K29_7_RDm : STD_LOGIC_VECTOR(7 downto 0) := "11111101"; type TYPE_STATE is (wait_comma ,data_0,data_1,data_2,wait_idle, lock_up); signal state: TYPE_STATE;
signal buff: STD_LOGIC_VECTOR(15 downto 0);
begin
STATE_MACHINE: --Автомат управления узла process(reset_n, RXUSRCLK2)
begin
if reset_n='0' then
state<= wait_comma1; buff<=(others=>'0'); data_out24 <=(others=>'0'); fifo_en <='0';
elsif rising_edge(RXUSRCLK2) then case state is
when wait_comma=>
if RXDATA=K28_5_RDm&K28_5_RDm and RXCHARISK0='1' and RXCHARISK1='1'then
state<=data_0; end if;
when data_0=> buff<= RXDATA;
if RXDATA="00000000"&K28_0_RDm and RXCHARISK0='1' and RXCHARISK1='0'then
state<=wait_idle; fifo_en <='0';
else
state<=data_1; fifo_en <='0';
end if;
when data_1=> -- Сборка пользовательских данных, этапы 1, 2 (первая часть)
buff<= RXDATA; data_out24(15 downto 0)<= buff;
data_out24(23 downto 16)<= RXDATA(7 downto 0); if RXDATA="00000000"&K28_0_RDm and
RXCHARISK0='1' and RXCHARISK1='0' then state<=wait_idle;
fifo_en <='0';
else
state<=data_2; fifo_en <='1';
end if;
175
when data_2=>--Сборка пользовательских данных, этапы 2 (вторая часть), 1
data_out24(7 downto 0)<=buff(15 downto 8); data_out24(23 downto 8)<= RXDATA;
if RXDATA="00000000"&K28_0_RDm and RXCHARISK0='1' and RXCHARISK1='0' then
state<=wait_idle; fifo_en <='0';
else
state<=data_0; end if;
when wait_idle=>
if RXDATA=K28_5_RDm&K29_7_RDm and RXCHARISK0='1' and RXCHARISK1='1' then
elsif RXDATA=K28_5_RDm&K28_5_RDm and RXCHARISK0='1' and RXCHARISK1='1' then
state<=data_0;
else
state<=lock_up; end if;
when others => null;
end case; end if;
end process;
end conv_8_to_12;
24-разрядные пользовательские данные, сформированные в узле conv_8_to_12, запоминаются в FIFO_Rx и становятся доступными пользователю как 12-разрядные. Ниже приведена синтезируемая VHDL-модель узла FIFO_Rx.
VHDL программа-спецификация узла FIFO_Rx
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.all; entity FIFO_Rx is
port(
reset_n : in STD_LOGIC; wr : in STD_LOGIC;
rd : in STD_LOGIC; fifo_en : in STD_LOGIC;
data_in : in STD_LOGIC_VECTOR(23 downto 0);
176
data_out12 : out STD_LOGIC_VECTOR(11 downto 0)
); end fifo_rx;
architecture fifo_rx of fifo_rx is
type TYPE_FIFO is array (0 to 3) of STD_LOGIC_VECTOR(11 downto 0); signal FIFO: TYPE_FIFO;
signal addr_cnt_wr, |
addr_cnt_rd:STD_LOGIC_VECTOR(1 downto 0); |
begin |
-- Запись в FIFO по указателю данных addr_cnt_wr |
FIFO_WRITE: |
|
process(reset_n,wr) |
-- и изменение указателя |
begin |
|
if reset_n='0' then FIFO(0)<=(others=>'0'); FIFO(1)<=(others=>'0'); FIFO(2)<=(others=>'0'); FIFO(3)<=(others=>'0'); addr_cnt_wr<=(others=>'0');
elsif falling_edge(wr) then if fifo_en='1' then
addr_cnt_wr<=addr_cnt_wr+2; FIFO(conv_integer(addr_cnt_wr))<=data_in(11 downto 0); FIFO(conv_integer(addr_cnt_wr+1))<=data_in(23 downto 12);
end if; end if;
end process;
FIFO_NEXT_ADDR: -- Изменение указателя данных addr_cnt_rd по чтению process(reset_n,rd)
begin
if reset_n='0' then addr_cnt_rd<=(others=>'0');
elsif falling_edge(rd) then addr_cnt_rd<=addr_cnt_rd+1;
end if;
end process;
FIFO_READ: -- Чтение FIFO по указателю данных addr_cnt_rd process(reset_n,rd)
begin
if reset_n='0' then data_out12<=(others=>'0');
elsif rising_edge(rd) then data_out12<=FIFO(conv_integer(addr_cnt_rd));
end if; end process; end FIFO_Rx;
177
Впроцессе FIFO_WRITE по отрицательному фронту сигнала wr и fifo_en, равного 1, 24-разрядные данные запоминаются в двух соседних 12-разрядных словах эластичной памяти FIFO. Локализацию данных определяет адресный счетчик записи addr_cnt_wr, увеличивающийся на 2 после каждой операции записи.
Впроцессе FIFO_READ 12-разрядное слово из адреса addr_cnt_rd FIFO копируется на выход data_out12 по положи-
тельному фронту сигнала rd. Адресный счетчик чтения addr_cnt_rd увеличивается на 1 по отрицательному фронту сигнала чтения rd в процессе FIFO_NEXT_ADDR.
178
7.ЯЗЫК ПРОЕКТИРОВАНИЯ АППАРАТУРЫ VHDL
ИИНТЕГРИРОВАННАЯ СРЕДА РАЗРАБОТКИ АППАРАТНЫХ СРЕДСТВ ACTIVE-HDL
Существует два популярных представителя группы языков
HDL (Hardware Description Language), предназначенных для опи-
сания цифровых аппаратных средств, – Verilog и VHDL: первый более краткий, менее гибкий, менее приятный; второй многословный, очень гибкий и более приятный.
История VHDL восходит к 80-м гг. прошлого века. В это время многие системы проектирования использовали графические HDL, когда наиболее общим строительным блоком был логический вентиль. Однако разработчики использовали и текстовые HDL, преимущество которых состояло в простоте представления сложных преобразований с использованием переменных, циклов и рекурсий. По мере усложнения устройств текстовые HDL почти полностью вытеснили графические.
Язык VHDL (VHSIC Hardware Description Language) был разработан в рамках программы VHSIC (Very High Speed Integrated Circuits) Министерства обороны Соединенных Штатов. В 1987 г. VHDL приобрел статус стандарта IEEE (IEEE Std. 1076–1987). В 1993 г. после ревизии начальной версии стал
VHDL’93, и далее на его основе VHDL’98, VHDL’2000, VHDL’2002, VHDL’2006, VHDL’2008, а подмножество VHDL AMS (Analog Mixed Signal) позволяет описывать как чисто аналоговые, так и смешанные, цифроаналоговые схемы.
При разработке VHDL использовался язык программирования ADA как отправная точка, поскольку оба языка разрабатывались для Министерства обороны. В свою очередь, ADA базируется на PASCAL, поэтому VHDL является синтаксическим сленгом PASCAL. Однако синтаксис VHDL более сложный.
7.1. ПРОГРАММИРОВАНИЕ НА VHDL ДЛЯ МОДЕЛИРОВАНИЯ И СИНТЕЗА
Программа на VHDL используется как модель, отражающая некоторое устройство. Система моделирования исполняет
179
программу на VHDL, имитируя работу реального устройства. Поведение устройства представляется в модели через события изменения сигналов и формируемые временные диаграммы сигналов. Наблюдая это поведение, разработчик анализирует свой проект, делает выводы о его правильности. Здесь программа на VHDL рассматривается как модель – VHDL про- грамма-модель.
Синтез является обратным процессом. При синтезе программа на VHDL рассматривается как спецификация, детальное описание, исходные данные и требования, по которым должна быть сгенерирована реализация физического устройства на СБИС. Синтезирующие компиляторы САПР по программе на VHDL генерируют реализацию проектируемого устройства. Здесь программа на VHDL выступает как программа-специфи- кация для синтеза.
Не всякая программа-модель может быть использована как программа-спецификация для синтеза. Не для всякой программы на VHDL ее поведение при моделировании будет соответствовать поведению устройства, синтезированного по этой же программе. Поэтому говорят о синтезируемом подмножестве языка VHDL. Имеется в виду та часть конструкций и понятий VHDL, которые могут использоваться в программе-спецификации для синтеза, исключая запрещенные для синтеза конструкции. Однако такого стандартизованного подмножества не существует.
Компиляция устройства по VHDL программе-специфика- ции может использовать разные наборы элементов (элементный базис). Базис реализации может состоять из элементов разного уровня – от вентилей и логических блоков табличного типа (LUT) до макроячеек сложных функциональных блоков: мультиплексоров, регистровых блоков, блоков памяти, умножителей и процессорных ядер. После компиляции производится оптимизация схемы с целью увеличения быстродействия или сокращения аппаратных затрат, уменьшения размеров на кристалле. Оптимизация схемы приводит к ее трансформациям, иногда весьма существенно меняющим структуру, которая просматривается в исходном тексте. Результатом может быть расхождение в поведении модели устройства и поведении реализации устройства, синтезированной по той же программе на VHDL. Разработчик
180