Подписка на новости

Опрос

Нужны ли комментарии к статьям? Комментировали бы вы?

Реклама

 

2010 №7

Разработка VHDL-описаний цифровых устройств, проектируемых на основе ПЛИС фирмы Xilinx, с использованием шаблонов САПР ISE Design Suite. Часть 6

Зотов Валерий


В шестой части статьи представлены шаблоны описаний элементов оперативной памяти с различной организацией выборки данных, реализуемых на базе ресурсов блочной памяти Block RAM кристаллов программируемой логики с архитектурой FPGA [1] семейств Virtex-6 LXT, Virtex-6 CXT, Virtex-6 SXT и Virtex-6 HXT [11, 13]. Кроме того, здесь же приводится информация о шаблонах описания компонентов, выполненных на основе библиотечных примитивов, которые предназначены для реализации на базе соответствующих аппаратных ресурсов ПЛИС семейств CPLD.

Все статьи цикла:

Dual Clock FIFO (FIFO_DUALCLOCK_ MACRO) включает в себя образец варианта применения библиотечного макроса FIFO_ DUALCLOCK_MACRO для подготовки описания экземпляра запоминающего устройства, работающего по принципу «первым вошел — первым вышел» (first-in first-out, FIFO), с раздельными сигналами синхронизации портов записи и чтения данных, предназначенного для реализации на основе блочной памяти Block RAM ПЛИС серии Virtex-6:

--FIFO_DUALCLOCK_MACRO : In order to incorporate this function into the design,

-- VHDL : the following instance declaration needs to be placed -- instance : in the architecture body of the design code. The

-- declaration : (FIFO_DUALCLOCK_MACRO_inst) and/or the port declarations

-- code : after the "=>" assignment maybe changed to properly

-- : reference and connect this function to the design.

-- : All inputs and outputs must be connected.

-- Library : In addition to adding the instance declaration, a use

-- declaration : statement for the UNISIM.vcomponents library needs to be

-- for : added before the entity declaration. This library

-- Xilinx : contains the component declarations for all Xilinx

-- primitives : primitives and points to the models that will be used

-- : for simulation.

-- Copy the following four statements and paste them before the

-- Entity declaration, unless they already exist.

Library UNISIM;

use UNISIM.vcomponents.all;

Library UNIMACRO;

use UNIMACRO.vcomponents.all;

-- <-----Cut code below this line and paste into the architecture

body---- >

-- FIFO_DUALCLOCK_MACRO: Dual-Clock First-In, First-Out (FIFO) RAM Buffer

-- Virtex-6

-- Xilinx HDL Language Template, version 11.4

FIFO_DUALCLOCK_MACRO_inst : FIFO_DUALCLOCK_ MACRO

generic map (

DEVICE => "VIRTEX6", -- Target Device: "VIRTEX5", "VIRTEX6"

ALMOST_FULL_OFFSET => X"0080", -- Sets almost full

threshold

ALMOST_EMPTY_OFFSET => X"0080", -- Sets the almost empty threshold

DATA_WIDTH => 0, -- Valid values are 1-72 (37-72 only valid when FIFO_SIZE="36Kb")

FIFO_SIZE => "18Kb", -- Target BRAM, "18Kb" or "36Kb"

FIRST_WORD_FALL_THROUGH => FALSE, -- Sets the FIFO FWFT to TRUE or FALSE

SIM_MODE => "SAFE") -- Simulation "SAFE" vs "FAST", -- see "Synthesis and Simulation Design Guide" for

details port map (

ALMOSTEMPTY => ALMOSTEMPTY, -- Output almost

empty

ALMOSTFULL => ALMOSTFULL, -- Output almost full

DO => DO, -- Output data

EMPTY => EMPTY, -- Output empty

FULL => FULL, -- Output full

RDCOUNT => RDCOUNT, -- Output read count

RDERR => RDERR, -- Output read error

WRCOUNT => WRCOUNT, -- Output write count

WRERR => WRERR, -- Output write error

DI => DI, -- Input data

RDCLK => RDCLK, -- Input read clock

RDEN => RDEN, -- Input read enable

RST => RST, -- Input reset

WRCLK => WRCLK, -- Input write clock

WREN => WREN -- Input write enable

);

-- End of FIFO_DUALCLOCK_MACRO_inst instantiation

Информация о назначении параметров настройки и системе условных обозначений входов и выходов макроса FIFO_DUALCLOCK_ MACRO, а также о процессе подготовки законченных описаний элементов FIFO-памяти с различными сигналами синхронизации портов записи и чтения данных была представлена при рассмотрении шаблона Dual Clock FIFO (FIFO_DUALCLOCK_MACRO), расположенного в папке Virtex-5 (КиТ. 2010. № 5).

Simple Dual Port RAM (BRAM_SDP_MACRO) представляет собой вариант конструкции описания элемента двухпортового ОЗУ с фиксированной функцией портов записи и чтения данных, который предназначен для последующей реализации на базе модулей блочной памяти Block RAM кристаллов программируемой логики семейств Virtex-6 LXT, Virtex-6 CXT, Virtex-6 SXT и Virtex-6 HXT:

--BRAM_SDP_MACRO : In order to incorporate this function into the design,

-- VHDL : the following instance declaration needs to be placed

-- instance : in the architecture body of the design code. The

-- declaration : (BRAM_SDP_MACRO_inst) and/or the port declarations

-- code : after the "=>" assignment maybe changed to properly

-- : reference and connect this function to the design.

-- : All inputs and outputs must be connected.

-- Library : In addition to adding the instance declaration, a use

-- declaration : statement for the UNISIM.vcomponents library needs to be

-- for : added before the entity declaration. This library

-- Xilinx : contains the component declarations for all Xilinx

-- primitives : primitives and points to the models that will be used

-- : for simulation.

-- Copy the following four statements and paste them before the

-- Entity declaration, unless they already exist.

Library UNISIM;

use UNISIM.vcomponents.all;

Library UNIMACRO;

use UNIMACRO.vcomponents.all;

-- <-----Cut code below this line and paste into the architecture

body---- >

-- BRAM_SDP_MACRO: Simple Dual Port RAM -- Virtex-6

-- Xilinx HDL Language Template, version 11.4

BRAM_SDP_MACRO_inst : BRAM_SDP_MACRO generic map (

BRAM_SIZE => "18Kb", -- Target BRAM, "18Kb" or

"36Kb"

DEVICE => "VIRTEX6" -- Target device: "VIRTEX5", "VIRTEX6", "SPARTAN6"

WRITE_WIDTH => 0, -- Valid values are 1-72 (37-72 only valid when BRAM_SIZE="36Kb")

READ_WIDTH => 0, -- Valid values are 1-72 (37-72 only valid when BRAM_SIZE="36Kb")

DO_REG => 0, -- Optional output register (0 or 1) INIT_FILE => "NONE",

SIM_COLLISION_CHECK => "ALL", -- Collision check enable "ALL", "WARNING_ONLY",

-- "GENERATE_X_ONLY" or "NONE" SIM_MODE => "SAFE", -- Simulation: "SAFE" vs

"FAST",

-- see "Synthesis and Simulation Design Guide" for

details

SRVAL => X"000000000000000000", -- Set/Reset value for port output

INIT => X"000000000000000000", -- Initial values on

output port

-- The following INIT_xx declarations specify the initial contents of the RAM

INIT_00 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_01 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_02 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_03 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_04 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_05 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_06 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_07 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_3 C => X"000000000000000000000000000000000000000000 0000000000000000",

INIT_3D => X"000000000000000000000000000000000000000000 00000000000000000",

INIT_3E => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_3F => X"0000000000000000000000000000000000000000000 0000000000000000",

-- The next set of INIT_xx are valid when configured as 36Kb

INIT_40 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_41 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_42 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_43 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_44 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_45 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_46 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_47 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_7D => X"000000000000000000000000000000000000000000 00000000000000000",

INIT_7E => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_7F => X"0000000000000000000000000000000000000000000 0000000000000000",

-- The next set of INITP_xx are for the parity bits

INITP_00 => X"000000000000000000000000000000000000000000 0000000000000000",

INITP_01 => X"000000000000000000000000000000000000000000 0000000000000000",

INITP_02 => X"000000000000000000000000000000000000000000 0000000000000000",

INITP_03 => X"000000000000000000000000000000000000000000 0000000000000000",

INITP_04 => X"000000000000000000000000000000000000000000 0000000000000000",

INITP_05 => X"000000000000000000000000000000000000000000 0000000000000000",

INITP_06 => X"000000000000000000000000000000000000000000 0000000000000000",

INITP_07 => X"000000000000000000000000000000000000000000 0000000000000000",

-- The next set of INIT_xx are valid when configured as 36Kb

INITP_08 => X"000000000000000000000000000000000000000000 0000000000000000",

INITP_09 => X"000000000000000000000000000000000000000000 0000000000000000",

INITP_0A => X"00000000000000000000000000000000000000000 00000000000000000",

INITP_0B => X"00000000000000000000000000000000000000000 00000000000000000",

INITP_0C => X"00000000000000000000000000000000000000000 00000000000000000",

INITP_0D => X"00000000000000000000000000000000000000000 00000000000000000",

INITP_0E => X"00000000000000000000000000000000000000000 00000000000000000",

INITP_0F => X"000000000000000000000000000000000000000000 00000000000000000"

)

port map (

DO => DO, -- Output read data port

DI => DI, -- Input write data port

RDADDR => RDADDR, -- Input read address

RDCLK => RDCLK, -- Input read clock

RDEN => RDEN, -- Input read port enable

REGCE => REGCE, -- Input read output register

enable

RST => RST, -- Input reset

WE => WE, -- Input write enable

WRADDR => WRADDR, -- Input write address

WRCLK => WRCLK, -- Input write clock

WREN => WREN -- Input write port enable

);

-- End of BRAM_SDP_MACRO_inst instantiation

В представленном шаблоне используются те же настраиваемые параметры и та же система условных обозначений интерфейсных портов, что и в варианте применения библиотечного макроса BRAM_SDP_MACRO для подготовки описаний элементов двухпортовой оперативной памяти с фиксированной функцией портов, предназначенных для использования в составе проектируемых устройств, выполняемых на основе в ПЛИС серии Spartan-6 (КиТ. 2010. № 4). В отличие от шаблона Simple Dual Port RAM (BRAM_ SDP_MACRO), применяемого для создания описаний элементов двухпортовых ОЗУ, реализуемых на базе модулей блочной памяти Block RAM кристаллов программируемой логики семейств Spartan-6 LX и Spartan-6 LXT, в варианте, предназначенном для ПЛИС серии Virtex-6, присутствуют дополнительные параметры настройки макроса BRAM_SDP_MACRO — INIT_40-INIT_7F и INITP_08-INITP_0F. Указанные параметры необходимы для определения содержимого соответствующих ячеек элементов оперативной памяти с информационной емкостью 36 кбит после завершения процесса конфигурирования кристалла. Кроме того, в этом варианте для ряда настраиваемых параметров по умолчанию установлены значения, соответствующие особенностям архитектуры кристаллов программируемой логики семейств Virtex-6 LXT, Virtex-6 CXT, Virtex-6 SXT и Virtex-6 HXT, а также двукратно увеличен диапазон выбора значений разрядности представления входных и выходных данных.

Single Port RAM (BRAM_SINGLE_MACRO) содержит вариант использования библиотечного макроса BRAM_SINGLE_MACRO для формирования описаний элементов однопо-ртовых ОЗУ, реализуемых на основе ресурсов блочной памяти ПЛИС Block RAM в составе проектов, разрабатываемых на базе кристаллов программируемой логики серии Virtex-6:

--BRAM_SINGLE_MACRO : In order to incorporate this function into the design,

-- VHDL : the following instance declaration needs to be placed

-- instance : in the architecture body of the design code. The

-- declaration : (BRAM_SINGLE_MACRO_inst) and/or the port declarations

-- code : after the "=>" assignment maybe changed to properly

-- : reference and connect this function to the design.

-- : All inputs and outputs must be connected.

-- Library : In addition to adding the instance declaration, a use

-- declaration : statement for the UNISIM.vcomponents library needs to be

-- for : added before the entity declaration. This library

-- Xilinx : contains the component declarations for all Xilinx

-- primitives : primitives and points to the models that will be used

-- : for simulation.

-- Copy the following four statements and paste them before the

-- Entity declaration, unless they already exist.

Library UNISIM;

use UNISIM.vcomponents.all;

Library UNIMACRO;

use UNIMACRO.vcomponents.all;

-- <-----Cut code below this line and paste into the architecture

body---- >

-- BRAM_SINGLE_MACRO: Single Port RAM -- Virtex-6

-- Xilinx HDL Language Template, version 11.4

BRAM_SINGLE_MACRO_inst : BRAM_SINGLE_MACRO generic map (

BRAM_SIZE => "18Kb", -- Target BRAM, "18Kb" or

"36Kb"

DEVICE => "VIRTEX6", -- Target Device: "VIRTEX5", "VIRTEX6", "SPARTAN6"

DO_REG => 0, -- Optional output register (0 or 1) INIT_A => X"000000000", -- Initial values on output

port

INIT_FILE => "NONE",

WRITE_WIDTH => 0, -- Valid values are 1-72 (37-72 only valid when BRAM_SIZE="36Kb")

READ_WIDTH => 0, -- Valid values are 1-72 (37-72 only valid when BRAM_SIZE="36Kb")

SIM_MODE => "SAFE", -- Simulation: "SAFE" vs

"FAST",

-- see "Synthesis and Simulation Design Guide" for

details

SRVAL => X"000000000", -- Set/Reset value for port

output

WRITE_MODE => "WRITE_FIRST", -- "WRITE_ FIRST", "READ_FIRST" or "NO_CHANGE"

-- The following INIT_xx declarations specify the initial contents of the RAM

INIT_00 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_01 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_02 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_03 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_04 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_05 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_06 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_07 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_3C => X"000000000000000000000000000000000000000000 00000000000000000",

INIT_3D => X"000000000000000000000000000000000000000000 00000000000000000",

INIT_3E => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_3F=> X"0000000000000000000000000000000000000000000 0000000000000000",

-- The next set of INIT_xx are valid when configured as 36Kb

INIT_40 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_41 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_42 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_43 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_44 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_45 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_46 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_47 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_7C => X"000000000000000000000000000000000000000000 00000000000000000",

INIT_7D => X"000000000000000000000000000000000000000000 00000000000000000",

INIT_7E => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_7F => X"0000000000000000000000000000000000000000000 0000000000000000",

-- The next set of INITP_xx are for the parity bits

INITP_00 => X"000000000000000000000000000000000000000000 00000000000000000",

INITP_01 => X"000000000000000000000000000000000000000000 00000000000000000",

INITP_02 => X"000000000000000000000000000000000000000000 00000000000000000",

INITP_03 => X"000000000000000000000000000000000000000000 00000000000000000",

INITP_04 => X"000000000000000000000000000000000000000000 00000000000000000",

INITP_05 => X"000000000000000000000000000000000000000000 00000000000000000",

INITP_06 => X"000000000000000000000000000000000000000000 00000000000000000",

INITP_07 => X"000000000000000000000000000000000000000000 00000000000000000",

-- The next set of INIT_xx are valid when configured as 36Kb

INITP_08 => X"000000000000000000000000000000000000000000 00000000000000000",

INITP_09 => X"000000000000000000000000000000000000000000 00000000000000000",

INITP_0A => X"00000000000000000000000000000000000000000 000000000000000000",

INITP_0B => X"00000000000000000000000000000000000000000 000000000000000000",

INITP_0C => X"00000000000000000000000000000000000000000 000000000000000000",

INITP_0D => X"00000000000000000000000000000000000000000 000000000000000000",

INITP_0E => X"00000000000000000000000000000000000000000 000000000000000000",

INITP_0F => X"000000000000000000000000000000000000000000 00000000000000000" )

port map (

DO => DO, -- Output data

ADDR => ADDR, -- Input address

CLK => CLK, -- Input clock

DI => DI, -- Input data port

EN => EN, -- Input RAM enable

REGCE => REGCE, -- Input output register enable

RST => RST, -- Input reset

WE => WE -- Input write enable );

-- End of BRAM_SINGLE_MACRO_inst instantiation

Система условных обозначений интерфейсных портов и параметров настройки макроса BRAM_SDP_MACRO была подробно рассмотрена при описании одноименного шаблона, предназначенного для подготовки описаний элементов однопортовых ОЗУ, реализуемых на базе модулей блочной памяти Block RAM кристаллов программируемой логики семейств Spartan-6 LX и Spartan-6 LXT. Шаблон Single Port RAM (BRAM_SINGLE_MACRO), расположенный в разделе Virtex-6, имеет те же отличия от аналогичного шаблона, представленного в разделе Spartan-6, что и шаблон Simple Dual Port RAM (BRAM_SDP_MACRO), рассмотренный выше.

Synchronous FIFO (FIFO_SYNC_MACRO) предоставляет вариант конструкции, выполненной на базе библиотечного макроса FIFO_ SYNC_MACRO, который предназначен для создания описаний элементов синхронных запоминающих устройств, функционирующих по принципу «первым вошел — первым вышел», реализуемых на основе модулей блочной памяти Block RAM кристаллов программируемой логики семейств Virtex-6 LXT, Virtex-6 CXT, Virtex-6 SXT и Virtex-6 HXT:

--FIFO_SYNC_MACRO : In order to incorporate this function into the design,

-- VHDL : the following instance declaration needs to be placed

-- instance : in the architecture body of the design code. The

-- declaration : (FIFO_SYNC_MACRO_inst) and/or the port declarations

-- code : after the "=>" assignment maybe changed to properly

-- : reference and connect this function to the design

. -- : All inputs and outputs must be connected.

-- Library : In addition to adding the instance declaration, a use

-- declaration : statement for the UNISIM.vcomponents library needs to be

-- for : added before the entity declaration. This library

-- Xilinx : contains the component declarations for all Xilinx

-- primitives : primitives and points to the models that will be used

-- : for simulation.

-- Copy the following four statements and paste them before the

-- Entity declaration, unless they already exist.

Library UNISIM;

use UNISIM.vcomponents.all;

Library UNIMACRO;

use UNIMACRO.vcomponents.all;

-- <-----Cut code below this line and paste into the architecture

body---- >

-- FIFO_SYNC_MACRO: Synchronous First-In, First-Out (FIFO) RAM Buffer -- Virtex-6

-- Xilinx HDL Language Template, version 11.4

FIFO_SYNC_MACRO_inst : FIFO_SYNC_MACRO generic map (

DEVICE => "VIRTEX6", -- Target Device: "VIRTEX5,

"VIRTEX6"

ALMOST_FULL_OFFSET => X"0080", -- Sets almost full threshold

ALMOST_EMPTY_OFFSET => X"0080", -- Sets the almost empty threshold

DATA_WIDTH => 0, -- Valid values are 1-72 (37-72 only valid when FIFO_SIZE="36Kb")

FIFO_SIZE => "18Kb, -- Target BRAM, "18Kb" or "36Kb" SIM_MODE => "SAFE") -- Simulation) "SAFE" vs

"FAST",

-- see "Synthesis and Simulation Design Guide"

for details port map (

ALMOSTEMPTY => ALMOSTEMPTY, -- Output almost

empty

ALMOSTFULL => ALMOSTFULL, -- Output almost full

DO => DO, -- Output data

EMPTY => EMPTY, -- Output empty

FULL => FULL, -- Output full

RDCOUNT => RDCOUNT, -- Output read count

RDERR => RDERR, -- Output read error

WRCOUNT => WRCOUNT, -- Output write count

WRERR => WRERR, -- Output write error

CLK => CLK, -- Input clock

DI => DI, -- Input data

RDEN => RDEN, -- Input read enable

RST => RST, -- Input reset

WREN => WREN -- Input write enable );

-- End of FIFO_SYNC_MACRO_inst instantiation

Элементы FIFO-памяти, описания которых формируются с помощью представленного шаблона, имеют ту же структуру, что и синхронные запоминающие устройства, функционирующие по принципу «первым вошел - первым вышел», с общим сигналом синхронизации портов записи и чтения данных, создаваемые с помощью макроса FIFO_ SYNC_MACRO для последующей реализации на основе блочной памяти Block RAM ПЛИС серии Virtex-5 (Рис. 28. КиТ. 2010. № 6).

True Dual Port RAM (BRAM_TDP_MACRO) включает в себя образец варианта использования библиотечного макроса BRAM_ TDP_MACRO для подготовки описания экземпляра полнофункционального двухпортового ОЗУ, предназначенного для реализации на основе модулей блочной памяти Block RAM ПЛИС семейств Virtex-6 LXT, Virtex-6 CXT, Virtex-6 SXT и Virtex-6 HXT:

--BRAM_TDP_MACRO : In order to incorporate this function into the design,

-- VHDL : the following instance declaration needs to be placed

-- instance : in the architecture body of the design code. The

-- declaration : (BRAM_TDP_MACRO_inst) and/or the port declarations

-- code : after the "=>" assignment maybe changed to properly

-- : reference and connect this function to the design.

-- : All inputs and outputs must be connected.

-- Library : In addition to adding the instance declaration, a use

-- declaration : statement for the UNISIM.vcomponents library needs to be

-- for : added before the entity declaration. This library

-- Xilinx : contains the component declarations for all Xilinx

-- primitives : primitives and points to the models that will be used

-- : for simulation.

-- Copy the following four statements and paste them before the

-- Entity declaration, unless they already exist.

Library UNISIM;

use UNISIM.vcomponents.all;

Library UNIMACRO;

use UNIMACRO.vcomponents.all;

-- <-----Cut code below this line and paste into the architecture

body---- >

-- BRAM_TDP_MACRO: True Dual Port RAM -- Virtex-6

-- Xilinx HDL Language Template, version 11.4

BRAM_TDP_MACRO_inst : BRAM_TDP_MACRO generic map (

BRAM_SIZE => "18Kb", -- Target BRAM, "18Kb" or

"36Kb"

DEVICE => "VIRTEX6", -- Target Device: "VIRTEX5", "VIRTEX6", "SPARTAN6"

DOA_REG => 0, -- Optional port A output register (0 or 1) DOB_REG => 0,

-- Optional port B output register (0 or 1) INIT_A => X"000000000",

-- Initial values on A output

port

INIT_B => X"000000000", -- Initial values on B output

port

INIT_FILE => "NONE",

READ_WIDTH_A => 0, -- Valid values are 1-36 (19-36 only valid when BRAM_SIZE="36Kb")

READ_WIDTH_B => 0, -- Valid values are 1-36 (19-36 only valid when BRAM_SIZE="36Kb")

SIM_COLLISION_CHECK => "ALL",

-- Collision check enable "ALL", "WARNING_ONLY",

-- "GENERATE_X_ONLY" or "NONE" SIM_MODE => "SAFE", -- Simulation:

"SAFE" vs "FAST", -- see "Synthesis and Simulation Design

Guide" for details

SRVAL_A => X"000000000", -- Set/Reset value for A

port output

SRVAL_B => X"000000000", -- Set/Reset value for B port

output

WRITE_MODE_A => "WRITE_FIRST",

-- "WRITE_ FIRST", "READ_FIRST" or "NO_CHANGE"

WRITE_MODE_B => "WRITE_FIRST",

-- "WRITE_ FIRST", "READ_FIRST" or "NO_CHANGE"

WRITE_WIDTH_A => 0,

-- Valid values are 1, 2, 4, 9, 18 or 36 (36 only valid when BRAM_SIZE="36Kb")

WRITE_WIDTH_B => 0,

-- Valid values are 1, 2, 4, 9, 18 or 36 (36 only valid when BRAM_SIZE="36Kb")

-- The following INIT_xx declarations specify the initial contents of the RAM

INIT_00 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_01 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_02 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_03 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_04 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_05 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_06 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_07 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_3C => X"000000000000000000000000000000000000000000 00000000000000000",

INIT_3D => X"000000000000000000000000000000000000000000 00000000000000000",

INIT_3E => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_3F=> X"0000000000000000000000000000000000000000000 0000000000000000",

-- The next set of INIT_xx are valid when configured as 36Kb

INIT_40 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_41 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_42 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_43 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_44 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_45 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_46 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_47 => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_7C => X"0000000000000000000000000000000000000000000 000000000000000000",

INIT_7D => X"000000000000000000000000000000000000000000 00000000000000000",

INIT_7E => X"0000000000000000000000000000000000000000000 0000000000000000",

INIT_7F => X"0000000000000000000000000000000000000000000 0000000000000000",

-- The next set of INITP_xx are for the parity bits

INITP_00 => X"000000000000000000000000000000000000000000 0000000000000000",

INITP_01 => X"000000000000000000000000000000000000000000 0000000000000000",

INITP_02 => X"000000000000000000000000000000000000000000 0000000000000000",

INITP_03 => X"000000000000000000000000000000000000000000 0000000000000000",

INITP_04 => X"000000000000000000000000000000000000000000 0000000000000000",

INITP_05 => X"000000000000000000000000000000000000000000 0000000000000000",

INITP_06 => X"000000000000000000000000000000000000000000 0000000000000000",

INITP_07 => X"000000000000000000000000000000000000000000 0000000000000000",

-- The next set of INIT_xx are valid when configured as 36Kb

INITP_08 => X"000000000000000000000000000000000000000000 0000000000000000",

INITP_09 => X"000000000000000000000000000000000000000000 0000000000000000",

INITP_0A => X"00000000000000000000000000000000000000000 00000000000000000",

INITP_0B => X"00000000000000000000000000000000000000000 00000000000000000",

INITP_0C => X"00000000000000000000000000000000000000000 00000000000000000",

INITP_0D => X"00000000000000000000000000000000000000000 00000000000000000",

INITP_0E => X"00000000000000000000000000000000000000000 00000000000000000",

INITP_0F => X"000000000000000000000000000000000000000000 0000000000000000") port map (

DOA => DOA, -- Output port-A data

DOB => DOB, -- Output port-B data

ADDRA => ADDRA, -- Input port-A address

ADDRB => ADDRB, -- Input port-B address

CLKA => CLKA, -- Input port-A clock

CLKB => CLKB, -- Input port-B clock

DIA => DIA, -- Input port-A data

DIB => DIB, -- Input port-B data

ENA => ENA, -- Input port-A enable

ENB => ENB, -- Input port-B enable

REGCEA => REGCEA, -- Input port-A output register

enable

REGCEB => REGCEB, -- Input port-B output register

enable

RSTA => RSTA, -- Input port-A reset

RSTB => RSTB, -- Input port-B reset

WEA => WEA, -- Input port-A write enable

WEB => WEB -- Input port-B write enable );

-- End of BRAM_TDP_MACRO_inst instantiation

В представленной конструкции применяется та же совокупность настраиваемых параметров, что и в шаблоне True Dual Port RAM (BRAM_TDP_MACRO), который предназначен для подготовки описаний элементов полнофункциональной двухпортовой оперативной памяти, реализуемых на базе модулей Block RAM кристаллов программируемой логики семейств Spartan-6 LX и Spartan-6 LXT (КиТ. 2010. № 4). Кроме того, в приведенной конструкции предусмотрены дополнительные параметры инициализации содержимого ячеек формируемых ОЗУ с информационной емкостью 36 кбит. При этом верхняя граница диапазона, в котором можно выбрать разрядность входных и выходных шин данных в создаваемых элементах двухпортовой оперативной памяти, увеличена до 72 бит.

Шаблоны описаний компонентов, реализуемых непосредственно на основе соответствующих аппаратных ресурсов кристаллов программируемой логики фирмы Xilinx

Образцы описаний компонентов, представляющих непосредственно соответствующие аппаратные ресурсы кристаллов программируемой логики фирмы Xilinx, сосредоточены в папке Device Primitive Instantiation, структура которой показана на рис. 38. Эта папка включает в себя несколько разделов, названия которых соответствуют определенным семействам ПЛИС. Исключением является раздел CPLD, который объединяет в себе примеры описаний элементов, реализуемых непосредственно на основе соответствующих аппаратных ресурсов кристаллов программируемой логики семейств XC9500, XC9500XL, XC9500XV, CoolRunner XPLA3 и CoolRunner-II [1]. Все шаблоны, расположенные в папке Device Primitive Instantiation, выполнены на основе библиотечных примитивов, предоставляемых фирмой Xilinx.

Структура папки Device Primitive Instantiation шаблонов языка VHDL

Рис. 38. Структура папки Device Primitive Instantiation шаблонов языка VHDL

Шаблоны описаний экземпляров компонентов, выполненных на основе библиотечных примитивов, предназначенных для непосредственной реализации на базе соответствующих аппаратных ресурсов ПЛИС семейств CPLD

Эти шаблоны расположены в одноименном разделе. В состав этого раздела входят три подраздела: Clock Components, I/O Components и Registers & Latches (рис. 38). В подразделе Clock Components представле ны образцы VHDL-описаний компонентов, предназначенных для использования в составе блоков формирования сигналов синхронизации разрабатываемых устройств. Подробная структура данного подраздела показана на рис. 39.

Структура подраздела Clock Components папки CPLD шаблонов языка VHDL

Рис. 39. Структура подраздела Clock Components папки CPLD шаблонов языка VHDL

Подраздел Clock Components, в свою очередь, включает в себя два каталога — CR-II Clock Divider и Clock Buffers. В каталоге CR-II Clock Divider расположены шаблоны описаний делителей частоты тактового сигнала с заданным коэффициентом деления, реализуемых на базе соответствующего аппаратного модуля кристаллов программируемой логики семейства CoolRunner-II. Каталог Clock Buffers содержит образец описания глобального буферного элемента.

В состав архитектуры ПЛИС семейства CoolRunner-II, содержащих 128 и более макроячеек, кроме совокупности функциональных блоков и блоков ввода/вывода входит встроенный делитель частоты тактового сигнала. Этот модуль, выполняющий деление частоты входного сигнала синхронизации на 2, 4, 6, 8, 10, 12, 14 и 16, сопряжен с одним из трех контактов кристалла, которые предназначены для подключения глобальных тактовых сигналов, а именно — с выводом GCK2. Встроенный делитель позволяет получить внутренний тактовый сигнал с требуемым значением частоты, не используя основных логических ресурсов кристалла (макроячеек). С выхода делителя этот сигнал синхронизации с выбранным значением частоты через глобальные цепи распределяется по всем функциональным блокам кристалла. Глобальные цепи ПЛИС семейства CoolRunner-II обеспечивают распространение тактовых сигналов внутри кристаллов без временных перекосов.

При конфигурировании встроенного делителя частоты, кроме требуемого коэффициента деления, можно задать дополнительные параметры. В частности, в формируемом делителе частоты может быть задействован вход синхронного сброса с активным высоким логическим уровнем сигнала. Сигнал сброса может подаваться через специально выделенный контакт кристалла CDRST. При переключении сигнала на входе сброса в состояние высокого логического уровня выход делителя частоты блокируется после завершения текущего цикла. При подаче питания ПЛИС выход устанавливается в состояние низкого логического уровня.

В составе встроенного делителя частоты может использоваться также схема генерации начальной задержки, которая позволяет после выполнения процедуры сброса или включения питания кристалла внести дополнительный временной сдвиг на выходе, длительность которого равна одному полному периоду формируемого тактового сигнала. На рис. 40 показаны временные диаграммы, поясняющие процесс получения внутренних тактовых сигналов без задержки и с начальным временным сдвигом путем деления частоты входного сигнала синхронизации на 2 и 16.

Временные диаграммы тактовых сигналов, формируемых встроенным делителем частоты в кристаллах семейства CoolRunner-II

Рис. 40. Временные диаграммы тактовых сигналов, формируемых встроенным делителем частоты в кристаллах семейства CoolRunner-II

Для каждого возможного варианта конфигурации встроенного делителя частоты тактового сигнала предусмотрен соответствующий шаблон VHDL-описания. Все шаблоны описаний встроенного делителя частоты сгруппированы в папки Divide by 2, Divide by 4, Divide by 6, Divide by 8, Divide by 10, Divide by 12, Divide by 14, Divide by 16 в соответствии со значением коэффициента деления (рис. 39).

Divider/w reset (CLK_DIV2R, CLK_DIV4R, CLK_DIV6R, CLK_DIV8R, CLK_DIV10R, CLK_DIV12R, CLK_DIV14R, CLK_DIV16R) представляют собой образцы описаний встроенного делителя частоты тактового сигнала в кристаллах программируемой логики семейства CoolRunner-II с соответствующим коэффициентом деления и синхронным сбросом, формирующего выходной сигнал без начальной задержки. Все перечисленные шаблоны имеют одинаковую структуру, основу которой образует одноименный библиотечный примитив CLK_DIVnR (где n определяет заданное значение коэффициента деления частоты входного сигнала). В качестве примера приведен текст шаблона, предназначенного для подготовки описания делителя частоты на 10 со входом синхронного сброса:

-- CLK_DIV10R : In order to incorporate this function into the design,

-- VHDL : the following instance declaration needs to be placed

-- instance : in the architecture body of the design code. The

-- declaration : instance name (CLK_DIV10R_inst) and/or the port declarations

-- code : after the "=>" assignment maybe changed to properly

-- : reference and connect this function to the design.

-- : All inputs and outputs must be connected.

-- Library : In addition to adding the instance declaration, a use

-- declaration : statement for the UNISIM.vcomponents library needs to be

-- for : added before the entity declaration. This library

-- Xilinx : contains the component declarations for all Xilinx

-- primitives : primitives and points to the models that will be used

-- : for simulation.

-- Copy the following two statements and paste them before the

-- Entity declaration, unless they already exist.

Library UNISIM;

use UNISIM.vcomponents.all;

-- <-----Cut code below this line and paste into the architecture

body---- >

-- CLK_DIV10R: Clock Divide by 10 with synchronous reset

-- CoolRunner-II

-- Xilinx HDL Language Template, version 11.4

CLK_DIV10R_inst : CLK_DIV10R port map (

CLKDV => CLKDV, -- Divided clock output

CDRST => CDRST, -- Synchronous reset input

CLKIN => CLKIN -- Clock input );

-- End of CLK_DIV10R_inst instantiation

В описании интерфейса библиотечных примитивов CLK_DIV2R, CLK_DIV4R, CLK_DIV6R, CLK_DIV8R, CLK_DIV10R, CLK_DIV12R, CLK_DIV14R, CLK_DIV16R используется следующая система условных обозначений входных и выходных портов:

  • CLKDV — выход сформированного сигнала синхронизации, полученного в результате деления частоты исходного тактового сигнала на заданное число;
  • CDRST — вход сигнала синхронного сброса;
  • CLKIN — вход исходного тактового сигнала.

Условный графический образ встроенного делителя частоты тактового сигнала с заданным коэффициентом деления и входом синхронного сброса, формирующего выходной сигнал без начальной задержки, описание которого создается с помощью шаблонов Divider/w reset (CLK_DIV2R, CLK_DIV4R, CLK_DIV6R, CLK_DIV8R, CLK_DIV10R, CLK_DIV12R, CLK_DIV14R, CLK_DIV16R), изображен на рис. 41.

Условный графический образ встроенного делителя частоты тактового сигнала с заданным коэффициентом деления и входом синхронного сброса

Рис. 41. Условный графический образ встроенного делителя частоты тактового сигнала с заданным коэффициентом деления и входом синхронного сброса

Divider/w reset and delay (CLK_DIV2RSD, CLK_DIV4RSD, CLK_DIV6RSD, CLK_ DIV8RSD, CLK_DIV10RSD, CLK_DIV12RSD, CLK_DIV14RSD, CLK_DIV16RSD) содержат шаблоны VHDL-описаний встроенного делителя частоты сигнала синхронизации с требуемым коэффициентом деления, синхронным сбросом и начальной задержкой выходного сигнала. Данные варианты описаний встроенного делителя построены на основе соответствующего библиотечного примитива CLK_DIVnRSD. Содержание указанных шаблонов показано на примере двенадцатикратного делителя частоты тактового сигнала с синхронным сбросом и начальной задержкой формируемого сигнала:

-- CLK_DIV12RSD : In order to incorporate this function into the design,

-- VHDL : the following instance declaration needs to be placed

-- instance : in the architecture body of the design code. The

-- declaration : instance name (CLK_DIV12RSD_inst) and/or the port declarations

-- code : after the "=>" assignment maybe changed to properly

-- : reference and connect this function to the design.

-- : All inputs and outputs must be connected.

-- Library : In addition to adding the instance declaration, a use

-- declaration : statement for the UNISIM.vcomponents library needs to be

-- for : added before the entity declaration. This library

-- Xilinx : contains the component declarations for all Xilinx

-- primitives : primitives and points to the models that will be used

-- : for simulation.

-- Copy the following two statements and paste them before the

-- Entity declaration, unless they already exist.

Library UNISIM;

use UNISIM.vcomponents.all;

-- <-----Cut code below this line and paste into the architecture

body---- >

-- CLK_DIV12RSD: Clock Divide by 12 with synchronous reset and start delay

-- CoolRunner-II

-- Xilinx HDL Language Template, version 11.4

CLK_DIV12RSD_inst : CLK_DIV12RSD

generic map (

DIVIDER_DELAY => 1

)

port map (

CLKDV => CLKDV, -- Divided clock output CDRST => CDRST, -- Synchronous reset input CLKIN => CLKIN -- Clock input );

-- End of CLK_DIV12RSD_inst instantiation

В шаблонах Divider/w reset and delay (CLK_ DIV2RSD, CLK_DIV4RSD, CLK_DIV6RSD, CLK_DIV8RSD, CLK_DIV10RSD, CLK_ DIV12RSD, CLK_DIV14RSD, CLK_DIV16RSD) используется единственный настраиваемый параметр DIVIDER_DELAY. Значение этого параметра определяет величину начальной задержки формирования выходного сигнала, которая выражена в количестве периодов тактового сигнала.

Система условных обозначений интерфейсных портов библиотечных примитивов CLK_DIV2RSD, CLK_DIV4RSD, CLK_ DIV6RSD, CLK_DIV8RSD, CLK_DIV10RSD, CLK_DIV12RSD, CLK_DIV14RSD, CLK_ DIV16RSD включает в себя те же идентификаторы, что и в примитивах CLK_DIV2R, CLK_DIV4R, CLK_DIV6R, CLK_DIV8R, CLK_DIV10R, CLK_DIV12R, CLK_DIV14R, CLK_DIV16R.

Условный графический образ встроенного делителя частоты тактового сигнала с выбранным коэффициентом деления и входом синхронного сброса, формирующего выходной сигнал с начальной задержкой, описание которого подготавливается на основе шаблонов Divider/w reset and delay (CLK_DIV2RSD, CLK_DIV4RSD, CLK_DIV6RSD, CLK_ DIV8RSD, CLK_DIV10RSD, CLK_DIV12RSD, CLK_DIV14RSD, CLK_DIV16RSD), отличается от представленного на рис. 41 только заголовком.

Divider/w start delay (CLK_DIV2SD, CLK_ DIV4SD, CLK_DIV6SD, CLK_DIV8SD, CLK_ DIV10SD, CLK_DIV12SD, CLK_DIV14SD, CLK_DIV16SD) предоставляют образцы VHDL-описаний встроенного делителя частоты тактового сигнала с требуемым коэффициентом деления и начальной задержкой выходного сигнала. Данные шаблоны выполнены на базе соответствующего библиотечного примитива CLK_DIVnSD. Текст перечисленных шаблонов демонстрируется на примере четырнадцатикратного делителя частоты с начальной задержкой формируемого сигнала:

-- CLK_DIV14SD : In order to incorporate this function into the design,

-- VHDL : the following instance declaration needs to be placed

-- instance : in the architecture body of the design code. The

-- declaration : instance name (CLK_DIV14SD_inst) and/or the port declarations

-- code : after the "=>" assignment maybe changed to properly

-- : reference and connect this function to the design.

-- : All inputs and outputs must be connected.

-- Library : In addition to adding the instance declaration, a use

-- declaration : statement for the UNISIM.vcomponents library needs to be

-- for : added before the entity declaration. This library

-- Xilinx : contains the component declarations for all Xilinx

-- primitives : primitives and points to the models that will be used

-- : for simulation.

-- Copy the following two statements and paste them before the

-- Entity declaration, unless they already exist.

Library UNISIM;

use UNISIM.vcomponents.all;

-- <-----Cut code below this line and paste into the architecture

body---- >

-- CLK_DIV14SD: Clock Divide by 14 with start delay -- CoolRunner-II

-- Xilinx HDL Language Template, version 11.4

CLK_DIV14SD_inst : CLK_DIV14SD

generic map (

DIVIDER_DELAY => 1

)

port map (

CLKDV => CLKDV, -- Divided clock output CLKIN => CLKIN -- Clock input );

-- End of CLK_DIV14SD_inst instantiation

В библиотечных примитивах CLK_DIV2SD, CLK_DIV4SD, CLK_DIV6SD, CLK_DIV8SD, CLK_DIV10SD, CLK_DIV12SD, CLK_DIV14SD, CLK_DIV16SD применяется тот же настраиваемый параметр DIVIDER_DELAY и система условных обозначений идентификаторов входных и выходных портов, что и в примитивах CLK_DIV2RSD, CLK_DIV4RSD, CLK_ DIV6RSD, CLK_DIV8RSD, CLK_DIV10RSD, CLK_DIV12RSD, CLK_DIV14RSD, CLK_ DIV16RSD.

Условный графический образ встроенного делителя частоты тактового сигнала с фиксированным коэффициентом деления и начальной задержкой генерации выходного сигнала, описание которого создается с помощью шаблонов Divider/w start delay (CLK_DIV2SD, CLK_DIV4SD, CLK_DIV6SD, CLK_DIV8SD, CLK_DIV10SD, CLK_DIV12SD, CLK_DIV14SD, CLK_DIV16SD), приведен на рис. 42.

Условный графический образ встроенного делителя частоты тактового сигнала с фиксированным коэффициентом деления и начальной задержкой формирования выходного сигнала

Рис. 42. Условный графический образ встроенного делителя частоты тактового сигнала с фиксированным коэффициентом деления и начальной задержкой формирования выходного сигнала

Simple Divider (CLK_DIV2, CLK_DIV4, CLK_DIV6, CLK_DIV8, CLK_DIV10, CLK_ DIV12, CLK_DIV14, CLK_DIV16) включают в себя шаблоны описаний встроенного делителя частоты сигнала синхронизации без входа сброса и начальной задержки формируемого сигнала. Основой каждого из этих шаблонов является соответствующий библиотечный примитив CLK_DIVn. В качестве примера, показывающего содержание перечисленных шаблонов, далее приведен образец описания встроенного делителя частоты сигнала без входа сброса и начального временного сдвига, функционирующего в режиме деления на 16:

-- CLK_DIV16 : In order to incorporate this function into the design,

-- VHDL : the following instance declaration needs to be placed

-- instance : in the architecture body of the design code. The

-- declaration : instance name (CLK_DIV16_inst) and/or the port declarations

-- code : after the "=>" assignment maybe changed to properly

-- : reference and connect this function to the design.

-- : All inputs and outputs must be connected.

-- Library : In addition to adding the instance declaration, a use

-- declaration : statement for the UNISIM.vcomponents library needs to be

-- for : added before the entity declaration. This library

-- Xilinx : contains the component declarations for all Xilinx

-- primitives : primitives and points to the models that will be used

-- : for simulation.

-- Copy the following two statements and paste them before the

-- Entity declaration, unless they already exist.

Library UNISIM;

use UNISIM.vcomponents.all;

-- <-----Cut code below this line and paste into the architecture

body---- >

-- CLK_DIV16: Simple clock Divide by 16

-- CoolRunner-II

-- Xilinx HDL Language Template, version 11.4

CLK_DIV16_inst : CLK_DIV16

port map (

CLKDV => CLKDV, -- Divided clock output CLKIN => CLKIN -- Clock input );

-- End of CLK_DIV16_inst instantiation

Условный графический образ данного варианта конфигурации встроенного делителя частоты тактового сигнала с заданным коэффициентом деления имеет тот вид, что и для варианта с начальной задержкой формирования выходного сигнала (рис. 42).

Global Clock Buffer (BUFG) содержит образец применения примитива BUFG, представляющего глобальный буферный элемент, необходимый для коммутации сигнала синхронизации, который поступает на тактовые входы ПЛИС, на специальные выделенные цепи, обеспечивающие распределение тактового сигнала внутри кристалла с высоким коэффициентом разветвления и минимальными разбегами фронтов:

-- BUFG : In order to incorporate this function into the design, -- VHDL : the following instance declaration needs to be placed -- instance : in the architecture body of the design code. The -- declaration : instance name (BUFG_inst) and/or the port declarations

-- code : after the "=>" assignment maybe changed to properly

-- : reference and connect this function to the design.

-- : All inputs and outputs must be connected.

-- Library : In addition to adding the instance declaration, a use

-- declaration : statement for the UNISIM.vcomponents library needs to be

-- for : added before the entity declaration. This library

-- Xilinx : contains the component declarations for all Xilinx

-- primitives : primitives and points to the models that will be used

-- : for simulation.

-- Copy the following two statements and paste them before the

-- Entity declaration, unless they already exist.

Library UNISIM;

use UNISIM.vcomponents.all;

-- <-----Cut code below this line and paste into the architecture

body---->

-- BUFG: Global Clock Buffer (source by an internal signal) -- Xilinx HDL Language Template, version 11.4

BUFG_inst : BUFG port map (

0 => O, -- Clock buffer output

1 => I -- Clock buffer input );

-- End of BUFG_inst instantiation

В представленном шаблоне используются следующие условные обозначения интерфейсных портов:

  • I — вход внешнего сигнала синхронизации;
  • O — выход внутреннего тактового сигнала.

Условный графический образ глобального буферного элемента, описание которого формируется с помощью шаблона Global Clock Buffer (BUFG), изображен на рис. 43.

Условный графический образ глобального буферного элемента

Рис. 43. Условный графический образ глобального буферного элемента

Подраздел I/O Components включает в себя шаблоны описаний входных и выходных буферных элементов, а также внутренних резисторов, подключаемых к выводам кристалла и шине питания. Эти шаблоны распределены соответственно в папки Input, Output, Weak drivers (рис. 39).

Single-ended Buffer (IBUF) представляет собой образец описания входного буферного элемента, предназначенного для согласования внешних и внутренних уровней входных сигналов ПЛИС. Основу данного описания образует библиотечный примитив IBUF:

-- IBUF : In order to incorporate this function into the design,

-- VHDL : the following instance declaration needs to be placed

-- instance : in the architecture body of the design code. The

-- declaration : instance name (IBUF_inst) and/or the port declarations

-- code : after the "=>" assignment maybe changed to properly

-- : connect this function to the design. All inputs must be

-- : connected.

-- Library : In addition to adding the instance declaration, a use

-- declaration : statement for the UNISIM.vcomponents library needs to be

-- for : added before the entity declaration. This library

-- Xilinx : contains the component declarations for all Xilinx

-- primitives : primitives and points to the models that will be used

-- : for simulation.

-- Copy the following two statements and paste them before the

-- Entity declaration, unless they already exist.

Library UNISIM;

use UNISIM.vcomponents.all;

-- <-----Cut code below this line and paste into the architecture

body---- >

-- IBUF: Single-ended Input Buffer -- All devices

-- Xilinx HDL Language Template, version 11.4

IBUF_inst : IBUF generic map (

IOSTANDARD => "DEFAULT"

)

port map (

0 => O, -- Buffer output

1 => I -- Buffer input (connect directly to top-level

port)

);

-- End of IBUF_inst instantiation

В шаблоне Single-ended Buffer (IBUF) используется та же система условных обозначений входных и выходных портов, что и в описании глобального буферного элемента Global Clock Buffer (BUFG).

Библиотечный примитив IBUF содержит единственный настраиваемый параметр IOSTANDARD, значение которого определяет стандарт ввода/вывода, в соответствии с которым конфигурируется соответствующий входной порт кристалла программируемой логики. Условный графический образ входного буферного элемента, описание которого формируется на основе шаблона Single-ended Buffer (IBUF), приведен на рис. 43.

Single-ended 3-state Buffer (OBUFT) является шаблоном описания выходного буферного элемента с тристабильным выходом. В качестве основы этого описания используется библиотечный примитив OBUFT:

-- OBUFT : In order to incorporate this function into the design,

-- VHDL : the following instance declaration needs to be placed

-- instance : in the architecture body of the design code. The

-- declaration : instance name (OBUFT_inst) and/or the port declarations

-- code : after the "=>" assignment maybe changed to properly

-- : connect this function to the design. All inputs must be

-- : connected.

-- Library : In addition to adding the instance declaration, a use

-- declaration : statement for the UNISIM.vcomponents library needs to be

-- for : added before the entity declaration. This library

-- Xilinx : contains the component declarations for all Xilinx

-- primitives : primitives and points to the models that will be used

-- : for simulation.

-- Copy the following two statements and paste them before the

-- Entity declaration, unless they already exist.

Library UNISIM;

use UNISIM.vcomponents.all;

-- <-----Cut code below this line and paste into the architecture

body---- >

-- OBUFT: Single-ended 3-state Output Buffer -- All devices

-- Xilinx HDL Language Template, version 11.4

OBUFT_inst : OBUFT generic map (

DRIVE => 12,

IOSTANDARD => "DEFAULT",

SLEW => "SLOW"

)

port map (

0 => O, -- Buffer output (connect directly to top-level

port)

1 => I, -- Buffer input

T => T -- 3-state enable input

);

-- End of OBUFT_inst instantiation

В представленном шаблоне предусмотрены следующие параметры настройки: • DRIVE — определяет нагрузочную способность соответствующего выхода ПЛИС.

  • IOSTANDARD — устанавливает стандарт ввода/вывода, в соответствии с которым конфигурируется соответствующий выходной порт кристалла программируемой логики.
  • SLEW — указывает требуемый вариант длительности фронтов выходных сигналов. Система условных обозначений интерфейсных портов примитива OBUFT кроме рассмотренных выше названий входов и выходов включает также идентификатор:
  • T — вход разрешения выхода (переключения в третье состояние).

На рис. 44 приведен условный графический образ выходного буферного элемента с тремя состояниями, описание которого создается с помощью шаблона Single-ended 3-state Buffer (OBUFT).

Условный графический образ выходного буферного элемента с тремя состояниями

Рис. 44. Условный графический образ выходного буферного элемента с тремя состояниями

Single-ended Buffer (OBUF) содержит образец использования библиотечного примитива OBUF при подготовке VHDL-описания выходного буферного элемента, который применяется для согласования внутренних и внешних уровней выходных сигналов ПЛИС:

-- OBUF : In order to incorporate this function into the design,

-- VHDL : the following instance declaration needs to be placed

-- instance : in the architecture body of the design code. The

-- declaration : instance name (OBUF_inst) and/or the port declarations

-- code : after the "=>" assignment maybe changed to properly

-- : connect this function to the design. All inputs must be

-- : connected.

-- Library : In addition to adding the instance declaration, a use

-- declaration : statement for the UNISIM.vcomponents library needs to be

-- for : added before the entity declaration. This library

-- Xilinx : contains the component declarations for all Xilinx

-- primitives : primitives and points to the models that will be used

-- : for simulation.

-- Copy the following two statements and paste them before the

-- Entity declaration, unless they already exist.

Library UNISIM;

use UNISIM.vcomponents.all;

-- <-----Cut code below this line and paste into the architecture

body---- >

-- OBUF: Single-ended Output Buffer

-- All devices

-- Xilinx HDL Language Template, version 11.4

OBUF_inst : OBUF generic map (

DRIVE => 12,

IOSTANDARD => "DEFAULT", SLEW => "SLOW"

)

port map (

0 => O, -- Buffer output (connect directly to top-level

port)

1 => I -- Buffer input );

-- End of OBUF_inst instantiation

В приведенном шаблоне используется та же совокупность настраиваемых параметров и та же система условных обозначений интерфейсных портов, что и в описании выходного тристабильного буферного элемента, создаваемого с помощью шаблона Single-ended 3-state Buffer (OBUFT). Условный графический образ выходного буферного элемента, формируемого на основе шаблона Single-ended Buffer (OBUF), показан на рис. 43.

KEEPER включает в себя конструкцию, предназначенную для описания применения схемы удержания последнего состояния, которая предусмотрена в блоках ввода/вывода кристаллов программируемой логики семейства CoolRunner-II. Основой этой конструкции является одноименный библиотечный примитив:

-- KEEPER : In order to incorporate this function into the design,

-- VHDL : the following instance declaration needs to be placed

-- instance : in the architecture body of the design code. The

-- declaration : instance name (KEEPER_inst) and/or the port declarations

-- code : after the "=>" assignment maybe changed to properly

-- : connect this function to the design.

-- Library : In addition to adding the instance declaration, a use

-- declaration : statement for the UNISIM.vcomponents library needs to be

-- for : added before the entity declaration. This library

-- Xilinx : contains the component declarations for all Xilinx

-- primitives : primitives and points to the models that will be used

-- : for simulation.

-- Copy the following two statements and paste them before the

-- Entity declaration, unless they already exist.

Library UNISIM;

use UNISIM.vcomponents.all;

-- <-----Cut code below this line and paste into the architecture

body---- >

-- KEEPER: I/O Buffer Weak Keeper -- CoolRunner-II

-- Xilinx HDL Language Template, version 11.4

KEEPER_inst : KEEPER port map (

O => O -- Keeper output (connect directly to top-level

port)

);

-- End of KEEPER_inst instantiation

Условный графический образ компонента, представляющего схему удержания последнего состояния, который формируется с помощью шаблона KEEPER, показан на рис. 45.

Условный графический образ компонента

Рис. 45. Условный графический образ компонента

PULLUP представляет собой образец использования одноименного библиотечного примитива для описания внутреннего подтягивающего резистора, входящего в состав блоков ввода/вывода ПЛИС семейств CoolRunner-II и CoolRunner XPLA3, подключенного к источнику питания:

-- PULLUP : In order to incorporate this function into the design,

-- VHDL : the following instance declaration needs to be placed

-- instance : in the architecture body of the design code. The

-- declaration : instance name (PULLUP_inst) and/or the port declarations

-- code : after the "=>" assignment maybe changed to properly

-- : connect this function to the design.

-- Library : In addition to adding the instance declaration, a use

-- declaration : statement for the UNISIM.vcomponents library needs to be

-- for : added before the entity declaration. This library

-- Xilinx : contains the component declarations for all Xilinx

-- primitives : primitives and points to the models that will be used

-- : for simulation.

-- Copy the following two statements and paste them before the

-- Entity declaration, unless they already exist.

Library UNISIM;

use UNISIM.vcomponents.all;

-- <-----Cut code below this line and paste into the architecture

body---- >

-- PULLUP: I/O Buffer Weak Pull-up

-- CoolRunner-II

-- Xilinx HDL Language Template, version 11.4

PULLUP_inst : PULLUP port map (

O => O -- Pullup output (connect directly to top-level

port)

);

-- End of PULLUP_inst instantiation

Условный графический образ внутреннего подтягивающего резистора, подключенного к источнику питания, описание которого создается с помощью шаблона PULLUP, показан на рис. 46. 

Условный графический образ внутреннего подтягивающего резистора

Рис. 46. Условный графический образ внутреннего подтягивающего резистора

Продолжение следует

Литература

  1. Кузелин М. О., Кнышев Д. А., Зотов В. Ю. Современные семейства ПЛИС фирмы Xilinx / Справочное пособие. М.: Горячая линия - Телеком, 2004.
  2. Бибило П. Н. Основы языка VHDL. М.: Солон-Пресс, 2000.
  3. Бибило П. Н. Синтез логических схем с использованием языка VHDL. М.: Солон-Пресс, 2002.
  4. Уэйкерли Дж. Ф. Проектирование цифровых устройств. Том 1. М.: Постмаркет, 2002.
  5. Поляков А. К. Языки VHDL и Verilog в проектировании цифровой аппаратуры. М.: Солон-Пресс, 2003.
  6. Зотов В. Инструментальный комплект Spartan-3 Starter Kit для практического освоения методов проектирования встраиваемых микропроцессорных систем на основе ПЛИС семейств FPGA фирмы Xilinx // Компоненты и технологии. 2005. № 7.
  7. Зотов В. Новый инструментальный комплект Spartan-3E Starter Kit для практического освоения методов проектирования встраиваемых микропроцессорных систем на основе ПЛИС семейств FPGA фирмы Xilinx // Компоненты и технологии. 2006. № 10.
  8. Зотов В. Новый инструментальный комплект Spartan-3A Starter Kit для практического освоения методов проектирования и отладки цифровых устройств с аппаратной и программной реализацией операций, реализуемых на основе ПЛИС семейств FPGA фирмы Xilinx // Компоненты и технологии. 2007. № 9.
  9. Зотов В. Новый инструментальный комплект от компании Avnet на основе ПЛИС FPGA семейства Spartan-3A фирмы Xilinx // Компоненты и технологии. 2008. № 8.
  10. Зотов В. Инструментальный модуль компании Avnet для отладки проектов встраиваемых систем, разрабатываемых на базе нового семейства ПЛИС FPGA фирмы Xilinx Virtex-5 FXT // Компоненты и технологии. 2008. № 9.
  11. Зотов В. Особенности архитектуры нового поколения высокопроизводительных ПЛИС FPGA фирмы Xilinx серии Virtex-6 // Компоненты и технологии. 2009. № 8.
  12. Зотов В. Особенности архитектуры нового поколения ПЛИС FPGA фирмы Xilinx серии Spartan-6 // Компоненты и технологии. 2009. № 9.
  13. Зотов В. Новое семейство высокопроизводительных ПЛИС с архитектурой FPGA фирмы Xilinx Virtex-6 HXT // Компоненты и технологии. 2010. № 1.
  14. IEEE Standard VHDL Language Reference Manual — IEEE Std 1076-2002.
  15. Суворова Е. А., Шейнин Ю. Е. Проектирование цифровых систем на VHDL. СПб.: БХВ-Петер-бург, 2003.
  16. Сергиенко A. M. VHDL для проектирования вычислительных устройств. Киев: ЧП «Корнейчук», ООО «ТИД «ДС», 2003.
  17. Зотов В. Проектирование цифровых устройств, реализуемых на базе ПЛИС FPGA фирмы Xilinx, с использованием средств CORE Generator // Компоненты и технологии. 2006. № 12. 2007. № 1.
  18. Зотов В. Разработка компонентов устройств цифровой обработки сигналов, реализуемых на базе аппаратных модулей DSP48E в ПЛИС FPGA серии Virtex-5, с помощью «мастера» Architecture Wizard САПР серии Xilinx ISE // Компоненты и технологии. 2008. № 12. 2009. № 1, 4-7.

Скачать статью в формате PDF  Скачать статью Компоненты и технологии PDF

 


Другие статьи по данной теме:

Сообщить об ошибке