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

Опрос

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

Реклама

 

2010 №10

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

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


В девятой части статьи приводится подробная информация о шаблонах VHDL-описаний элементов двухпортовых оперативных запоминающих устройств, реализуемых на основе ресурсов блочной памяти Block RAM кристаллов программируемой логики семейства Spartan-3. Все рассматриваемые шаблоны являются образцами применения соответствующих примитивов, предоставляемых библиотекой UNISIM.

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

В подразделе RAM/ROM содержатся образцы описаний элементов оперативных и постоянных запоминающих устройств, предназначенных для реализации на базе различных ресурсов ПЛИС семейства Spartan-3. В состав этого подраздела входят три каталога — Block RAM, Distributed RAM и Distributed ROM (Рис. 51. КиТ. 2010. № 8). Каталог Block RAM объединяет в себе шаблоны VHDL-описаний элементов ОЗУ, реализуемых на основе модулей блочной памяти Block RAM.

Все кристаллы программируемой логики семейства Spartan-3 содержат специальные аппаратные ресурсы оперативной памяти Block RAM, которые организованы в виде блоков (модулей) информационной емкостью 18 кбит. Каждый модуль блочной памяти может конфигурироваться в виде однопо-ртового или двухпортового ОЗУ с определенными комбинациями объема и разрядности слов данных [1, 20]. Для каждого поддерживаемого варианта конфигурирования модуля блочной памяти Block RAM предусмотрен соответствующий библиотечный примитив. Шаблоны описаний элементов оперативной памяти, основанные на использовании этих примитивов, распределены в каталоге Block RAM по трем папкам — Dual-Port (Matched Port Widths), Dual-Port (Mis-matched Port Widths) и Single-Port.

В папке Dual-Port (Matched Port Widths) представлены образцы описаний элементов двухпортовых оперативных запоминающих устройств с одинаковой разрядностью портов. Папка Dual-Port (Mis-matched Port Widths) включает в себя шаблоны описаний элементов двухпортовых ОЗУ, в которых порты имеют различную организацию данных. В папке

Single-Port находятся образцы описаний элементов однопортовой оперативной памяти.

16k x 1 (RAMB16_S1_S1) представляет собой шаблон описания элемента двухпортового ОЗУ с информационной емкостью 16 384 бита и организацией каждого порта 16 384 слова х 1 разряд, которое предназначено для реализации на основе модуля блочной памяти Block RAM кристаллов программируемой логики семейства Spartan-3. В качестве основы этого шаблона используется библиотечный примитив RAMB16_S1_S1:

-- : 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 : (RAMB16_S1_S1_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—>

--

-- RAMB16_S1_S1: 16k x 1 Dual-Port RAM

-- Spartan-3

-- Xilinx HDL Language Template, version 11.4

--

RAMB16_S1_S1_inst : RAMB16_S1_S1

generic map (

INIT_A => "0", -- Value of output RAM registers on Port A at startup

INIT_B => "0", -- Value of output RAM registers on Port B at

startup

SRVAL_A => "0", -- Port A ouput value upon SSR assertion

SRVAL_B => "0", -- Port B ouput value upon SSR assertion

WRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE

WRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE

SIM_COLLISION_CHECK => "ALL", -- "NONE", "WARNING", "GENERATE_X_ONLY", "ALL"

-- The following INIT_xx declarations specify the initial contents of the RAM -- Address 0 to 4095

INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 4096 to 8191

INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 8192 to 12287

INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",


INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",


INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",


INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 12288 to 16383

INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3D => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000"),

port map (

DOA => DOA, -- Port A 1-bit Data Output

DOB => DOB, -- Port B 1-bit Data Output

ADDRA => ADDRA, -- Port A 14-bit Address Inpu

ADDRB => ADDRB, -- Port B 14-bit Address Inpu

CLKA => CLKA, -- Port A Clock

CLKB => CLKB, -- Port B Clock

DIA => DIA, -- Port A 1-bit Data Input

DIB => DIB, -- Port B 1-bit Data Input

ENA => ENA, -- Port A RAM Enable Input

ENB => ENB, -- PortB RAM Enable Input

SSRA => SSRA, -- Port A Synchronous Set/Reset In

SSRB => SSRB, -- Port B Synchronous Set/Reset In

WEA => WEA, -- Port A Write Enable Input

WEB => WEB -- Port B Write Enable Input

);

-- End of RAMB16_S1_S1_inst instantiation

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

  • INIT_A и INIT_B — задают начальные значения для выходных регистров первого и второго портов ОЗУ соответственно (по умолчанию предлагается нулевое значение).
  • SRVAL_A и SRVAL_B — определяют состояние выходных портов данных A и B соответственно при активном уровне сигнала на входах сброса/установки (по умолчанию устанавливается нулевое значение).
  • WRITE_MODE_A и WRITE_MODE_B — указывают режим записи информации (порядок выполнения операций записи и чтения данных при одновременном обращении к ячейкам памяти) для первого и второго портов соответственно.
  • SIM_COLLISION_CHECK — устанавливает режим обработки различных конфликтных ситуаций при осуществлении операций записи и чтения данных в процессе моделирования (по умолчанию предлагается значение "ALL").
  • INIT_00-INIT_3F — предназначены для инициализации содержимого соответствующих ячеек памяти (по умолчанию во все ячейки ОЗУ записывается нулевое значение).

Система условных обозначений, применяемых в описании интерфейса библиотечного примитива RAMB16_S1_S1, включает в себя следующие идентификаторы входов и выходов:

  • DOA — выход первого порта элемента 2-портовой оперативной памяти;
  • DOB — выход второго порта элемента 2-портового ОЗУ;
  • ADDRA — 14-разрядная шина адреса первого порта элемента 2-портовой оперативной памяти;
  • ADDRB — 14-разрядная шина адреса второго порта 2-портового ОЗУ;
  • CLKA и CLKB — входы сигнала синхронизации первого и второго порта соответственно;
  • DIA — информационный вход (записи) первого порта;
  • DIB — информационный вход (записи) второго порта;
  • ENA и ENB — входы сигнала разрешения для первого и второго порта соответственно;
  • SSRA и SSRB — входы сигнала синхронного сброса/установки первого и второго порта соответственно;
  • WEA и WEB — входы сигнала разрешения записи соответственно в первый и второй порт элемента двухпортовой оперативной памяти.

Все операции выполняются в каждом порте при высоком логическом уровне напряжения на входе сигнала разрешения ENA и ENB по фронту соответствующего тактового сигнала CLKA и CLKB. Для загрузки данных, поступающих на информационные входы первого и второго порта DIA и DIB, в ячейки с адресами, представленными на шинах ADDRA и ADDRB, необходимо наличие высокого логического уровня напряжения на входах сигнала разрешения записи WEA и WEB соответственно. При подаче активного уровня напряжения на входы сигнала синхронного сброса/установки SSRA или SSRB информационные выходы соответствующего порта переключаются в состояние, определяемое заданными значениями параметров настройки SRVAL_A и SRVAL_B.

Условный графический образ элемента 2-портового ОЗУ с информационной емкостью 16 384 бита и организацией каждого порта 16 384 слова х 1 разряд, описание которого создается с помощью шаблона 16k x 1 (RAMB16_S1_S1) для последующей реализации на основе блочной памяти Block RAM кристаллов программируемой логики семейства Spartan-3, представлен на рис. 1.

1k x 16 + 2 Parity bits (RAMB16_S18_S18) включает в себя образец описания элемента двухпортовой оперативной памяти с информационной емкостью 16 384 бита и дополнительным объемом 2048 бит, предназначенным для контроля четности записываемых данных. Каждый порт такого элемента имеет организацию 1024 слова х 16 разрядов, а также два дополнительных разряда для осуществления контроля четности.

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

Рис. 1. Условный графический образ 2-портового ОЗУ

Этот шаблон выполнен на основе использования библиотечного примитива RAMB16_S18_S18, который представляет соответствующий вариант конфигурирования модуля блочной памяти Block RAM ПЛИС семейства Spartan-3:

-- RAMB16_S18_S18 : 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 : (RAMB16_S18_S18_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—>

--

-- RAMB16_S18_S18: 1k x 16 + 2 Parity bits Dual-Port RAM

-- Spartan-3

-- Xilinx HDL Language Template, version 11.4

RAMB16_S18_S18_inst : RAMB16_S18_S18 generic map (

INIT_A => X"00000", -- Value of output RAM registers on Port A at startup

INIT_B => X"00000", -- Value of output RAM registers on Port B at startup

SRVAL_A => X"00000", -- Port A ouput value upon SSR assertion

SRVAL_B => X"00000", -- Port B ouput value upon SSR assertion

WRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE

WRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE

SIM_COLLISION_CHECK => "ALL", -- "NONE", "WARNING", "GENERATE_X_ONLY", "ALL"

-- The follosing INIT_xx declarations specify the intiial contents of the RAM

-- Address 0 to 255

INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_01 => X'0000000000000000000000000000000000000000000000000000000000000000",

INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_03 => X'0000000000000000000000000000000000000000000000000000000000000000",

INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 256 to 511 INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 512 to 767 INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 768 to 1023 INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3F => X"00000000000000000000000000000000000000000000 00000000000000000000",

-- The next set of INITP_xx are for the parity bits -- Address 0 to 255 INITP_00 => X"0000000000000000000000000000000000000000000 000000000000000000000",

INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 256 to 511 INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",

INITP_03 => X"0000000000000000000000000000000000000000000 000000000000000000000",

-- Address 512 to 767 INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",

INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 768 to 1023 INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",

INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")

port map (

DOA => DOA,

-- Port A 16-bit Data Output DOB => DOB,

-- Port B 16-bit Data Output DOPA => DOPA,

-- Port A 2-bit Parity Output DOPB => DOPB,

-- Port B 2-bit Parity Output ADDRA => ADDRA,

-- Port A 10-bit Address Input ADDRB => ADDRB,

-- Port B 10-bit Address Input CLKA => CLKA,

-- Port A Clock CLKB => CLKB,

-- Port B Clock DIA => DIA,

-- Port A 16-bit Data Input DIB => DIB,

-- Port B 16-bit Data Input

DIPA => DIPA, -- Port A 2-bit parity Input

DIPB => DIPB, -- Port-B 2-bit parity Input

ENA => ENA, -- Port A RAM Enable Input

ENB => ENB, -- PortB RAM Enable Input

SSRA => SSRA, -- Port A Synchronous Set/Reset Input

SSRB => SSRB, -- Port B Synchronous Set/Reset Input

WEA => WEA, -- Port A Write Enable Input

WEB => WEB -- Port B Write Enable Input

);

- End of RAMB16_S18_S18_inst instantiation

В приведенной конструкции кроме параметров настройки, которые были рассмотрены при описании предыдущего шаблона, предусмотрены также параметры INITP_00-INITP_07, предназначенные для инициализации содержимого ячеек памяти, используемых для организации контроля четности.

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

  • DOA и DOB — выходные 16-разрядные шины информационных данных первого и второго порта соответственно;
  • DOPA и DOPB — выходные двухразрядные шины, применяемые для осуществления контроля четности данных первого и второго порта соответственно;
  • ADDRA и ADDRB — 10-разрядные шины адреса первого и второго порта соответственно;
  • DIA и DIB — входные 16-разрядные шины информационных данных первого и второго порта соответственно;
  • DIPA и DIPB — входные двухразрядные шины, предназначенные для организации контроля четности данных первого и второго порта соответственно;
  • CLKA, CLKB, ENA, ENB, SSRA, SSRB, WEA, WEB — имеют то же предназначение, что и в предыдущем шаблоне.

Условный графический образ двухпортового ОЗУ с организацией 1024 слова х 16 разрядов и контролем четности

Рис. 2. Условный графический образ двухпортового ОЗУ с организацией 1024 слова х 16 разрядов и контролем четности

Условный графический образ элемента 2-портовой оперативной памяти информационной емкостью 16 384 бита с организацией 1024 слова х 16 разрядов и дополнительным объемом 2048 бит, используемым при осуществлении контроля четности, для подготовки описания которого применяется шаблон 1k x 16 + 2 Parity bits (rAmB16_S18_S18), изображен на рис. 2.

2k x 8 + 1 Parity bit (RAMB16_S9_S9) содержит шаблон VHDL-описания варианта конфигурирования модуля блочной памяти кристаллов программируемой логики семейства Spartan-3 в виде элемента двухпортового ОЗУ с организацией 2048 слов х 8 разрядов и контролем четности. Основу этого шаблона образует оператор создания экземпляра библиотечного компонента RAMB16 S9 S9:

-- : 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 : (RAMB16_S9_S9_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—>

-- RAMB16_S9_S9: 2k x 8 + 1 Parity bit Dual-Port RAM

-- Spartan-3

-- Xilinx HDL Language Template, version 11.4

RAMB16_S9_S9_inst : RAMB16_S9_S9 generic map (

INIT_A => X"000",

-- Value of output RAM registers on Port A at startup

INIT_B => X"000",

-- Value of output RAM registers on Port B at startup

SRVAL_A => X"000",

-- Port A ouput value upon SSR assertion

SRVAL_B => X"000",

-- Port B ouput value upon SSR assertion

WRITE_MODE_A => "WRITE_FIRST",

-- WRITE_FIRST, READ_FIRST or NO_CHANGE

WRITE_MODE_B => "WRITE_FIRST",

-- WRITE_FIRST, READ_FIRST or NO_CHANGE

SIM_COLLISION_CHECK => "ALL",

-- "NONE", "WARNING", "GENERATE_X_ONLY", "ALL"

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

-- Address 0 to 511

INIT_00 => X

INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 512 to 1023

INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 1024 to 1535

INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 1536 to 2047

INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000",

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

-- Address 0 to 511

INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",

INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 512 to 1023

INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",

INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 1024 to 1535

INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",

INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 1536 to 2047

INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",

INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")

port map (

DOA => DOA, -- Port A 8-bit Data Output

DOB => DOB, -- Port B 8-bit Data Output

DOPA => DOPA, -- Port A 1-bit Parity Output

DOPB => DOPB, -- Port B 1-bit Parity Output

ADDRA => ADDRA, -- Port A 11-bit Address Input

ADDRB => ADDRB, -- Port B 11-bit Address Input

CLKA => CLKA, -- Port A Clock

CLKB => CLKB, -- Port B Clock

DIA => DIA, -- Port A 8-bit Data Input

DIB => DIB, -- Port B 8-bit Data Input

DIPA => DIPA, -- Port A 1-bit parity Input

DIPB => DIPB, -- Port-B 1-bit parity Input

ENA => ENA, -- Port A RAM Enable Input

ENB => ENB, -- PortB RAM Enable Input

SSRA => SSRA, -- Port A Synchronous Set/Reset Input

SSRB => SSRB, -- Port B Synchronous Set/Reset Input

WEA => WEA, -- Port A Write Enable Input

WEB => WEB -- Port B Write Enable Input

);

-- End of RAMB16_S9_S9_inst instantiation

Параметры настройки, предусмотренные в этой конструкции, имеют то же назначение, что и в шаблонах 16k x 1 (RAMB16_S1_S1) и 1k x 16 + 2 Parity bits (RAMB16_S18_S18), рассмотренных выше. При этом необходимо учитывать, что количество разрядов, указываемых при определении значений параметров INIT_A, INIT_B, SRVAL_A и SRVAL_B, должно соответствовать разрядности выходных шин данных формируемого элемента двухпортовой оперативной памяти.

Условный графический образ двухпортового ОЗУ с организацией 2048 слов х 8 разрядов и контролем четности

Рис. 3. Условный графический образ двухпортового ОЗУ с организацией 2048 слов х 8 разрядов и контролем четности

В систему условных обозначений, используемую в описании интерфейса библиотечного примитива RAMB16_S9_S9, входят идентификаторы входов и выходов, представленные при рассмотрении предыдущего шаблона. Основные отличия проявляются в разрядности входных и выходных шин данных и шин адреса. В шаблоне 2k x 8 + 1 Parity bit (RAMB16_S9_S9) входные и выходные шины данных имеют разрядность восемь бит. Кроме того, оба порта содержат дополнительные входы и выходы, которые предназначены для организации контроля четности. При этом шина адреса каждого порта содержит одиннадцать двоичных разрядов.

На рис. 3 показан условный графический образ элемента двухпортового ОЗУ с организацией 2048 слов х 8 разрядов и контролем четности, описание которого формируется на основе шаблона 2k x 8 + 1 Parity bit (RAMB16_S9_S9) для последующей реализации на базе модуля блочной памяти Block RAM ПЛИС семейства Spartan-3.

4k x 4 (RAMB16_S4_S4) является образцом VHDL-описания варианта конфигурирования модуля блочной памяти кристаллов программируемой логики семейства Spartan-3 в виде двухпортового оперативного запоминающего устройства с организацией 4096 слов х 4 разряда. В качестве основы этого шаблона используется экземпляр библиотечного компонента RАМВ16 S4 S4:

-- RAMB16_S4_S4 : 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 : (RAMB16_S4_S4_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---->

--

-- RAMB16_S4_S4: 4k x 4 Dual-Port RAM

-- Spartan-3

-- Xilinx HDL Language Template, version 11.4

-- RAMB16_S4_S4_inst : RAMB16_S4_S4

generic map (

INIT_A => X"0", -- Value of output RAM registers on Port A at startup

INIT_B => X"0", -- Value of output RAM registers on Port B at startup

SRVAL_A => X"0",

-- Port A ouput value upon SSR assertion

SRVAL_B => X"0",

-- Port B ouput value upon SSR assertion WRITE_MODE_A => "WRITE_FIRST",

-- WRITE_FIRST,
READ_FIRST or NO_CHANGE WRITE_MODE_B => "WRITE_FIRST",

-- WRITE_FIRST, READ_FIRST or NO_CHANGE SIM_COLLISION_CHECK => "ALL",

-- "NONE",

"WARNING", "GENERATE_X_ONLY", "ALL"

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

-- Address 0 to 1023

INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 1024 to 2047

INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 2048 to 3071

INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2D => X"000000000000000000000000000000000000000000000000000000000000000",

INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 3072 to 4095

INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3D => X"000000000000000000000000000000000000000000000000000000000000000",

INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000")

port map (

DOA => DOA, -- Port A 4-bit Data Output

DOB => DOB, -- Port B 4-bit Data Output

ADDRA => ADDRA, -- Port A 12-bit Address Input

ADDRB => ADDRB, -- Port B 12-bit Address Input

CLKA => CLKA, -- Port A Clock

CLKB => CLKB, -- Port B Clock

DIA => DIA, -- Port A 4-bit Data Input

DIB => DIB, -- Port B 4-bit Data Input

ENA => ENA, -- Port A RAM Enable Input

ENB => ENB, -- Port B RAM Enable Input

SSRA => SSRA, -- Port A Synchronous Set/Reset Input

SSRB => SSRB, -- Port B Synchronous Set/Reset Input

WEA => WEA, -- Port A Write Enable Input

WEB => WEB -- Port B Write Enable Input

);

-- End of RAMB16_S4_S4_inst instantiation

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

Условный графический образ элемента 2-портового ОЗУ с организацией 4096 слов х 4 разряда, описание которого создается с помощью шаблона 4k x 4 (RAMB16_S4_S4), изображен на рис. 4.

Условный графический образ двухпортового ОЗУ с организацией 4096 слов × 4 разряда

Рис. 4. Условный графический образ двухпортового ОЗУ с организацией 4096 слов × 4 разряда

512 x 32 + 4 Parity bits (RAMB16_S36_S36) представляет собой шаблон описания элемента двухпортовой оперативной памяти информационной емкостью 16 384 бита с организацией 512 слов х 32 разряда и дополнительным объемом 2048 бит, необходимым для реализации контроля четности загружаемых данных. Основой этого шаблона является библиотечный примитив RAMB16_S36_ S36, который представляет соответствующий вариант конфигурирования модуля блочной памяти кристаллов программируемой логики семейства Spartan-3:

-- RAMB16_S36_S36 : 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 : (RAMB16_S36_S36_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—>

-- RAMB16_S36_S36: 512 x 32 + 4 Parity bits Dual-Port RAM

-- Spartan-3

-- Xilinx HDL Language Template, version 11.4

--

RAMB16_S36_S36_inst : RAMB16_S36_S36

generic map (

INIT_A => X"000000000", -- Value of output RAM registers on Port A at startup

INIT_B => X"000000000", -- Value of output RAM registers on Port B at startup

SRVAL_A => X"000000000", -- Port A ouput value upon SSR assertion

SRVAL_B => X"000000000", -- Port B ouput value upon SSR assertion

WRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE

WRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE

SIM_COLLISION_CHECK => "ALL", -- "NONE",

"WARNING", "GENERATE_X_ONLY", "ALL"

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

-- Address 0 to 127

INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000"

INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 128 to 255

INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",


INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 256 to 383

INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 384 to 511

INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000",

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

-- Address 0 to 127

INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",

INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 128 to 255

INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",

INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 256 to 383

INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",

INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 384 to 511

INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",

INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")

port map (

DOA => DOA, -- Port A 32-bit Data Output

DOB => DOB, -- Port B 32-bit Data Output

DOPA => DOPA, -- Port A 4-bit Parity Output

DOPB => DOPB, -- Port B 4-bit Parity Output

ADDRA => ADDRA, -- Port A 9-bit Address Input

ADDRB => ADDRB, -- Port B 9-bit Address Input

CLKA => CLKA, -- Port A Clock

CLKB => CLKB, -- Port B Clock

DIA => DIA, -- Port A 32-bit Data Input

DIB => DIB, -- Port B 32-bit Data Input

DIPA => DIPA, -- Port A 4-bit parity Input

DIPB => DIPB, -- Port-B 4-bit parity Input

ENA => ENA, -- Port A RAM Enable Input

ENB => ENB, -- PortB RAM Enable Input

SSRA => SSRA, -- Port A Synchronous Set/Reset Input

SSRB => SSRB, -- Port B Synchronous Set/Reset Input

WEA => WEA, -- Port A Write Enable Input

WEB => WEB -- Port B Write Enable Input

);

-- End of RAMB16_S36_S36_inst instantiation

В приведенной конструкции входные и выходные шины данных каждого порта имеют разрядность 32 бита, а шины адреса — девять бит. Для организации контроля четности используются дополнительные 4-разрядные входные и выходные шины данных.

На рис. 5 представлен условный графический образ элемента 2-портового ОЗУ с организацией 512 слов х 32 разряда и дополнительным объемом 2048 бит, предназначенным для контроля четности записываемых данных, для подготовки описания которого используется шаблон 512 x 32 + 4 Parity bits (RAMB16_S36_S36).

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

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

 

8k x 2 (RAMB16_S2_S2) представляет образец VHDL-описания варианта конфигурирования модуля блочной памяти кристаллов программируемой логики семейства Spartan-3 в виде элемента двухпортовой памяти с организацией 8192 слова х 2 разряда. Данный шаблон выполнен на основе библиотечного примитива RAMB16_S2_S2:

-- RAMB16_S2_S2 : 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 : (RAMB16_S2_S2_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---->

--

-- RAMB16_S2_S2: 8k x 2 Dual-Port RAM

-- Spartan-3

-- Xilinx HDL Language Template, version 11.4

--

RAMB16_S2_S2_inst : RAMB16_S2_S2

generic map (

INIT_A => X"0", -- Value of output RAM registers on Port A

at startup

INIT_B => X"0", -- Value of output RAM registers on Port B

at startup

SRVAL_A => X"0", -- Port A ouput value upon SSR assertion

SRVAL_B => X"0", -- Port B ouput value upon SSR assertion

WRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE

WRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE

SIM_COLLISION_CHECK => "ALL", -- "NONE", "WARNING", "GENERATE_X_ONLY", "ALL"

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

-- Address 0 to 2047

INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 2048 to 4095

INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 4096 to 6143

INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Address 6143 to 8191

INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3D => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000")

port map (

DOA => DOA, -- Port A 2-bit Data Output

DOB => DOB, -- Port B 2-bit Data Output

ADDRA => ADDRA, -- Port A 13-bit Address Input

ADDRB => ADDRB, -- Port B 13-bit Address Input

CLKA => CLKA, -- Port A Clock

CLKB => CLKB, -- Port B Clock

DIA => DIA, -- Port A 2-bit Data Input

DIB => DIB, -- Port B 2-bit Data Input

ENA => ENA, -- Port A RAM Enable Input

ENB => ENB, -- Port B RAM Enable Input

SSRA => SSRA, -- Port A Synchronous Set/Reset Input

SSRB => SSRB, -- Port B Synchronous Set/Reset Input

WEA => WEA, -- Port A Write Enable Input

WEB => WEB -- Port B Write Enable Input

);

-- End of RAMB16_S2_S2_inst instantiation

При практическом использовании представленного шаблона следует учитывать, что разрядность входной и выходной шин данных каждого порта библиотечного примитива RAMB16_S2_S2 составляет два бита, а шины адреса — тринадцать бит.

На рис. 6 приведен условный графический образ элемента 2-портовой оперативной памяти с организацией 8192 слова х 2 разряда, описание которого формируется с помощью шаблона 8k x 2 (RAMB16_S2_S2) для последующей реализации на базе модуля блочной памяти Block RAM ПЛИС семейства Spartan-3.

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

Рис. 6. Условный графический образ элемента двухпортового ОЗУ с организацией 8192 слова х 2 разряда

16 k/1 k x 1/16 + 0/2 Parity bits (RAMB16_S1_ S18) включает в себя конструкцию, предназначенную для подготовки VHDL-описания варианта конфигурирования модуля блочной памяти кристаллов программируемой логики семейства Spartan-3 в виде элемента двухпортового ОЗУ, в котором первый порт имеет организацию 16 384 слова х 1 разряд, а второй — 1024 слова х 16 разрядов. При этом для второго порта предусмотрена возможность реализации контроля четности:

-- RAMB16_S1_S18 : 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 : (RAMB16_S1_S18_inst) and/or the port declarations

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

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

-- : AH 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—>

-- RAMB16_S1_S18: 16k/1k x 1/16 + 0/2 Parity bits Dual-Port RAM

-- Spartan-3

-- Xilinx HDL Language Template, version 11.4

RAMB16_S1_S18_inst : RAMB16_S1_S18

generic map (

INIT_A => "0", -- Value of output RAM registers on Port A at startup

INIT_B => X"00000", -- Value of output RAM registers on Port B at startup

SRVAL_A => "0", -- Port A ouput value upon SSR assertion

SRVAL_B => X"00000", -- Port B ouput value upon SSR assertion

WRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE

WRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE

SIM_COLLISION_CHECK => "ALL", -- "NONE", "WARNING", "GENERATE_X_ONLY", "ALL"

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

-- Port A Address 0 to 4095, Port B Address 0 to 255 INIT_00 =>

INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Port A Address 4096 to 8191, Port B Address 256 to 511

INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Port A Address 8192 to 12287, Port B Address 512 to 767

INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Port A Address 12288 to 16383, Port B Address 768 to 1023

INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3D => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000",

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

-- Port B Address 0 to 255

INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",

INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Port B Address 256 to 511

INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",

INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Port B Address 512 to 767

INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",

INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Port B Address 768 to 1023

INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",

INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")

port map (

DOA => DOA, -- Port A 1-bit Data Output

DOB => DOB, -- Port B 16-bit Data Output

DOPB => DOPB, -- Port B 2-bit Parity Output

ADDRA => ADDRA, -- Port A 14-bit Address Input

ADDRB => ADDRB, -- Port B 10-bit Address Input

CLKA => CLKA, -- Port A Clock

CLKB => CLKB, -- Port B Clock

DIA => DIA, -- Port A 1-bit Data Input

DIB => DIB, -- Port B 16-bit Data Input

DIPB => DIPB, -- Port-B 2-bit parity Input

ENA => ENA, -- Port A RAM Enable Input

ENB => ENB, -- PortB RAM Enable Input

SSRA => SSRA, -- Port A Synchronous Set/Reset Input

SSRB => SSRB, -- Port B Synchronous Set/Reset Input

WEA => WEA, -- Port A Write Enable Input

WEB => WEB -- Port B Write Enable Input

);

-- End of RAMB16_S1_S18_inst instantiation

Представленный шаблон выполнен на основе библиотечного примитива RAMB16_S1_ S18. Назначение всех идентификаторов входов и выходов, используемых в описании интерфейса этого примитива, было рассмотрено выше. При этом следует учитывать, что в составе первого порта используются одиночные информационные входы и выходы, а во втором — 16-разрядные входные и выходные шины данных. Кроме того, ко второму порту относятся дополнительные двухразрядные шины данных, предназначенные для организации контроля четности. Шина адреса первого порта содержит четырнадцать двоичных разрядов, а второго — десять.

Условный графический образ элемента двухпортового ОЗУ с организацией портов 16 384 слова х 1 разряд и 1024 слова х 16 разрядов, описание которого формируется с помощью шаблона 16k/1k x 1/16 + 0/2 Parity bits (RAMB16_S1_S18) для последующей реализации на базе модуля блочной памяти Block RAM ПЛИС семейства Spartan-3, показан на рис. 7.

Условный графический образ элемента двухпортового ОЗУ с организацией портов 16 384 слова × 1 разряд и 1024 слова × 16 разрядов

Рис. 7. Условный графический образ элемента двухпортового ОЗУ с организацией портов 16 384 слова × 1 разряд и 1024 слова × 16 разрядов

16k/2k x 1/8 + 0/1 Parity bit (RAMB16_S1_S9) содержит образец описания варианта конфигурирования модуля блочной памяти Block RAM в кристаллах программируемой логики семейства Spartan-3 в виде элемента двухпортового ОЗУ с различной организацией портов — 16 384 слова х 1 разряд и 2048 слов х 8 разрядов. В элементах двухпортовой памяти, формируемых на основе этого шаблона, второй порт может поддерживать выполнение операций с контролем четности:

-- RAMB16_S1_S9 : 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 : (RAMB16_S1_S9_inst) and/or the port declarations

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

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

-- : AH 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---->

--

-- RAMB16_S1_S9: 16k/2k x 1/8 + 0/1 Parity bit Dual-Port RAM

-- Spartan-3

-- Xilinx HDL Language Template, version 11.4

--

RAMB16_S1_S9_inst : RAMB16_S1_S9

generic map (

INIT_A => "0", -- Value of output RAM registers on Port A

at startup

INIT_B => X"000", -- Value of output RAM registers on Port

B at startup

SRVAL_A => "0", -- Port A ouput value upon SSR assertion

SRVAL_B => X"000", -- Port B ouput value upon SSR

assertion

WRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST,

READ_FIRST or NO_CHANGE

WRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST,

READ_FIRST or NO_CHANGE

SIM_COLLISION_CHECK => "ALL", -- "NONE",

"WARNING", "GENERATE_X_ONLY", "ALL"

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

-- Port A Address 0 to 4095, Port B Address 0 to 511

INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Port A Address 4096 to 8191, Port B Address 512 to 1023

INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Port A Address 8192 to 12287, Port B Address 1024 to 1535

INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Port A Address 12288 to 16383, Port B Address 1535 to 2047

INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3D => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",

INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000",

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

-- Port B Address 0 to 511

INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",

INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Port B Address 512 to 1023

INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",

INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Port B Address 1024 to 1535

INITP_04 =>X"0000000000000000000000000000000000000000000000000000000000000000",

INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",

-- Port B Address 1535 to 2047

INITP_06 => X"000000000000000000000000000000000000000000 0000000000000000000000",

INITP_07 => X"000000000000000000000000000000000000000000 0000000000000000000000")

portmap (

DOA => DOA, -- Port A 1-bit Data Output

DOB => DOB, -- Port B 8-bit Data Output

DOPB => DOPB, -- Port B 1-bit Parity Output

ADDRA => ADDRA, -- Port A 14-bit Address Input

ADDRB => ADDRB, -- Port B 11-bit Address Input

CLKA => CLKA, -- Port A Clock

CLKB => CLKB, -- Port B Clock

DIA => DIA, -- Port A 1-bit Data Input

DIB => DIB, -- Port B 8-bit Data Input

DIPB => DIPB, -- Port-B 1-bit parity Input

ENA => ENA, -- Port A RAM Enable Input

ENB => ENB, -- PortB RAM Enable Input

SSRA => SSRA, -- Port A Synchronous Set/Reset Input

SSRB => SSRB, -- Port B Synchronous Set/Reset Input

WEA => WEA, -- Port A Write Enable Input

WEB => WEB -- Port B Write Enable Input

);

-- End of RAMB16_S1_S9_inst instantiation

Система условных обозначений входов и выходов, используемая в представленной конструкции, отличается от совокупности идентификаторов предыдущего шаблона только разрядностью адресной и информационных шин второго порта. В шаблоне 16k/2k x 1/8 + 0/1 Parity bit (RAMB16_ S1_S9) входная и выходная шины данных второго порта имеют разрядность восемь бит, а шина адреса — одиннадцать бит. При этом второй порт включает в себя также дополнительные входы и выходы данных, используемые для реализации контроля четности.

На рис. 8 приведен условный графический образ элемента двухпортовой оперативной памяти с организацией портов 16 384 слова х 1 разряд и 2048 слов х 8 разрядов с контролем четности, для создания описания которого используется шаблон 16k/2k x 1/8 + 0/1 Parity bit (RAMB16_S1_S9).

Условный графический образ элемента двухпортового ОЗУ с организацией портов 16 384 слова × 1 разряд и 2048 слов × 8 разрядов

Рис. 8. Условный графический образ элемента двухпортового ОЗУ с организацией портов 16 384 слова × 1 разряд и 2048 слов × 8 разрядов

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

Литература

  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.
  19. Spartan-3 Generation FPGA User Guide. Xilinx, 2009.
  20. Spartan-3 FPGA Family: Complete Data Sheet. Xilinx, 2009.

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

 


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

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