Разработка компонентов устройств ЦОС, реализуемых на базе аппаратных модулей DSP48E в ПЛИС FPGA серии Virtex;5, с помощью «мастера» Architecture Wizard САПР серии Xilinx ISE
Все статьи цикла:
Для подготовки описаний аккумуляторов,предназначенных для последующей реализации на базе аппаратных секций ЦОС DSP48E в ПЛИС FPGA серии Virtex-5, необходимов списке, представленном во второй диалоговой панели «мастера» Architecture Wizardс заголовком Selection (рис. 6), выбрать строку Accumulator. Если процесс разработки аккумулятора инициирован в среде управляющей оболочки САПР серии Xilinx ISE Навигатора проекта (Project Navigator), то дляформирования соответствующего описаниянужно в диалоговой панели Select IP, приведенной на рис. 8 (см. КиТ № 12 `2008, стр. 35), выбрать параметризированный модуль Accumulator v9.1i. После выполнения указанных действий на экран выводится стартоваядиалоговая панель «мастера» настройки параметров генерируемого аккумулятора, которая имеет заголовок Input/Output DataSetup Accumulator. Данная панель предназначена для выбора источника входных данных и определения разрядности входнойи выходной шины создаваемого элемента. Вид этой диалоговой панели представлен на рис. 11.
Источник входных данных разрабатываемого аккумулятора указывается в поле выбора Select input data. В выпадающем спискеэтого поля выбора представлено четыре возможных варианта: A:B, BCIN, CиPCIN. При использовании значения A:B, предлагаемого по умолчанию, входным портом формируемого аккумулятора является шина, образованная путем объединения входных шинданных A и B. Если в поле выбора Select inputdata указывается вариант BCIN, то в качествеисточника входных данных используется одноименная шина данных, предназначеннаядля подключения выходной шины BCOUT предшествующей секции DSP48E при каскадном соединении аппаратных модулей ЦОС. В случае выбора варианта C функцию входного порта создаваемого аккумулятора выполняет дополнительная входная шина данных C арифметическо-логического блока аппаратной секции DSP48E. При выборе варианта PCIN источником входных данных является одноименная шина, предназначенная для подключения выходной шины PCOUT предыдущей секции DSP48E при каскадном наращивании аппаратных модулей ЦОС.
Для определения разрядности входной шины данных генерируемого аккумулятора нужно воспользоваться полем редактированияWidth, которое расположено во встроенной панели Input Data(рис. 11). Диапазон возможных значений этого параметра зависит от источника входных данных создаваемого аккумулятора, указанного в поле выбора Select input data. Если для параметра Select input data выбран вариант A:B или C, то разрядность входной шины данных формируемого аккумулятора можно выбрать в диапазоне от 1 до 48 бит. При этом по умолчанию предлагается значение, равное 48 бит. Требуемое значение разрядности входной шины данных может быть задано с помощью клавиатуры после активизации поля редактирования Width или с помощью кнопок, расположенных в левой части этого поля. В том случае, когда в качестве источника входных данных выбрана шина BCIN, параметр Width принимает фиксированное значение, составляющее 18 двоичных разрядов. Если в создаваемом аккумуляторе входным портом является шина PCIN, то разрядность этого порта также жестко зафиксирована и составляет 48 бит.
При выборе вариантов A:B и BCIN для параметра Select input data в состав интерфейса разрабатываемого аккумулятора может быть добавлена выходная шина данных BCOUT, предназначенная для подключения к входной шине BCIN следующей секции DSP48E при каскадном сопряжении аппаратных модулей ЦОС. Для этой цели следует воспользоваться индикатором состояния Bring the dedicated cascade out to next DSP slice (BCOUT pin), который представлен во встроенной панели Input Data (рис. 11). По умолчанию данный индикатор находится в установленном состоянии, разрешающем включение указанной выходной шины данных в состав интерфейса создаваемого элемента. Чтобы заблокировать использование выходной шины данных BCOUT, нужно установить индикатор Bring the dedicated cascade out to next DSP slice (BCOUT pin) в состояние «Выключено».
После выбора требуемых параметров входного порта формируемого аккумулятора следует указать разрядность выходной шины данных, используя для этого поле редактирования Width, которое находится во встроенной панели Output Data P (рис. 11). Данный параметр может принимать любые значения в диапазоне от 1 до 48 разрядов. По умолчанию предлагается значение, соответствующее максимально возможной разрядности выходной шины данных. Если создаваемый аккумулятор предполагается использовать в составе каскадной схемы соединения секций DSP48E, то в состав его интерфейса необходимо добавить выходную шину PCOUT, которая предназначена для подключения к входной шине PCIN следующего аппаратного модуля ЦОС. Включение указанной шины в состав генерируемого аккумулятора осуществляется с помощью индикатора состояния Bring the dedicated cascade result out to next DSP Slice in chain (PCOUT pin), который расположен во встроенной панели Output Data P.
Завершив процедуру определения значений параметров входного и выходного порта разрабатываемого элемента, нужно перейти к следующей диалоговой панели «мастера» настройки параметров аккумулятора, предназначенного для реализации на базе аппаратного модуля DSP48E в ПЛИС семейств Virtex-5 LX, Virtex-5 LXT, Virtex-5 SXT и Virtex-5 FXT. Для этого следует нажать клавишу Далее (Next), представленную в нижней части стартовой диалоговой панели Input/ Output Data Setup Accumulator. Вторая диалоговая панель данного «мастера» имеет заголовок Operation Mode Setup Accumulator и используется для выбора типа выполняемой операции. Вид этой диалоговой панели приведен на рис. 12.
Индикатор состояния Use a CARRYIN, расположенный во встроенной панели Carry option, определяет возможность использования сигнала входного переноса в создаваемом аккумуляторе. По умолчанию этот индикатор установлен в состояние «Включено», при котором в состав описания интерфейса аккумулятора добавляется порт сигнала входного переноса. Если индикатор Use a CARRYIN переводится в сброшенное состояние, то вход переноса аппаратного модуля DSP48E, на базе которого реализуется аккумулятор, подключается к общей шине.
Чтобы выбрать тип выполняемой операции в разрабатываемом аккумуляторе, следует воспользоваться тремя кнопками с зависимой фиксацией, которые расположены во встроенной панели Add/Subtract control (рис. 12). Для формирования описания аккумулятора, выполняющего операцию сложения входных данных со значением содержимого, нужно зафиксировать в нажатом положении кнопку Add. Данный вариант сумматора предлагается по умолчанию. При создании описания аккумулятора, осуществляющего операцию вычитания, в нажатом состоянии должна находиться кнопка Subtract. Если необходимо сгенерировать описание аккумулятора, в котором тип выполняемой операции изменяется динамически в процессе работы этого элемента, то нажать следует кнопку Dynamic control of the ALUMODE. При этом в состав интерфейса разрабатываемого элемента автоматически добавляется входная 4-разрядная шина ALUMODE, которая используется для управления выбором выполняемой функции.
Третья диалоговая панелm «мастера» настройки параметров аккумулятора, реализуемого на базе аппаратного модуля DSP48E в ПЛИС семейств Virtex-5 LX, Virtex-5 LXT, Virtex-5 SXT и Virtex-5 FXT, имеет заголовок Pipelining and CE/RST Setup. Данная панель, вид которой изображен на рис. 13, предназначена для определения параметров конвейерной организации выполнения операций и выбора входов управления конвейерных регистров в формируемом аккумуляторе.
В представленной диалоговой панели, прежде всего, целесообразно указать расположение и количество конвейерных регистров, включаемых в состав структуры формируемого аккумулятора, используя для этого группы кнопок с зависимой фиксацией, расположенные во встроенной панели Pipelining option. Из всей совокупности кнопок, присутствующих в этой встроенной панели, в доступном состоянии находятся только те группы кнопок, которые соответствуют выбранному источнику входных данных (указанному в поле выбора Select input data в стартовой диалоговой панели Input/Output Data Setup Accumulator ) и типу выполняемой операции (заданному с помощью группы кнопок Add/ Subtract control, расположенных во второй диалоговой панели Operation Mode Setup Accumulator ). Если в качестве входного порта формируемого аккумулятора используется шина, образованная путем объединения входных шин данных A и B, то с помощью групп кнопок с зависимой фиксацией A и B нужно указать количество конвейерных регистров для этих шин. При этом следует учитывать, что количество используемых буферных регистров в составе шин данных A и B в аккумуляторе должно быть одинаковым. Поэтому кнопки групп A и B переключаются одновременно. Если в нажатом состоянии зафиксированы кнопки 0, то конвейерные регистры на входах данных не устанавливаются. Чтобы добавить в состав генерируемого аккумулятора один конвейерный регистр на входной шине данных A:B, следует нажать кнопки 1. При этом диалоговая панель Pipelining option приобретает вид, представленный на рис. 14.
аккумулятора, предназначенного для реализации на базе аппаратного модуля DSP48E,
при выборе одноступенчатой схемы буферизации входных данных
В этой панели становятся доступны индикаторы состояния, которые позволяют далее указать входы управления для буферного регистра, устанавливаемого на входной шине данных аккумулятора. В том случае, когда необходима двухступенчатая структура конвейерной обработки входных данных, нужно нажать кнопки 2. После этого диалоговая панель Pipelining option автоматически преобразуется к виду, показанному на рис. 15.
аккумулятора, предназначенного для реализации на базе аппаратного модуля DSP48E,
при выборе двухступенчатой схемы буферизации входных данных
Когда входным портом генерируемого аккумулятора является шина данных BCIN, используемая при каскадном сопряжении аппаратных секций DSP48E, в доступном состоянии находится группа кнопок B. С помощью этих кнопок аналогичным образом выбирается требуемое число конвейерных регистров, устанавливаемых на входной шине аккумулятора.
Если в качестве источника входных данных формируемого аккумулятора выбирается дополнительная входная шина данных C арифметическо-логического блока аппаратного модуля ЦОС, то в доступное состояние автоматически переводится группа кнопок C. В отличие от шин данных A и B к шине C подключается только один входной регистр. Для того чтобы добавить в состав создаваемого аккумулятора данный регистр, нужно нажать кнопку 1.
При выборе конвейерных регистров следует обратить внимание на то, что выходной регистр аккумулятора включается в его состав автоматически.
Кроме входных и выходных шин конвейерные регистры могут также устанавливаться в цепях входного переноса и сигналов управления. Для включения буферного регистра в цепи сигнала входного переноса следует воспользоваться группой кнопок с зависимой фиксацией CARRYIN, которые также находятся во встроенной панели Pipelining option (рис. 14, 15). Управление включением буферного регистра на входе разрешения загрузки входных данных в аккумулятор осуществляется с помощью группы кнопок с зависимой фиксацией LOAD. При формировании описания аккумулятора, в котором тип выполняемой операции изменяется динамически в процессе работы этого элемента, в его структуру можно добавить буферные регистры на входах шины управления выбором функции, выполняемой арифметическо-логическим блоком. Для этой цели нужно нажать кнопку 1, входящую в состав группы ALUMODE.
После определения состава конвейерных регистров, включаемых в структуру генерируемого аккумулятора, разработчику предоставляется возможность выборочного включения в состав интерфейса входов сброса и разрешения синхронизации указанных регистров. Активизация входов сброса в буферных регистрах осуществляется с помощью индикаторов состояния, представленных во встроенной панели Use a reset (рис. 14, 15). Чтобы добавить в состав интерфейса создаваемого аккумулятора входы сброса конвейерных регистров, устанавливаемых на входных шинах данных, следует перевести в состояние «Включено» индикаторы A, B и C соответственно. Для включения входа сброса выходного регистра в состав интерфейса аккумулятора необходимо установить во включенное состояние индикатор P. Если в разрабатываемом элементе необходимы вход сброса буферного регистра, устанавливаемого в цепи сигнала входного переноса, то нужно перевести в состояние «Включено» индикатор CARRYIN. Чтобы задействовать в создаваемом аккумуляторе входы сброса конвейерных регистров, устанавливаемых в цепях управления загрузкой входных данных и выбора типа выполняемой операции для арифметическо-логического блока, необходимо переключить в активное состояние индикаторы LOAD и ALUMODE соответственно.
Вместо раздельных входов сброса различных конвейерных регистров в формируемом аккумуляторе разработчику предоставляется возможность использования одного общего входа сброса. Для этой цели следует воспользоваться индикатором состояния Bring out one port for all resets, который также расположен во встроенной панели Use a reset. При установке этого индикатора в состояние «Включено», отмеченное маркером, в состав интерфейса генерируемого элемента добавляется вход единого сигнала сброса всех буферных регистров.
Для включения в состав интерфейса разрабатываемого аккумулятора входов сигналов разрешения синхронизации конвейерных регистров следует воспользоваться индикаторами состояния, находящимися во встроенной панели Use a clock-enable (рис. 14, 15). В составе этой встроенной панели в большинстве своем представлены те же индикаторы состояния, что и в панели Use a reset. Основное отличие заключается в том, что при использовании двухступенчатой схемы конвейерной обработки входных данных (рис. 15) в соответствующих буферных регистрах применяются раздельные входы разрешения синхронизации, которые обозначаются как A1, A2 и B1, B2. Чтобы задействовать общий сигнал разрешения синхронизации для всех буферных регистров, применяемых в составе генерируемого аккумулятора, нужно перевести индикатор Bring out one port for all clock-enables в состояние «Включено».
Завершается процесс определения параметров конфигурации создаваемого аккумулятора нажатием клавиши Далее (Next) в нижней части диалоговой панели с заголовком Operation Mode Setup Accumulator. При этом на экран выводится заключительная информационная панель «мастера» настройки параметров аккумулятора, которая имеет заголовок Summary. Вид этой панели изображен на рис. 16.
Данная информационная панель включает в себя три встроенные панели. В первой из них, Feature Summary, отображаются сведения о типе формируемого элемента и разрядности входных и выходных шин данных. Во второй встроенной панели, Files To Be Generated, представлена информация о формируемых файлах и месте их расположения на диске. Третья встроенная панель, Block Attibutes, содержит список атрибутов используемого библиотечного примитива, представляющего аппаратный модуль ЦОС DSP48E кристаллов семейств Virtex-5 LX, Virtex-5 LXT, Virtex-5 SXT и Virtex-5 FXT.
Чтобы активизировать процесс автоматической генерации файлов описания аккумулятора, следует нажать кнопку «Готово» (Finish), расположенную в нижней части заключительной информационной панели «мастера» (рис. 16). Если запуск «мастера» Architecture Wizard осуществлялся в автономном режиме, то сформированные файлы нужно добавить в состав проекта разрабатываемого устройства ЦОС в САПР серии Xilinx ISE, выполнив стандартную процедуру включения модулей исходного описания, рассмотренную в [3, 4].
Примеры аккумуляторов, реализуемых на базе аппаратных модулей DSP48E в ПЛИС FPGA серии Virtex-5, сформированных с помощью «мастера» Architecture Wizard
В качестве примеров в настоящем разделе приводятся описания аккумуляторов, реализуемых на базе аппаратных модулей DSP48E в ПЛИС FPGA семейств Virtex-5 SXT, Virtex-5 LXT и Virtex-5 FXT, для каждого типа выполняемой операции с различными источниками входных данных. Результат формирования описания аккумулятора с возможностью динамического выбора выполняемой операции демонстрирует VHDL-описание элемента accumulator_36_48. Этот аккумулятор предназначен для реализации на основе ПЛИС семейства Virtex-5 SXT. Разрядность входной шины данных элемента accumulator_36_48, которая представляет собой результат объединения входных шин данных A и B аппаратной секции ЦОС, составляет 36 бит. Выходная шина данных сформированного аккумулятора имеет разрядность, равную 48 бит. В элементе accumulator_36_48 применяется двухступенчатая схема конвейерной обработки входных данных, а также задействованы буферные регистры в цепях управляющих сигналов. В состав интерфейса рассматриваемого аккумулятора включен вход сигнала переноса, а также входы сигналов сброса и разрешения синхронизации буферных регистров. Кроме того, в этом элементе предусмотрены шины данных, предоставляющие возможность каскадного соединения.
Текст описания аккумулятора accumulator_ 36_48 на языке VHDL, сформированного «мастером» Architecture Wizard, выглядит следующим образом:
--Command: xaw2vhdl-st D:PRJaccumulator_36_48.xaw D:PRJac- cumulator_36_48 --Design Name: accumulator_36_48 --Device: xc5vsx50t-ff1136-3 -- -- Module -- Generated by Xilinx Architecture Wizard -- Written for synthesis tool: XST -- library ieee; use ieee.std_logic_1164.ALL; use ieee.numeric_std.ALL; library UNISIM; use UNISIM.Vcomponents.ALL; -- entity accumulator_36_48 is port ( AB_IN : instd_logic_vector (35 downto 0); ALUMODE_IN : in std_logic_vector (3 downto 0); CARRYIN_IN : in std_logic; CEALUMODE_IN : in std_logic; CEA1_IN : in std_logic; CEA2_IN : in std_logic; CEB1_IN : in std_logic; CEB2_IN : in std_logic; CECARRYIN_IN : in std_logic; CECTRL_IN : in std_logic; CEMULTCARRYIN_IN : instd_logic; CEM_IN : in std_logic; CEP_IN : in std_logic; CLK_IN : in std_logic; LOAD_IN : in std_logic; RSTALLCARRYIN_IN : in std_logic; RSTALUMODE_IN : in std_logic; RSTA_IN : in std_logic; RSTB_IN : in std_logic; RSTCTRL_IN : in std_logic; RSTM_IN : in std_logic; RSTP_IN : in std_logic; BCOUT_OUT : outstd_logic_vector (17 downto 0); PCOUT_OUT : outstd_logic_vector (47 downto 0); P_OUT : out std_logic_vector (47 downto 0) ); end accumulator_36_48; -- architecture BEHAVIORAL of accumulator_36_48 is signal GND_BUS_3 : std_logic_vector (2 downto 0); signal GND_BUS_18 : std_logic_vector (17 downto 0); signal GND_BUS_30 : std_logic_vector (29 downto 0); signal GND_BUS_48 : std_logic_vector (47 downto 0); signal GND_OPMODE : std_logic; signal VCC_OPMODE : std_logic; begin GND_BUS_3(2 downto 0) <= «000»; GND_BUS_18(17 downto 0) <= «000000000000000000»; GND_BUS_30(29 downto 0) <= «000000000000000000000000000000»; GND_BUS_48(47 downto 0) <= «000000000000000000000000000000000000000000000000»; GND_OPMODE <= '0'; VCC_OPMODE <= '1'; DSP48E_INST : DSP48E generic map( ACASCREG => 1, ALUMODEREG => 1, AREG => 2, AUTORESET_PATTERN_DETECT => FALSE, AUTORESET_PATTERN_DETECT_OPTINV => «MATCH», A_INPUT => «DIRECT», BCASCREG => 1, BREG => 2, B_INPUT => «DIRECT», CARRYINREG => 1, CARRYINSELREG => 0, CREG => 0, MASK => x»3FFFFFFFFFFF», MREG => 1, MULTCARRYINREG => 1, OPMODEREG => 1, PATTERN => x»000000000000», PREG => 1, SEL_MASK => «MASK», SEL_PATTERN => «PATTERN», SEL_ROUNDING_MASK => «SEL_MASK», USE_MULT => «NONE», USE_PATTERN_DETECT => «NO_PATDET», USE_SIMD => «ONE48» ) port map ( A(29)=>AB_IN(35), A(28)=>AB_IN(35), A(27)=>AB_IN(35), A(26)=>AB_IN(35), A(25)=>AB_IN(35), A(24)=>AB_IN(35), A(23)=>AB_IN(35), A(22)=>AB_IN(35), A(21)=>AB_IN(35), A(20)=>AB_IN(35), A(19)=>AB_IN(35), A(18)=>AB_IN(35), A(17 downto 0)=>AB_IN(35 downto 18), ACIN(29 downto 0)=>GND_BUS_30(29 downto 0), ALUMODE(3 downto 0)=>ALUMODE_IN(3 downto 0), B(17 downto 0)=>AB_IN(17 downto 0), BCIN(17 downto 0)=>GND_BUS_18(17 downto 0), C(47 downto 0)=>GND_BUS_48(47 downto 0), CARRYCASCIN=>GND_OPMODE, CARRYIN=>CARRYIN_IN, CARRYINSEL(2 downto 0)=>GND_BUS_3(2 downto 0), CEALUMODE=>CEALUMODE_IN, CEA1=>CEA1_IN, CEA2=>CEA2_IN, CEB1=>CEB1_IN, CEB2=>CEB2_IN, CEC=>VCC_OPMODE, CECARRYIN=>CECARRYIN_IN, CECTRL=>CECTRL_IN, CEM=>CEM_IN, CEMULTCARRYIN=>CEMULTCARRYIN_IN, CEP=>CEP_IN, CLK=>CLK_IN, MULTSIGNIN=>GND_OPMODE, OPMODE(6)=>GND_OPMODE, OPMODE(5)=>LOAD_IN, OPMODE(4)=>GND_OPMODE, OPMODE(3)=>GND_OPMODE, OPMODE(2)=>GND_OPMODE, OPMODE(1)=>VCC_OPMODE, OPMODE(0)=>VCC_OPMODE, PCIN(47 downto 0)=>GND_BUS_48(47 downto 0), RSTA=>RSTA_IN, RSTALLCARRYIN=>RSTALLCARRYIN_IN, RSTALUMODE=>RSTALUMODE_IN, RSTB=>RSTB_IN, RSTC=>GND_OPMODE, RSTCTRL=>RSTCTRL_IN, RSTM=>RSTM_IN, RSTP=>RSTP_IN, ACOUT=>open, BCOUT(17 downto 0)=>BCOUT_OUT(17 downto 0), CARRYCASCOUT=>open, CARRYOUT=>open, MULTSIGNOUT=>open, OVERFLOW=>open, P(47 downto 0)=>P_OUT(47 downto 0), PATTERNBDETECT=>open, PATTERNDETECT=>open, PCOUT(47 downto 0)=>PCOUT_OUT(47 downto 0), UNDERFLOW=>open ); end BEHAVIORAL;
В начале представленного описания присутствуют ссылки на используемые библиотеки и пакеты этих библиотек. Далее приведено объявление объекта, представляющего формируемый аккумулятор, и описание его интерфейса. Затем следует описание архитектуры элемента accumulator_36_48, основу которого образует примитив DSP48E [5].
В описании интерфейса аккумулятора accumulator_36_48 используются следующие условные обозначения входных и выходных портов:
- AB_IN[35:0] 36-разрядная входная шина данных;
- ALUMODE_IN[3:0] 4-разрядная входная шина управления выбором функции, выполняемой аккумулятором;
- CARRYIN_IN вход сигнала переноса;
- CEALUMODE_IN вход сигнала разрешения синхронизации для регистра управления, в который заносится код выполняемой функции;
- CEA1_IN, CEA2_IN входы сигнала разрешения синхронизации для первого и второго конвейерных регистров, устанавливаемых на шине данных A ;
- CEB1_IN, CEB2_IN входы сигнала разрешения синхронизации для первого и второго конвейерных регистров, устанавливаемых на шине данных B ;
- CECARRYIN_IN вход сигнала разрешения синхронизации для буферного регистра, устанавливаемого в цепи внешнего сигнала входного переноса;
- CECTRL_IN вход сигнала разрешения синхронизации буферных регистров, установленных в цепях управления загрузкой входных данных и входного переноса;
- CEMULTCARRYIN_IN вход сигнала разрешения синхронизации для буферного регистра, устанавливаемого в цепи внутреннего сигнала входного переноса;
- CEM_IN вход сигнала разрешения синхронизации для конвейерного регистра, устанавливаемого на входе арифметическологического блока;
- CEP_IN вход сигнала разрешения синхронизации для выходного регистра;
- CLK_IN вход тактового сигнала;
- LOAD_IN вход сигнала управления загрузкой входных данных в аккумулятор;
- RSTALLCARRYIN_IN вход сигнала сброса буферных регистров, применяемых в цепях входного переноса;
- RSTALUMODE_IN вход сигнала сброса для регистра управления выбором выполняемой функции аккумулятора;
- RSTA_IN, RSTB_IN входы сигналов сброса конвейерных регистров, устанавливаемых на входных шинах данных А и B соответственно;
- RSTCTRL_IN вход сигнала сброса буферных регистров, установленных в цепях управления загрузкой входных данных и входного переноса;
- RSTM_IN вход сигнала сброса конвейерного регистра, устанавливаемого на входе арифметическо-логического блока;
- RSTP_IN вход сигнала сброса выходного регистра;
- BCOUT_OUT [17:0] 18-разрядная выходная шина, предназначенная для каскадного соединения аккумуляторов;
- PCOUT_OUT 48-разрядная выходная шина данных, используемая при каскадном соединении аккумуляторов;
- P_OUT выходная 48-разрядная шина данных.
Кроме представленного VHDL-описания, «мастер» Architecture Wizard автоматически создает файл с расширением ucf, название которого состоит из идентификатора генерируемого элемента и суффикса «_arwz». Этот файл содержит последовательность выражений, которые определяют требуемые значения всех необходимых атрибутов библиотечного примитива DSP48E. Все эти выражения нужно включить в состав файла временных и топологических ограничений проекта разрабатываемого устройства ЦОС в САПР серии Xilinx ISE. Для аккумулятора accumulator_36_48 содержимое соответствующего файла с расширением ucf выглядит следующим образом:
# Generated by Xilinx Architecture Wizard # --- UCF Template Only --- # Cut and paste these attributes into the project's UCF file, if desired INST DSP48E_INST ACASCREG = 1; INST DSP48E_INST ALUMODEREG = 1; INST DSP48E_INST AREG = 2; INST DSP48E_INST AUTORESET_PATTERN_DETECT = FALSE; INST DSP48E_INST AUTORESET_PATTERN_DETECT_OPTINV = MATCH; INST DSP48E_INST A_INPUT = DIRECT; INST DSP48E_INST BCASCREG = 1; INST DSP48E_INST BREG = 2; INST DSP48E_INST B_INPUT = DIRECT; INST DSP48E_INST CARRYINREG = 1; INST DSP48E_INST CARRYINSELREG = 0; INST DSP48E_INST CREG = 0; INST DSP48E_INST MASK = 3FFFFFFFFFFF; INST DSP48E_INST MREG = 1; INST DSP48E_INST MULTCARRYINREG = 1; INST DSP48E_INST OPMODEREG = 1; INST DSP48E_INST PATTERN = 000000000000; INST DSP48E_INST PREG = 1; INST DSP48E_INST SEL_MASK = MASK; INST DSP48E_INST SEL_PATTERN = PATTERN; INST DSP48E_INST SEL_ROUNDING_MASK = SEL_MASK; INST DSP48E_INST USE_MULT = NONE; INST DSP48E_INST USE_PATTERN_DETECT = NO_PATDET; INST DSP48E_INST USE_SIMD = ONE48;
Примером описания аккумулятора с функцией накопления значений входных данных, сгенерированного с помощью «мастера» Architecture Wizard, является VHDL-описание элемента accumulator_add_32_40. Этот аккумулятор разработан, в первую очередь, для применения в составе проектов устройств ЦОС, реализуемых на базе кристаллов FPGA семейства Virtex-5 LXT. Входной 32-разрядный информационный порт элемента accumulator_add_32_40 выполнен на базе дополнительной входной шины данных C арифметическо-логического блока аппаратного модуля DSP48E. Разрядность выходной шины данных этого элемента составляет 40 бит. Сформированный текст VHDL-описания аккумулятора accumulator_add_32_40 имеет следующий вид:
--Command: xaw2vhdl-st D:PRJaccumulator_add_32_40.xaw D:PRJaccumulator_add_32_40 --Design Name: accumulator_add_32_40 --Device: xc5vlx50t-ff1136-3 -- -- Module accumulator_add_32_40 -- Generated by Xilinx Architecture Wizard -- Written for synthesis tool: XST -- library ieee; use ieee.std_logic_1164.ALL; use ieee.numeric_std.ALL; library UNISIM; use UNISIM.Vcomponents.ALL; -- entity accumulator_add_32_40 is port ( CARRYIN_IN : in std_logic; CECARRYIN_IN : in std_logic; CECTRL_IN : in std_logic; CEC_IN : in std_logic; CEMULTCARRYIN_IN : instd_logic; CEM_IN : in std_logic; CEP_IN : in std_logic; CLK_IN : in std_logic; C_IN : instd_logic_vector (31 downto 0); LOAD_IN : in std_logic; RSTALLCARRYIN_IN : in std_logic; RSTCTRL_IN : in std_logic; RSTC_IN : in std_logic; RSTM_IN : in std_logic; RSTP_IN : in std_logic; PCOUT_OUT : outstd_logic_vector (47 downto 0); P_OUT : outstd_logic_vector (39 downto 0) ); end accumulator_add_32_40; -- architecture BEHAVIORAL of accumulator_add_32_40 is signal GND_ALUMODE : std_logic; signal GND_BUS_3 : std_logic_vector (2 downto 0); signal GND_BUS_18 : std_logic_vector (17 downto 0); signal GND_BUS_30 : std_logic_vector (29 downto 0); signal GND_BUS_48 : std_logic_vector (47 downto 0); signal GND_OPMODE : std_logic; signal P_float : std_logic_vector (7 downto 0); signal VCC_OPMODE : std_logic; begin GND_ALUMODE <= '0'; GND_BUS_3(2 downto 0) <= «000»; GND_BUS_18(17 downto 0) <= «000000000000000000»; GND_BUS_30(29 downto 0) <= «000000000000000000000000000000»; GND_BUS_48(47 downto 0) <= «000000000000000000000000000000000000000000000000»; GND_OPMODE <= '0'; VCC_OPMODE <= '1'; DSP48E_INST : DSP48E generic map( ACASCREG => 1, ALUMODEREG => 0, AREG => 0, AUTORESET_PATTERN_DETECT => FALSE, AUTORESET_PATTERN_DETECT_OPTINV => «MATCH», A_INPUT => «DIRECT», BCASCREG => 1, BREG => 0, B_INPUT => «DIRECT», CARRYINREG => 1, CARRYINSELREG => 0, CREG => 1, MASK => x»3FFFFFFFFFFF», MREG => 1, MULTCARRYINREG => 1, OPMODEREG => 1, PATTERN => x»000000000000», PREG => 1, SEL_MASK => «MASK», SEL_PATTERN => «PATTERN», SEL_ROUNDING_MASK => «SEL_MASK», USE_MULT => «NONE», USE_PATTERN_DETECT => «NO_PATDET», USE_SIMD => «ONE48» ) port map ( A(29 downto 0)=>GND_BUS_30(29 downto 0), ACIN(29 downto 0)=>GND_BUS_30(29 downto 0), ALUMODE(3)=>GND_ALUMODE, ALUMODE(2)=>GND_ALUMODE, ALUMODE(1)=>GND_ALUMODE, ALUMODE(0)=>GND_ALUMODE, B(17 downto 0)=>GND_BUS_18(17 downto 0), BCIN(17 downto 0)=>GND_BUS_18(17 downto 0), C(47)=>C_IN(31), C(46)=>C_IN(31), C(45)=>C_IN(31), C(44)=>C_IN(31), C(43)=>C_IN(31), C(42)=>C_IN(31), C(41)=>C_IN(31), C(40)=>C_IN(31), C(39)=>C_IN(31), C(38)=>C_IN(31), C(37)=>C_IN(31), C(36)=>C_IN(31), C(35)=>C_IN(31), C(34)=>C_IN(31), C(33)=>C_IN(31), C(32)=>C_IN(31), C(31 downto 0)=>C_IN(31 downto 0), CARRYCASCIN=>GND_ALUMODE, CARRYIN=>CARRYIN_IN, CARRYINSEL(2 downto 0)=>GND_BUS_3(2 downto 0), CEALUMODE=>VCC_OPMODE, CEA1=>VCC_OPMODE, CEA2=>VCC_OPMODE, CEB1=>VCC_OPMODE, CEB2=>VCC_OPMODE, CEC=>CEC_IN, CECARRYIN=>CECARRYIN_IN, CECTRL=>CECTRL_IN, CEM=>CEM_IN, CEMULTCARRYIN=>CEMULTCARRYIN_IN, CEP=>CEP_IN, CLK=>CLK_IN, MULTSIGNIN=>GND_ALUMODE, OPMODE(6)=>GND_OPMODE, OPMODE(5)=>VCC_OPMODE, OPMODE(4)=>VCC_OPMODE, OPMODE(3)=>GND_OPMODE, OPMODE(2)=>GND_OPMODE, OPMODE(1)=>LOAD_IN, OPMODE(0)=>GND_OPMODE, PCIN(47 downto 0)=>GND_BUS_48(47 downto 0), RSTA=>GND_ALUMODE, RSTALLCARRYIN=>RSTALLCARRYIN_IN, RSTALUMODE=>GND_ALUMODE, RSTB=>GND_ALUMODE, RSTC=>RSTC_IN, RSTCTRL=>RSTCTRL_IN, RSTM=>RSTM_IN, RSTP=>RSTP_IN, ACOUT=>open, BCOUT=>open, CARRYCASCOUT=>open, CARRYOUT=>open, MULTSIGNOUT=>open, OVERFLOW=>open, P(47 downto 40)=>P_float(7 downto 0), P(39 downto 0)=>P_OUT(39 downto 0), PATTERNBDETECT=>open, PATTERNDETECT=>open, PCOUT(47 downto 0)=>PCOUT_OUT(47 downto 0), UNDERFLOW=>open ); end BEHAVIORAL;
В структуру аккумулятора accumulator_add_ 32_40 включены буферные регистры, установленные в цепях входных и выходных информационных шин, а также в цепях сигналов входного переноса и управления загрузкой входных данных. В этих регистрах задействованы входы сигналов сброса и разрешения синхронизации. Эти входы включены в состав интерфейса сформированного аккумулятора в форме соответствующих портов сигналов управления.
Большинство условных обозначений интерфейсных портов элемента accumulator_ add_32_40 совпадает с идентификаторами входных и выходных портов, используемых в описании аккумулятора accumulator_36_48, рассмотренными ранее. Кроме того, в составе интерфейса элемента accumulator_add_32_40 присутствуют следующие входные порты:
- CEC_IN вход сигнала разрешения синхронизации для буферного регистра, установленного на входной шине данных;
- C_IN[31:0] 32-разрядная входная шина данных аккумулятора;
- RSTC_IN вход сигнала сброса буферного регистра, подключенного к входной шине данных.
При использовании аккумулятора accumulator_add_32_40 в качестве одного из компонентов в составе разрабатываемого устройства ЦОС в файл временных и топологических ограничений проекта САПР серии Xilinx ISE необходимо включить следующую совокупность выражений:
# Generated by Xilinx Architecture Wizard # --- UCF Template Only --- # Cut and paste these attributes into the project's UCF file, if desired INST DSP48E_INST ACASCREG = 1; INST DSP48E_INST ALUMODEREG = 0; INST DSP48E_INST AREG = 0; INST DSP48E_INST AUTORESET_PATTERN_DETECT = FALSE; INST DSP48E_INST AUTORESET_PATTERN_DETECT_OPTINV = MATCH; INST DSP48E_INST A_INPUT = DIRECT; INST DSP48E_INST BCASCREG = 1; INST DSP48E_INST BREG = 0; INST DSP48E_INST B_INPUT = DIRECT; INST DSP48E_INST CARRYINREG = 1; INST DSP48E_INST CARRYINSELREG = 0; INST DSP48E_INST CREG = 1; INST DSP48E_INST MASK = 3FFFFFFFFFFF; INST DSP48E_INST MREG = 1; INST DSP48E_INST MULTCARRYINREG = 1; INST DSP48E_INST OPMODEREG = 1; INST DSP48E_INST PATTERN = 000000000000; INST DSP48E_INST PREG = 1; INST DSP48E_INST SEL_MASK = MASK; INST DSP48E_INST SEL_PATTERN = PATTERN; INST DSP48E_INST SEL_ROUNDING_MASK = SEL_MASK; INST DSP48E_INST USE_MULT = NONE; INST DSP48E_INST USE_PATTERN_DETECT = NO_PATDET; INST DSP48E_INST USE_SIMD = ONE48;
В качестве примера аккумулятора, выполняющего операцию вычитания, далее приводится описание элемента accumulator_sub_48_48, реализуемого на основе ПЛИС семейства Virtex-5 FXT. Сформированный аккумулятор предназначен для обработки 48-разрядных значений входных данных, которые поступают на шину PCIN аппаратного модуля ЦОС. Элемент accumulator_sub_48_48 целесообразно использовать в составе каскадного соединения аппаратных секций DSP48E:
--Command: xaw2vhdl-st D:Xilinx10.1ISEaccumulator_sub_48_48.xaw D:Xilinx10.1ISEaccumulator_sub_48_48 --Design Name: accumulator_sub_48_48 --Device: xc5vfx70t-ff1136-3 -- -- Module accumulator_sub_48_48 -- Generated by Xilinx Architecture Wizard -- Written for synthesis tool: XST -- library ieee; use ieee.std_logic_1164.ALL; use ieee.numeric_std.ALL; library UNISIM; use UNISIM.Vcomponents.ALL; -- entity accumulator_sub_48_48 is port ( CARRYIN_IN : in std_logic; CECARRYIN_IN : in std_logic; CECTRL_IN : in std_logic; CEMULTCARRYIN_IN : in std_logic; CEM_IN : in std_logic; CEP_IN : in std_logic; CLK_IN : in std_logic; LOAD_IN : in std_logic; PCIN_IN : instd_logic_vector (47 downto 0); RSTALLCARRYIN_IN : in std_logic; RSTCTRL_IN : in std_logic; RSTM_IN : in std_logic; RSTP_IN : in std_logic; PCOUT_OUT : outstd_logic_vector (47 downto 0); P_OUT : outstd_logic_vector (47 downto 0) ); end accumulator_sub_48_48; -- architecture BEHAVIORAL of accumulator_sub_48_48 is signal GND_ALUMODE : std_logic; signal GND_BUS_3 : std_logic_vector (2 downto 0); signal GND_BUS_18 : std_logic_vector (17 downto 0); signal GND_BUS_30 : std_logic_vector (29 downto 0); signal GND_BUS_48 : std_logic_vector (47 downto 0); signal GND_OPMODE : std_logic; signal VCC_ALUMODE : std_logic; signal VCC_OPMODE : std_logic; begin GND_ALUMODE <= '0'; GND_BUS_3(2 downto 0) <= «000»; GND_BUS_18(17 downto 0) <= «000000000000000000»; GND_BUS_30(29 downto 0) <= «000000000000000000000000000000»; GND_BUS_48(47 downto 0) <= «000000000000000000000000000000000000000000000000»; GND_OPMODE <= '0'; VCC_ALUMODE <= '1'; VCC_OPMODE <= '1'; DSP48E_INST : DSP48E generic map( ACASCREG => 1, ALUMODEREG => 0, AREG => 0, AUTORESET_PATTERN_DETECT => FALSE, AUTORESET_PATTERN_DETECT_OPTINV => «MATCH», A_INPUT => «DIRECT», BCASCREG => 1, BREG => 0, B_INPUT => «DIRECT», CARRYINREG => 1, CARRYINSELREG => 0, CREG => 0, MASK => x»3FFFFFFFFFFF», MREG => 1, MULTCARRYINREG => 1, OPMODEREG => 1, PATTERN => x»000000000000», PREG => 1, SEL_MASK => «MASK», SEL_PATTERN => «PATTERN», SEL_ROUNDING_MASK => «SEL_MASK», USE_MULT => «NONE», USE_PATTERN_DETECT => «NO_PATDET», USE_SIMD => «ONE48» ) port map ( A(29 downto 0)=>GND_BUS_30(29 downto 0), ACIN(29 downto 0)=>GND_BUS_30(29 downto 0), ALUMODE(3)=>GND_ALUMODE, ALUMODE(2)=>GND_ALUMODE, ALUMODE(1)=>VCC_ALUMODE, ALUMODE(0)=>VCC_ALUMODE, B(17 downto 0)=>GND_BUS_18(17 downto 0), BCIN(17 downto 0)=>GND_BUS_18(17 downto 0), C(47 downto 0)=>GND_BUS_48(47 downto 0), CARRYCASCIN=>GND_ALUMODE, CARRYIN=>CARRYIN_IN, CARRYINSEL(2 downto 0)=>GND_BUS_3(2 downto 0), CEALUMODE=>VCC_ALUMODE, CEA1=>VCC_ALUMODE, CEA2=>VCC_ALUMODE, CEB1=>VCC_ALUMODE, CEB2=>VCC_ALUMODE, CEC=>VCC_ALUMODE, CECARRYIN=>CECARRYIN_IN, CECTRL=>CECTRL_IN, CEM=>CEM_IN, CEMULTCARRYIN=>CEMULTCARRYIN_IN, CEP=>CEP_IN, CLK=>CLK_IN, MULTSIGNIN=>GND_ALUMODE, OPMODE(6)=>GND_OPMODE, OPMODE(5)=>GND_OPMODE, OPMODE(4)=>LOAD_IN, OPMODE(3)=>GND_OPMODE, OPMODE(2)=>GND_OPMODE, OPMODE(1)=>VCC_OPMODE, OPMODE(0)=>GND_OPMODE, PCIN(47 downto 0)=>PCIN_IN(47 downto 0), RSTA=>GND_ALUMODE, RSTALLCARRYIN=>RSTALLCARRYIN_IN, RSTALUMODE=>GND_ALUMODE, RSTB=>GND_ALUMODE, RSTC=>GND_ALUMODE, RSTCTRL=>RSTCTRL_IN, RSTM=>RSTM_IN, RSTP=>RSTP_IN, ACOUT=>open, BCOUT=>open, CARRYCASCOUT=>open, CARRYOUT=>open, MULTSIGNOUT=>open, OVERFLOW=>open, P(47 downto 0)=>P_OUT(47 downto 0), PATTERNBDETECT=>open, PATTERNDETECT=>open, PCOUT(47 downto 0)=>PCOUT_OUT(47 downto 0), UNDERFLOW=>open ); end BEHAVIORAL;
В аккумуляторе accumulator_sub_48_48 предусмотрен вход сигнала переноса. В этом элементе задействованы буферные регистры, установленные в цепях управления загрузкой входных данных и входного переноса.
Система условных обозначений входных и выходных портов элемента accumulator_ sub_48_48 включает в себя идентификаторы интерфейсных цепей, представленные в описании аккумулятора accumulator_36_48, за исключением входной шины данных. Для обозначения этой шины используется идентификатор PCIN_IN[47:0].
При использовании данного аккумулятора в составе описания разрабатываемого устройства ЦОС следует добавить в состав файла временных и топологических ограничений проекта следующие выражения:
# Generated by Xilinx Architecture Wizard # --- UCF Template Only --- # Cut and paste these attributes into the project's UCF file, if desired INST DSP48E_INST ACASCREG = 1; INST DSP48E_INST ALUMODEREG = 0; INST DSP48E_INST AREG = 0; INST DSP48E_INST AUTORESET_PATTERN_DETECT = FALSE; INST DSP48E_INST AUTORESET_PATTERN_DETECT_OPTINV = MATCH; INST DSP48E_INST A_INPUT = DIRECT; INST DSP48E_INST BCASCREG = 1; INST DSP48E_INST BREG = 0; INST DSP48E_INST B_INPUT = DIRECT; INST DSP48E_INST CARRYINREG = 1; INST DSP48E_INST CARRYINSELREG = 0; INST DSP48E_INST CREG = 0; INST DSP48E_INST MASK = 3FFFFFFFFFFF; INST DSP48E_INST MREG = 1; INST DSP48E_INST MULTCARRYINREG = 1; INST DSP48E_INST OPMODEREG = 1; INST DSP48E_INST PATTERN = 000000000000; INST DSP48E_INST PREG = 1; INST DSP48E_INST SEL_MASK = MASK; INST DSP48E_INST SEL_PATTERN = PATTERN; INST DSP48E_INST SEL_ROUNDING_MASK = SEL_MASK; INST DSP48E_INST USE_MULT = NONE; INST DSP48E_INST USE_PATTERN_DETECT = NO_PATDET; INST DSP48E_INST USE_SIMD = ONE48;
Продолжение следует
Литература
- Кузелин М. О., Кнышев Д. А., Зотов В. Ю. Современные семейства ПЛИС фирмы Xilinx / Справочное пособие. М.: Горячая линия Телеком, 2004.
- Зотов В. Инструментальный модуль компании Avnet для отладки проектов встраиваемых систем, разрабатываемых на базе нового семейства ПЛИС FPGA фирмы Xilinx Virtex-5 FXT // Компоненты и технологии. 2008. № 9.
- Зотов В. Ю. Проектирование цифровых устройств на основе ПЛИС фирмы Xilinx в САПР WebPack ISE. М.: Горячая линия Телеком, 2003.
- Зотов В. Ю. Проектирование встраиваемых микропроцессорных систем на основе ПЛИС фирмы Xilinx. М.: Горячая линия Телеком, 2006.
- Virtex-5 FPGA XtremeDSP Design Considerations. User Guide.