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

.Проектирование устройств и систем с высокоскоростными соединениями

.pdf
Скачиваний:
41
Добавлен:
15.11.2022
Размер:
21.68 Mб
Скачать

state<=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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]