+ All Categories
Home > Documents > ISE10.1 Designs Virtex-IILibrariesGuideforHDL

ISE10.1 Designs Virtex-IILibrariesGuideforHDL

Date post: 04-Oct-2021
Category:
Upload: others
View: 5 times
Download: 0 times
Share this document with a friend
627
Virtex-II Libraries Guide for HDL Designs ISE 10.1
Transcript
Page 1: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

Virtex-II Libraries Guide for HDLDesigns

ISE 10.1

Page 2: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

Xilinx Trademarks and Copyright Information

Xilinx is disclosing this user guide, manual, release note, and/or specification (the “Documentation”) to yousolely for use in the development of designs to operate with Xilinx hardware devices. You may not reproduce,distribute, republish, download, display, post, or transmit the Documentation in any form or by any meansincluding, but not limited to, electronic, mechanical, photocopying, recording, or otherwise, without the priorwritten consent of Xilinx. Xilinx expressly disclaims any liability arising out of your use of the Documentation.Xilinx reserves the right, at its sole discretion, to change the Documentation without notice at any time. Xilinxassumes no obligation to correct any errors contained in the Documentation, or to advise you of any correctionsor updates. Xilinx expressly disclaims any liability in connection with technical support or assistance that may beprovided to you in connection with the Information.

THE DOCUMENTATION IS DISCLOSED TO YOU “AS-IS” WITH NOWARRANTY OF ANY KIND. XILINXMAKES NO OTHER WARRANTIES, WHETHER EXPRESS, IMPLIED, OR STATUTORY, REGARDINGTHE DOCUMENTATION, INCLUDING ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR APARTICULAR PURPOSE, OR NONINFRINGEMENT OF THIRD-PARTY RIGHTS. IN NO EVENT WILLXILINX BE LIABLE FOR ANY CONSEQUENTIAL, INDIRECT, EXEMPLARY, SPECIAL, OR INCIDENTALDAMAGES, INCLUDING ANY LOSS OF DATA OR LOST PROFITS, ARISING FROM YOUR USE OF THEDOCUMENTATION.

© Copyright 2002 – 2008 Xilinx, Inc. All Rights Reserved. XILINX, the Xilinx logo, the Brand Window and otherdesignated brands included herein are trademarks of Xilinx, Inc. All other trademarks are the property oftheir respective owners.

Libraries Guide

2 www.xilinx.com 10.1

Page 3: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

Table of ContentsAbout this Guide .......................................................................................................................................... 7Functional Categories ................................................................................................................................... 9About Design Elements............................................................................................................................... 17

BSCAN_VIRTEX2 ................................................................................................................................ 18BUFCF ................................................................................................................................................ 20BUFG.................................................................................................................................................. 22BUFGCE ............................................................................................................................................. 24BUFGCE_1 .......................................................................................................................................... 26BUFGMUX.......................................................................................................................................... 28BUFGMUX_1....................................................................................................................................... 30CAPTURE_VIRTEX2............................................................................................................................ 32CLKDLL ............................................................................................................................................. 34CLKDLLE ........................................................................................................................................... 37CLKDLLHF......................................................................................................................................... 40DCM................................................................................................................................................... 43FDCE .................................................................................................................................................. 48FDCE_1............................................................................................................................................... 50FDCPE ................................................................................................................................................ 52FDCPE_1............................................................................................................................................. 55FDRSE ................................................................................................................................................ 58FDRSE_1 ............................................................................................................................................. 60IBUF ................................................................................................................................................... 62IBUFDS............................................................................................................................................... 65IBUFG................................................................................................................................................. 67IBUFGDS ............................................................................................................................................ 69ICAP_VIRTEX2 ................................................................................................................................... 72IFDDRCPE .......................................................................................................................................... 74IFDDRRSE .......................................................................................................................................... 76IOBUF................................................................................................................................................. 78IOBUFDS ............................................................................................................................................ 81KEEPER .............................................................................................................................................. 83LDCPE................................................................................................................................................ 85LUT1 .................................................................................................................................................. 88LUT1_D .............................................................................................................................................. 90LUT1_L............................................................................................................................................... 93LUT2 .................................................................................................................................................. 96LUT2_D .............................................................................................................................................. 98LUT2_L.............................................................................................................................................. 101LUT3 ................................................................................................................................................. 103LUT3_D ............................................................................................................................................. 105LUT3_L.............................................................................................................................................. 107LUT4 ................................................................................................................................................. 109LUT4_D ............................................................................................................................................. 112LUT4_L.............................................................................................................................................. 115MULT_AND....................................................................................................................................... 118MULT18X18 ....................................................................................................................................... 120MULT18X18S...................................................................................................................................... 122MUXCY ............................................................................................................................................. 124MUXCY_D ......................................................................................................................................... 126MUXCY_L.......................................................................................................................................... 128MUXF5 .............................................................................................................................................. 130MUXF5_D .......................................................................................................................................... 132MUXF5_L........................................................................................................................................... 134MUXF6 .............................................................................................................................................. 136MUXF6_D .......................................................................................................................................... 138MUXF6_L........................................................................................................................................... 140

Libraries Guide

10.1 www.xilinx.com 3

Page 4: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

MUXF7 .............................................................................................................................................. 142MUXF7_D .......................................................................................................................................... 144MUXF7_L........................................................................................................................................... 146MUXF8 .............................................................................................................................................. 148MUXF8_D .......................................................................................................................................... 150MUXF8_L........................................................................................................................................... 152OBUF................................................................................................................................................. 154OBUFDS ............................................................................................................................................ 156OBUFT............................................................................................................................................... 158OBUFTDS .......................................................................................................................................... 160OFDDRCPE........................................................................................................................................ 162OFDDRRSE ........................................................................................................................................ 164OFDDRTCPE...................................................................................................................................... 166OFDDRTRSE...................................................................................................................................... 168ORCY ................................................................................................................................................ 170PULLDOWN...................................................................................................................................... 172PULLUP............................................................................................................................................. 174RAM128X1S ....................................................................................................................................... 176RAM128X1S_1 .................................................................................................................................... 179RAM16X1D ........................................................................................................................................ 182RAM16X1D_1..................................................................................................................................... 185RAM16X1S......................................................................................................................................... 188RAM16X1S_1...................................................................................................................................... 190RAM16X2S......................................................................................................................................... 192RAM16X4S......................................................................................................................................... 195RAM16X8S......................................................................................................................................... 198RAM32X1D ........................................................................................................................................ 202RAM32X1D_1..................................................................................................................................... 205RAM32X1S......................................................................................................................................... 207RAM32X1S_1...................................................................................................................................... 209RAM32X2S......................................................................................................................................... 212RAM32X4S......................................................................................................................................... 215RAM32X8S......................................................................................................................................... 218RAM64X1D ........................................................................................................................................ 221RAM64X1D_1..................................................................................................................................... 224RAM64X1S......................................................................................................................................... 227RAM64X1S_1...................................................................................................................................... 230RAM64X2S......................................................................................................................................... 233RAMB16_S1 ....................................................................................................................................... 236RAMB16_S1_S1 .................................................................................................................................. 242RAMB16_S1_S18................................................................................................................................. 253RAMB16_S1_S2 .................................................................................................................................. 264RAMB16_S1_S36................................................................................................................................. 275RAMB16_S1_S4 .................................................................................................................................. 286RAMB16_S1_S9 .................................................................................................................................. 297RAMB16_S18...................................................................................................................................... 308RAMB16_S18_S18 ............................................................................................................................... 315RAMB16_S18_S36 ............................................................................................................................... 325RAMB16_S2 ....................................................................................................................................... 337RAMB16_S2_S18................................................................................................................................. 343RAMB16_S2_S2 .................................................................................................................................. 351RAMB16_S2_S36................................................................................................................................. 362RAMB16_S2_S4 .................................................................................................................................. 374RAMB16_S2_S9 .................................................................................................................................. 385RAMB16_S36...................................................................................................................................... 397RAMB16_S36_S36 ............................................................................................................................... 404RAMB16_S4 ....................................................................................................................................... 416RAMB16_S4_S18................................................................................................................................. 422RAMB16_S4_S36................................................................................................................................. 433

Libraries Guide

4 www.xilinx.com 10.1

Page 5: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

RAMB16_S4_S4 .................................................................................................................................. 444RAMB16_S4_S9 .................................................................................................................................. 455RAMB16_S9 ....................................................................................................................................... 466RAMB16_S9_S18................................................................................................................................. 473RAMB16_S9_S36................................................................................................................................. 485RAMB16_S9_S9 .................................................................................................................................. 497RAMB4_S1 ......................................................................................................................................... 509RAMB4_S1_S1 .................................................................................................................................... 512RAMB4_S1_S16 .................................................................................................................................. 516RAMB4_S1_S2 .................................................................................................................................... 520RAMB4_S1_S4 .................................................................................................................................... 525RAMB4_S1_S8 .................................................................................................................................... 529RAMB4_S16 ....................................................................................................................................... 533RAMB4_S16_S16................................................................................................................................. 536RAMB4_S2 ......................................................................................................................................... 540RAMB4_S2_S16 .................................................................................................................................. 543RAMB4_S2_S2 .................................................................................................................................... 547RAMB4_S2_S4 .................................................................................................................................... 551RAMB4_S2_S8 .................................................................................................................................... 555RAMB4_S4 ......................................................................................................................................... 559RAMB4_S4_S16 .................................................................................................................................. 562RAMB4_S4_S4 .................................................................................................................................... 566RAMB4_S4_S8 .................................................................................................................................... 570RAMB4_S8 ......................................................................................................................................... 574RAMB4_S8_S16 .................................................................................................................................. 577RAMB4_S8_S8 .................................................................................................................................... 581ROM128X1 ......................................................................................................................................... 585ROM16X1........................................................................................................................................... 588ROM256X1 ......................................................................................................................................... 591ROM32X1........................................................................................................................................... 594ROM64X1........................................................................................................................................... 597SRL16 ................................................................................................................................................ 600SRL16_1 ............................................................................................................................................. 602SRL16E .............................................................................................................................................. 604SRL16E_1 ........................................................................................................................................... 607SRLC16 .............................................................................................................................................. 610SRLC16_1........................................................................................................................................... 612SRLC16E ............................................................................................................................................ 614SRLC16E_1......................................................................................................................................... 617STARTUP_VIRTEX2 ........................................................................................................................... 620XORCY .............................................................................................................................................. 622XORCY_D.......................................................................................................................................... 624XORCY_L .......................................................................................................................................... 626

Libraries Guide

10.1 www.xilinx.com 5

Page 6: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

Libraries Guide

6 www.xilinx.com 10.1

Page 7: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About this GuideThis HDL guide is part of the ISE documentation collection. A separate version of this guide is available if youprefer to work with schematics.

This guide contains the following:

• Introduction.

• A list of design elements supported in this architecture, organized by functional categories.

• Individual descriptions of each available primitive.

About Design ElementsThis version of the Libraries Guide describes the primitives that comprise the Xilinx Unified Libraries for thisarchitecture, and includes examples of instantiation code for each element.

Primitives are Xilinx components that are native to the FPGA you are targeting. If you instantiate a primitive inyour design, after the translation process you will end up with the exact same component in the back end. Forexample, if you instantiate the Virtex-5 element known as ISERDES_NODELAY as a user primitive, after you runtranslate (ngdbuild) you will end up with an ISERDES_NODELAY in the back end as well. If you were usingISERDES in a Virtex-5 device, then this will automatically retarget to an ISERDES_NODELAY for Virtex-5 in theback end. Hence, this concept of a “primitive” differs from other uses of that term in this technology.

Xilinx maintains software libraries with hundreds of functional design elements (unimacros and primitives) fordifferent device architectures. New functional elements are assembled with each release of development systemsoftware. In addition to a comprehensive Unified Library containing all design elements, beginning in 2003,Xilinx developed a separate library for each architecture. This guide is one in a series of architecture-specificlibraries.

Design Entry MethodsFor each design element in this guide, Xilinx evaluates the four options and recommends what we believe is thebest solution for you. The four options are:

• Instantiation - This component can be instantiated directly into the design. This method is useful if you wantto control the exact placement of the individual blocks.

• Inference - This component can be inferred by most supported synthesis tools. You should use this method ifyou want to have complete flexibility and portability of the code to multiple architectures. Inference also givesthe tools the ability to optimize for performance, area, or power, as specified by the user to the synthesis tool.

• Coregen &Wizards - This component can be used through Coregen or Wizards. You should use this methodif you want to build large blocks of any FPGA primitive that cannot be inferred. When using this flow, youwill have to re-generate your cores for each architecture that you are targeting.

• Macro Support - This component has a UniMacro that can be used. These components are in the UniMacrolibrary in the Xilinx tool, and are used to instantiate primitives that are complex to instantiate by just usingthe primitives. The synthesis tools will automatically expand the unimacros to their underlying primitives.

Libraries Guide

10.1 www.xilinx.com 7

Page 8: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

Libraries Guide

8 www.xilinx.com 10.1

Page 9: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

Functional CategoriesThis section categorizes, by function, the circuit design elements described in detail later in this guide. Theelements (primitives and macros) are listed in alphanumeric order under each functional category.

Arithmetic Functions I/O Components Shift Register LUT

Clock Components RAM/ROM Slice/CLB Primitives

Config/BSCAN Components Registers & Latches

Arithmetic Functions

Design Element Description

MULT18X18 Primitive: 18 x 18 Signed Multiplier

MULT18X18S Primitive: 18 x 18 Signed Multiplier -- Registered Version

Clock Components

Design Element Description

BUFG Primitive: Global Clock Buffer

BUFGCE Primitive: Global Clock Buffer with Clock Enable

BUFGCE_1 Primitive: Global Clock Buffer with Clock Enable and Output State 1

BUFGMUX Primitive: Global Clock MUX Buffer

BUFGMUX_1 Primitive: Global Clock MUX Buffer with Output State 1

CLKDLL Primitive: Clock Delay Locked Loop

CLKDLLE Primitive: Clock Delay Locked Loop with Expanded Output

CLKDLLHF Primitive: High Frequency Clock Delay Locked Loop

DCM Primitive: Digital Clock Manager

IBUFG Primitive: Dedicated Input Clock Buffer

IBUFGDS Primitive: Differential Signaling Dedicated Input Clock Buffer and Optional Delay

Config/BSCAN Components

Design Element Description

BSCAN_VIRTEX2 Primitive: Virtex2 Boundary Scan Logic Control Circuit

CAPTURE_VIRTEX2 Primitive: Virtex4 Register State Capture for Bitstream Readback

ICAP_VIRTEX2 Primitive: User Interface to Virtex-II Internal Configuration Access Port

STARTUP_VIRTEX2 Primitive: Virtex-II, Virtex-II Pro, and Virtex-II User Interface to Global Clock, Reset,and 3-State Controls

Libraries Guide

10.1 www.xilinx.com 9

Page 10: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

Functional Categories

I/O Components

Design Element Description

IBUF Primitive: Input Buffer

IBUFDS Primitive: Differential Signaling Input Buffer with Optional Delay

IBUFG Primitive: Dedicated Input Clock Buffer

IBUFGDS Primitive: Differential Signaling Dedicated Input Clock Buffer and Optional Delay

IOBUF Primitive: Bi-Directional Buffer

IOBUFDS Primitive: 3-State Differential Signaling I/O Buffer with Active Low Output Enable

KEEPER Primitive: KEEPER Symbol

OBUF Primitive: Output Buffer

OBUFDS Primitive: Differential Signaling Output Buffer

OBUFT Primitive: 3-State Output Buffer with Active Low Output Enable

OBUFTDS Primitive: 3-State Output Buffer with Differential Signaling, Active-Low OutputEnable

PULLDOWN Primitive: Resistor to GND for Input Pads, Open-Drain, and 3-State Outputs

PULLUP Primitive: Resistor to VCC for Input PADs, Open-Drain, and 3-State Outputs

RAM/ROM

Design Element Description

RAM128X1S Primitive: 128-Deep by 1-Wide Static Synchronous RAM

RAM128X1S_1 Primitive: 128-Deep by 1-Wide Static Synchronous RAM with Negative-Edge Clock

RAM16X1D Primitive: 16-Deep by 1-Wide Static Dual Port Synchronous RAM

RAM16X1D_1 Primitive: 16-Deep by 1-Wide Static Dual Port Synchronous RAM with Negative-EdgeClock

RAM16X1S Primitive: 16-Deep by 1-Wide Static Synchronous RAM

RAM16X1S_1 Primitive: 16-Deep by 1-Wide Static Synchronous RAM with Negative-Edge Clock

RAM16X2S Primitive: 16-Deep by 2-Wide Static Synchronous RAM

RAM16X4S Primitive: 16-Deep by 4-Wide Static Synchronous RAM

RAM16X8S Primitive: 16-Deep by 8-Wide Static Synchronous RAM

RAM32X1D Primitive: 32-Deep by 1-Wide Static Dual Port Synchronous RAM

RAM32X1D_1 Primitive: 32-Deep by 1-Wide Static Dual Port Synchronous RAM with Negative-EdgeClock

RAM32X1S Primitive: 32-Deep by 1-Wide Static Synchronous RAM

RAM32X1S_1 Primitive: 32-Deep by 1-Wide Static Synchronous RAM with Negative-Edge Clock

RAM32X2S Primitive: 32-Deep by 2-Wide Static Synchronous RAM

RAM32X4S Primitive: 32-Deep by 4-Wide Static Synchronous RAM

RAM32X8S Primitive: 32-Deep by 8-Wide Static Synchronous RAM

RAM64X1D Primitive: 64-Deep by 1-Wide Dual Port Static Synchronous RAM

Libraries Guide

10 www.xilinx.com 10.1

Page 11: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

Functional Categories

Design Element Description

RAM64X1D_1 Primitive: 64-Deep by 1-Wide Dual Port Static Synchronous RAM with Negative-EdgeClock

RAM64X1S Primitive: 64-Deep by 1-Wide Static Synchronous RAM

RAM64X1S_1 Primitive: 64-Deep by 1-Wide Static Synchronous RAM with Negative-Edge Clock

RAM64X2S Primitive: 64-Deep by 2-Wide Static Synchronous RAM

RAMB16_S1 Primitive: 16K-bit Data and 2K-bit Parity Single-Port Synchronous Block RAM with1-bit Port

RAMB16_S1_S1 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with1-bit Ports

RAMB16_S1_S18 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with1-bit and 18-bit Ports

RAMB16_S1_S2 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with1-bit and 2-bit Ports

RAMB16_S1_S36 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with1-bit and 36-bit Ports

RAMB16_S1_S4 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with1-bit and 4-bit Ports

RAMB16_S1_S9 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with1-bit and 9-bit Ports

RAMB16_S18 Primitive: 16K-bit Data + 2K-bit Parity Memory, Single-Port Synchronous Block RAMwith 18-bit Port

RAMB16_S18_S18 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with18-bit Ports

RAMB16_S18_S36 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with18-bit and 36-bit Ports

RAMB16_S2 Primitive: 16K-bit Data and 2K-bit Parity Single-Port Synchronous Block RAM with2-bit Port

RAMB16_S2_S2 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with2-bit Ports

RAMB16_S2_S18 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with2-bit and 18-bit Ports

RAMB16_S2_S36 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with2-bit and 36-bit Ports

RAMB16_S2_S4 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with2-bit and 4-bit Ports

RAMB16_S2_S9 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with2-bit and 9-bit Ports

RAMB16_S36 Primitive: 16K-bit Data and 2K-bit Parity Single-Port Synchronous Block RAM with36-bit Port

RAMB16_S36_S36 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM withTwo 36-bit Ports

RAMB16_S4 Primitive: 16K-bit Data and 2K-bit Parity Single-Port Synchronous Block RAM with4-bit Port

RAMB16_S4_S18 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with4-bit and 18-bit Ports

RAMB16_S4_S36 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with4-bit and 36-bit Ports

Libraries Guide

10.1 www.xilinx.com 11

Page 12: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

Functional Categories

Design Element Description

RAMB16_S4_S4 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with4-bit Ports

RAMB16_S4_S9 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with4-bit and 9-bit Ports

RAMB16_S9 Primitive: 16K-bit Data and 2K-bit Parity Single-Port Synchronous Block RAM with9-bit Port

RAMB16_S9_S18 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with9-bit and 18-bit Ports

RAMB16_S9_S36 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with9-bit and 36-bit Ports

RAMB16_S9_S9 Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with9-bit Ports

RAMB4_S1 Primitive: 4K-bit Single-Port Synchronous Block RAM with Port Width Configured to1 Bit

RAMB4_S1_S1 Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to1-bit

RAMB4_S1_S16 Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configuredto 1-bit and 16-bits

RAMB4_S1_S2 Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configuredto 1-bit and 2-bits

RAMB4_S1_S4 Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configuredto 1-bit and 4-bits

RAMB4_S1_S8 Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configuredto 1-bit and 8-bits

RAMB4_S16 Primitive: 4096-Bit Single-Port Synchronous Block RAM with Port Width Configuredto 16 Bits

RAMB4_S16_S16 Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configuredto 16-bits

RAMB4_S2 Primitive: 4K-bit Single-Port Synchronous Block RAM with Port Width Configuredto 2-bits

RAMB4_S2_S16 Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to2-bits and 16-bits

RAMB4_S2_S2 Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configuredto 2-bits and 2-bits

RAMB4_S2_S4 Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configuredto 2-bits and 4-bits

RAMB4_S2_S8 Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configuredto 2-bits and 8-bits

RAMB4_S4 Primitive: 4k-bit Single-Port Synchronous Block RAM with Port Width Configuredto 4-bits

RAMB4_S4_S16 Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to4-bits and 16-bits

RAMB4_S4_S4 Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configuredto 4-bits and 4-bits

RAMB4_S4_S8 Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configuredto 4-bits and 8-bits

RAMB4_S8 Primitive: 4k-bit Single-Port Synchronous Block RAM with Port Width Configuredto 8-bits

Libraries Guide

12 www.xilinx.com 10.1

Page 13: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

Functional Categories

Design Element Description

RAMB4_S8_S16 Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to8-bits and 16-bits

RAMB4_S8_S8 Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configuredto 8-bits

ROM128X1 Primitive: 128-Deep by 1-Wide ROM

ROM16X1 Primitive: 16-Deep by 1-Wide ROM

ROM256X1 Primitive: 256-Deep by 1-Wide ROM

ROM32X1 Primitive: 32-Deep by 1-Wide ROM

ROM64X1 Primitive: 64-Deep by 1-Wide ROM

Registers & Latches

Design Element Description

FDCE Primitive: D Flip-Flop with Clock Enable and Asynchronous Clear

FDCE_1 Primitive: D Flip-Flop with Negative-Edge Clock, Clock Enable, and AsynchronousClear

FDCPE Primitive: D Flip-Flop with Clock Enable and Asynchronous Preset and Clear

FDCPE_1 Primitive: D Flip-Flop with Negative-Edge Clock, Clock Enable, and AsynchronousPreset and Clear

FDRSE Primitive: D Flip-Flop with Synchronous Reset and Set and Clock Enable

FDRSE_1 Primitive: D Flip-Flop with Negative-Clock Edge, Synchronous Reset and Set, andClock Enable

IFDDRCPE Primitive: Dual Data Rate Input D Flip-Flop with Clock Enable and AsynchronousPreset and Clear

IFDDRRSE Primitive: Dual Data Rate Input D Flip-Flop with Synchronous Reset and Set andClock Enable

LDCPE Primitive: Transparent Data Latch with Asynchronous Clear and Preset and GateEnable

OFDDRCPE Primitive: Dual Data Rate Output D Flip-Flop with Clock Enable and AsynchronousPreset and Clear

OFDDRRSE Primitive: Dual Data Rate Output D Flip-Flop with Synchronous Reset and Set andClock Enable

OFDDRTCPE Primitive: Dual Data Rate D Flip-Flop with Active-Low 3--State Output Buffer, ClockEnable, and Asynchro-nous Preset and Clear

OFDDRTRSE Primitive: Dual Data Rate D Flip-Flop with Active -Low 3-State Output Buffer,Synchronous Reset and Set, and Clock Enable

Shift Register LUT

Design Element Description

SRL16 Primitive: 16-Bit Shift Register Look-Up-Table (LUT)

SRL16_1 Primitive: 16-Bit Shift Register Look-Up-Table (LUT) with Negative-Edge Clock

Libraries Guide

10.1 www.xilinx.com 13

Page 14: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

Functional Categories

Design Element Description

SRL16E Primitive: 16-Bit Shift Register Look-Up-Table (LUT) with Clock Enable

SRL16E_1 Primitive: 16-Bit Shift Register Look-Up-Table (LUT) with Negative-Edge Clock andClock Enable

SRLC16 Primitive: 16-Bit Shift Register Look-Up Table (LUT) with Carry

SRLC16_1 Primitive: 16-Bit Shift Register Look-Up Table (LUT) with Carry and Negative-EdgeClock

SRLC16E Primitive: 16-Bit Shift Register Look-Up Table (LUT) with Carry and Clock Enable

SRLC16E_1 Primitive: 16-Bit Shift Register Look-Up Table (LUT) with Carry, Negative-Edge Clock,and Clock Enable

Slice/CLB Primitives

Design Element Description

BUFCF Primitive: Fast Connect Buffer

LUT1 Primitive: 1-Bit Look-Up-Table with General Output

LUT1_D Primitive: 1-Bit Look-Up-Table with Dual Output

LUT1_L Primitive: 1-Bit Look-Up-Table with Local Output

LUT2 Primitive: 2-Bit Look-Up-Table with General Output

LUT2_D Primitive: 2-Bit Look-Up-Table with Dual Output

LUT2_L Primitive: 2-Bit Look-Up-Table with Local Output

LUT3 Primitive: 3-Bit Look-Up-Table with General Output

LUT3_D Primitive: 3-Bit Look-Up-Table with Dual Output

LUT3_L Primitive: 3-Bit Look-Up-Table with Local Output

LUT4 Primitive: 4-Bit Look-Up-Table with General Output

LUT4_D Primitive: 4-Bit Look-Up-Table with Dual Output

LUT4_L Primitive: 4-Bit Look-Up-Table with Local Output

MULT_AND Primitive: Fast Multiplier AND

MUXCY Primitive: 2-to-1 Multiplexer for Carry Logic with General Output

MUXCY_D Primitive: 2-to-1 Multiplexer for Carry Logic with Dual Output

MUXCY_L Primitive: 2-to-1 Multiplexer for Carry Logic with Local Output

MUXF5 Primitive: 2-to-1 Look-Up Table Multiplexer with General Output

MUXF5_D Primitive: 2-to-1 Look-Up Table Multiplexer with Dual Output

MUXF5_L Primitive: 2-to-1 Look-Up Table Multiplexer with Local Output

MUXF6 Primitive: 2-to-1 Look-Up Table Multiplexer with General Output

MUXF6_D Primitive: 2-to-1 Look-Up Table Multiplexer with Dual Output

MUXF6_L Primitive: 2-to-1 Look-Up Table Multiplexer with Local Output

MUXF7 Primitive: 2-to-1 Look-Up Table Multiplexer with General Output

MUXF7_D Primitive: 2-to-1 Look-Up Table Multiplexer with Dual Output

MUXF7_L Primitive: 2-to-1 Look-Up Table Multiplexer with Local Output

Libraries Guide

14 www.xilinx.com 10.1

Page 15: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

Functional Categories

Design Element Description

MUXF8 Primitive: 2-to-1 Look-Up Table Multiplexer with General Output

MUXF8_D Primitive: 2-to-1 Look-Up Table Multiplexer with Dual Output

MUXF8_L Primitive: 2-to-1 Look-Up Table Multiplexer with Local Output

ORCY Primitive: OR with Carry Logic

XORCY Primitive: XOR for Carry Logic with General Output

XORCY_D Primitive: XOR for Carry Logic with Dual Output

XORCY_L Primitive: XOR for Carry Logic with Local Output

Libraries Guide

10.1 www.xilinx.com 15

Page 16: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

Libraries Guide

16 www.xilinx.com 10.1

Page 17: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design ElementsThis section describes the design elements that can be used with this architecture. The design elements areorganized alphabetically.

The following information is provided for each design element, where applicable:

• Name of element

• Brief description

• Schematic symbol (if any)

• Logic table (if any)

• Port descriptions

• Design Entry Method

• Available attributes (if any)

• Example instantiation code

• For more information

Libraries Guide

10.1 www.xilinx.com 17

Page 18: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

BSCAN_VIRTEX2Primitive: Virtex2 Boundary Scan Logic Control Circuit

IntroductionThis design element provides access to the BSCAN sites on a Virtex-II, Virtex-II Pro, or Virtex-II Pro X device. Itis used to create internal boundary scan chains. The 4-pin JTAG interface (TDI, TDO, TCK, and TMS) arededicated pins in Virtex-II, Virtex-II Pro, and Virtex-II Pro X. To use normal JTAG for boundary scan purposes,just hook up the JTAG pins to the port and go. The pins on the this design element do not need to be connected,unless those special functions are needed to drive an internal scan chain.

A signal on the TDO1 input is passed to the external TDO output when the USER1 instruction is executed; theSEL1 output goes High to indicate that the USER1 instruction is active. The DRCK1 output provides USER1access to the data register clock (generated by the TAP controller). The TDO2 and SEL2 pins perform a similarfunction for the USER2 instruction and the DRCK2 output provides USER2 access to the data register clock(generated by the TAP controller). The RESET, UPDATE, SHIFT, and CAPTURE pins represent the decoding ofthe corresponding state of the boundary scan internal state machine. The TDI pin provides access to the TDIsignal of the JTAG port in order to shift data into an internal scan chain.

Note For specific information on boundary scan for an architecture, see The Programmable Logic Data Sheets

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- BSCAN_VIRTEX2: Boundary Scan primitive for connecting internal logic to-- JTAG interface. Virtex-II/II-Pro-- Xilinx HDL Libraries Guide, version 10.1.2

Libraries Guide

18 www.xilinx.com 10.1

Page 19: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

BSCAN_VIRTEX2_inst : BSCAN_VIRTEX2port map (CAPTURE => CAPTURE, -- CAPTURE output from TAP controllerDRCK1 => DRCK1, -- Data register output for USER1 functionsDRCK2 => DRCK2, -- Data register output for USER2 functionsRESET => RESET, -- Reset output from TAP controllerSEL1 => SEL1, -- USER1 active outputSEL2 => SEL2, -- USER2 active outputSHIFT => SHIFT, -- SHIFT output from TAP controllerTDI => TDI, -- TDI output from TAP controllerUPDATE => UPDATE, -- UPDATE output from TAP controllerTDO1 => TDO1, -- Data input for USER1 functionTDO2 => TDO2 -- Data input for USER2 function);

-- End of BSCAN_VIRTEX2_inst instantiation

Verilog Instantiation Template// BSCAN_VIRTEX2: Boundary Scan primitive for connecting internal logic to// JTAG interface. Virtex-II/II-Pro// Xilinx HDL Libraries Guide, version 10.1.2

BSCAN_VIRTEX2 BSCAN_VIRTEX2_inst (.CAPTURE(CAPTURE), // CAPTURE output from TAP controller.DRCK1(DRCK1), // Data register output for USER1 functions.DRCK2(DRCK2), // Data register output for USER2 functions.RESET(RESET), // Reset output from TAP controller.SEL1(SEL1), // USER1 active output.SEL2(SEL2), // USER2 active output.SHIFT(SHIFT), // SHIFT output from TAP controller.TDI(TDI), // TDI output from TAP controller.UPDATE(UPDATE), // UPDATE output from TAP controller.TDO1(TDO1), // Data input for USER1 function.TDO2(TDO2) // Data input for USER2 function);

// End of BSCAN_VIRTEX2_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 19

Page 20: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

BUFCFPrimitive: Fast Connect Buffer

IntroductionThis design element is a single fast connect buffer used to connect the outputs of the LUTs and some dedicatedlogic directly to the input of another LUT. Using this buffer implies CLB packing. No more than four LUTsmay be connected together as a group.

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- BUFCF: Fast connect buffer used to connect the outputs of the LUTs-- and some dedicated logic directly to the input of another LUT.-- For use with all FPGAs.-- Xilinx HDL Libraries Guide, version 10.1.2

BUFCF_inst: BUFCF (port map (O => O, -- Connect to the output of a LUTI => I -- Connect to the input of a LUT);

-- End of BUFCF_inst instantiation

Verilog Instantiation Template// BUFCF: Fast connect buffer used to connect the outputs of the LUTs// and some dedicated logic directly to the input of another LUT.// For use with all FPGAs.// Xilinx HDL Libraries Guide, version 10.1.2

BUFCF BUFCF_inst (.O(O), // Connect to the output of a LUT.I(I) // Connect to the input of a LUT);

// End of BUFCF_inst instantiation

Libraries Guide

20 www.xilinx.com 10.1

Page 22: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

BUFGPrimitive: Global Clock Buffer

IntroductionThis design element is a high-fanout buffer that connects signals to the global routing resources for low skewdistribution of the signal. BUFGs are typically used on clock nets as well other high fanout nets like sets/resetsand clock enables.

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- BUFG: Global Clock Buffer (source by an internal signal)-- All Devices-- Xilinx HDL Libraries Guide, version 10.1.2

BUFG_inst : BUFGport map (O => O, -- Clock buffer outputI => I -- Clock buffer input);

-- End of BUFG_inst instantiation

Verilog Instantiation Template// BUFG: Global Clock Buffer (source by an internal signal)// All FPGAs// Xilinx HDL Libraries Guide, version 10.1.2

BUFG BUFG_inst (.O(O), // Clock buffer output.I(I) // Clock buffer input);

// End of BUFG_inst instantiation

Libraries Guide

22 www.xilinx.com 10.1

Page 24: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

BUFGCE

Primitive: Global Clock Buffer with Clock Enable

IntroductionThis design element is a global clock buffer with a single gated input. Its O output is "0" when clock enable (CE)is Low (inactive). When clock enable (CE) is High, the I input is transferred to the O output.

Logic TableInputs Outputs

I CE O

X 0 0

I 1 I

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- BUFGCE: Global Clock Buffer with Clock Enable (active high)-- Virtex-II/II-Pro/4/5, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

BUFGCE_inst : BUFGCEport map (O => O, -- Clock buffer ouptputCE => CE, -- Clock enable inputI => I -- Clock buffer input);

-- End of BUFGCE_inst instantiation

Libraries Guide

24 www.xilinx.com 10.1

Page 25: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Verilog Instantiation Template// BUFGCE: Global Clock Buffer with Clock Enable (active high)// Virtex-II/II-Pro/4/5, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

BUFGCE BUFGCE_inst (.O(O), // Clock buffer output.CE(CE), // Clock enable input.I(I) // Clock buffer input);

// End of BUFGCE_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 25

Page 26: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

BUFGCE_1

Primitive: Global Clock Buffer with Clock Enable and Output State 1

IntroductionThis design element is a multiplexed global clock buffer with a single gated input. Its O output is High (1) whenclock enable (CE) is Low (inactive). When clock enable (CE) is High, the I input is transferred to the O output.

Logic TableInputs Outputs

I CE O

X 0 1

I 1 I

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- BUFGCE_1: Global Clock Buffer with Clock Enable (active low)-- Virtex-II/II-Pro/4/5, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

BUFGCE_1_inst : BUFGCE_1port map (O => O, -- Clock buffer ouptputCE => CE, -- Clock enable inputI => I -- Clock buffer input);

-- End of BUFGCE_1_inst instantiation

Libraries Guide

26 www.xilinx.com 10.1

Page 27: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Verilog Instantiation Template// BUFGCE_1: Global Clock Buffer with Clock Enable (active low)// Virtex-II/II-Pro, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

BUFGCE_1 BUFGCE_1_inst (.O(O), // Clock buffer output.CE(CE), // Clock enable input.I(I) // Clock buffer input);

// End of BUFGCE_1_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 27

Page 28: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

BUFGMUXPrimitive: Global Clock MUX Buffer

IntroductionBUFGMUX is a multiplexed global clock buffer, based off of the BUFGCTRL, that can select between two inputclocks: I0 and I1. When the select input (S) is Low, the signal on I0 is selected for output (O). When the selectinput (S) is High, the signal on I1 is selected for output.

BUFGMUX and BUFGMUX_1 are distinguished by the state the output assumes when that output switchesbetween clocks in response to a change in its select input. BUGFMUX assumes output state 0 and BUFGMUX_1assumes output state 1.

Note BUFGMUX guarantees that when S is toggled, the state of the output remains in the inactive state untilthe next active clock edge (either I0 or I1) occurs.

Logic TableInputs Outputs

I0 I1 S O

I0 X 0 I0

X I1 1 I1

X X ↑ 0

X X ↓ 0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- BUFGMUX: Global Clock Buffer 2-to-1 MUX-- Virtex-II/II-Pro/4/5, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

BUFGMUX_inst : BUFGMUXport map (O => O, -- Clock MUX output

Libraries Guide

28 www.xilinx.com 10.1

Page 29: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

I0 => I0, -- Clock0 inputI1 => I1, -- Clock1 inputS => S -- Clock select input);

-- End of BUFGMUX_inst instantiation

Verilog Instantiation Template// BUFGMUX: Global Clock Buffer 2-to-1 MUX// Virtex-II/II-Pro/4/5, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

BUFGMUX BUFGMUX_inst (.O(O), // Clock MUX output.I0(I0), // Clock0 input.I1(I1), // Clock1 input.S(S) // Clock select input);

// End of BUFGMUX_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 29

Page 30: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

BUFGMUX_1Primitive: Global Clock MUX Buffer with Output State 1

IntroductionThis design element is a multiplexed global clock buffer that can select between two input clocks: I0 and I1.When the select input (S) is Low, the signal on I0 is selected for output (0). When the select input (S) is High, thesignal on I1 is selected for output.

This design element is distinguished from BUFGMUX by the state the output assumes when that output switchesbetween clocks in response to a change in its select input. BUFGMUX assumes output state 0 and BUFGMUX_1assumes output state 1.

Logic TableInputs Outputs

I0 I1 S O

I0 X 0 I0

X I1 1 I1

X X ↑ 1

X X ↓ 1

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- BUFGMUX_1: Global Clock Buffer 2-to-1 MUX (inverted select)-- Virtex-II/II-Pro, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

BUFGMUX_1_inst : BUFGMUX_1port map (O => O, -- Clock MUX outputI0 => I0, -- Clock0 inputI1 => I1, -- Clock1 inputS => S -- Clock select input

Libraries Guide

30 www.xilinx.com 10.1

Page 31: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

);

-- End of BUFGMUX_1_inst instantiation

Verilog Instantiation Template// BUFGMUX_1: Global Clock Buffer 2-to-1 MUX (inverted select)// Virtex-II/II-Pro, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

BUFGMUX_1 BUFGMUX_1_inst (.O(O), // Clock MUX output.I0(I0), // Clock0 input.I1(I1), // Clock1 input.S(S) // Clock select input);

// End of BUFGMUX_1_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 31

Page 32: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

CAPTURE_VIRTEX2

Primitive: Virtex4 Register State Capture for Bitstream Readback

IntroductionThis element provides user control and synchronization over when and how the capture register (flip-flop andlatch) information task is requested. The readback function is provided through dedicated configuration portinstructions. However, without this element, the readback data is synchronized to the configuration clock.Only register (flip-flop and latch) states can be captured. Although LUT RAM, SRL, and block RAM statesare readback, they cannot be captured.

An asserted high CAP signal indicates that the registers in the device are to be captured at the next Low-to-Highclock transition. By default, data is captured after every trigger when transition on CLK while CAP is asserted.To limit the readback operation to a single data capture, add the ONESHOT=TRUE attribute to this element.

Port DescriptionsPort Direction Width Function

CAP Input 1 Readback capture trigger

CLK Input 1 Readback capture clock

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

Connect all inputs and outputs to the design in order to ensure proper operation.

Available Attributes

Attribute Type Allowed Values Default Description

ONESHOT Boolean TRUE, FALSE TRUE Specifies the procedure for performing single readback perCAP trigger.

Libraries Guide

32 www.xilinx.com 10.1

Page 33: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- CAPTURE_VIRTEX2: Register State Capture for Bitstream Readback-- Virtex-II/II-Pro-- Xilinx HDL Libraries Guide, version 10.1.2

CAPTURE_VIRTEX2_inst : CAPTURE_VIRTEX2port map (CAP => CAP, -- Capture inputCLK => CLK -- Clock input);

-- End of CAPTURE_VIRTEX2_inst instantiation

Verilog Instantiation Template// CAPTURE_VIRTEX2: Register State Capture for Bitstream Readback// Virtex-II/II-Pro// Xilinx HDL Libraries Guide, version 10.1.2

CAPTURE_VIRTEX2 CAPTURE_VIRTEX2_inst (.CAP(CAP), // Capture input.CLK(CLK) // Clock input);

// End of CAPTURE_VIRTEX2_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 33

Page 34: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

CLKDLLPrimitive: Clock Delay Locked Loop

IntroductionThis design element is a clock delay locked loop used to minimize clock skew. It synchronizes the clock signal atthe feedback clock input (CLKFB) to the clock signal at the input clock (CLKIN). The locked output (LOCKED) ishigh when the two signals are in phase. The signals are considered to be in phase when their rising edges arewithin a specific range of each other (see The Programmable Logic Data Sheets for the most current value).

The frequency of the clock signal at the CLKIN input must be in a specific range depending on speed grade (seeThe Programmable Logic Data Sheets for the most current values). The CLKIN pin must be driven by an IBUFGor a BUFG. If phase alignment is not required, CLKIN can also be driven by IBUF.

On-chip synchronization is achieved by connecting the CLKFB input to a point on the global clock networkdriven by a BUFG, a global clock buffer. The BUFG connected to the CLKFB input of the CLKDLL must besourced from either the CLK0 or CLK2X outputs of the same CLKDLL. The CLKIN input should be connected tothe output of an IBUFG, with the IBUFG input connected to a pad driven by the system clock.

Off-chip synchronization is achieved by connecting the CLKFB input to the output of an IBUFG, with the IBUFGinput connected to a pad. Either the CLK0 or CLK2X output can be used but not both. The CLK0 or CLK2X mustbe connected to the input of OBUF, an output buffer.

The duty cycle of the CLK0 output is 50-50 unless the DUTY_CYCLE_CORRECTION attribute is set to FALSE, inwhich case the duty cycle is the same as that of the CLKIN input. The duty cycle of the phase shifted outputs(CLK90, CLK180, and CLK270) is the same as that of the CLK0 output. The duty cycle of the CLK2X andCLKDV outputs is always 50-50. The frequency of the CLKDV output is determined by the value assigned tothe CLKDV_DIVIDE attribute.

The master reset input (RST) resets CLKDLL to its initial (power-on) state. The signal at the RST input isasynchronous and must be held High for just 2ns.

Port DescriptionsPort Function

CLK0 Clock at 1x CLKIN frequency

CLK180 Clock at 1x CLKIN frequency, shifted 180 o with regards to CLK0

CLK270 Clock at 1x CLKIN frequency, shifted 270 o with regards to CLK0

CLK2X Clock at 2x CLKIN frequency, in phase with CLK0

CLK90 Clock at 1x CLKIN frequency, shifted 90 o with regards to CLK0

CLKDV Clock at (1/n)x CLKIN frequency, n=CLKDV_DIVIDE value. CLKDV is in phase with CLK0.

LOCKED CLKDLL locked

Note See the "PERIOD Specifications on CLKDLLs and DCM" in the Constraints Guide for additionalinformation on using the TNM, TNM_NET, and PERIOD attributes with CLKDLL components.

Libraries Guide

34 www.xilinx.com 10.1

Page 35: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- CLKDLL: Delay Locked Loop Circuit for Virtex and Spartan-II (Low frequency)-- Xilinx HDL Libraries Guide, version 10.1.2

CLKDLL_inst : CLKDLLgeneric map (CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,4.0,5.0,8.0 or 16.0DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSEFACTORY_JF => X"C080", -- FACTORY JF ValuesSTARTUP_WAIT => FALSE) -- Delay config DONE until DLL LOCK, TRUE/FALSEport map (CLK0 => CLK0, -- 0 degree DLL CLK ouptputCLK180 => CLK180, -- 180 degree DLL CLK outputCLK270 => CLK270, -- 270 degree DLL CLK outputCLK2X => CLK2X, -- 2X DLL CLK outputCLK90 => CLK90, -- 90 degree DLL CLK outputCLKDV => CLKDV, -- Divided DLL CLK out (CLKDV_DIVIDE)LOCKED => LOCKED, -- DLL LOCK status outputCLKFB => CLKFB, -- DLL clock feedbackCLKIN => CLKIN, -- Clock input (from IBUFG, BUFG or DLL)RST => RST -- DLL asynchronous reset input);

-- End of CLKDLL_inst instantiation

Verilog Instantiation Template// CLKDLL: Delay Locked Loop Circuit for Virtex and Spartan-II (Low frequency)// Xilinx HDL Libraries Guide, version 10.1.2

CLKDLL #(.CLKDV_DIVIDE(2.0), // Divide by: 1.5,2.0,2.5,3.0,4.0,5.0,8.0 or 16.0.DUTY_CYCLE_CORRECTION("TRUE"), // Duty cycle correction, TRUE or FALSE.FACTORY_JF(16’hC080), // FACTORY JF Values.STARTUP_WAIT("FALSE") // Delay config DONE until DLL LOCK, TRUE/FALSE) CLKDLL_inst (.CLK0(CLK0), // 0 degree DLL CLK output.CLK180(CLK180), // 180 degree DLL CLK output.CLK270(CLK270), // 270 degree DLL CLK output.CLK2X(CLK2X), // 2X DLL CLK output.CLK90(CLK90), // 90 degree DLL CLK output.CLKDV(CLKDV), // Divided DLL CLK out (CLKDV_DIVIDE).LOCKED(LOCKED), // DLL LOCK status output.CLKFB(CLKFB), // DLL clock feedback.CLKIN(CLKIN), // Clock input (from IBUFG, BUFG or DLL).RST(RST) // DLL asynchronous reset input

Libraries Guide

10.1 www.xilinx.com 35

Page 36: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

);

// End of CLKDLL_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

36 www.xilinx.com 10.1

Page 37: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

CLKDLLEPrimitive: Clock Delay Locked Loop with Expanded Output

IntroductionThis design element is a clock delay locked loop used to minimize clock skew. It synchronizes the clock signal atthe feedback clock input (CLKFB) to the clock signal at the input clock (CLKIN). The locked output (LOCKED) ishigh when the two signals are in phase. The signals are considered to be in phase when their rising edges arewithin a specific range of each other (see The Programmable Logic Data Sheets for the most current value).

The frequency of the clock signal at the CLKIN input must be in a specific range depending on speed grade(see The Programmable Logic Data Sheets for the most current values). The CLKIN pin must be driven by anIBUFG or a BUFG.

On-chip synchronization is achieved by connecting the CLKFB input to a point on the global clock networkdriven by a BUFG, a global clock buffer. The BUFG input can only be connected to the CLK0 or CLK2X output ofCLKDLLE. The BUFG connected to the CLKFB input of the CLKDLLE must be sourced from either the CLK0or CLK2X outputs of the same CLKDLLE. The CLKIN input should be connected to the output of an IBUFG,with the IBUFG input connected to a pad driven by the system clock.

Off-chip synchronization is achieved by connecting the CLKFB input to the output of an IBUFG, with the IBUFGinput connected to a pad. Either the CLK0 or CLK2X output can be used but not both. The CLK0 or CLK2X mustbe connected to the input of OBUF, an output buffer.

The duty cycle of the CLK0 output is 50-50 unless the DUTY_CYCLE_CORRECTION attribute is set to FALSE, inwhich case the duty cycle is the same as that of the CLKIN input. The duty cycle of the phase shifted outputs(CLK90, CLK180, and CLK270) is the same as that of the CLK0 output. The duty cycle of the CLK2X andCLKDV outputs is always 50-50. The frequency of the CLKDV output is determined by the value assigned tothe CLKDV_DIVIDE attribute.

The master reset input (RST) resets CLKDLL to its initial (power-on) state. The signal at the RST input isasynchronous and must be held High for just 2ns.

Port DescriptionsPort Function

CLK0 Clock at 1x CLKIN frequency

CLK180 Clock at 1x CLK0 frequency, shifted 180 o with regards to CLK0

CLK270 Clock at 1x CLK0 frequency, shifted 270 o with regards to CLK0

CLK2X Clock at 2x CLK0 frequency, in phase with CLK0

Libraries Guide

10.1 www.xilinx.com 37

Page 38: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Port Function

CLK2X180 Clock at 1x CLK2X frequency shifted 180 o with regards to CLK2X

CLK90 Clock at 1x CLK0 frequency, shifted 90 o with regards to CLK0

CLKDV Clock at (1/n) x CLK0 frequency, where n=CLKDV_DIVIDE value. CLKDV is in phase withCLK0.

LOCKED CLKDLLE locked. CLKIN and CLKFB synchronized.

Note See the "PERIOD Specifications on CLKDLLs and DCM" in the Constraints Guide for additionalinformation on using the TNM, TNM_NET, and PERIOD attributes with CLKDLLE components.

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- CLKDLLE: Delay Locked Loop Circuit for VirtexE and Spartan-IIE (Low frequency)-- Xilinx HDL Libraries Guide, version 10.1.2

CLKDLLE_inst : CLKDLLEgeneric map (CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,4.0,5.0,8.0 or 16.0DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSEFACTORY_JF => X"C080", -- FACTORY JF ValuesSTARTUP_WAIT => FALSE) -- Delay config DONE until DLL LOCK, TRUE/FALSEport map (CLK0 => CLK0, -- 0 degree DLL CLK ouptputCLK180 => CLK180, -- 180 degree DLL CLK outputCLK270 => CLK270, -- 270 degree DLL CLK outputCLK2X => CLK2X, -- 2X DLL CLK outputCLK90 => CLK90, -- 90 degree DLL CLK outputCLKDV => CLKDV, -- Divided DLL CLK out (CLKDV_DIVIDE)LOCKED => LOCKED, -- DLL LOCK status outputCLKFB => CLKFB, -- DLL clock feedbackCLKIN => CLKIN, -- Clock input (from IBUFG, BUFG or DLL)RST => RST -- DLL asynchronous reset input);

-- End of CLKDLLE_inst instantiation

Verilog Instantiation Template// CLKDLLE: Delay Locked Loop Circuit for VirtexE and Spartan-IIE (Low frequency)// Xilinx HDL Libraries Guide, version 10.1.2

CLKDLLE #(.CLKDV_DIVIDE(2.0), // Divide by: 1.5,2.0,2.5,3.0,4.0,5.0,8.0 or 16.0.DUTY_CYCLE_CORRECTION("TRUE"), // Duty cycle correction, TRUE or FALSE.FACTORY_JF(16’hC080), // FACTORY JF Values

Libraries Guide

38 www.xilinx.com 10.1

Page 39: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.STARTUP_WAIT("FALSE") // Delay config DONE until DLL LOCK, TRUE/FALSE) CLKDLLE_inst (.CLK0(CLK0), // 0 degree DLL CLK output.CLK180(CLK180), // 180 degree DLL CLK output.CLK270(CLK270), // 270 degree DLL CLK output.CLK2X(CLK2X), // 2X DLL CLK output.CLK90(CLK90), // 90 degree DLL CLK output.CLKDV(CLKDV), // Divided DLL CLK out (CLKDV_DIVIDE).LOCKED(LOCKED), // DLL LOCK status output.CLKFB(CLKFB), // DLL clock feedback.CLKIN(CLKIN), // Clock input (from IBUFG, BUFG or DLL).RST(RST) // DLL asynchronous reset input);

// End of CLKDLLE_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 39

Page 40: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

CLKDLLHF

Primitive: High Frequency Clock Delay Locked Loop

IntroductionThis design element is a high frequency clock delay locked loop used to minimize clock skew. It synchronizesthe clock signal at the feedback clock input (CLKFB) to the clock signal at the input clock (CLKIN). The lockedoutput (LOCKED) is high when the two signals are in phase. The signals are considered to be in phase whentheir rising edges are within a specific range of each other (see The Programmable Logic Data Sheets for themost current value).

The frequency of the clock signal at the CLKIN input must be in a specific range depending on speed grade(see The Programmable Logic Data Sheets for the most current values). The CLKIN pin must be driven by anIBUFG or a BUFG.

On-chip synchronization is achieved by connecting the CLKFB input to a point on the global clock networkdriven by a BUFG, a global clock buffer. The BUFG input can only be connected to the CLK0 output ofCLKDLLHF. The BUFG connected to the CLKFB input of the CLKDLLHF must be sourced from the CLK0 outputof the same CLKDLLHF. The CLKIN input should be connected to the output of an IBUFG, with the IBUFGinput connected to a pad driven by the system clock.

Off-chip synchronization is achieved by connecting the CLKFB input to the output of an IBUFG, with theIBUFG input connected to a pad. Only the CLK0 output can be used. CLK0 must be connected to the input ofOBUF, an output buffer.

The duty cycle of the CLK0 output is 50-50 unless the DUTY_CYCLE_CORRECTION attribute is set to FALSE, inwhich case the duty cycle is the same as that of the CLKIN input. The duty cycle of the phase shifted output(CLK180) is the same as that of the CLK0 output. The frequency of the CLKDV output is determined by the valueassigned to the CLKDV_DIVIDE attribute.

The master reset input (RST) resets CLKDLL to its initial (power-on) state. The signal at the RST input isasynchronous and must be held High for just 2ns.

Port DescriptionsOutput Function

CLK0 Clock at 1x CLKIN frequency

CLK180 Clock at 1x CLKIN frequency, shifted 180o with regards to CLK0

CLKDV Clock at (1/n)x CLKIN frequency, n=CLKDV_DIVIDE value. CLKDV is in phase with CLK0.

LOCKED CLKDLLHF locked

Note See the "PERIOD Specifications on CLKDLLs and DCM" section of the "Xilinx Constraints P" chapterin the Constraints Guide for additional information on using the TNM, TNM_NET, and PERIOD attributeswith CLKDLLHF components.

Libraries Guide

40 www.xilinx.com 10.1

Page 41: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- CLKDLLHF: Delay Locked Loop Circuit for Virtex/E and Spartan-II/IIE (High frequency)-- Xilinx HDL Libraries Guide, version 10.1.2

CLKDLLHF_inst : CLKDLLHFgeneric map (CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,4.0,5.0,8.0 or 16.0DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correct, TRUE or FALSEFACTORY_JF => X"C080", -- FACTORY JF ValuesSTARTUP_WAIT => FALSE) -- Delay config DONE until DLL LOCK, TRUE/FALSEport map (CLK0 => CLK0, -- 0 degree DLL CLK ouptputCLK180 => CLK180, -- 180 degree DLL CLK outputCLKDV => CLKDV, -- Divided DLL CLK out (CLKDV_DIVIDE)LOCKED => LOCKED, -- DLL LOCK status outputCLKFB => CLKFB, -- DLL clock feedbackCLKIN => CLKIN, -- Clock input (from IBUFG, BUFG or DLL)RST => RST -- DLL asynchronous reset input);

-- End of CLKDLLHF_inst instantiation

Verilog Instantiation Template// CLKDLLHF: Delay Locked Loop Circuit for Virtex/E and Spartan-II/IIE (High frequency)// Xilinx HDL Libraries Guide, version 10.1.2

CLKDLLHF #(.CLKDV_DIVIDE(2.0), // Divide by: 1.5,2.0,2.5,3.0,4.0,5.0,8.0 or 16.0.DUTY_CYCLE_CORRECTION("TRUE"), // Duty cycle correct, TRUE or FALSE.FACTORY_JF(16’hC080), // FACTORY JF Values.STARTUP_WAIT("FALSE") // Delay config DONE until DLL LOCK, TRUE/FALSE) CLKDLLHF_inst (.CLK0(CLK0), // 0 degree DLL CLK output.CLK180(CLK180), // 180 degree DLL CLK output.CLKDV(CLKDV), // Divided DLL CLK out (CLKDV_DIVIDE).LOCKED(LOCKED), // DLL LOCK status output.CLKFB(CLKFB), // DLL clock feedback.CLKIN(CLKIN), // Clock input (from IBUFG, BUFG or DLL).RST(RST) // DLL asynchronous reset input);

// End of CLKDLLHF_inst instantiation

Libraries Guide

10.1 www.xilinx.com 41

Page 43: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

DCMPrimitive: Digital Clock Manager

IntroductionThis design element is a digital clock manager that provides multiple functions. It can implement a clock delaylocked loop, a digital frequency synthesizer, digital phase shifter, and a digital spread spectrum.

Note All unused inputs must be driven Low. The program will automatically tie the inputs Low if theyare unused.

Clock Delay Locked Loop (DLL)

DCM includes a clock delay locked loop used to minimize clock skew for Spartan-3, Virtex-II, Virtex-II Pro, andVirtex-II Pro X devices. DCM synchronizes the clock signal at the feedback clock input (CLKFB) to the clocksignal at the input clock (CLKIN). The locked output (LOCKED) is high when the two signals are in phase. Thesignals are considered to be in phase when their rising edges are within a specified time (ps) of each other.

DCM supports two frequency modes for the DLL. By default, the DLL_FREQUENCY_MODE attribute is set toLow and the frequency of the clock signal at the CLKIN input must be in the Low (DLL_CLKIN_MIN_LF toDLL_CLKIN_MAX_LF) frequency range (MHz). In Low frequency mode, the CLK0, CLK90, CLK180, CLK270,CLK2X, CLKDV, and CLK2X180 outputs are available.

For up to and including Virtex-II Pro, you get only CLK0, CLK180, CLKDV, CLKFX and CLKFX180 in the HFmode. In Virtex-4, you get all outputs.

When the DLL_FREQUENCY_MODE attribute is set to High, the frequency of the clock signal at the CLKINinput must be in the High (DLL_CLKIN_MIN_HF to DLL_CLKIN_MAX_HF) frequency range (MHz). In Highfrequency mode, only the CLK0, CLK180, and CLKDV outputs are available.

On-chip synchronization is achieved by connecting the CLKFB input to a point on the global clock networkdriven by a BUFG, a global clock buffer. The BUFG connected to the CLKFB input of the DCM must be sourcedfrom either the CLK0 or CLK2X outputs of the same DCM. The CLKIN input should be connected to the outputof an IBUFG, with the IBUFG input connected to a pad driven by the system clock. Off-chip synchronization isachieved by connecting the CLKFB input to the output of an IBUFG, with the IBUFG input connected to a pad.Either the CLK0 or CLK2X output can be used but not both. The CLK0 or CLK2X must be connected to the inputof OBUF, an output buffer. The CLK_FEEDBACK attribute controls whether the CLK0 output, the default, orthe CLK2X output is the source of the CLKFB input.

Libraries Guide

10.1 www.xilinx.com 43

Page 44: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The duty cycle of the CLK0 output is 50-50 unless the DUTY_CYCLE_CORRECTION attribute is set to FALSE, inwhich case the duty cycle is the same as that of the CLKIN input. The duty cycle of the phase shifted outputs(CLK90, CLK180, and CLK270) is the same as that of the CLK0 output. The duty cycle of the CLK2X, CLK2X180,and CLKDV outputs is 50-50 unless CLKDV_DIVIDE is a non-integer and the DLL_FREQUENCY_MODEis High (see CLKDV_DIVIDE, in the Constraints Guide for details). The frequency of the CLKDV output isdetermined by the value assigned to the CLKDV_DIVIDE attribute

DCM Clock Delay Lock Loop Outputs

Output Description

CLK0 Clock at 1x CLKIN frequency

CLK180 Clock at 1x CLK0 frequency, shifted 180o with regards to CLK0

CLK270* Clock at 1x CLK0 frequency, shifted 270o with regards to CLK0

CLK2X* Clock at 2x CLK0 frequency, in phase with CLK0

CLK2X180* Clock at 2x CLK0 frequency shifted 180o with regards to CLK2X

CLK90* Clock at 1x CLK0 frequency, shifted 90o with regards to CLK0

CLKDV Clock at (1/n) x CLK0 frequency, where n=CLKDV_DIVIDE value. CLKDV is inphase with CLK0.

LOCKED All enabled DCM features locked.

* The CLK90, CLK270, CLK2X, and CLK2X180 outputs are not available if the DLL_FREQUENCY_MODE is set to High.

Digital Frequency Synthesizer (DFS)

The CLKFX and CLKFX180 outputs in conjunction with the CLKFX_MULTIPLY and CLKFX_DIVIDE attributesprovide a frequency synthesizer that can be any multiple or division of CLKIN. CLKFX and CLKIN are in phaseevery CLKFX_MULTIPLY cycles of CLKFX and every CLKFX_DIVIDE cycles of CLKIN when a feedback isprovided to the CLKFB input of the DLL. The frequency of CLKFX is defined by the following equation.FrequencyCLKFX= (CLKFX_MULTIPLY_value/CLKFX_DIVIDE_value) * FrequencyCLKIN

Both the CLKFX or CLKFX180 output can be used simultaneously. CLKFX180 is 1x the CLKFX frequency,shifted 180o with regards to CLKFX. CLKFX and CLKFX180 always have a 50/50 duty cycle. TheDFS_FREQUENCY_MODE attribute specifies the allowable input clock and output clock frequency ranges. TheCLK_FEEDBACK attribute set to NONE will cause the DCM to be in the Digital Frequency Synthesizer mode.The CLKFX and CLKFX180 will be generated without phase correction with respect to CLKIN. The DSSEN inputpin for the DCM is no longer recommended for use and should remain unconnected in the design.

Digital Phase Shifter (DPS)

The phase shift (skew) between the rising edges of CLKIN and CLKFB may be configured as a fraction of theCLKIN period with the PHASE_SHIFT attribute. This allows the phase shift to remain constant as ambientconditions change. The CLKOUT_PHASE_SHIFT attribute controls the use of the PHASE_SHIFT value. Bydefault, the CLKOUT_PHASE_SHIFT attribute is set to NONE and the PHASE_SHIFT attribute has no effect.

By creating skew between CLKIN and CLKFB, all DCM output clocks are phase shifted by the amount of theskew. When the CLKOUT_PHASE_SHIFT attribute is set to FIXED, the skew set by the PHASE_SHIFT attributeis used at configuration for the rising edges of CLKIN and CLKFB. The skew remains constant. When theCLKOUT_PHASE_SHIFT attribute is set to VARIABLE, the skew set at configuration is used as a starting pointand the skew value can be changed dynamically during operation using the PS* signals. This digital phase shifterfeature is controlled by a synchronous interface. The inputs PSEN (phase shift enable) and PSINCDEC (phaseshift increment/decrement) are set up to the rising edge of PSCLK (phase shift clock). The PSDONE (phase shiftdone) output is clocked with the rising edge of PSCLK (the phase shift clock). PSDONE must be connected toimplement the complete synchronous interface. The rising-edge skew between CLKIN and CLKFB may bedynamically adjusted after the LOCKED output goes High. The PHASE_SHIFT attribute value specifies theinitial phase shift amount when the device is configured. Then the PHASE_SHIFT value is changed one unitwhen PSEN is activated for one period of PSCLK. The PHASE_SHIFT value is incremented when PSINCDEC isHigh and decremented when PSINCDEC is Low during the period that PSEN is High.

Libraries Guide

44 www.xilinx.com 10.1

Page 45: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

When the DCM completes an increment or decrement operation, the PSDONE output goes High for a singlePSCLK cycle to indicate the operation is complete. At this point the next change may be made. WhenRST (reset) is High, the PHASE_SHIFT attribute value is reset to the skew value set at configuration. IfCLKOUT_PHASE_SHIFT is FIXED or NONE, the PSEN, PSINCDEC, and PSCLK inputs must be tied to GND.The program will automatically tie the inputs to GND if they are not connected by the user.

Additional Status Bits

The STATUS output bits return the following information:

Bit Description

0 Phase Shift Overflow*

1 = |PHASE_SHIFT| > 255

1 DLL CLKIN stopped**

1 = CLKIN stopped toggling

2 DLL CLKFX stopped

1 = CLKFX stopped toggling

3 No

4 No

5 No

6 No

7 No

* Phase Shift Overflow will also go high if the end of the phase shift delay line is reached (see the product data sheet forthe most current value of the maximum shifting delay).

** If only the DFS outputs are used (CLKFX & CLKFX180), this status bit will not go high if CLKIN stops.

LOCKED

When LOCKED is high, all enabled signals are locked.

RST

The master reset input (RST) resets DCM to its initial (power-on) state. The signal at the RST input isasynchronous and must be held High for 2ns.

Design Entry MethodInstantiation Yes

Inference No

Coregen and wizards Recommended

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

SIM_MODE String "SAFE" or "FAST" "SAFE" This is a simulation only attribute. It will direct thesimulation model to run in performance-orientedmode when set to "FAST." Please see the Synthesis andSimulation Design Guide for more information.

Libraries Guide

10.1 www.xilinx.com 45

Page 46: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- DCM: Digital Clock Manager Circuit-- Virtex-II/II-Pro and Spartan-3-- Xilinx HDL Libraries Guide, version 10.1.2

DCM_inst : DCMgeneric map (CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5-- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0CLKFX_DIVIDE => 1, -- Can be any interger from 1 to 32CLKFX_MULTIPLY => 4, -- Can be any integer from 1 to 32CLKIN_DIVIDE_BY_2 => FALSE, -- TRUE/FALSE to enable CLKIN divide by two featureCLKIN_PERIOD => 0.0, -- Specify period of input clockCLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift of NONE, FIXED or VARIABLECLK_FEEDBACK => "1X", -- Specify clock feedback of NONE, 1X or 2XDESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or-- an integer from 0 to 15DFS_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for frequency synthesisDLL_FREQUENCY_MODE => "LOW", -- HIGH or LOW frequency mode for DLLDUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSEFACTORY_JF => X"C080", -- FACTORY JF ValuesPHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 255SIM_MODE => "SAFE", -- Simulation: "SAFE" vs "FAST", see "Synthesis and Simulation-- Design Guide" for detailsSTARTUP_WAIT => FALSE) -- Delay configuration DONE until DCM LOCK, TRUE/FALSEport map (CLK0 => CLK0, -- 0 degree DCM CLK ouptputCLK180 => CLK180, -- 180 degree DCM CLK outputCLK270 => CLK270, -- 270 degree DCM CLK outputCLK2X => CLK2X, -- 2X DCM CLK outputCLK2X180 => CLK2X180, -- 2X, 180 degree DCM CLK outCLK90 => CLK90, -- 90 degree DCM CLK outputCLKDV => CLKDV, -- Divided DCM CLK out (CLKDV_DIVIDE)CLKFX => CLKFX, -- DCM CLK synthesis out (M/D)CLKFX180 => CLKFX180, -- 180 degree CLK synthesis outLOCKED => LOCKED, -- DCM LOCK status outputPSDONE => PSDONE, -- Dynamic phase adjust done outputSTATUS => STATUS, -- 8-bit DCM status bits outputCLKFB => CLKFB, -- DCM clock feedbackCLKIN => CLKIN, -- Clock input (from IBUFG, BUFG or DCM)PSCLK => PSCLK, -- Dynamic phase adjust clock inputPSEN => PSEN, -- Dynamic phase adjust enable inputPSINCDEC => PSINCDEC, -- Dynamic phase adjust increment/decrementRST => RST -- DCM asynchronous reset input);

-- End of DCM_inst instantiation

Verilog Instantiation Template// DCM: Digital Clock Manager Circuit// Virtex-II/II-Pro and Spartan-3// Xilinx HDL Libraries Guide, version 10.1.2

DCM #(.SIM_MODE("SAFE"), // Simulation: "SAFE" vs. "FAST", see "Synthesis and Simulation Design Guide" for details.CLKDV_DIVIDE(2.0), // Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5// 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0.CLKFX_DIVIDE(1), // Can be any integer from 1 to 32.CLKFX_MULTIPLY(4), // Can be any integer from 2 to 32

Libraries Guide

46 www.xilinx.com 10.1

Page 47: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.CLKIN_DIVIDE_BY_2("FALSE"), // TRUE/FALSE to enable CLKIN divide by two feature

.CLKIN_PERIOD(0.0), // Specify period of input clock

.CLKOUT_PHASE_SHIFT("NONE"), // Specify phase shift of NONE, FIXED or VARIABLE

.CLK_FEEDBACK("1X"), // Specify clock feedback of NONE, 1X or 2X

.DESKEW_ADJUST("SYSTEM_SYNCHRONOUS"), // SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or// an integer from 0 to 15.DFS_FREQUENCY_MODE("LOW"), // HIGH or LOW frequency mode for frequency synthesis.DLL_FREQUENCY_MODE("LOW"), // HIGH or LOW frequency mode for DLL.DUTY_CYCLE_CORRECTION("TRUE"), // Duty cycle correction, TRUE or FALSE.FACTORY_JF(16’hC080), // FACTORY JF values.PHASE_SHIFT(0), // Amount of fixed phase shift from -255 to 255.STARTUP_WAIT("FALSE") // Delay configuration DONE until DCM LOCK, TRUE/FALSE) DCM_inst (.CLK0(CLK0), // 0 degree DCM CLK output.CLK180(CLK180), // 180 degree DCM CLK output.CLK270(CLK270), // 270 degree DCM CLK output.CLK2X(CLK2X), // 2X DCM CLK output.CLK2X180(CLK2X180), // 2X, 180 degree DCM CLK out.CLK90(CLK90), // 90 degree DCM CLK output.CLKDV(CLKDV), // Divided DCM CLK out (CLKDV_DIVIDE).CLKFX(CLKFX), // DCM CLK synthesis out (M/D).CLKFX180(CLKFX180), // 180 degree CLK synthesis out.LOCKED(LOCKED), // DCM LOCK status output.PSDONE(PSDONE), // Dynamic phase adjust done output.STATUS(STATUS), // 8-bit DCM status bits output.CLKFB(CLKFB), // DCM clock feedback.CLKIN(CLKIN), // Clock input (from IBUFG, BUFG or DCM).PSCLK(PSCLK), // Dynamic phase adjust clock input.PSEN(PSEN), // Dynamic phase adjust enable input.PSINCDEC(PSINCDEC), // Dynamic phase adjust increment/decrement.RST(RST) // DCM asynchronous reset input);

// End of DCM_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 47

Page 48: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

FDCE

Primitive: D Flip-Flop with Clock Enable and Asynchronous Clear

IntroductionThis design element is a single D-type flip-flop with clock enable and asynchronous clear. When clock enable(CE) is High and asynchronous clear (CLR) is Low, the data on the data input (D) of this design element istransferred to the corresponding data output (Q) during the Low-to-High clock (C) transition. When CLR is High,it overrides all other inputs and resets the data output (Q) Low. When CE is Low, clock transitions are ignored.

For XC9500XL and XC9500XV devices, logic connected to the clock enable (CE) input may be implemented usingthe clock enable product term (p-term) in the macrocell, provided the logic can be completely implemented usingthe single p-term available for clock enable without requiring feedback from another macrocell. Only FDCE andFDPE flip-flops may take advantage of the clock-enable p-term.

This flip-flop is asynchronously cleared, outputs Low, when power is applied. For FPGA devices, power-onconditions are simulated when global set/reset (GSR) is active. GSR defaults to active-High but can be invertedby adding an inverter in front of the GSR input of the appropriate STARTUP_architecture symbol.

Logic TableInputs Outputs

CLR CE D C Q

1 X X X 0

0 0 X X No Change

0 1 D ↑ D

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Binary 0,1 0 Sets the initial value of Q output after configuration.

Libraries Guide

48 www.xilinx.com 10.1

Page 49: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- FDCE: Single Data Rate D Flip-Flop with Asynchronous Clear and-- Clock Enable (posedge clk). All families.-- Xilinx HDL Libraries Guide, version 10.1.2

FDCE_inst : FDCEgeneric map (INIT => ’0’) -- Initial value of register (’0’ or ’1’)port map (Q => Q, -- Data outputC => C, -- Clock inputCE => CE, -- Clock enable inputCLR => CLR, -- Asynchronous clear inputD => D -- Data input);

-- End of FDCE_inst instantiation

Verilog Instantiation Template// FDCE: Single Data Rate D Flip-Flop with Asynchronous Clear and// Clock Enable (posedge clk).// All families.// Xilinx HDL Libraries Guide, version 10.1.2

FDCE #(.INIT(1’b0) // Initial value of register (1’b0 or 1’b1)) FDCE_inst (.Q(Q), // Data output.C(C), // Clock input.CE(CE), // Clock enable input.CLR(CLR), // Asynchronous clear input.D(D) // Data input);

// End of FDCE_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 49

Page 50: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

FDCE_1Primitive: D Flip-Flop with Negative-Edge Clock, Clock Enable, and Asynchronous Clear

IntroductionThis design element is a single D-type flip-flop with data (D), clock enable (CE), asynchronous clear (CLR) inputs,and data output (Q). The asynchronous CLR input, when High, overrides all other inputs and sets the Q outputLow. The data on the (D) input is loaded into the flip-flop when CLR is Low and CE is High on the High-to-Lowclock (C) transition. When CE is Low, the clock transitions are ignored.

This flip-flop is asynchronously cleared, outputs Low, when power is applied. For FPGA devices, power-onconditions are simulated when global set/reset (GSR) is active. GSR defaults to active-High but can be invertedby adding an inverter in front of the GSR input of the appropriate STARTUP_architecture symbol.

Logic TableInputs Outputs

CLR CE D C Q

1 X X X 0

0 0 X ? No Change

0 1 1 ? 1

0 1 0 ? 0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Binary 0,1 0 Sets the initial valueof Q output afterconfiguration.

Libraries Guide

50 www.xilinx.com 10.1

Page 51: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- FDCE_1: Single Data Rate D Flip-Flop with Asynchronous Clear and-- Clock Enable (negedge clock). All families.-- Xilinx HDL Libraries Guide, version 10.1.2

FDCE_1_inst : FDCE_1generic map (INIT => ’0’) -- Initial value of register (’0’ or ’1’)port map (Q => Q, -- Data outputC => C, -- Clock inputCE => CE, -- Clock enable inputCLR => CLR, -- Asynchronous clear inputD => D -- Data input);

-- End of FDCE_1_inst instantiation

Verilog Instantiation Template// FDCE_1: Single Data Rate D Flip-Flop with Asynchronous Clear and// Clock Enable (negedge clock).// All families.// Xilinx HDL Libraries Guide, version 10.1.2

FDCE_1 #(.INIT(1’b0) // Initial value of register (1’b0 or 1’b1)) FDCE_1_inst (.Q(Q), // Data output.C(C), // Clock input.CE(CE), // Clock enable input.CLR(CLR), // Asynchronous clear input.D(D) // Data input);

// End of FDCE_1_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 51

Page 52: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

FDCPEPrimitive: D Flip-Flop with Clock Enable and Asynchronous Preset and Clear

IntroductionThis design element is a single D-type flip-flop with data (D), clock enable (CE), asynchronous preset (PRE),and asynchronous clear (CLR) inputs. The asynchronous active high PRE sets the Q output High; that activehigh CLR resets the output Low and has precedence over the PRE input. Data on the D input is loaded into theflip-flop when PRE and CLR are Low and CE is High on the Low-to-High clock (C) transition. When CE is Low,the clock transitions are ignored and the previous value is retained. The FDCPE is generally implemented as aslice or IOB register within the device.

For FPGA devices, upon power-up, the initial value of this component is specified by the INIT attribute. If asubsequent GSR (Global Set/Reset) is asserted, the flop is asynchronously set to the INIT value.

Note While this device supports the use of asynchronous set and reset, it is not generally recommended tobe used for in most cases. Use of asynchronous signals pose timing issues within the design that are difficultto detect and control and also have an adverse affect on logic optimization causing a larger design that canconsume more power than if a synchronous set or reset is used.

Logic TableInputs Outputs

CLR PRE CE D C Q

1 X X X X 0

0 1 X X X 1

0 0 0 X X No Change

0 0 1 D ↑ D

Port DescriptionsPort Direction Width Function

Q Output 1 Data output

C Input 1 Clock input

CE Input 1 Clock enable input

CLR Input 1 Asynchronous clear input

Libraries Guide

52 www.xilinx.com 10.1

Page 53: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Port Direction Width Function

D Input 1 Data input

PRE Input 1 Asynchronous set input

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Binary 0,1 0 Sets the initial value of Q output afterconfiguration and on GSR.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- FDCPE: Single Data Rate D Flip-Flop with Asynchronous Clear, Set and-- Clock Enable (posedge clk). All families.-- Xilinx HDL Libraries Guide, version 10.1.2

FDCPE_inst : FDCPEgeneric map (INIT => ’0’) -- Initial value of register (’0’ or ’1’)port map (Q => Q, -- Data outputC => C, -- Clock inputCE => CE, -- Clock enable inputCLR => CLR, -- Asynchronous clear inputD => D, -- Data inputPRE => PRE -- Asynchronous set input);

-- End of FDCPE_inst instantiation

Libraries Guide

10.1 www.xilinx.com 53

Page 54: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Verilog Instantiation Template// FDCPE: Single Data Rate D Flip-Flop with Asynchronous Clear, Set and// Clock Enable (posedge clk).// All families.// Xilinx HDL Libraries Guide, version 10.1.2

FDCPE #(.INIT(1’b0) // Initial value of register (1’b0 or 1’b1)) FDCPE_inst (.Q(Q), // Data output.C(C), // Clock input.CE(CE), // Clock enable input.CLR(CLR), // Asynchronous clear input.D(D), // Data input.PRE(PRE) // Asynchronous set input);

// End of FDCPE_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

54 www.xilinx.com 10.1

Page 55: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

FDCPE_1

Primitive: D Flip-Flop with Negative-Edge Clock, Clock Enable, and Asynchronous Preset and Clear

IntroductionFDCPE_1 is a single D-type flip-flop with data (D), clock enable (CE), asynchronous preset (PRE), andasynchronous clear (CLR) inputs and data output (Q). The asynchronous PRE, when High, sets the (Q) outputHigh; CLR, when High, resets the output Low. Data on the (D) input is loaded into the flip-flop when PRE andCLR are Low and CE is High on the High-to-Low clock (C) transition. When CE is Low, the clock transitionsare ignored.

This flip-flop is asynchronously cleared, outputs Low, when power is applied. For FPGA devices, power-onconditions are simulated when global set/reset (GSR) is active. GSR defaults to active-High but can be invertedby adding an inverter in front of the GSR input of the appropriate STARTUP_architecture symbol.

Logic TableInputs Outputs

CLR PRE CE D C Q

1 X X X X 0

0 1 X X X 1

0 0 0 X X No Change

0 0 1 D ↓ D

Port DescriptionsPort Direction Width Function

Q Output 1 Data output

C Input 1 Clock input

CE Input 1 Clock enable input

CLR Input 1 Asynchronous clear input

D Input 1 Data input

PRE Input 1 Asynchronous set input

Libraries Guide

10.1 www.xilinx.com 55

Page 56: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Binary 0,1 0 Sets the initial value of Q output afterconfiguration.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- FDCPE_1: Single Data Rate D Flip-Flop with Asynchronous Clear, Set and-- Clock Enable (negedge clock). All families.-- Xilinx HDL Libraries Guide, version 10.1.2

FDCPE_1_inst : FDCPE_1generic map (INIT => ’0’) -- Initial value of register (’0’ or ’1’)port map (Q => Q, -- Data outputC => C, -- Clock inputCE => CE, -- Clock enable inputCLR => CLR, -- Asynchronous clear inputD => D, -- Data inputPRE => PRE -- Asynchronous set input);

-- End of FDCPE_1_inst instantiation

Verilog Instantiation Template// FDCPE_1: Single Data Rate D Flip-Flop with Asynchronous Clear, Set and// Clock Enable (negedge clock).// All families.// Xilinx HDL Libraries Guide, version 10.1.2

FDCPE_1 #(.INIT(1’b0) // Initial value of register (1’b0 or 1’b1)) FDCPE_1_inst (.Q(Q), // Data output.C(C), // Clock input.CE(CE), // Clock enable input.CLR(CLR), // Asynchronous clear input.D(D), // Data input.PRE(PRE) // Asynchronous set input);

// End of FDCPE_1_inst instantiation

Libraries Guide

56 www.xilinx.com 10.1

Page 58: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

FDRSE

Primitive: D Flip-Flop with Synchronous Reset and Set and Clock Enable

IntroductionFDRSE is a single D-type flip-flop with synchronous reset (R), synchronous set (S), clock enable (CE) inputs.The reset (R) input, when High, overrides all other inputs and resets the Q output Low during the Low-to-Highclock transition. (Reset has precedence over Set.) When the set (S) input is High and R is Low, the flip-flop is set,output High, during the Low-to-High clock (C) transition. Data on the D input is loaded into the flip-flop whenR and S are Low and CE is High during the Low-to-High clock transition.

Upon power-up, the initial value of this component is specified by the INIT attribute. If a subsequent GSR(Global Set/Reset) is asserted, the flop is asynchronously set to the INIT value.

Logic TableInputs Outputs

R S CE D C Q

1 X X X ↑ 0

0 1 X X ↑ 1

0 0 0 X X No Change

0 0 1 1 ↑ 1

0 0 1 0 ↑ 0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

58 www.xilinx.com 10.1

Page 59: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT Binary 0 or 1 0 Sets the initial value of Q output after configuration and on GSR.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- FDRSE: Single Data Rate D Flip-Flop with Synchronous Clear, Set and-- Clock Enable (posedge clk). All families.-- Xilinx HDL Libraries Guide, version 10.1.2

FDRSE_inst : FDRSEgeneric map (INIT => ’0’) -- Initial value of register (’0’ or ’1’)port map (Q => Q, -- Data outputC => C, -- Clock inputCE => CE, -- Clock enable inputD => D, -- Data inputR => R, -- Synchronous reset inputS => S -- Synchronous set input);

-- End of FDRSE_inst instantiation

Verilog Instantiation Template// FDRSE: Single Data Rate D Flip-Flop with Synchronous Clear, Set and// Clock Enable (posedge clk).// All families.// Xilinx HDL Libraries Guide, version 10.1.2

FDRSE #(.INIT(1’b0) // Initial value of register (1’b0 or 1’b1)) FDRSE_inst (.Q(Q), // Data output.C(C), // Clock input.CE(CE), // Clock enable input.D(D), // Data input.R(R), // Synchronous reset input.S(S) // Synchronous set input);

// End of FDRSE_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 59

Page 60: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

FDRSE_1Primitive: D Flip-Flop with Negative-Clock Edge, Synchronous Reset and Set, and Clock Enable

IntroductionFDRSE_1 is a single D-type flip-flop with synchronous reset (R), synchronous set (S), and clock enable (CE)inputs and data output (Q). The reset (R) input, when High, overrides all other inputs and resets the (Q) outputLow during the High-to-Low clock transition. (Reset has precedence over Set.) When the set (S) input is Highand R is Low, the flip-flop is set, output High, during the High-to-Low clock (C) transition. Data on the (D) inputis loaded into the flip-flop when (R) and (S) are Low and (CE) is High during the High-to-Low clock transition.

This flip-flop is asynchronously cleared, outputs Low, when power is applied. For FPGA devices, power-onconditions are simulated when global set/reset (GSR) is active. GSR defaults to active-High but can be invertedby adding an inverter in front of the GSR input of the appropriate STARTUP_architecture symbol.

Logic TableInputs Outputs

R S CE D C Q

1 X X X ↓ 0

0 1 X X ↓ 1

0 0 0 X X No Change

0 0 1 D ↓ D

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available Attributes

Attribute TypeAllowedValues Default Description

INIT Binary 0 or 1 0 Sets the initial value of Q output after configuration and on GSR.

Libraries Guide

60 www.xilinx.com 10.1

Page 61: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- FDRSE_1: Single Data Rate D Flip-Flop with Synchronous Clear, Set and-- Clock Enable (negedge clock). All families.-- Xilinx HDL Libraries Guide, version 10.1.2

FDRSE_1_inst : FDRSE_1generic map (INIT => ’0’) -- Initial value of register (’0’ or ’1’)port map (Q => Q, -- Data outputC => C, -- Clock inputCE => CE, -- Clock enable inputD => D, -- Data inputR => R, -- Synchronous reset inputS => S -- Synchronous set input);

-- End of FDRSE_1_inst instantiation

Verilog Instantiation Template// FDRSE_1: Single Data Rate D Flip-Flop with Synchronous Clear, Set and// Clock Enable (negedge clock).// All families.// Xilinx HDL Libraries Guide, version 10.1.2

FDRSE_1 #(.INIT(1’b0) // Initial value of register (1’b0 or 1’b1)) FDRSE_1_inst (.Q(Q), // Data output.C(C), // Clock input.CE(CE), // Clock enable input.D(D), // Data input.R(R), // Synchronous reset input.S(S) // Synchronous set input);// End of FDRSE_1_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 61

Page 62: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

IBUF

Primitive: Input Buffer

IntroductionThis design element is automatically inserted (inferred) by the synthesis tool to any signal directly connectedto a top-level input or in-out port of the design. You should generally let the synthesis tool infer this buffer.However, it can be instantiated into the design if required. In order to do so, connect the input port (I) directly tothe associated top-level input or in-out port, and connect the output port (O) to the logic sourced by that port.Modify any necessary generic maps (VHDL) or named parameter value assignment (Verilog) in order to changethe default behavior of the component.

Port DescriptionsPort Direction Width Function

O Output 1 Buffer input

I Input 1 Buffer output

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

In general, this element is inferred by the synthesis tool for any specified top-level input port to the design. It isgenerally not necessary to specify them in the source code however if desired, they be manually instantiated byeither copying the instantiation code from the ISE Libraries Guide HDL Template and paste it into the top-levelentity/module of your code. It is recommended to always put all I/O components on the top-level of the design tohelp facilitate hierarchical design methods. Connect the I port directly to the top-level input port of the designand the O port to the logic in which this input is to source. Specify the desired generic/defparam values inorder to configure the proper behavior of the buffer.

Available AttributesAttribute Type Allowed Values Default Description

IOSTANDARD String See Data Sheet "DEFAULT" Assigns an I/O standard to theelement.

Libraries Guide

62 www.xilinx.com 10.1

Page 63: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- IBUF: Single-ended Input Buffer-- All devices-- Xilinx HDL Libraries Guide, version 10.1.2

IBUF_inst : IBUFgeneric map (IBUF_DELAY_VALUE => "0", -- Specify the amount of added input delay for buffer, "0"-"16" (Spartan-3E/3A only)IFD_DELAY_VALUE => "AUTO", -- Specify the amount of added delay for input register, "AUTO", "0"-"8" (Spartan-3E/3A only)IOSTANDARD => "DEFAULT")port map (O => O, -- Buffer outputI => I -- Buffer input (connect directly to top-level port));

-- End of IBUF_inst instantiation

Verilog Instantiation Template// IBUF: Single-ended Input Buffer// All devices// Xilinx HDL Libraries Guide, version 10.1.2

IBUF #(.IBUF_DELAY_VALUE("0"), // Specify the amount of added input delay for// the buffer, "0"-"16" (Spartan-3E/3A only).IFD_DELAY_VALUE("AUTO"), // Specify the amount of added delay for input// register, "AUTO", "0"-"8" (Spartan-3E/3A only).IOSTANDARD("DEFAULT") // Specify the input I/O standard)IBUF_inst (.O(O), // Buffer output.I(I) // Buffer input (connect directly to top-level port));

// End of IBUF_inst instantiation

Libraries Guide

10.1 www.xilinx.com 63

Page 65: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

IBUFDS

Primitive: Differential Signaling Input Buffer with Optional Delay

IntroductionThis design element is an input buffer that supports low-voltage, differential signaling. In IBUFDS, a designlevel interface signal is represented as two distinct ports (I and IB), one deemed the "master" and the other the"slave." The master and the slave are opposite phases of the same logical signal (for example, MYNET_P andMYNET_N). Optionally, a programmable differential termination feature is available to help improve signalintegrity and reduce external components. Also available is a programmable delay to assist in the capturingof incoming data to the device.

Logic TableInputs Outputs

I IB O

0 0 No Change

0 1 0

1 0 1

1 1 No Change

Port Descriptions

Port Direction Width Function

O Output 1 Diff_p Buffer Input

IB Input 1 Diff_n Buffer Input

I Input 1 Buffer Output

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

Put all I/O components on the top-level of the design to help facilitate hierarchical design methods. Connectthe I port directly to the top-level "master" input port of the design, the IB port to the top-level "slave" inputport, and the O port to the logic in which this input is to source. Specify the desired generic/defparam values inorder to configure the proper behavior of the buffer.

Libraries Guide

10.1 www.xilinx.com 65

Page 66: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available Attributes

Attribute TypeAllowedValues Default Description

IOSTANDARD String See Data Sheet "DEFAULT" Assigns an I/O standard to the element.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- IBUFDS: Differential Input Buffer-- Virtex-II/II-Pro, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

IBUFDS_inst : IBUFDSgeneric map (CAPACITANCE => "DONT_CARE", -- "LOW", "NORMAL", "DONT_CARE" (Virtex-4 only)DIFF_TERM => FALSE, -- Differential Termination (Virtex-4/5, Spartan-3E/3A)IBUF_DELAY_VALUE => "0", -- Specify the amount of added input delay for buffer, "0"-"16" (Spartan-3E/3A only)IFD_DELAY_VALUE => "AUTO", -- Specify the amount of added delay for input register, "AUTO", "0"-"8" (Spartan-3E/3A only)IOSTANDARD => "DEFAULT")port map (O => O, -- Clock buffer outputI => I, -- Diff_p clock buffer input (connect directly to top-level port)IB => IB -- Diff_n clock buffer input (connect directly to top-level port));

-- End of IBUFDS_inst instantiation

Verilog Instantiation Template// IBUFDS: Differential Input Buffer// Virtex-II/II-Pro/4/5, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

IBUFDS #(.CAPACITANCE("DONT_CARE"), // "LOW", "NORMAL", "DONT_CARE" (Virtex-4 only).DIFF_TERM("FALSE"), // Differential Termination (Virtex-4/5, Spartan-3E/3A).IBUF_DELAY_VALUE("0"), // Specify the amount of added input delay for// the buffer, "0"-"16" (Spartan-3E only).IFD_DELAY_VALUE("AUTO"), // Specify the amount of added delay for input// register, "AUTO", "0"-"8" (Spartan-3E/3A only).IOSTANDARD("DEFAULT") // Specify the input I/O standard) IBUFDS_inst (.O(O), // Buffer output.I(I), // Diff_p buffer input (connect directly to top-level port).IB(IB) // Diff_n buffer input (connect directly to top-level port));

// End of IBUFDS_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

66 www.xilinx.com 10.1

Page 67: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

IBUFGPrimitive: Dedicated Input Clock Buffer

IntroductionThe IBUFG is a dedicated input to the device which should be used to connect incoming clocks to the FPGAto the global clock routing resources. The IBUFG provides dedicated connections to the DCM_SP and BUFGproviding the minimum amount of clock delay and jitter to the device. The IBUFG input can only be driven bythe global clock pins. The IBUFG output can drive CLKIN of a DCM_SP, BUFG, or your choice of logic. TheIBUFG can be routed to your choice of logic to allow the use of the dedicated clock pins for general logic.

Port DescriptionsPort Direction Width Function

O Output 1 Clock Buffer input

I Input 1 Clock Buffer output

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

IOSTANDARD String See Data Sheet "DEFAULT" Assigns an I/O standard to theelement.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- IBUFG: Global Clock Buffer (sourced by an external pin)-- Xilinx HDL Libraries Guide, version 10.1.2

IBUFG_inst : IBUFGgeneric map (IOSTANDARD => "DEFAULT")port map (O => O, -- Clock buffer outputI => I -- Clock buffer input (connect directly to top-level port)

Libraries Guide

10.1 www.xilinx.com 67

Page 68: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

);

-- End of IBUFG_inst instantiation

Verilog Instantiation Template// IBUFG: Global Clock Buffer (sourced by an external pin)// All FPGAs// Xilinx HDL Libraries Guide, version 10.1.2

IBUFG #(.IOSTANDARD("DEFAULT")) IBUFG_inst (.O(O), // Clock buffer output.I(I) // Clock buffer input (connect directly to top-level port));

// End of IBUFG_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

68 www.xilinx.com 10.1

Page 69: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

IBUFGDSPrimitive: Differential Signaling Dedicated Input Clock Buffer and Optional Delay

IntroductionThis design element is a dedicated differential signaling input buffer for connection to the clock buffer (BUFG) orDCM. In IBUFGDS, a design-level interface signal is represented as two distinct ports (I and IB), one deemed the"master" and the other the "slave." The master and the slave are opposite phases of the same logical signal (forexample, MYNET_P and MYNET_N). Optionally, a programmable differential termination feature is available tohelp improve signal integrity and reduce external components. Also available is a programmable delay is toassist in the capturing of incoming data to the device.

Logic Table

Inputs Outputs

I IB O

0 0 No Change

0 1 0

1 0 1

1 1 No Change

Port DescriptionsPort Direction Width Function

O Output 1 Diff_p Clock Buffer Input

IB Input 1 Diff_n Clock Buffer Input

I Input 1 Clock Buffer output

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

Put all I/O components on the top-level of the design to help facilitate hierarchical design methods. Connect theI port directly to the top-level "master" input port of the design, the IB port to the top-level "slave" input portand the O port to a DCM, BUFG or logic in which this input is to source. Some synthesis tools infer the BUFGautomatically if necessary, when connecting an IBUFG to the clock resources of the FPGA. Specify the desiredgeneric/defparam values in order to configure the proper behavior of the buffer.

Libraries Guide

10.1 www.xilinx.com 69

Page 70: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

IOSTANDARD String See Data Sheet "DEFAULT" Assigns an I/O standard to theelement.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- IBUFGDS: Differential Global Clock Buffer (sourced by an external pin)-- Virtex-II/II-Pro/4/5, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

IBUFGDS_inst : IBUFGDSgeneric map (IOSTANDARD => "DEFAULT")port map (O => O, -- Clock buffer outputI => I, -- Diff_p clock buffer inputIB => IB -- Diff_n clock buffer input);

-- End of IBUFGDS_inst instantiation

Verilog Instantiation Template// IBUFGDS: Differential Global Clock Buffer (sourced by an external pin)// Virtex-II/II-Pro/4/5, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

IBUFGDS #(.DIFF_TERM("FALSE"), // Differential Termination (Virtex-4/5, Spartan-3E/3A).IOSTANDARD("DEFAULT") // Specifies the I/O standard for this buffer) IBUFGDS_inst (.O(O), // Clock buffer output.I(I), // Diff_p clock buffer input.IB(IB) // Diff_n clock buffer input);

// End of IBUFGDS_inst instantiation

Libraries Guide

70 www.xilinx.com 10.1

Page 72: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ICAP_VIRTEX2Primitive: User Interface to Virtex-II Internal Configuration Access Port

IntroductionThis design element provides user access to the Virtex-II, Virtex-II Pro, and Virtex-II Pro X internal configurationaccess port (ICAP).

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- ICAP_VIRTEX2: Internal Configuration Access Port-- Virtex-II/II-Pro-- Xilinx HDL Libraries Guide, version 10.1.2

ICAP_VIRTEX2_inst : ICAP_VIRTEX2port map (BUSY => BUSY, -- Busy outputO => O, -- 8-bit data outputCE => CE, -- Clock enable inputCLK => CLK, -- Clock inputI => I, -- 8-bit data inputWRITE => WRITE -- Write input);

-- End of ICAP_VIRTEX2_inst instantiation

Verilog Instantiation Template// ICAP_VIRTEX2: Internal Configuration Access Port// Virtex-II/II-Pro// Xilinx HDL Libraries Guide, version 10.1.2

ICAP_VIRTEX2 ICAP_VIRTEX2_inst (.BUSY(BUSY), // Busy output.O(O), // 8-bit data output.CE(CE), // Clock enable input

Libraries Guide

72 www.xilinx.com 10.1

Page 73: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.CLK(CLK), // Clock input

.I(I), // 8-bit data input

.WRITE(WRITE) // Write input);

// End of ICAP_VIRTEX2_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 73

Page 74: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

IFDDRCPEPrimitive: Dual Data Rate Input D Flip-Flop with Clock Enable and Asynchronous Preset and Clear

IntroductionThis design element is a dual data rate (DDR) input D flip-flop with clock enable (CE) and asynchronous preset(PRE) and clear (CLR). It consists of one input buffer and two identical flip-flops (FDCPE).

When the asynchronous PRE is High and CLR is Low, both the Q0 and Q1 outputs are set High. When CLRis High, both outputs are reset Low. When PRE and CLR are Low and CE is High, data on the D input isloaded into the Q0 output on the Low-to High C0 clock transition, and into the Q1 output on the Low-to-HighC1 clock transition.

The INIT attribute does not apply to this design elements components.

This flip-flop is asynchronously cleared, outputs Low, when power is applied. For FPGA devices, power-onconditions are simulated when global set/reset (GSR) is active. GSR defaults to active-High but can be invertedby adding an inverter in front of the GSR input of the appropriate STARTUP_architecture symbol.

Logic TableInputs Outputs

C0 C1 CE D CLR PRE Q0 Q1

X X X X 1 0 0 0

X X X X 0 1 1 1

X X X X 1 1 0 0

X X 0 X 0 0 No Change No Change

↑ X 1 D 0 0 D No Change

X ↑ 1 D 0 0 No Change D

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

74 www.xilinx.com 10.1

Page 75: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- IFDDRCPE: Double Data Rate Input Register with Async. Clear, Async. Preset-- and Clock Enable. Virtex-II/II-Pro, Spartan-3-- Xilinx HDL Libraries Guide, version 10.1.2

IFDDRCPE_inst : IFDDRCPEport map (Q0 => Q0, -- Posedge data outputQ1 => Q1, -- Negedge data outputC0 => C0, -- 0 degree clock inputC1 => C1, -- 180 degree clock inputCE => CE, -- Clock enable inputCLR => CLR, -- Asynchronous reset inputD => D, -- Data input (connect directly to top-level port)PRE => PRE -- Asynchronous preset input);

-- End of IFDDRCPE_inst instantiation

Verilog Instantiation Template// IFDDRCPE: Double Data Rate Input Register with Async. Clear, Async. Preset// and Clock Enable.// Virtex-II/II-Pro, Spartan-3// Xilinx HDL Libraries Guide, version 10.1.2

IFDDRCPE IFDDRCPE_inst (.Q0(Q0), // Posedge data output.Q1(Q1), // Negedge data output.C0(C0), // 0 degree clock input.C1(C1), // 180 degree clock input.CE(CE), // Clock enable input.CLR(CLR), // Asynchronous reset input.D(D), // Data input (connect directly to top-level port).PRE(PRE) // Asynchronous preset input);

// End of IFDDRCPE_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 75

Page 76: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

IFDDRRSE

Primitive: Dual Data Rate Input D Flip-Flop with Synchronous Reset and Set and Clock Enable

IntroductionThis design element is a dual data rate (DDR) input D flip-flop with synchronous reset (R), synchronous set (S),and clock enable (CE). It consists of one input buffer and two identical flip-flops (FDRSE).

For the C0 input and Q0 output, reset (R) has precedence. The R input, when High, resets the Q0 output Lowduring the Low-to-High C0 clock transition. When S is High and R is Low, the Q0 output is set High during theLow-to-High C0 clock transition. For the C1 input and Q1 output, set (S) has precedence. The R input, whenHigh, resets the Q1 output Low during the Low-to-High C1 clock transition. When S is High and R is Low, theQ0 output is set to High during the Low-to-High C1 clock transition.

This flip-flop is asynchronously cleared, outputs Low, when power is applied. For FPGA devices, power-onconditions are simulated when global set/reset (GSR) is active. GSR defaults to active-High but can be invertedby adding an inverter in front of the GSR input of the appropriate STARTUP_architecture symbol.

The INIT attribute does not apply to this element.

Logic TableInputs Outputs

C0 C1 CE D R S Q0 Q1

↑ X X X 1 0 0 No Change

↑ X X X 0 1 1 No Change

↑ X X X 1 1 0 No Change

X ↑ X X 1 0 No Change 0

X ↑ X X 0 1 No Change 1

X ↑ X X 1 1 No Change 0

X X 0 X 0 0 No Change No Change

↑ X 1 D 0 0 D No Change

X ↑ 1 D 0 0 No Change D

Libraries Guide

76 www.xilinx.com 10.1

Page 77: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- IFDDRRSE: Double Data Rate Input Register with Sync. Clear, Sync. Preset-- and Clock Enable. Virtex-II/II-Pro, Spartan-3-- Xilinx HDL Libraries Guide, version 10.1.2

IFDDRRSE_inst : IFDDRRSEport map (Q0 => Q0, -- Posedge data outputQ1 => Q1, -- Negedge data outputC0 => C0, -- 0 degree clock inputC1 => C1, -- 180 degree clock inputCE => CE, -- Clock enable inputD => D, -- Data input (connect directly to top-level port)R => R, -- Synchronous reset inputS => S -- Synchronous preset input);

-- End of IFDDRRSE_inst instantiation

Verilog Instantiation Template// IFDDRRSE: Double Data Rate Input Register with Sync. Clear, Sync. Preset// and Clock Enable.// Virtex-II/II-Pro, Spartan-3// Xilinx HDL Libraries Guide, version 10.1.2

IFDDRRSE IFDDRRSE_inst (.Q0(Q0), // Posedge data output.Q1(Q1), // Negedge data output.C0(C0), // 0 degree clock input.C1(C1), // 180 degree clock input.CE(CE), // Clock enable input.D(D), // Data input (connect directly to top-level port).R(R), // Synchronous reset input.S(S) // Synchronous preset input);

// End of IFDDRRSE_inst instantiation

For More Information• See the Virtex-II User Guide.• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 77

Page 78: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

IOBUF

Primitive: Bi-Directional Buffer

IntroductionThe design element is a bidirectional single-ended I/O Buffer used to connect internal logic to an externalbidirectional pin.

Logic TableInputs Bidirectional Outputs

T I IO O

1 X Z X

0 1 1 1

0 0 0 0

Port DescriptionsPort Direction Width Function

O Output 1 Buffer output

IO Inout 1 Buffer inout

I Input 1 Buffer input

T Input 1 3-State enable input

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

78 www.xilinx.com 10.1

Page 79: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

DRIVE Integer 2, 4, 6, 8, 12, 16, 24 12 Selects output drive strength (mA) forthe SelectIO buffers that use the LVTTL,LVCMOS12, LVCMOS15, LVCMOS18,LVCMOS25, or LVCMOS33 interface I/Ostandard.

IOSTANDARD String See Data Sheet "DEFAULT" Assigns an I/O standard to the element.

SLEW String "SLOW", "FAST" "SLOW" Sets the output rise and fall time. See theData Sheet for recommendations of thebest setting for this attribute.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- IOBUF: Single-ended Bi-directional Buffer-- All devices-- Xilinx HDL Libraries Guide, version 10.1.2

IOBUF_inst : IOBUFgeneric map (DRIVE => 12,IBUF_DELAY_VALUE => "0", -- Specify the amount of added input delay for buffer, "0"-"16" (Spartan-3E/3A only)IFD_DELAY_VALUE => "AUTO", -- Specify the amount of added delay for input register, "AUTO", "0"-"8" (Spartan-3E/3A only)IOSTANDARD => "DEFAULT",SLEW => "SLOW")port map (O => O, -- Buffer outputIO => IO, -- Buffer inout port (connect directly to top-level port)I => I, -- Buffer inputT => T -- 3-state enable input);

-- End of IOBUF_inst instantiation

Verilog Instantiation Template// IOBUF: Single-ended Bi-directional Buffer// All devices// Xilinx HDL Libraries Guide, version 10.1.2

IOBUF #(.DRIVE(12), // Specify the output drive strength.IBUF_DELAY_VALUE("0"), // Specify the amount of added input delay for the buffer, "0"-"16" (Spartan-3E only).IFD_DELAY_VALUE("AUTO"), // Specify the amount of added delay for input register, "AUTO", "0"-"8" (Spartan-3E only).IOSTANDARD("DEFAULT"), // Specify the I/O standard.SLEW("SLOW") // Specify the output slew rate) IOBUF_inst (.O(O), // Buffer output.IO(IO), // Buffer inout port (connect directly to top-level port).I(I), // Buffer input.T(T) // 3-state enable input);

// End of IOBUF_inst instantiation

Libraries Guide

10.1 www.xilinx.com 79

Page 81: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

IOBUFDS

Primitive: 3-State Differential Signaling I/O Buffer with Active Low Output Enable

IntroductionThe design element is a bidirectional buffer that supports low-voltage, differential signaling. For the IOBUFDS, adesign level interface signal is represented as two distinct ports (IO and IOB), one deemed the "master" andthe other the "slave." The master and the slave are opposite phases of the same logical signal (for example,MYNET_P and MYNET_N). Optionally, a programmable differential termination feature is available to helpimprove signal integrity and reduce external components. Also available is a programmable delay is to assist inthe capturing of incoming data to the device.

Logic TableInputs Bidirectional Outputs

I T IO IOB O

X 1 Z Z No Change

0 0 0 1 0

I 0 1 0 1

Port DescriptionsPort Direction Width Function

O Output 1 Buffer output

IO Inout 1 Diff_p inout

IOB Inout 1 Diff_n inout

I Input 1 Buffer input

T Input 1 3-state enable input

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

Libraries Guide

10.1 www.xilinx.com 81

Page 82: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

IOSTANDARD String See Data Sheet "DEFAULT" Assigns an I/O standard to the element.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- IOBUFDS: Differential Bi-directional Buffer-- Virtex-II/II-Pro, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

IOBUFDS_inst : IOBUFDSgeneric map (IBUF_DELAY_VALUE => "0", -- Specify the amount of added input delay for buffer, "0"-"16" (Spartan-3E/3A only)IFD_DELAY_VALUE => "AUTO", -- Specify the amount of added delay for input register, "AUTO", "0"-"8" (Spartan-3E/3A only)IOSTANDARD => "DEFAULT")port map (O => O, -- Buffer outputIO => IO, -- Diff_p inout (connect directly to top-level port)IOB => IOB, -- Diff_n inout (connect directly to top-level port)I => I, -- Buffer inputT => T -- 3-state enable input);

-- End of IOBUFDS_inst instantiation

Verilog Instantiation Template// IOBUFDS: Differential Bi-directional Buffer// Virtex-II/II-Pro/4/5, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

IOBUFDS #(.IBUF_DELAY_VALUE("0"), // Specify the amount of added input delay for the buffer, "0"-"16" (Spartan-3E only).IFD_DELAY_VALUE("AUTO"), // Specify the amount of added delay for input register, "AUTO", "0"-"8" (Spartan-3E only).IOSTANDARD("DEFAULT") // Specify the I/O standard) IOBUFDS_inst (.O(O), // Buffer output.IO(IO), // Diff_p inout (connect directly to top-level port).IOB(IOB), // Diff_n inout (connect directly to top-level port).I(I), // Buffer input.T(T) // 3-state enable input);

// End of IOBUFDS_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

82 www.xilinx.com 10.1

Page 83: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

KEEPER

Primitive: KEEPER Symbol

IntroductionThe design element is a weak keeper element that retains the value of the net connected to its bidirectional O pin.For example, if a logic 1 is being driven onto the net, KEEPER drives a weak/resistive 1 onto the net. If the netdriver is then 3-stated, KEEPER continues to drive a weak/resistive 1 onto the net.

Port DescriptionsName Direction Width Function

O Output 1-Bit Keeper output

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

Libraries Guide

10.1 www.xilinx.com 83

Page 84: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

-- KEEPER: I/O Buffer Weak Keeper-- All FPGA, CoolRunner-II-- Xilinx HDL Libraries Guide, version 10.1.2

KEEPER_inst : KEEPERport map (O => O -- Keeper output (connect directly to top-level port));

-- End of KEEPER_inst instantiation

Verilog Instantiation Template// KEEPER: I/O Buffer Weak Keeper// All FPGA, CoolRunner-II// Xilinx HDL Libraries Guide, version 10.1.2

KEEPER KEEPER_inst (.O(O) // Keeper output (connect directly to top-level port));

// End of KEEPER_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

84 www.xilinx.com 10.1

Page 85: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

LDCPEPrimitive: Transparent Data Latch with Asynchronous Clear and Preset and Gate Enable

IntroductionThis design element is a transparent data latch with data (D), asynchronous clear (CLR), asynchronous preset(PRE), and gate enable (GE). When (CLR) is High, it overrides the other inputs and resets the data (Q) outputLow. When (PRE) is High and (CLR) is Low, it presets the data (Q) output High. Q reflects the data (D) inputwhile the gate (G) input and gate enable (GE) are High and (CLR) and PRE are Low. The data on the (D) inputduring the High-to-Low gate transition is stored in the latch. The data on the Q output remains unchanged aslong as (G) or (GE) remains Low.

This latch is asynchronously cleared, outputs Low, when power is applied. For FPGA devices, power-onconditions are simulated when global set/reset (GSR) is active. GSR defaults to active-High but can be invertedby adding an inverter in front of the GSR input of the appropriate STARTUP_architecture symbol.

Logic TableInputs Outputs

CLR PRE GE G D Q

1 X X X X 0

0 1 X X X 1

0 0 0 X X No Change

0 0 1 1 0 0

0 0 1 1 1 1

0 0 1 0 X No Change

0 0 1 ↓ D D

Port DescriptionsPort Direction Width Function

Q Output 1 Data Output

CLR Input 1 Asynchronous clear/reset input

D Input 1 Data Input

G Input 1 Gate Input

GE Input 1 Gate Enable Input

PRE Input 1 Asynchronous preset/set input

Libraries Guide

10.1 www.xilinx.com 85

Page 86: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Integer 0 or 1 0 Sets the initial value of Q output after configuration.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- LDCPE: Transparent latch with Asynchronous Reset, Preset and-- Gate Enable.-- All families.-- Xilinx HDL Libraries Guide, version 10.1.2

LDCPE_inst : LDCPEgeneric map (INIT => ’0’) -- Initial value of latch (’0’ or ’1’)port map (Q => Q, -- Data outputCLR => CLR, -- Asynchronous clear/reset inputD => D, -- Data inputG => G, -- Gate inputGE => GE, -- Gate enable inputPRE => PRE -- Asynchronous preset/set input);

-- End of LDCPE_inst instantiation

Verilog Instantiation Template// LDCPE: Transparent latch with Asynchronous Reset, Preset and// Gate Enable.// All families.// Xilinx HDL Libraries Guide, version 10.1.2

LDCPE #(.INIT(1’b0) // Initial value of latch (1’b0 or 1’b1)) LDCPE_inst (.Q(Q), // Data output.CLR(CLR), // Asynchronous clear/reset input.D(D), // Data input.G(G), // Gate input.GE(GE), // Gate enable input.PRE(PRE) // Asynchronous preset/set input);

// End of LDCPE_inst instantiation

Libraries Guide

86 www.xilinx.com 10.1

Page 88: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

LUT1Primitive: 1-Bit Look-Up-Table with General Output

IntroductionThis design element is a 1-bit look-up-tables (LUT) with general output (O).

An INIT attribute with an appropriate number of hexadecimal digits for the number of inputs must be attachedto the LUT to specify its function. This element provides a look-up-table version of a buffer or inverter. Theseelements are the basic building blocks. Two LUTs are available in each CLB slice; four LUTs are available in eachCLB. Multiple variants of LUTs accommodate additional types of outputs that can be used by different timingmodels for more accurate pre-layout timing estimation.

The INIT parameter for the FPGA LUT primitive is what gives the LUT its logical value. By default, this value iszero, thus driving the output to a zero regardless of the input values (acting as a ground). However, in mostcases a new INIT value must be determined in order to specify the logic function for the LUT primitive. Thereare at least two methods by which the LUT value can be determined:

The Truth Table Method -A common method to determine the desired INIT value for a LUT is using a truthtable. To do so, simply create a binary truth table of all possible inputs, specify the desired logic value of theoutput and then create the INIT string from those output values.

The Equation Method -Another method to determine the LUT value is to define parameters for each input tothe LUT that correspond to their listed truth value and use those to build the logic equation you are after. Thismethod is easier to understand once you have grasped the concept and more self-documenting that the abovemethod however does require the code to first specify the appropriate parameters.

Logic TableInputs Outputs

I0 O

0 INIT[0]

1 INIT[1]

INIT = Binary number assigned to the INIT attribute

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

88 www.xilinx.com 10.1

Page 89: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 2-Bit Value All zeros Initializes look-up tables.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- LUT1: 1-input Look-Up Table with general output-- Xilinx HDL Libraries Guide, version 10.1.2

LUT1_inst : LUT1generic map (INIT => "00")port map (O => O, -- LUT general outputI0 => I0 -- LUT input);

-- End of LUT1_inst instantiation

Verilog Instantiation Template// LUT1: 1-input Look-Up Table with general output// For use with all FPGAs.// Xilinx HDL Libraries Guide, version 10.1.2

LUT1 #(.INIT(2’b00) // Specify LUT Contents) LUT1_inst (.O(O), // LUT general output.I0(I0) // LUT input);

// End of LUT1_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 89

Page 90: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

LUT1_D

Primitive: 1-Bit Look-Up-Table with Dual Output

IntroductionThis design element is a 1-bit look-up-table (LUT) with two functionally identical outputs, O and LO. It providesa look-up-table version of a buffer or inverter.

The O output is a general interconnect. The LO output is used to connect to another output within the same CLBslice and to the fast connect buffer. A mandatory INIT attribute, with an appropriate number of hexadecimaldigits for the number of inputs, must be attached to the LUT to specify its function.

The INIT parameter for the FPGA LUT primitive is what gives the LUT its logical value. By default, this value iszero, thus driving the output to a zero regardless of the input values (acting as a ground). However, in mostcases a new INIT value must be determined in order to specify the logic function for the LUT primitive. Thereare at least two methods by which the LUT value can be determined:

The Truth Table Method -A common method to determine the desired INIT value for a LUT is using a truthtable. To do so, simply create a binary truth table of all possible inputs, specify the desired logic value of theoutput and then create the INIT string from those output values.

The Equation Method -Another method to determine the LUT value is to define parameters for each input tothe LUT that correspond to their listed truth value and use those to build the logic equation you are after. Thismethod is easier to understand once you have grasped the concept and more self-documenting that the abovemethod however does require the code to first specify the appropriate parameters.

Logic TableInputs Outputs

I0 O LO

0 INIT[0] INIT[0]

1 INIT[1] INIT[1]

INIT = Binary number assigned to the INIT attribute

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

90 www.xilinx.com 10.1

Page 91: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 2-Bit Value All zeros Initializes look-up tables.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- LUT1_D: 1-input Look-Up Table with general and local outputs-- Xilinx HDL Libraries Guide, version 10.1.2

LUT1_D_inst : LUT1_Dgeneric map (INIT => "00")port map (LO => LO, -- LUT local outputO => O, -- LUT general outputI0 => I0 -- LUT input);

-- End of LUT1_D_inst instantiation

Verilog Instantiation Template// LUT1_D: 1-input Look-Up Table with general and local outputs// For use with all FPGAs.// Xilinx HDL Libraries Guide, version 10.1.2

LUT1_D #(.INIT(2’b00) // Specify LUT Contents) LUT1_D_inst (.LO(LO), // LUT local output.O(O), // LUT general output.I0(I0) // LUT input);

// End of LUT1_D_inst instantiation

Libraries Guide

10.1 www.xilinx.com 91

Page 93: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

LUT1_L

Primitive: 1-Bit Look-Up-Table with Local Output

IntroductionThis design element is a 1- bit look-up-tables (LUTs) with a local output (LO) that is used to connect to anotheroutput within the same CLB slice and to the fast connect buffer. It provides a look-up-table version of a bufferor inverter.

A mandatory INIT attribute, with an appropriate number of hexadecimal digits for the number of inputs,must be attached to the LUT to specify its function.

The INIT parameter for the FPGA LUT primitive is what gives the LUT its logical value. By default, this value iszero, thus driving the output to a zero regardless of the input values (acting as a ground). However, in mostcases a new INIT value must be determined in order to specify the logic function for the LUT primitive. Thereare at least two methods by which the LUT value can be determined:

The Truth Table Method -A common method to determine the desired INIT value for a LUT is using a truthtable. To do so, simply create a binary truth table of all possible inputs, specify the desired logic value of theoutput and then create the INIT string from those output values.

The Equation Method -Another method to determine the LUT value is to define parameters for each input tothe LUT that correspond to their listed truth value and use those to build the logic equation you are after. Thismethod is easier to understand once you have grasped the concept and more self-documenting that the abovemethod however does require the code to first specify the appropriate parameters.

Logic TableInputs Outputs

I0 LO

0 INIT[0]

1 INIT[1]

INIT = Binary number assigned to the INIT attribute

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

10.1 www.xilinx.com 93

Page 94: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 2-Bit Value All zeros Initializes look-up tables.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- LUT1_L: 1-input Look-Up Table with local output-- Xilinx HDL Libraries Guide, version 10.1.2

LUT1_L_inst : LUT1_Lgeneric map (INIT => "00")port map (LO => LO, -- LUT local outputI0 => I0 -- LUT input);

-- End of LUT1_L_inst instantiation

Verilog Instantiation Template// LUT1_L: 1-input Look-Up Table with local output// For use with all FPGAs.// Xilinx HDL Libraries Guide, version 10.1.2

LUT1_L #(.INIT(2’b00) // Specify LUT Contents) LUT1_L_inst (.LO(LO), // LUT local output.I0(I0) // LUT input);

// End of LUT1_L_inst instantiation

Libraries Guide

94 www.xilinx.com 10.1

Page 96: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

LUT2Primitive: 2-Bit Look-Up-Table with General Output

IntroductionThis design element is a 2-bit look-up-table (LUT) with general output (O).

An INIT attribute with an appropriate number of hexadecimal digits for the number of inputs must be attachedto the LUT to specify its function. This element provides a look-up-table version of a buffer or inverter. Theseelements are the basic building blocks. Two LUTs are available in each CLB slice; four LUTs are available in eachCLB. Multiple variants of LUTs accommodate additional types of outputs that can be used by different timingmodels for more accurate pre-layout timing estimation.

The INIT parameter for the FPGA LUT primitive is what gives the LUT its logical value. By default, this value iszero, thus driving the output to a zero regardless of the input values (acting as a ground). However, in mostcases a new INIT value must be determined in order to specify the logic function for the LUT primitive. Thereare at least two methods by which the LUT value can be determined:

The Truth Table Method -A common method to determine the desired INIT value for a LUT is using a truthtable. To do so, simply create a binary truth table of all possible inputs, specify the desired logic value of theoutput and then create the INIT string from those output values.

The Equation Method -Another method to determine the LUT value is to define parameters for each input tothe LUT that correspond to their listed truth value and use those to build the logic equation you are after. Thismethod is easier to understand once you have grasped the concept and more self-documenting that the abovemethod however does require the code to first specify the appropriate parameters.

Logic TableInputs Outputs

I1 I0 O

0 0 INIT[0]

0 1 INIT[1]

1 0 INIT[2]

1 1 INIT[3]

INIT = Binary equivalent of the hexadecimal number assigned to the INIT attribute

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

96 www.xilinx.com 10.1

Page 97: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 4-Bit Value All zeros Initializes look-up tables.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- LUT2: 2-input Look-Up Table with general output-- Xilinx HDL Libraries Guide, version 10.1.2

LUT2_inst : LUT2generic map (INIT => X"0")port map (O => O, -- LUT general outputI0 => I0, -- LUT inputI1 => I1 -- LUT input);

-- End of LUT2_inst instantiation

Verilog Instantiation Template// LUT2: 2-input Look-Up Table with general output// For use with all FPGAs.// Xilinx HDL Libraries Guide, version 10.1.2

LUT2 #(.INIT(4’h0) // Specify LUT Contents) LUT2_inst (.O(O), // LUT general output.I0(I0), // LUT input.I1(I1) // LUT input);

// End of LUT2_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 97

Page 98: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

LUT2_D

Primitive: 2-Bit Look-Up-Table with Dual Output

IntroductionThis design element is a 2-bit look-up-tables (LUTs) with two functionally identical outputs, O and LO.

The O output is a general interconnect. The LO output is used to connect to another output within the same CLBslice and to the fast connect buffer. A mandatory INIT attribute, with an appropriate number of hexadecimaldigits for the number of inputs, must be attached to the LUT to specify its function.

The INIT parameter for the FPGA LUT primitive is what gives the LUT its logical value. By default, this value iszero, thus driving the output to a zero regardless of the input values (acting as a ground). However, in mostcases a new INIT value must be determined in order to specify the logic function for the LUT primitive. Thereare at least two methods by which the LUT value can be determined:

The Truth Table Method -A common method to determine the desired INIT value for a LUT is using a truthtable. To do so, simply create a binary truth table of all possible inputs, specify the desired logic value of theoutput and then create the INIT string from those output values.

The Equation Method -Another method to determine the LUT value is to define parameters for each input tothe LUT that correspond to their listed truth value and use those to build the logic equation you are after. Thismethod is easier to understand once you have grasped the concept and more self-documenting that the abovemethod however does require the code to first specify the appropriate parameters.

Logic TableInputs Outputs

I1 I0 O LO

0 0 INIT[0] INIT[0]

0 1 INIT[1] INIT[1]

1 0 INIT[2] INIT[2]

1 1 INIT[3] INIT[3]

INIT = Binary equivalent of the hexadecimal number assigned to the INIT attribute

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

98 www.xilinx.com 10.1

Page 99: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 4-Bit Value All zeros Initializes look-up tables.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- LUT2_D: 2-input Look-Up Table with general and local outputs-- Xilinx HDL Libraries Guide, version 10.1.2

LUT2_D_inst : LUT2_Dgeneric map (INIT => X"0")port map (LO => LO, -- LUT local outputO => O, -- LUT general outputI0 => I0, -- LUT inputI1 => I1 -- LUT input);

-- End of LUT2_D_inst instantiation

Verilog Instantiation Template// LUT2_D: 2-input Look-Up Table with general and local outputs// For use with all FPGAs.// Xilinx HDL Libraries Guide, version 10.1.2

LUT2_D #(.INIT(4’h0) // Specify LUT Contents) LUT2_D_inst (.LO(LO), // LUT local output.O(O), // LUT general output.I0(I0), // LUT input.I1(I1) // LUT input);

// End of LUT2_L_inst instantiation

Libraries Guide

10.1 www.xilinx.com 99

Page 101: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

LUT2_L

Primitive: 2-Bit Look-Up-Table with Local Output

IntroductionThis design element is a 2- bit look-up-tables (LUTs) with a local output (LO) that is used to connect to anotheroutput within the same CLB slice and to the fast connect buffer. It provides a look-up-table version of a bufferor inverter.

A mandatory INIT attribute, with an appropriate number of hexadecimal digits for the number of inputs,must be attached to the LUT to specify its function.

The INIT parameter for the FPGA LUT primitive is what gives the LUT its logical value. By default, this value iszero, thus driving the output to a zero regardless of the input values (acting as a ground). However, in mostcases a new INIT value must be determined in order to specify the logic function for the LUT primitive. Thereare at least two methods by which the LUT value can be determined:

The Truth Table Method -A common method to determine the desired INIT value for a LUT is using a truthtable. To do so, simply create a binary truth table of all possible inputs, specify the desired logic value of theoutput and then create the INIT string from those output values.

The Equation Method -Another method to determine the LUT value is to define parameters for each input tothe LUT that correspond to their listed truth value and use those to build the logic equation you are after. Thismethod is easier to understand once you have grasped the concept and more self-documenting that the abovemethod however does require the code to first specify the appropriate parameters.

Logic TableInputs Outputs

I1 I0 LO

0 0 INIT[0]

0 1 INIT[1]

1 0 INIT[2]

1 1 INIT[3]

INIT = Binary equivalent of the hexadecimal number assigned to the INIT attribute

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

10.1 www.xilinx.com 101

Page 102: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 4-Bit Value All zeros Initializes look-up tables.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- LUT2_L: 2-input Look-Up Table with local output-- Xilinx HDL Libraries Guide, version 10.1.2

LUT2_L_inst : LUT2_Lgeneric map (INIT => X"0")port map (LO => LO, -- LUT local outputI0 => I0, -- LUT inputI1 => I1 -- LUT input);

-- End of LUT2_L_inst instantiation

Verilog Instantiation Template// LUT2_L: 2-input Look-Up Table with local output// For use with all FPGAs.// Xilinx HDL Libraries Guide, version 10.1.2

LUT2_L #(.INIT(4’h0) // Specify LUT Contents) LUT2_L_inst (.LO(LO), // LUT local output.I0(I0), // LUT input.I1(I1) // LUT input);

// End of LUT2_L_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

102 www.xilinx.com 10.1

Page 103: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

LUT3

Primitive: 3-Bit Look-Up-Table with General Output

IntroductionThis design element is a 3-bit look-up-table (LUT) with general output (O). A mandatory INIT attribute, withan appropriate number of hexadecimal digits for the number of inputs, must be attached to the LUT to specifyits function.

An INIT attribute with an appropriate number of hexadecimal digits for the number of inputs must be attachedto the LUT to specify its function. This element provides a look-up-table version of a buffer or inverter. Theseelements are the basic building blocks. Two LUTs are available in each CLB slice; four LUTs are available in eachCLB. Multiple variants of LUTs accommodate additional types of outputs that can be used by different timingmodels for more accurate pre-layout timing estimation.

Logic TableInputs Outputs

I2 I1 I0 O

0 0 0 INIT[0]

0 0 1 INIT[1]

0 1 0 INIT[2]

0 1 1 INIT[3]

1 0 0 INIT[4]

1 0 1 INIT[5]

1 1 0 INIT[6]

1 1 1 INIT[7]

INIT = Binary equivalent of the hexadecimal number assigned to the INIT attribute

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

10.1 www.xilinx.com 103

Page 104: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 8-Bit Value All zeros Initializes look-up tables.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- LUT3: 3-input Look-Up Table with general output-- Xilinx HDL Libraries Guide, version 10.1.2

LUT3_inst : LUT3generic map (INIT => X"00")port map (O => O, -- LUT general outputI0 => I0, -- LUT inputI1 => I1, -- LUT inputI2 => I2 -- LUT input);

-- End of LUT3_inst instantiation

Verilog Instantiation Template// LUT3: 3-input Look-Up Table with general output// For use with all FPGAs.// Xilinx HDL Libraries Guide, version 10.1.2

LUT3 #(.INIT(8’h00) // Specify LUT Contents) LUT3_inst (.O(O), // LUT general output.I0(I0), // LUT input.I1(I1), // LUT input.I2(I2) // LUT input);

// End of LUT3_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

104 www.xilinx.com 10.1

Page 105: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

LUT3_DPrimitive: 3-Bit Look-Up-Table with Dual Output

IntroductionThis design element is a 3-bit look-up-tables (LUTs) with two functionally identical outputs, O and LO.

The O output is a general interconnect. The LO output is used to connect to another output within the same CLBslice and to the fast connect buffer. A mandatory INIT attribute, with an appropriate number of hexadecimaldigits for the number of inputs, must be attached to the LUT to specify its function.

The INIT parameter for the FPGA LUT primitive is what gives the LUT its logical value. By default, this value iszero, thus driving the output to a zero regardless of the input values (acting as a ground). However, in mostcases a new INIT value must be determined in order to specify the logic function for the LUT primitive. Thereare at least two methods by which the LUT value can be determined:

The Logic Table Method -A common method to determine the desired INIT value for a LUT is using a truthtable. To do so, simply create a binary logic table of all possible inputs, specify the desired logic value of theoutput and then create the INIT string from those output values.

The Equation Method -Another method to determine the LUT value is to define parameters for each input tothe LUT that correspond to their listed truth value and use those to build the logic equation you are after. Thismethod is easier to understand once you have grasped the concept and more self-documenting that the abovemethod however does require the code to first specify the appropriate parameters.

Logic TableInputs Outputs

I2 I1 I0 O LO

0 0 0 INIT[0] INIT[0]

0 0 1 INIT[1] INIT[1]

0 1 0 INIT[2] INIT[2]

0 1 1 INIT[3] INIT[3]

1 0 0 INIT[4] INIT[4]

1 0 1 INIT[5] INIT[5]

1 1 0 INIT[6] INIT[6]

1 1 1 INIT[7] INIT[7]

INIT = Binary equivalent of the hexadecimal number assigned to the INIT attribute

Design Entry MethodInstantiation Yes

Inference Recommended

Libraries Guide

10.1 www.xilinx.com 105

Page 106: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 8-Bit Value All zeros Initializes look-up tables.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- LUT3_D: 3-input Look-Up Table with general and local outputs-- Xilinx HDL Libraries Guide, version 10.1.2

LUT3_D_inst : LUT3_Dgeneric map (INIT => X"00")port map (LO => LO, -- LUT local outputO => O, -- LUT general outputI0 => I0, -- LUT inputI1 => I1, -- LUT inputI2 => I2 -- LUT input);

-- End of LUT3_D_inst instantiation

Verilog Instantiation Template// LUT3_D: 3-input Look-Up Table with general and local outputs// For use with all FPGAs.// Xilinx HDL Libraries Guide, version 10.1.2

LUT3_D #(.INIT(8’h00) // Specify LUT Contents) LUT3_D_inst (.LO(LO), // LUT local output.O(O), // LUT general output.I0(I0), // LUT input.I1(I1), // LUT input.I2(I2) // LUT input);

// End of LUT3_D_inst instantiation

For More Information• See the Virtex-II User Guide.• See the Virtex-II Data Sheets.

Libraries Guide

106 www.xilinx.com 10.1

Page 107: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

LUT3_L

Primitive: 3-Bit Look-Up-Table with Local Output

IntroductionThis design element is a 3- bit look-up-tables (LUTs) with a local output (LO) that is used to connect to anotheroutput within the same CLB slice and to the fast connect buffer. It provides a look-up-table version of a bufferor inverter.

A mandatory INIT attribute, with an appropriate number of hexadecimal digits for the number of inputs,must be attached to the LUT to specify its function.

The INIT parameter for the FPGA LUT primitive is what gives the LUT its logical value. By default, this value iszero, thus driving the output to a zero regardless of the input values (acting as a ground). However, in mostcases a new INIT value must be determined in order to specify the logic function for the LUT primitive. Thereare at least two methods by which the LUT value can be determined:

The Truth Table Method -A common method to determine the desired INIT value for a LUT is using a truthtable. To do so, simply create a binary truth table of all possible inputs, specify the desired logic value of theoutput and then create the INIT string from those output values.

The Equation Method -Another method to determine the LUT value is to define parameters for each input tothe LUT that correspond to their listed truth value and use those to build the logic equation you are after. Thismethod is easier to understand once you have grasped the concept and more self-documenting that the abovemethod however does require the code to first specify the appropriate parameters.

Logic TableInputs Outputs

I2 I1 I0 LO

0 0 0 INIT[0]

0 0 1 INIT[1]

0 1 0 INIT[2]

0 1 1 INIT[3]

1 0 0 INIT[4]

1 0 1 INIT[5]

1 1 0 INIT[6]

1 1 1 INIT[7]

INIT = Binary equivalent of the hexadecimal number assigned to the INIT attribute

Libraries Guide

10.1 www.xilinx.com 107

Page 108: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 8-Bit Value All zeros Initializes look-up tables.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- LUT3_L: 3-input Look-Up Table with local output-- Xilinx HDL Libraries Guide, version 10.1.2

LUT3_L_inst : LUT3_Lgeneric map (INIT => X"00")port map (LO => LO, -- LUT local outputI0 => I0, -- LUT inputI1 => I1, -- LUT inputI2 => I2 -- LUT input);

-- End of LUT3_L_inst instantiation

Verilog Instantiation Template// LUT3_L: 3-input Look-Up Table with local output// For use with all FPGAs.// Xilinx HDL Libraries Guide, version 10.1.2

LUT3_L #(.INIT(8’h00) // Specify LUT Contents) LUT3_L_inst (.LO(LO), // LUT local output.I0(I0), // LUT input.I1(I1), // LUT input.I2(I2) // LUT input);

// End of LUT3_L_inst instantiation

For More Information• See the Virtex-II User Guide.• See the Virtex-II Data Sheets.

Libraries Guide

108 www.xilinx.com 10.1

Page 109: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

LUT4

Primitive: 4-Bit Look-Up-Table with General Output

IntroductionThis design element is a 4-bit look-up-tables (LUT) with general output (O).

An INIT attribute with an appropriate number of hexadecimal digits for the number of inputs must be attachedto the LUT to specify its function. This element provides a look-up-table version of a buffer or inverter. Theseelements are the basic building blocks. Two LUTs are available in each CLB slice; four LUTs are available in eachCLB. Multiple variants of LUTs accommodate additional types of outputs that can be used by different timingmodels for more accurate pre-layout timing estimation.

The INIT parameter for the FPGA LUT primitive is what gives the LUT its logical value. By default, this value iszero, thus driving the output to a zero regardless of the input values (acting as a ground). However, in mostcases a new INIT value must be determined in order to specify the logic function for the LUT primitive. Thereare at least two methods by which the LUT value can be determined:

The Truth Table Method -A common method to determine the desired INIT value for a LUT is using a truthtable. To do so, simply create a binary truth table of all possible inputs, specify the desired logic value of theoutput and then create the INIT string from those output values.

The Equation Method -Another method to determine the LUT value is to define parameters for each input tothe LUT that correspond to their listed truth value and use those to build the logic equation you are after. Thismethod is easier to understand once you have grasped the concept and more self-documenting that the abovemethod however does require the code to first specify the appropriate parameters.

Logic TableInputs Outputs

I3 I2 I1 I0 O

0 0 0 0 INIT[0]

0 0 0 1 INIT[1]

0 0 1 0 INIT[2]

0 0 1 1 INIT[3]

0 1 0 0 INIT[4]

0 1 0 1 INIT[5]

0 1 1 0 INIT[6]

0 1 1 1 INIT[7]

1 0 0 0 INIT[8]

1 0 0 1 INIT[9]

1 0 1 0 INIT[10]

Libraries Guide

10.1 www.xilinx.com 109

Page 110: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

I3 I2 I1 I0 O

1 0 1 1 INIT[11]

1 1 0 0 INIT[12]

1 1 0 1 INIT[13]

1 1 1 0 INIT14]

1 1 1 1 INIT[15]

INIT = Binary equivalent of the hexadecimal number assigned to the INIT attribute

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 16-Bit Value All zeros Initializes look-up tables.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- LUT4: 4-input Look-Up Table with general output-- Xilinx HDL Libraries Guide, version 10.1.2

LUT4_inst : LUT4generic map (INIT => X"0000")port map (O => O, -- LUT general outputI0 => I0, -- LUT inputI1 => I1, -- LUT inputI2 => I2, -- LUT inputI3 => I3 -- LUT input);

-- End of LUT4_inst instantiation

Verilog Instantiation Template// LUT4: 4-input Look-Up Table with general output// For use with all FPGAs.// Xilinx HDL Libraries Guide, version 10.1.2

LUT4 #(

Libraries Guide

110 www.xilinx.com 10.1

Page 111: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT(16’h0000) // Specify LUT Contents) LUT4_inst (.O(O), // LUT general output.I0(I0), // LUT input.I1(I1), // LUT input.I2(I2), // LUT input.I3(I3) // LUT input);

// End of LUT4_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 111

Page 112: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

LUT4_DPrimitive: 4-Bit Look-Up-Table with Dual Output

IntroductionThis design element is a 4-bit look-up-tables (LUTs) with two functionally identical outputs, O and LO

The O output is a general interconnect. The LO output is used to connect to another output within the same CLBslice and to the fast connect buffer. A mandatory INIT attribute, with an appropriate number of hexadecimaldigits for the number of inputs, must be attached to the LUT to specify its function.

The INIT parameter for the FPGA LUT primitive is what gives the LUT its logical value. By default, this value iszero, thus driving the output to a zero regardless of the input values (acting as a ground). However, in mostcases a new INIT value must be determined in order to specify the logic function for the LUT primitive. Thereare at least two methods by which the LUT value can be determined:

The Truth Table Method -A common method to determine the desired INIT value for a LUT is using a truthtable. To do so, simply create a binary truth table of all possible inputs, specify the desired logic value of theoutput and then create the INIT string from those output values.

The Equation Method -Another method to determine the LUT value is to define parameters for each input tothe LUT that correspond to their listed truth value and use those to build the logic equation you are after. Thismethod is easier to understand once you have grasped the concept and more self-documenting that the abovemethod however does require the code to first specify the appropriate parameters.

Logic TableInputs Outputs

I3 I2 I1 I0 O LO

0 0 0 0 INIT[0] INIT[0]

0 0 0 1 INIT[1] INIT[1]

0 0 1 0 INIT[2] INIT[2]

0 0 1 1 INIT[3] INIT[3]

0 1 0 0 INIT[4] INIT[4]

0 1 0 1 INIT[5] INIT[5]

0 1 1 0 INIT[6] INIT[6]

0 1 1 1 INIT[7] INIT[7]

1 0 0 0 INIT[8] INIT[8]

1 0 0 1 INIT[9] INIT[9]

1 0 1 0 INIT[10] INIT[10]

1 0 1 1 INIT[11] INIT[11]

1 1 0 0 INIT[12] INIT[12]

Libraries Guide

112 www.xilinx.com 10.1

Page 113: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

I3 I2 I1 I0 O LO

1 1 0 1 INIT[13] INIT[13]

1 1 1 0 INIT14] INIT14]

1 1 1 1 INIT[15] INIT[15]

INIT = Binary equivalent of the hexadecimal number assigned to the INIT attribute

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 16-Bit Value All zeros Initializes look-up tables.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- LUT4_D: 4-input Look-Up Table with general and local outputs-- Xilinx HDL Libraries Guide, version 10.1.2

LUT4_D_inst : LUT4_Dgeneric map (INIT => X"0000")port map (LO => LO, -- LUT local outputO => O, -- LUT general outputI0 => I0, -- LUT inputI1 => I1, -- LUT inputI2 => I2, -- LUT inputI3 => I3 -- LUT input);

-- End of LUT4_D_inst instantiation

Verilog Instantiation Template// LUT4_D: 4-input Look-Up Table with general and local outputs// For use with all FPGAs.// Xilinx HDL Libraries Guide, version 10.1.2

LUT4_D #(.INIT(16’h0000) // Specify LUT Contents) LUT4_D_inst (

Libraries Guide

10.1 www.xilinx.com 113

Page 114: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.LO(LO), // LUT local output

.O(O), // LUT general output

.I0(I0), // LUT input

.I1(I1), // LUT input

.I2(I2), // LUT input

.I3(I3) // LUT input);

// End of LUT4_D_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

114 www.xilinx.com 10.1

Page 115: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

LUT4_LPrimitive: 4-Bit Look-Up-Table with Local Output

IntroductionThis design element is a 4- bit look-up-tables (LUTs) with a local output (LO) that is used to connect to anotheroutput within the same CLB slice and to the fast connect buffer. It provides a look-up-table version of a bufferor inverter.

A mandatory INIT attribute, with an appropriate number of hexadecimal digits for the number of inputs,must be attached to the LUT to specify its function.

The INIT parameter for the FPGA LUT primitive is what gives the LUT its logical value. By default, this value iszero, thus driving the output to a zero regardless of the input values (acting as a ground). However, in mostcases a new INIT value must be determined in order to specify the logic function for the LUT primitive. Thereare at least two methods by which the LUT value can be determined:

The Truth Table Method -A common method to determine the desired INIT value for a LUT is using a truthtable. To do so, simply create a binary truth table of all possible inputs, specify the desired logic value of theoutput and then create the INIT string from those output values.

The Equation Method -Another method to determine the LUT value is to define parameters for each input tothe LUT that correspond to their listed truth value and use those to build the logic equation you are after. Thismethod is easier to understand once you have grasped the concept and more self-documenting that the abovemethod however does require the code to first specify the appropriate parameters.

Logic TableInputs Outputs

I3 I2 I1 I0 LO

0 0 0 0 INIT[0]

0 0 0 1 INIT[1]

0 0 1 0 INIT[2]

0 0 1 1 INIT[3]

0 1 0 0 INIT[4]

0 1 0 1 INIT[5]

0 1 1 0 INIT[6]

0 1 1 1 INIT[7]

1 0 0 0 INIT[8]

1 0 0 1 INIT[9]

1 0 1 0 INIT[10]

1 0 1 1 INIT[11]

1 1 0 0 INIT[12]

Libraries Guide

10.1 www.xilinx.com 115

Page 116: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

I3 I2 I1 I0 LO

1 1 0 1 INIT[13]

1 1 1 0 INIT14]

1 1 1 1 INIT[15]

INIT = Binary equivalent of the hexadecimal number assigned to the INIT attribute

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 16-Bit Value All zeros Initializes look-up tables.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- LUT4_L: 4-input Look-Up Table with local output-- Xilinx HDL Libraries Guide, version 10.1.2

LUT4_L_inst : LUT4_Lgeneric map (INIT => X"0000")port map (LO => LO, -- LUT local outputI0 => I0, -- LUT inputI1 => I1, -- LUT inputI2 => I2, -- LUT inputI3 => I3 -- LUT input);

-- End of LUT4_L_inst instantiation

Verilog Instantiation Template// LUT4_L: 4-input Look-Up Table with local output// For use with all FPGAs.// Xilinx HDL Libraries Guide, version 10.1.2

LUT4_L #(.INIT(16’h0000) // Specify LUT Contents) LUT4_L_inst (.LO(LO), // LUT local output

Libraries Guide

116 www.xilinx.com 10.1

Page 117: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.I0(I0), // LUT input

.I1(I1), // LUT input

.I2(I2), // LUT input

.I3(I3) // LUT input);

// End of LUT4_L_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 117

Page 118: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

MULT_ANDPrimitive: Fast Multiplier AND

IntroductionThe design element is an AND component located within the slice where the two inputs are shared with the4-input LUT and the output drives into the carry logic. This added logic is especially useful for building fastand smaller multipliers however be used for other purposes as well. The I1 and I0 inputs must be connected tothe I1 and I0 inputs of the associated LUT. The LO output must be connected to the DI input of the associatedMUXCY, MUXCY_D, or MUXCY_L.

Logic TableInputs Outputs

I1 I0 LO

0 0 0

0 1 0

1 0 0

1 1 1

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- MULT_AND: 2-input AND gate connected to Carry chain-- All FPGA devices except Virtex-5-- Xilinx HDL Libraries Guide, version 10.1.2

MULT_AND_inst : MULT_ANDport map (LO => LO, -- MULT_AND output (connect to MUXCY DI)I0 => I0, -- MULT_AND data[0] inputI1 => I1 -- MULT_AND data[1] input);

-- End of MULT_AND_inst instantiation

Libraries Guide

118 www.xilinx.com 10.1

Page 119: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Verilog Instantiation Template// MULT_AND: 2-input AND gate connected to Carry chain// For use with all FPGAs except Virtex-5// Xilinx HDL Libraries Guide, version 10.1.2

MULT_AND MULT_AND_inst (.LO(LO), // MULT_AND output (connect to MUXCY DI).I0(I0), // MULT_AND data[0] input.I1(I1) // MULT_AND data[1] input);

// End of MULT_AND_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 119

Page 120: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

MULT18X18Primitive: 18 x 18 Signed Multiplier

IntroductionMULT18X18 is a combinational signed 18-bit by 18-bit multiplier. The value represented in the 18-bit input A ismultiplied by the value represented in the 18-bit input B. Output P is the 36-bit product of A and B.

Logic TableInputs Output

A B P

A B A x B

A, B, and P are two’s complement.

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- MULT18X18: 18 x 18 signed asynchronous multiplier-- Virtex-II/II-Pro, Spartan-3-- Xilinx HDL Libraries Guide, version 10.1.2

MULT18X18_inst : MULT18X18port map (P => P, -- 36-bit multiplier outputA => A, -- 18-bit multiplier inputB => B -- 18-bit multiplier input);

-- End of MULT18X18_inst instantiation

Verilog Instantiation Template// MULT18X18: 18 x 18 signed asynchronous multiplier

Libraries Guide

120 www.xilinx.com 10.1

Page 121: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

// Virtex-II/II-Pro, Spartan-3// Xilinx HDL Libraries Guide, version 10.1.2

MULT18X18 MULT18X18_inst (.P(P), // 36-bit multiplier output.A(A), // 18-bit multiplier input.B(B) // 18-bit multiplier input);

// End of MULT18X18_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 121

Page 122: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

MULT18X18SPrimitive: 18 x 18 Signed Multiplier – Registered Version

IntroductionMULT18X18S is the registered version of the 18 x 18 signed multiplier with output P and inputs A, B, C, CE, andR. The registers are initialized to 0 after the GSR pulse.

The value represented in the 18-bit input A is multiplied by the value represented in the 18-bit input B. Output Pis the 36-bit product of A and B.

Logic TableInputs Output

C CE Am Bn R P

↑ X X X 1 0

↑ 1 Am Bn 0 A x B

X 0 X X 0 No Change

A, B, and P are two’s complement.

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- MULT18X18S: 18 x 18 signed synchronous multiplier-- Virtex-II/II-Pro, Spartan-3-- Xilinx HDL Libraries Guide, version 10.1.2

MULT18X18S_inst : MULT18X18Sport map (

Libraries Guide

122 www.xilinx.com 10.1

Page 123: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

P => P, -- 36-bit multiplier outputA => A, -- 18-bit multiplier inputB => B, -- 18-bit multiplier inputC => C, -- Clock inputCE => CE, -- Clock enable inputR => R -- Synchronous reset input);

-- End of MULT18X18S_inst instantiation

Verilog Instantiation Template// MULT18X18S: 18 x 18 signed synchronous multiplier// Virtex-II/II-Pro, Spartan-3// Xilinx HDL Libraries Guide, version 10.1.2

MULT18X18S MULT18X18S_inst (.P(P), // 36-bit multiplier output.A(A), // 18-bit multiplier input.B(B), // 18-bit multiplier input.C(C), // Clock input.CE(CE), // Clock enable input.R(R) // Synchronous reset input);

// End of MULT18X18S_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 123

Page 124: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

MUXCYPrimitive: 2-to-1 Multiplexer for Carry Logic with General Output

IntroductionThe direct input (DI) of a slice is connected to the (DI) input of the MUXCY. The carry in (CI) input of an LCis connected to the CI input of the MUXCY. The select input (S) of the MUXCY is driven by the output of theLook-Up Table (LUT) and configured as a MUX function. The carry out (O) of the MUXCY reflects the state of theselected input and implements the carry out function of each LC. When Low, S selects DI; when High, S selects CI.

The variants “MUXCY_D” and “MUXCY_L” provide additional types of outputs that can be used by differenttiming models for more accurate pre-layout timing estimation.

Logic TableInputs Outputs

S DI CI O

0 1 X 1

0 0 X 0

1 X 1 1

1 X 0 0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- MUXCY: Carry-Chain MUX with general output-- Xilinx HDL Libraries Guide, version 10.1.2

MUXCY_inst : MUXCYport map (O => O, -- Carry output signalCI => CI, -- Carry input signalDI => DI, -- Data input signalS => S -- MUX select, tie to ’1’ or LUT4 out

Libraries Guide

124 www.xilinx.com 10.1

Page 125: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

);

-- End of MUXCY_inst instantiation

Verilog Instantiation Template// MUXCY: Carry-Chain MUX with general output// For use with All FPGAs// Xilinx HDL Libraries Guide, version 10.1.2

MUXCY MUXCY_inst (.O(O), // Carry output signal.CI(CI), // Carry input signal.DI(DI), // Data input signal.S(S) // MUX select, tie to ’1’ or LUT4 out);

// End of MUXCY_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 125

Page 126: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

MUXCY_DPrimitive: 2-to-1 Multiplexer for Carry Logic with Dual Output

IntroductionThis design element implements a 1-bit, high-speed carry propagate function. One such function can beimplemented per logic cell (LC), for a total of 4-bits per configurable logic block (CLB). The direct input (DI) ofan LC is connected to the DI input of the MUXCY_D. The carry in (CI) input of an LC is connected to the CIinput of the MUXCY_D. The select input (S) of the MUX is driven by the output of the Look-Up Table (LUT) andconfigured as an XOR function. The carry out (O and LO) of the MUXCY_D reflects the state of the selected inputand implements the carry out function of each LC. When Low, S selects DI; when High, S selects CI.

Outputs O and LO are functionally identical. The O output is a general interconnect. See also “MUXCY”and “MUXCY_L”.

Logic TableInputs Outputs

S DI CI O LO

0 1 X 1 1

0 0 X 0 0

1 X 1 1 1

1 X 0 0 0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- MUXCY_D: Carry-Chain MUX with general and local outputs-- Xilinx HDL Libraries Guide, version 10.1.2

MUXCY_D_inst : MUXCY_Dport map (LO => LO, -- Carry local output signal

Libraries Guide

126 www.xilinx.com 10.1

Page 127: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

O => O, -- Carry general output signalCI => CI, -- Carry input signalDI => DI, -- Data input signalS => S -- MUX select, tie to ’1’ or LUT4 out);

-- End of MUXCY_D_inst instantiation

Verilog Instantiation Template// MUXCY_D: Carry-Chain MUX with general and local outputs// For use with All FPGAs// Xilinx HDL Libraries Guide, version 10.1.2

MUXCY_D MUXCY_D_inst (.LO(LO), // Carry local output signal.O(O), // Carry general output signal.CI(CI), // Carry input signal.DI(DI), // Data input signal.S(S) // MUX select, tie to ’1’ or LUT4 out);

// End of MUXCY_D_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 127

Page 128: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

MUXCY_LPrimitive: 2-to-1 Multiplexer for Carry Logic with Local Output

IntroductionThis design element implements a 1-bit high-speed carry propagate function. One such function is implementedper logic cell (LC), for a total of 4-bits per configurable logic block (CLB). The direct input (DI) of an LC isconnected to the DI input of the MUXCY_L. The carry in (CI) input of an LC is connected to the CI input of theMUXCY_L. The select input (S) of the MUXCY_L is driven by the output of the Look-Up Table (LUT) andconfigured as an XOR function. The carry out (LO) of the MUXCY_L reflects the state of the selected input andimplements the carry out function of each (LC). When Low, (S) selects DI; when High, (S) selects (CI).

See also “MUXCY” and “MUXCY_D.”

Logic TableInputs Outputs

S DI CI LO

0 1 X 1

0 0 X 0

1 X 1 1

1 X 0 0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- MUXCY_L: Carry-Chain MUX with local output-- Xilinx HDL Libraries Guide, version 10.1.2

MUXCY_L_inst : MUXCY_Lport map (LO => LO, -- Carry local output signalCI => CI, -- Carry input signalDI => DI, -- Data input signal

Libraries Guide

128 www.xilinx.com 10.1

Page 129: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

S => S -- MUX select, tie to ’1’ or LUT4 out);

-- End of MUXCY_L_inst instantiation

Verilog Instantiation Template// MUXCY_L: Carry-Chain MUX with local output// For use with All FPGAs// Xilinx HDL Libraries Guide, version 10.1.2

MUXCY_L MUXCY_L_inst (.LO(LO), // Carry local output signal.CI(CI), // Carry input signal.DI(DI), // Data input signal.S(S) // MUX select, tie to ’1’ or LUT4 out);

// End of MUXCY_L_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 129

Page 130: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

MUXF5Primitive: 2-to-1 Look-Up Table Multiplexer with General Output

IntroductionThis design element provides a multiplexer function in a CLB slice for creating a function-of-5 lookup table or a4-to-1 multiplexer in combination with the associated lookup tables. The local outputs (LO) from the twolookup tables are connected to the I0 and I1 inputs of the MUXF5. The (S) input is driven from any internal net.When Low, (S) selects I0. When High, (S) selects I1.

The variants, “MUXF5_D” and “MUXF5_L”, provide additional types of outputs that can be used by differenttiming models for more accurate pre-layout timing estimation.

Logic TableInputs Outputs

S I0 I1 O

0 1 X 1

0 0 X 0

1 X 1 1

1 X 0 0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- MUXF5: Slice MUX to tie two LUT4’s together with general output-- All FPGA Devices except Virtex-5-- Xilinx HDL Libraries Guide, version 10.1.2

MUXF5_inst : MUXF5port map (O => O, -- Output of MUX to general routingI0 => I0, -- Input (tie directly to the output of LUT4)I1 => I1, -- Input (tie directoy to the output of LUT4)S => S -- Input select to MUX

Libraries Guide

130 www.xilinx.com 10.1

Page 131: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

);

-- End of MUXF5_inst instantiation

Verilog Instantiation Template// MUXF5: Slice MUX to tie two LUT4’s together with general output// For use with All FPGAs except Virtex-5// Xilinx HDL Libraries Guide, version 10.1.2

MUXF5 MUXF5_inst (.O(O), // Output of MUX to general routing.I0(I0), // Input (tie directly to the output of LUT4).I1(I1), // Input (tie directoy to the output of LUT4).S(S) // Input select to MUX);

// End of MUXF5_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 131

Page 132: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

MUXF5_DPrimitive: 2-to-1 Look-Up Table Multiplexer with Dual Output

IntroductionThis design element provides a multiplexer function in a CLB slice for creating a function-of-5 lookup table or a4-to-1 multiplexer in combination with the associated lookup tables. The local outputs (LO) from the two lookuptables are connected to the I0 and I1 inputs of the MUXF5. The S input is driven from any internal net. WhenLow, S selects I0. When High, S selects I1.

Outputs O and LO are functionally identical. The O output is a general interconnect. The LO output connects toother inputs in the same CLB slice. See also “MUXF5” and “MUXF5_L”

Logic TableInputs Outputs

S I0 I1 O LO

0 1 X 1 1

0 0 X 0 0

1 X 1 1 1

1 X 0 0 0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- MUXF5_D: Slice MUX to tie two LUT4’s together with general and local outputs-- All FPGA Devices except Virtex-5-- Xilinx HDL Libraries Guide, version 10.1.2

MUXF5_D_inst : MUXF5_Dport map (LO => LO, -- Ouptut of MUX to local routingO => O, -- Output of MUX to general routingI0 => I0, -- Input (tie directly to the output of LUT4)

Libraries Guide

132 www.xilinx.com 10.1

Page 133: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

I1 => I1, -- Input (tie directoy to the output of LUT4)S => S -- Input select to MUX);

-- End of MUXF5_D_inst instantiation

Verilog Instantiation Template// MUXF5_D: Slice MUX to tie two LUT4’s together with general and local outputs// For use with All FPGAs except Virtex-5// Xilinx HDL Libraries Guide, version 10.1.2

MUXF5_D MUXF5_D_inst (.LO(LO), // Ouptut of MUX to local routing.O(O), // Output of MUX to general routing.I0(I0), // Input (tie directly to the output of LUT4).I1(I1), // Input (tie directoy to the output of LUT4).S(S) // Input select to MUX);

// End of MUXF5_D_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 133

Page 134: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

MUXF5_LPrimitive: 2-to-1 Look-Up Table Multiplexer with Local Output

IntroductionThis design element provides a multiplexer function in a CLB slice for creating a function-of-5 lookup table or a4-to-1 multiplexer in combination with the associated lookup tables. The local outputs (LO) from the two lookuptables are connected to the I0 and I1 inputs of the MUXF5. The S input is driven from any internal net. WhenLow, S selects I0. When High, S selects I1.

The LO output connects to other inputs in the same CLB slice.

See also “MUXF5” and “MUXF5_D”

Logic TableInputs Output

S I0 I1 LO

0 1 X 1

0 0 X 0

1 X 1 1

1 X 0 0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- MUXF5_L: Slice MUX to tie two LUT4’s together with local output-- All FPGA Devices except Virtex-5-- Xilinx HDL Libraries Guide, version 10.1.2

MUXF5_L_inst : MUXF5_Lport map (LO => LO, -- Output of MUX to local routingI0 => I0, -- Input (tie directly to the output of LUT4)I1 => I1, -- Input (tie directoy to the output of LUT4)

Libraries Guide

134 www.xilinx.com 10.1

Page 135: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

S => S -- Input select to MUX);

-- End of MUXF5_L_inst instantiation

Verilog Instantiation Template// MUXF5_L: Slice MUX to tie two LUT4’s together with local output// For use with All FPGAs except Virtex-5// Xilinx HDL Libraries Guide, version 10.1.2

MUXF5_L MUXF5_L_inst (.LO(LO), // Output of MUX to local routing.I0(I0), // Input (tie directly to the output of LUT4).I1(I1), // Input (tie directoy to the output of LUT4).S(S) // Input select to MUX);

// End of MUXF5_L_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 135

Page 136: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

MUXF6Primitive: 2-to-1 Look-Up Table Multiplexer with General Output

IntroductionThis design element provides a multiplexer function in two slices for creating a function-of-6 lookup table or an8-to-1 multiplexer in combination with the associated four lookup tables and two MUXF5s. The local outputs(LO) from the two MUXF5s in the CLB are connected to the I0 and I1 inputs of the MUXF6. The S input is drivenfrom any internal net. When Low, (S) selects I0. When High, (S) selects I1.

The variants, “MUXF6_D” and “MUXF6_L”, provide additional types of outputs that can be used by differenttiming models for more accurate pre-layout timing estimation.

Logic TableInputs Outputs

S I0 I1 O

0 1 X 1

0 0 X 0

1 X 1 1

1 X 0 0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- MUXF6: CLB MUX to tie two MUXF5’s together with general output-- All FPGA Devices except Virtex-5-- Xilinx HDL Libraries Guide, version 10.1.2

MUXF6_inst : MUXF6port map (O => O, -- Output of MUX to general routingI0 => I0, -- Input (tie to MUXF5 LO out)

Libraries Guide

136 www.xilinx.com 10.1

Page 137: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

I1 => I1, -- Input (tie to MUXF5 LO out)S => S -- Input select to MUX);

-- End of MUXF6_inst instantiation

Verilog Instantiation Template// MUXF6: CLB MUX to tie two MUXF5’s together with general output// For use with All FPGAs except Virtex-5// Xilinx HDL Libraries Guide, version 10.1.2

MUXF6 MUXF6_inst (.O(O), // Output of MUX to general routing.I0(I0), // Input (tie to MUXF5 LO out).I1(I1), // Input (tie to MUXF5 LO out).S(S) // Input select to MUX);

// End of MUXF6_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 137

Page 138: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

MUXF6_DPrimitive: 2-to-1 Look-Up Table Multiplexer with Dual Output

IntroductionThis design element provides a multiplexer function in a two slices for creating a function-of-6 lookup table or an8-to-1 multiplexer in combination with the associated four lookup tables and two MUXF5s. The local outputs(LO) from the two MUXF5s in the CLB are connected to the I0 and I1 inputs of the MUXF6. The (S) input isdriven from any internal net. When Low, (S) selects I0. When High, (S) selects I1.

Outputs (O) and (LO) are functionally identical. The (O) output is a general interconnect. The (LO) outputconnects to other inputs in the same CLB slice.

Logic TableInputs Outputs

S I0 I1 O LO

0 1 X 1 1

0 0 X 0 0

1 X 1 1 1

1 X 0 0 0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- MUXF6_D: CLB MUX to tie two MUXF5’s together with general and local outputs-- All FPGA Devices except Virtex-5-- Xilinx HDL Libraries Guide, version 10.1.2

MUXF6_D_inst : MUXF6_Dport map (LO => LO, -- Ouptut of MUX to local routingO => O, -- Output of MUX to general routing

Libraries Guide

138 www.xilinx.com 10.1

Page 139: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

I0 => I0, -- Input (tie to MUXF5 LO out)I1 => I1, -- Input (tie to MUXF5 LO out)S => S -- Input select to MUX);

-- End of MUXF6_D_inst instantiation

Verilog Instantiation Template// MUXF6_D: CLB MUX to tie two MUXF5’s together with general and local outputs// For use with All FPGAs except Virtex-5// Xilinx HDL Libraries Guide, version 10.1.2

MUXF6_D MUXF6_D_inst (.LO(LO), // Ouptut of MUX to local routing.O(O), // Output of MUX to general routing.I0(I0), // Input (tie to MUXF5 LO out).I1(I1), // Input (tie to MUXF5 LO out).S(S) // Input select to MUX);

// End of MUXF6_D_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 139

Page 140: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

MUXF6_LPrimitive: 2-to-1 Look-Up Table Multiplexer with Local Output

IntroductionThis design element provides a multiplexer function for use in creating a function-of-6 lookup table or an 8-to-1multiplexer in combination with the associated four lookup tables and two MUXF5s. The local outputs (LO)from the two MUXF5s in the (CLB) are connected to the I0 and I1 inputs of the MUXF6. The (S) input is drivenfrom any internal net. When Low, (S) selects I0. When High, (S) selects I1.

The LO output connects to other inputs in the same CLB slice.

Logic TableInputs Output

S I0 I1 LO

0 1 X 1

0 0 X 0

1 X 1 1

1 X 0 0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- MUXF6_L: CLB MUX to tie two MUXF5’s together with local output-- All FPGA Devices except Virtex-5-- Xilinx HDL Libraries Guide, version 10.1.2

MUXF6_L_inst : MUXF6_Lport map (LO => LO, -- Output of MUX to local routingI0 => I0, -- Input (tie to MUXF5 LO out)I1 => I1, -- Input (tie to MUXF5 LO out)S => S -- Input select to MUX

Libraries Guide

140 www.xilinx.com 10.1

Page 141: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

);

-- End of MUXF6_L_inst instantiation

Verilog Instantiation Template// MUXF6_L: CLB MUX to tie two MUXF5’s together with local output// For use with All FPGAs except Virtex-5// Xilinx HDL Libraries Guide, version 10.1.2

MUXF6_L MUXF6_L_inst (.LO(LO), // Output of MUX to local routing.I0(I0), // Input (tie to MUXF5 LO out).I1(I1), // Input (tie to MUXF5 LO out).S(S) // Input select to MUX);

// End of MUXF6_L_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 141

Page 142: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

MUXF7

Primitive: 2-to-1 Look-Up Table Multiplexer with General Output

IntroductionThis design element provides a multiplexer function for use in creating a function-of-7 Look-Up Table or a16-to-1 multiplexer in combination with the associated Look-Up Tables. Local outputs (LO) of MUXF6 areconnected to the I0 and I1 inputs of the MUXF7. The (S) input is driven from any internal net. When Low,(S) selects I0. When High, ( S) selects I1.

The variants, “MUXF7_D” and “MUXF7_L”, provide additional types of outputs that can be used by differenttiming models for more accurate pre-layout timing estimation.

Logic TableInputs Outputs

S I0 I1 O

0 I0 X I0

1 X I1 I1

X 0 0 0

X 1 1 1

Port DescriptionsPort Direction Width Function

O Output 1 Output of MUX to general routing

I0 Input 1 Input (tie to MUXF6 LO out)

I1 Input 1 Input (tie to MUXF6 LO out)

S Input 1 Input select to MUX

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

142 www.xilinx.com 10.1

Page 143: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- MUXF7: CLB MUX to tie two MUXF6’s together with general output-- Virtex-II/II-Pro/4/5 and Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

MUXF7_inst : MUXF7port map (O => O, -- Output of MUX to general routingI0 => I0, -- Input (tie to MUXF6 LO out)I1 => I1, -- Input (tie to MUXF6 LO out)S => S -- Input select to MUX);

-- End of MUXF7_inst instantiation

Verilog Instantiation Template// MUXF7: CLB MUX to tie two LUT6’s or MUXF6’s together with general output// For use with Virtex-II/II-Pro/4/5 and Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

MUXF7 MUXF7_inst (.O(O), // Output of MUX to general routing.I0(I0), // Input (tie to MUXF6 LO out).I1(I1), // Input (tie to MUXF6 LO out).S(S) // Input select to MUX);

// End of MUXF7_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 143

Page 144: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

MUXF7_DPrimitive: 2-to-1 Look-Up Table Multiplexer with Dual Output

IntroductionThis design element provides a multiplexer function for use in creating a function-of-7 Look-Up Table or a16-to-1 multiplexer in combination with the associated Look-Up Tables. Local outputs (LO) of MUXF6 areconnected to the I0 and I1 inputs of the MUXF7. The S input is driven from any internal net. When Low, (S)selects I0. When High, (S) selects I1.

Outputs O and LO are functionally identical. The O output is a general interconnect. The LO output connects toother inputs in the same CLB slice.

Logic TableInputs Outputs

S I0 I1 O LO

0 I0 X I0 I0

1 X I1 I1 I1

X 0 0 0 0

X 1 1 1 1

Port DescriptionsPort Direction Width Function

O Output 1 Output of MUX to general routing

LO Output 1 Output of MUX to local routing

I0 Input 1 Input (tie to MUXF6 LO out)

I1 Input 1 Input (tie to MUXF6 LO out)

S Input 1 Input select to MUX

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

144 www.xilinx.com 10.1

Page 145: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- MUXF7_D: CLB MUX to tie two MUXF6’s together with general and local outputs-- Virtex-II/II-Pro/4/5 and Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

MUXF7_D_inst : MUXF7_Dport map (LO => LO, -- Ouptut of MUX to local routingO => O, -- Output of MUX to general routingI0 => I0, -- Input (tie to MUXF6 LO out)I1 => I1, -- Input (tie to MUXF6 LO out)S => S -- Input select to MUX);

-- End of MUXF7_D_inst instantiation

Verilog Instantiation Template// MUXF7_D: CLB MUX to tie two LUT6’s or MUXF6’s together with general and local outputs// For use with Virtex-II/II-Pro/4/5 and Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

MUXF7_D MUXF7_D_inst (.LO(LO), // Ouptut of MUX to local routing.O(O), // Output of MUX to general routing.I0(I0), // Input (tie to MUXF6 LO out).I1(I1), // Input (tie to MUXF6 LO out).S(S) // Input select to MUX);

// End of MUXF7_D_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 145

Page 146: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

MUXF7_L

Primitive: 2-to-1 Look-Up Table Multiplexer with Local Output

IntroductionThis design element provides a multiplexer function for use in creating a function-of-7 Look-Up Table or a16-to-1 multiplexer in combination with the associated Look-Up Tables. Local outputs (LO) of MUXF6 areconnected to the I0 and I1 inputs of the MUXF7. The S input is driven from any internal net. When Low, (S)selects I0. When High, (S) selects I1.

The LO output connects to other inputs in the same CLB slice.

Logic TableInputs Output

S I0 I1 LO

0 I0 X I0

1 X I1 I1

X 0 0 0

X 1 1 1

Port DescriptionsPort Direction Width Function

LO Output 1 Output of MUX to local routing

I0 Input 1 Input (tie to MUXF6 LO out)

I1 Input 1 Input (tie to MUXF6 LO out)

S Input 1 Input select to MUX

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

146 www.xilinx.com 10.1

Page 147: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- MUXF7_L: CLB MUX to tie two MUXF6’s together with local output-- Virtex-II/II-Pro/4/5 and Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

MUXF7_L_inst : MUXF7_Lport map (LO => LO, -- Output of MUX to local routingI0 => I0, -- Input (tie to MUXF6 LO out)I1 => I1, -- Input (tie to MUXF6 LO out)S => S -- Input select to MUX);

-- End of MUXF7_L_inst instantiation

Verilog Instantiation Template// MUXF7_L: CLB MUX to tie two LUT6’s or MUXF6’s together with local output// For use with Virtex-II/II-Pro/4/5 and Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

MUXF7_L MUXF7_L_inst (.LO(LO), // Output of MUX to local routing.I0(I0), // Input (tie to MUXF6 LO out).I1(I1), // Input (tie to MUXF6 LO out).S(S) // Input select to MUX);

// End of MUXF7_L_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 147

Page 148: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

MUXF8

Primitive: 2-to-1 Look-Up Table Multiplexer with General Output

IntroductionThis design element provides a multiplexer function in eight slices for creating a function-of-8 Look-Up Tableor a 32-to-1 multiplexer in combination with the associated Look-Up Tables, MUXF5s, MUXF6s, and MUXF7s.Local outputs (LO) of MUXF7 are connected to the I0 and I1 inputs of the MUXF8. The S input is driven from anyinternal net. When Low, (S) selects I0. When High, (S) selects I1.

Logic TableInputs Outputs

S I0 I1 O

0 I0 X I0

1 X I1 I1

X 0 0 0

X 1 1 1

Port DescriptionsPort Direction Width Function

O Output 1 Output of MUX to general routing

I0 Input 1 Input (tie to MUXF7 LO out)

I1 Input 1 Input (tie to MUXF7 LO out)

S Input 1 Input select to MUX

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

148 www.xilinx.com 10.1

Page 149: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- MUXF8: CLB MUX to tie two MUXF7’s together with general output-- Virtex-II/II-Pro/4/5 and Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

MUXF8_inst : MUXF8port map (O => O, -- Output of MUX to general routingI0 => I0, -- Input (tie to MUXF7 LO out)I1 => I1, -- Input (tie to MUXF7 LO out)S => S -- Input select to MUX);

-- End of MUXF8_inst instantiation

Verilog Instantiation Template// MUXF8: CLB MUX to tie two MUXF7’s together with general output// For use with Virtex-II/II-Pro/4/5 and Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

MUXF8 MUXF8_inst (.O(O), // Output of MUX to general routing.I0(I0), // Input (tie to MUXF7 LO out).I1(I1), // Input (tie to MUXF7 LO out).S(S) // Input select to MUX);

// End of MUXF8_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 149

Page 150: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

MUXF8_D

Primitive: 2-to-1 Look-Up Table Multiplexer with Dual Output

IntroductionThis design element provides a multiplexer function in eight slices for creating a function-of-8 Look-Up Table ora 32-to-1 multiplexer in combination with the associated four Look-Up Tables and two MUXF8s. Local outputs(LO) of MUXF7 are connected to the I0 and I1 inputs of the MUXF8. The S input is driven from any internal net.When Low, (S) selects I0. When High, (S) selects I1.

Outputs O and LO are functionally identical. The O output is a general interconnect. The LO output connects toother inputs in the same CLB slice.

Logic TableInputs Outputs

S I0 I1 O LO

0 I0 X I0 I0

1 X I1 I1 I1

X 0 0 0 0

X 1 1 1 1

Port DescriptionsPort Direction Width Function

O Output 1 Output of MUX to general routing

LO Output 1 Output of MUX to local routing

I0 Input 1 Input (tie to MUXF7 LO out)

I1 Input 1 Input (tie to MUXF7 LO out)

S Input 1 Input select to MUX

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

150 www.xilinx.com 10.1

Page 151: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- MUXF8_D: CLB MUX to tie two MUXF7’s together with general and local outputs-- Virtex-II/II-Pro/4/5 and Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

MUXF8_D_inst : MUXF8_Dport map (LO => LO, -- Ouptut of MUX to local routingO => O, -- Output of MUX to general routingI0 => I0, -- Input (tie to MUXF7 LO out)I1 => I1, -- Input (tie to MUXF7 LO out)S => S -- Input select to MUX);

-- End of MUXF8_D_inst instantiation

Verilog Instantiation Template// MUXF8_D: CLB MUX to tie two MUXF7’s together with general and local outputs// For use with Virtex-II/II-Pro/4/5 and Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

MUXF8_D MUXF8_D_inst (.LO(LO), // Ouptut of MUX to local routing.O(O), // Output of MUX to general routing.I0(I0), // Input (tie to MUXF7 LO out).I1(I1), // Input (tie to MUXF7 LO out).S(S) // Input select to MUX);

// End of MUXF8_D_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 151

Page 152: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

MUXF8_L

Primitive: 2-to-1 Look-Up Table Multiplexer with Local Output

IntroductionThis design element provides a multiplexer function in eight slices for creating a function-of-8 Look-Up Table ora 32-to-1 multiplexer in combination with the associated four Look-Up Tables and two MUXF8s. Local outputs(LO) of MUXF7 are connected to the I0 and I1 inputs of the MUXF8. The S input is driven from any internal net.When Low, (S) selects I0. When High, (S) selects I1.

The LO output connects to other inputs in the same CLB slice.

Logic TableInputs Output

S I0 I1 LO

0 I0 X I0

1 X I1 I1

X 0 0 0

X 1 1 1

Port DescriptionsPort Direction Width Function

LO Output 1 Output of MUX to local routing

I0 Input 1 Input (tie to MUXF7 LO out)

I1 Input 1 Input (tie to MUXF7 LO out)

S Input 1 Input select to MUX

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

152 www.xilinx.com 10.1

Page 153: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- MUXF8_L: CLB MUX to tie two MUXF7’s together with local output-- Virtex-II/II-Pro/4/5 and Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

MUXF8_L_inst : MUXF8_Lport map (LO => LO, -- Output of MUX to local routingI0 => I0, -- Input (tie to MUXF7 LO out)I1 => I1, -- Input (tie to MUXF7 LO out)S => S -- Input select to MUX);

-- End of MUXF8_L_inst instantiation

Verilog Instantiation Template// MUXF8_L: CLB MUX to tie two MUXF7’s together with local output// For use with Virtex-II/II-Pro/4/5 and Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

MUXF8_L MUXF8_L_inst (.LO(LO), // Output of MUX to local routing.I0(I0), // Input (tie to MUXF7 LO out).I1(I1), // Input (tie to MUXF7 LO out).S(S) // Input select to MUX);

// End of MUXF8_L_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 153

Page 154: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

OBUFPrimitive: Output Buffer

IntroductionThis design element is a simple output buffer used to drive output signals to the FPGA device pins that do notneed to be 3-stated (constantly driven). Either an OBUF, OBUFT, OBUFDS, or OBUFTDS must be connected toevery output port in the design.

This element isolates the internal circuit and provides drive current for signals leaving a chip. It exists ininput/output blocks (IOB). Its output (O) is connected to an OPAD or an IOPAD. The interface standard usedby this element is LVTTL. Also, this element has selectable drive and slew rates using the DRIVE and SLOWor FAST constraints. The defaults are DRIVE=12 mA and SLOW slew.

Port DescriptionsPort Direction Width Function

O Output 1 Output of OBUF to be connected directly to top-level outputport.

I Input 1 Input of OBUF. Connect to the logic driving the output port.

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

IOSTANDARD String See Data Sheet "DEFAULT" Assigns an I/O standard to the element.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- OBUF: Single-ended Output Buffer-- All devices-- Xilinx HDL Libraries Guide, version 10.1.2

OBUF_inst : OBUF

Libraries Guide

154 www.xilinx.com 10.1

Page 155: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

generic map (DRIVE => 12,IOSTANDARD => "DEFAULT",SLEW => "SLOW")port map (O => O, -- Buffer output (connect directly to top-level port)I => I -- Buffer input);

-- End of OBUF_inst instantiation

Verilog Instantiation Template// OBUF: Single-ended Output Buffer// All devices// Xilinx HDL Libraries Guide, version 10.1.2

OBUF #(.DRIVE(12), // Specify the output drive strength.IOSTANDARD("DEFAULT"), // Specify the output I/O standard.SLEW("SLOW") // Specify the output slew rate) OBUF_inst (.O(O), // Buffer output (connect directly to top-level port).I(I) // Buffer input);

// End of OBUF_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 155

Page 156: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

OBUFDS

Primitive: Differential Signaling Output Buffer

IntroductionThis design element is a single output buffer that supports low-voltage, differential signaling (1.8 v CMOS).OBUFDS isolates the internal circuit and provides drive current for signals leaving the chip. Its output isrepresented as two distinct ports (O and OB), one deemed the "master" and the other the "slave." The master andthe slave are opposite phases of the same logical signal (for example, MYNET and MYNETB).

Logic TableInputs Outputs

I O OB

0 0 1

1 1 0

Port DescriptionsPort Direction Width Function

O Output 1 Diff_p output (connect directly to top level port)

OB Input 1 Diff_n output (connect directly to top level port)

I Input 1 Buffer input

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

IOSTANDARD String See Data Sheet "DEFAULT" Assigns an I/O standard to the element.

Libraries Guide

156 www.xilinx.com 10.1

Page 157: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- OBUFDS: Differential Output Buffer-- Virtex-II/II-Pro, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

OBUFDS_inst : OBUFDSgeneric map (IOSTANDARD => "DEFAULT")port map (O => O, -- Diff_p output (connect directly to top-level port)OB => OB, -- Diff_n output (connect directly to top-level port)I => I -- Buffer input);

-- End of OBUFDS_inst instantiation

Verilog Instantiation Template// OBUFDS: Differential Output Buffer// Virtex-II/II-Pro/4/5, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

OBUFDS #(.IOSTANDARD("DEFAULT") // Specify the output I/O standard) OBUFDS_inst (.O(O), // Diff_p output (connect directly to top-level port).OB(OB), // Diff_n output (connect directly to top-level port).I(I) // Buffer input);

// End of OBUFDS_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 157

Page 158: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

OBUFTPrimitive: 3-State Output Buffer with Active Low Output Enable

IntroductionThis design element is a single, 3-state output buffer with input I, output O, and active-Low output enables (T).This element uses the LVTTL standard and has selectable drive and slew rates using the DRIVE and SLOW orFAST constraints. The defaults are DRIVE=12 mA and SLOW slew.

When T is Low, data on the inputs of the buffers is transferred to the corresponding outputs. When T is High, theoutput is high impedance (off or Z state). OBUFTs are generally used when a single-ended output is neededwith a 3-state capability, such as the case when building bidirectional I/O.

Logic TableInputs Outputs

T I O

1 X Z

0 I F

Port DescriptionsPort Direction Width Function

O Output 1 Buffer output (connect directly to top-level port)

I Input 1 Buffer input

T Input 1 3-state enable input

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

IOSTANDARD String See Data Sheet "DEFAULT" Assigns an I/O standard to the element.

Libraries Guide

158 www.xilinx.com 10.1

Page 159: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- OBUFT: Single-ended 3-state Output Buffer-- All devices-- Xilinx HDL Libraries Guide, version 10.1.2

OBUFT_inst : OBUFTgeneric map (DRIVE => 12,IOSTANDARD => "DEFAULT",SLEW => "SLOW")port map (O => O, -- Buffer output (connect directly to top-level port)I => I, -- Buffer inputT => T -- 3-state enable input);

-- End of OBUFT_inst instantiation

Verilog Instantiation Template// OBUFT: Single-ended 3-state Output Buffer// All devices// Xilinx HDL Libraries Guide, version 10.1.2

OBUFT #(.DRIVE(12), // Specify the output drive strength.IOSTANDARD("DEFAULT"), // Specify the output I/O standard.SLEW("SLOW") // Specify the output slew rate) OBUFT_inst (.O(O), // Buffer output (connect directly to top-level port).I(I), // Buffer input.T(T) // 3-state enable input);

// End of OBUFT_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 159

Page 160: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

OBUFTDSPrimitive: 3-State Output Buffer with Differential Signaling, Active-Low Output Enable

IntroductionThis design element is an output buffer that supports low-voltage, differential signaling. For the OBUFTDS,a design level interface signal is represented as two distinct ports (O and OB), one deemed the "master" andthe other the "slave." The master and the slave are opposite phases of the same logical signal (for example,MYNET_P and MYNET_N).

Logic TableInputs Outputs

I T O OB

X 1 Z Z

0 0 0 1

1 0 1 0

Port DescriptionsPort Direction Width Function

O Output 1 Diff_p output (connect directly to top level port)

OB Output 1 Diff_n output (connect directly to top level port)

I Input 1 Buffer input

T Input 1 3-state enable input

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

IOSTANDARD String See Data Sheet "DEFAULT" Assigns an I/O standard to the element.

Libraries Guide

160 www.xilinx.com 10.1

Page 161: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- OBUFTDS: Differential 3-state Output Buffer-- Virtex-II/II-Pro, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

OBUFTDS_inst : OBUFTDSgeneric map (IOSTANDARD => "DEFAULT")port map (O => O, -- Diff_p output (connect directly to top-level port)OB => OB, -- Diff_n output (connect directly to top-level port)I => I, -- Buffer inputT => T -- 3-state enable input);

-- End of OBUFTDS_inst instantiation

Verilog Instantiation Template// OBUFTDS: Differential 3-state Output Buffer// Virtex-II/II-Pro/4/5, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

OBUFTDS #(.IOSTANDARD("DEFAULT") // Specify the output I/O standard) OBUFTDS_inst (.O(O), // Diff_p output (connect directly to top-level port).OB(OB), // Diff_n output (connect directly to top-level port).I(I), // Buffer input.T(T) // 3-state enable input);

// End of OBUFTDS_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 161

Page 162: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

OFDDRCPE

Primitive: Dual Data Rate Output D Flip-Flop with Clock Enable and Asynchronous Preset and Clear

IntroductionThis design element is a dual data rate (DDR) output D flip-flop with clock enable (CE) and asynchronous preset(PRE) and clear (CLR). It consists of one output buffer and one dual data rate flip-flop (FDDRCPE). When theasynchronous PRE is High and CLR is Low, the Q output is preset High.

When CLR is High, Q is set Low. Data on the D0 input is loaded into the flip-flop when PRE and CLR areLow and CE is High on the Low-to-High C0 clock transition. Data on the D1 input is loaded into the flip-flopwhen PRE and CLR are Low and CE is High on the Low-to-High C1 clock transition. The INIT attribute doesnot apply to OFDDRCPE components.

This flip-flop is asynchronously cleared, outputs Low, when power is applied. For FPGA devices, power-onconditions are simulated when global set/reset (GSR) is active. GSR defaults to active-High but can be invertedby adding an inverter in front of the GSR input of the appropriate STARTUP_architecture symbol.

Logic TableInputs Outputs

C0 C1 CE D0 D1 CLR PRE Q

X X X X X 1 0 0

X X X X X 0 1 1

X X X X X 1 1 0

X X 0 X X 0 0 No Change

↑ X 1 D0 X 0 0 D0

X ↑ 1 X D1 0 0 D1

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

162 www.xilinx.com 10.1

Page 163: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- OFDDRCPE: Double Data Rate Output Register with Async. Clear, Async. Preset-- and Clock Enable. Virtex-II/II-Pro, Spartan-3-- Xilinx HDL Libraries Guide, version 10.1.2

OFDDRCPE_inst : OFDDRCPEport map (Q => Q, -- Data output (connect directly to top-level port)C0 => C0, -- 0 degree clock inputC1 => C1, -- 180 degree clock inputCE => CE, -- Clock enable inputCLR => CLR, -- Asynchronous reset inputD0 => D0, -- Posedge data inputD1 => D1, -- Negedge data inputPRE => PRE -- Asynchronous preset input);

-- End of OFDDRCPE_inst instantiation

Verilog Instantiation Template// OFDDRCPE: Double Data Rate Output Register with Async. Clear, Async. Preset// and Clock Enable.// Virtex-II/II-Pro, Spartan-3// Xilinx HDL Libraries Guide, version 10.1.2

OFDDRCPE OFDDRCPE_inst (.Q(Q), // Data output (connect directly to top-level port).C0(C0), // 0 degree clock input.C1(C1), // 180 degree clock input.CE(CE), // Clock enable input.CLR(CLR), // Asynchronous reset input.D0(D0), // Posedge data input.D1(D1), // Negedge data input.PRE(PRE) // Asynchronous preset input);

// End of OFDDRCPE_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 163

Page 164: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

OFDDRRSE

Primitive: Dual Data Rate Output D Flip-Flop with Synchronous Reset and Set and Clock Enable

IntroductionThis design element is a dual data rate (DDR) output D flip-flop with synchronous reset (R) and set (S) and clockenable (CE). It consists of one output buffer and one dual data rate flip-flop (FDDRRSE).

On a Low-to-High clock transition (C0 or C1), a High R input resets the Q output Low; a Low R input with aHigh S input sets Q High. When both R and S are Low and clock enable is High, data on the D0 input is loadedinto the flip-flop on a Low-to-High C0 clock transition and data on the D1 input is loaded into the flip-flop on aLow-to-High C1 clock transition.

This flip-flop is asynchronously cleared, outputs Low, when power is applied. For FPGA devices, power-onconditions are simulated when global set/reset (GSR) is active. GSR defaults to active-High but can be invertedby adding an inverter in front of the GSR input of the appropriate STARTUP_architecture symbol.

The INIT attribute does not apply to this design element.

Logic TableInputs Outputs

C0 C1 CE D0 D1 R S Q

↑ X X X X 1 0 0

↑ X X X X 0 1 1

↑ X X X X 1 1 0

X ↑ X X X 1 0 0

X ↑ X X X 0 1 1

X ↑ X X X 1 1 0

X X 0 X X 0 0 No Change

↑ X 1 D0 X 0 0 D0

X ↑ 1 X D1 0 0 D1

Design Entry MethodInstantiation Yes

Inference Recommended

Libraries Guide

164 www.xilinx.com 10.1

Page 165: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Coregen and wizards No

Macro support No

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- OFDDRRSE: Double Data Rate Input Register with Sync. Clear, Sync. Preset-- and Clock Enable. Virtex-II/II-Pro, Spartan-3-- Xilinx HDL Libraries Guide, version 10.1.2

OFDDRRSE_inst : OFDDRRSEport map (Q => Q, -- Data output (connect directly to top-level port)C0 => C0, -- 0 degree clock inputC1 => C1, -- 180 degree clock inputCE => CE, -- Clock enable inputD0 => D0, -- Posedge data inputD1 => D1, -- Negedge data inputR => R, -- Synchronous reset inputS => S -- Synchronous preset input);

-- End of OFDDRRSE_inst instantiation

Verilog Instantiation Template// OFDDRRSE: Double Data Rate Input Register with Sync. Clear, Sync. Preset// and Clock Enable.// Virtex-II/II-Pro, Spartan-3// Xilinx HDL Libraries Guide, version 10.1.2

OFDDRRSE OFDDRRSE_inst (.Q(Q), // Data output (connect directly to top-level port).C0(C0), // 0 degree clock input.C1(C1), // 180 degree clock input.CE(CE), // Clock enable input.D0(D0), // Posedge data input.D1(D1), // Negedge data input.R(R), // Synchronous reset input.S(S) // Synchronous preset input);

// End of OFDDRRSE_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 165

Page 166: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

OFDDRTCPE

Primitive: Dual Data Rate D Flip-Flop with Active-Low 3–State Output Buffer, Clock Enable, andAsynchro-nous Preset and Clear

IntroductionThis design element is a dual data rate (DDR) D flip-flop with clock enable (CE) and asynchronous preset andclear whose output is enabled by a 3-state buffer. It consists of a dual data rate flip-flop (FDDRCPE) and a 3-stateoutput buffer (OBUFT). The data output (O) of the flip-flop is connected to the input of the output buffer(OBUFT). The output of the OBUFT is connected to an OPAD or IOPAD.

When the active-Low enable input (T) is Low, output is enabled and the data on the flip-flop’s Q output appearson the OBUFT’s O output. When the asynchronous PRE is High and CLR is Low, the O output is preset High.When CLR is High, O is set Low. Data on the D0 input is loaded into the flip-flop when PRE and CLR are Lowand CE is High on the Low-to-High C0 clock transition. Data on the D1 input is loaded into the flip-flop whenPRE and CLR are Low and CE is High on the Low-to-High C1 clock transition.

When T is High, outputs are high impedance (Off). When CE is Low and T is Low, the outputs do not change.

This flip-flop is asynchronously cleared, outputs Low, when power is applied. For FPGA devices, power-onconditions are simulated when global set/reset (GSR) is active. GSR defaults to active-High but can be invertedby adding an inverter in front of the GSR input of the appropriate STARTUP_architecture symbol.

The INIT attribute does not apply to this design element.

Logic Table

Inputs Outputs

C0 C1 CE D0 D1 CLR PRE T O

X X X X X X X 1 Z

X X X X X 1 0 0 0

X X X X X 0 1 0 1

X X X X X 1 1 0 0

X X 0 X X 0 0 0 No Change

↑ X 1 D0 X 0 0 0 D0

X ↑ 1 X D1 0 0 0 D1

Libraries Guide

166 www.xilinx.com 10.1

Page 167: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- OFDDRTCPE: Double Data Rate Output Register with Async. Clear, Async. Preset-- and Clock Enable with 3-state. Virtex-II/II-Pro, Spartan-3-- Xilinx HDL Libraries Guide, version 10.1.2

OFDDRTCPE_inst : OFDDRTCPEport map (O => O, -- Data output (connect directly to top-level port)C0 => C0, -- 0 degree clock inputC1 => C1, -- 180 degree clock inputCE => CE, -- Clock enable inputCLR => CLR, -- Asynchronous reset inputD0 => D0, -- Posedge data inputD1 => D1, -- Negedge data inputPRE => PRE, -- Asynchronous preset inputT => T -- 3-state enable input);

-- End of OFDDRTCPE_inst instantiation

Verilog Instantiation Template// OFDDRTCPE: Double Data Rate Output Register with Async. Clear, Async. Preset// and Clock Enable with 3-state.// Virtex-II/II-Pro, Spartan-3// Xilinx HDL Libraries Guide, version 10.1.2

OFDDRTCPE OFDDRTCPE_inst (.O(O), // Data output (connect directly to top-level port).C0(C0), // 0 degree clock input.C1(C1), // 180 degree clock input.CE(CE), // Clock enable input.CLR(CLR), // Asynchronous reset input.D0(D0), // Posedge data input.D1(D1), // Negedge data input.PRE(PRE), // Asynchronous preset input.T(T) // 3-state enable input);

// End of OFDDRTCPE_inst instantiation

For More Information• See the Virtex-II User Guide.• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 167

Page 168: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

OFDDRTRSE

Primitive: Dual Data Rate D Flip-Flop with Active -Low 3-State Output Buffer, Synchronous Resetand Set, and Clock Enable

IntroductionThis design element is a dual data rate (DDR) D flip-flop with clock enable (CE) and synchronous reset and setwhose output is enabled by a 3-state buffer. It consists of a dual data rate flip-flop (FDDRRSE) and a 3-stateoutput buffer (OBUFT). The data output (O) of the flip-flop is connected to the input of the output buffer(OBUFT). The output of the OBUFT is connected to an OPAD or IOPAD.

When the active-Low enable input (T) is Low, output is enabled and the data on the flip-flop’s Q output appearson the OBUFT’s O output. On a Low-to-High clock transition (C0 or C1), a High R input resets the Q output Low;a Low R input with a High S input sets O High. When both R and S are Low and clock enable is High, data onthe D0 input is loaded into the flip-flop on a Low-to-High C0 clock transition and data on the D1 input is loadedinto the flip-flop on a Low-to-High C1 clock transition.

When T is High, outputs are high impedance (Off). When CE is Low and T is Low, the outputs do not change.

This flip-flop is asynchronously cleared, outputs Low, when power is applied. For FPGA devices, power-onconditions are simulated when global set/reset (GSR) is active. GSR defaults to active-High but can be invertedby adding an inverter in front of the GSR input of the appropriate STARTUP_architecture symbol.

The INIT attribute does not apply to this design elements components

Logic TableInputs Outputs

C0 C1 CE D0 D1 R S T O

X X X X X X X 1 Z

↑ X X X X 1 0 0 0

↑ X X X X 0 1 0 1

↑ X X X X 1 1 0 0

X ↑ X X X 1 0 0 0

X ↑ X X X 0 1 0 1

X ↑ X X X 1 1 0 0

X X 0 X X 0 0 0 No Change

↑ X 1 D0 X 0 0 0 D0

X ↑ 1 X D1 0 0 0 D1

Libraries Guide

168 www.xilinx.com 10.1

Page 169: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- OFDDRTRSE: Double Data Rate Input Register with Sync. Clear, Sync. Preset-- and Clock Enable with 3-state. Virtex-II/II-Pro, Spartan-3-- Xilinx HDL Libraries Guide, version 10.1.2

OFDDRTRSE_inst : OFDDRTRSEport map (O => O, -- Data output (connect directly to top-level port)C0 => C0, -- 0 degree clock inputC1 => C1, -- 180 degree clock inputCE => CE, -- Clock enable inputD0 => D0, -- Posedge data inputD1 => D1, -- Negedge data inputR => R, -- Synchronous reset inputS => S, -- Synchronous preset inputT => T -- 3-state enable input);

-- End of OFDDRTRSE_inst instantiation

Verilog Instantiation Template// OFDDRTRSE: Double Data Rate Input Register with Sync. Clear, Sync. Preset// and Clock Enable with 3-state.// Virtex-II/II-Pro, Spartan-3// Xilinx HDL Libraries Guide, version 10.1.2

OFDDRTRSE OFDDRTRSE_inst (.Q(Q), // Data output (connect directly to top-level port).C0(C0), // 0 degree clock input.C1(C1), // 180 degree clock input.CE(CE), // Clock enable input.D0(D0), // Posedge data input.D1(D1), // Negedge data input.R(R), // Synchronous reset input.S(S), // Synchronous preset input.T(T) // 3-state enable input);

// End of OFDDRTRSE_inst instantiation

For More Information• See the Virtex-II User Guide.• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 169

Page 170: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ORCYPrimitive: OR with Carry Logic

IntroductionThis element is a special OR with general O output that generates faster and smaller arithmetic functions.

Each Virtex-II, Virtex-II Pro, and Virtex-II Pro X slice contains a dedicated 2-input OR gate that ORs togethercarry out values for a series of horizontally adjacent carry chains. The OR gate gets one input external to theslice and the other input from the output of the high order carry mux. The OR gate’s output drives the nextslice’s OR gate horizontally across the die.

Only MUXCY outputs can drive the signal on the CI pin. Only this design elements outputs or logic zerocan drive the I pin.

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- ORCY: Carry-Chain OR-gate-- Xilinx HDL Libraries Guide, version 10.1.2

ORCY_inst : ORCYport map (O => O, -- OR output signalCI => CI, -- Carry input signalI => I -- Data input signal);

-- End of ORCY_inst instantiation

Verilog Instantiation Template// ORCY: Carry-Chain OR-gate// For use with Virtex-II/II-Pro, Spartan-3/3E// Xilinx HDL Libraries Guide, version 10.1.2

ORCY ORCY_inst (

Libraries Guide

170 www.xilinx.com 10.1

Page 171: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.O(O), // OR output signal

.CI(CI), // Carry input signal

.I(I) // Data input signal);

// End of ORCY_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 171

Page 172: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

PULLDOWNPrimitive: Resistor to GND for Input Pads, Open-Drain, and 3-State Outputs

IntroductionThis resistor element is connected to input, output, or bidirectional pads to guarantee a logic Low level fornodes that might float.

Port DescriptionsPort Direction Width Function

O Output 1 Pulldown output (connect directly to top level port)

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- PULLDOWN: I/O Buffer Weak Pull-down-- All FPGA-- Xilinx HDL Libraries Guide, version 10.1.2

PULLDOWN_inst : PULLDOWNport map (O => O -- Pulldown output (connect directly to top-level port));

-- End of PULLDOWN_inst instantiation

Verilog Instantiation Template// PULLDOWN: I/O Buffer Weak Pull-down// All FPGA// Xilinx HDL Libraries Guide, version 10.1.2

Libraries Guide

172 www.xilinx.com 10.1

Page 173: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

PULLDOWN PULLDOWN_inst (.O(O) // Pulldown output (connect directly to top-level port));

// End of PULLDOWN_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 173

Page 174: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

PULLUPPrimitive: Resistor to VCC for Input PADs, Open-Drain, and 3-State Outputs

IntroductionThis design element allows for an input, 3-state output or bi-directional port to be driven to a weak highvalue when not being driven by an internal or external source. This element establishes a High logic level foropen-drain elements and macros when all the drivers are off.

Port DescriptionsPort Direction Width Function

O Output 1 Pullup output (connect directly to top level port)

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- PULLUP: I/O Buffer Weak Pull-up-- All FPGA, CoolRunner-II-- Xilinx HDL Libraries Guide, version 10.1.2

PULLUP_inst : PULLUPport map (O => O -- Pullup output (connect directly to top-level port));

-- End of PULLUP_inst instantiation

Verilog Instantiation Template// PULLUP: I/O Buffer Weak Pull-up// All FPGA, CoolRunner-II// Xilinx HDL Libraries Guide, version 10.1.2

Libraries Guide

174 www.xilinx.com 10.1

Page 175: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

PULLUP PULLUP_inst (.O(O) // Pullup output (connect directly to top-level port));

// End of PULLUP_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 175

Page 176: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM128X1S

Primitive: 128-Deep by 1-Wide Static Synchronous RAM

IntroductionThis element is a 128-word by 1-bit static random access memory with synchronous write capability. When thewrite enable is Low, transitions on the write clock (WCLK) are ignored and data stored in the RAM is notaffected. When WE is High, any positive transition on WCLK loads the data on the data input (D) into the wordselected by the 7-bit address (A6 - A0). This RAM block assumes an active-High WCLK. However, WCLK can beactive-High or active-Low. Any inverter placed on the WCLK input net is absorbed into the block.

The signal output on the data output pin (O) is the data that is stored in the RAM at the location defined bythe values on the address pins.

You can initialize RAM128X1S during configuration using the INIT attribute.

Logic TableInputs Outputs

WE (mode) WCLK D O

0 (read) X X Data

1 (read) 0 X Data

1 (read) 1 X Data

1 (write) ↑ D D

1 (read) ↓ X Data

Data = word addressed by bits A6 – A0

Design Entry MethodInstantiation Yes

Inference Recommended

Libraries Guide

176 www.xilinx.com 10.1

Page 177: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 128-Bit Value All zeros Initializes ROMs, RAMs, registers, and look-uptables.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM128X1S: 128 x 1 positive edge write, asynchronous read single-port distributed RAM-- Virtex-II/II-Pro/5-- Xilinx HDL Libraries Guide, version 10.1.2

RAM128X1S_inst : RAM128X1Sgeneric map (INIT => X"00000000000000000000000000000000")port map (O => O, -- 1-bit data outputA0 => A0, -- Address[0] input bitA1 => A1, -- Address[1] input bitA2 => A2, -- Address[2] input bitA3 => A3, -- Address[3] input bitA4 => A4, -- Address[4] input bitA5 => A5, -- Address[5] input bitA6 => A6, -- Address[6] input bitD => D, -- 1-bit data inputWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM128X1S_inst instantiation

Verilog Instantiation Template// RAM128X1S: 128 x 1 positive edge write, asynchronous read single-port distributed RAM// Virtex-II/II-Pro/5// Xilinx HDL Libraries Guide, version 10.1.2

RAM128X1S #(.INIT(128’h00000000000000000000000000000000) // Initial contents of RAM) RAM128X1S_inst (.O(O), // 1-bit data output.A0(A0), // Address[0] input bit.A1(A1), // Address[1] input bit.A2(A2), // Address[2] input bit.A3(A3), // Address[3] input bit.A4(A4), // Address[4] input bit.A5(A5), // Address[5] input bit.A6(A6), // Address[6] input bit.D(D), // 1-bit data input.WCLK(WCLK), // Write clock input.WE(WE) // Write enable input);

Libraries Guide

10.1 www.xilinx.com 177

Page 178: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

// End of RAM128X1S_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

178 www.xilinx.com 10.1

Page 179: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM128X1S_1Primitive: 128-Deep by 1-Wide Static Synchronous RAM with Negative-Edge Clock

IntroductionThis element is a 128-word by 1-bit static random access memory with synchronous write capability. When thewrite enable is Low, transitions on the write clock (WCLK) are ignored and data stored in the RAM is notaffected. When WE is High, any negative transition on WCLK loads the data on the data input (D) into the wordselected by the 7-bit address (A6 – A0). For predictable performance, address and data inputs must be stablebefore a High-to-Low WCLK transition. This RAM block assumes an active-Low WCLK. However, WCLK canbe active-High or active-Low. Any inverter placed on the WCLK input net is absorbed into the block.

The signal output on the data output pin (O) is the data that is stored in the RAM at the location defined bythe values on the address pins.

You can initialize RAM128X1S_1 during configuration using the INIT attribute.

Logic TableInputs Outputs

WE (mode) WCLK D O

0 (read) X X Data

1 (read) 0 X Data

1 (read) 1 X Data

1 (write) ↓ D D

1 (read) ↑ X Data

Data = word addressed by bits A6 – A0

Design Entry MethodInstantiation Yes

Inference Recommended

Libraries Guide

10.1 www.xilinx.com 179

Page 180: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 128-Bit Value All zeros Initializes ROMs, RAMs, registers, andlook-up tables.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM128X1S_1: 128 x 1 negative edge write, asynchronous read single-port distributed RAM-- Virtex-II/II-Pro-- Xilinx HDL Libraries Guide, version 10.1.2

RAM128X1S_1_inst : RAM128X1S_1generic map (INIT => X"00000000000000000000000000000000")port map (O => O, -- 1-bit data outputA0 => A0, -- Address[0] input bitA1 => A1, -- Address[1] input bitA2 => A2, -- Address[2] input bitA3 => A3, -- Address[3] input bitA4 => A4, -- Address[4] input bitA5 => A5, -- Address[5] input bitA6 => A6, -- Address[6] input bitD => D, -- 1-bit data inputWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM128X1S_1_inst instantiation

Verilog Instantiation Template// RAM128X1S_1: 128 x 1 negative edge write, asynchronous read single-port distributed RAM// Virtex-II/II-Pro// Xilinx HDL Libraries Guide, version 10.1.2

RAM128X1S_1 #(.INIT(128’h00000000000000000000000000000000) // Initial contents of RAM) RAM128X1S_1_inst (.O(O), // 1-bit data output.A0(A0), // Address[0] input bit.A1(A1), // Address[1] input bit.A2(A2), // Address[2] input bit.A3(A3), // Address[3] input bit.A4(A4), // Address[4] input bit.A5(A5), // Address[5] input bit.A6(A6), // Address[6] input bit.D(D), // 1-bit data input.WCLK(WCLK), // Write clock input.WE(WE) // Write enable input);

Libraries Guide

180 www.xilinx.com 10.1

Page 181: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

// End of RAM128X1S_1_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 181

Page 182: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM16X1D

Primitive: 16-Deep by 1-Wide Static Dual Port Synchronous RAM

IntroductionThis element is a 16-word by 1-bit static dual port random access memory with synchronous write capability.The device has two address ports: the read address (DPRA3–DPRA0) and the write address (A3–A0). These twoaddress ports are asynchronous. The read address controls the location of the data driven out of the output pin(DPO), and the write address controls the destination of a valid write transaction. When the write enable (WE) isLow, transitions on the write clock (WCLK) are ignored and data stored in the RAM is not affected.

When WE is High, any positive transition on (WCLK) loads the data on the data input (D) into the word selectedby the 4-bit write address. For predictable performance, write address and data inputs must be stable before aLow-to-High (WCLK) transition. This RAM block assumes an active-High (WCLK). (WCLK) can be active-Highor active-Low. Any inverter placed on the (WCLK) input net is absorbed into the block.

The SPO output reflects the data in the memory cell addressed by A3 – A0. The DPO output reflects the datain the memory cell addressed by DPRA3–DPRA0.

Note The write process is not affected by the address on the read address port.

You can use the INIT attribute to directly specify an initial value. The value must be a hexadecimal number, forexample, INIT=ABAC. If the INIT attribute is not specified, the RAM is initialized with all zeros.

Logic TableMode selection is shown in the following logic table:

Inputs Outputs

WE (mode) WCLK D SPO DPO

0 (read) X X data_a data_d

1 (read) 0 X data_a data_d

1 (read) 1 X data_a data_d

1 (write) ↑ D D data_d

Libraries Guide

182 www.xilinx.com 10.1

Page 183: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

WE (mode) WCLK D SPO DPO

1 (read) ↓ X data_a data_d

data_a = word addressed by bits A3-A0

data_d = word addressed by bits DPRA3-DPRA0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 16-Bit Value Allzeros.

Initializes RAMs, registers, and look-uptables.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM16X1D: 16 x 1 positive edge write, asynchronous read dual-port distributed RAM-- All FPGAs-- Xilinx HDL Libraries Guide, version 10.1.2

RAM16X1D_inst : RAM16X1Dgeneric map (INIT => X"0000")port map (DPO => DPO, -- Read-only 1-bit data output for DPRASPO => SPO, -- R/W 1-bit data output for A0-A3A0 => A0, -- R/W address[0] input bitA1 => A1, -- R/W address[1] input bitA2 => A2, -- R/W address[2] input bitA3 => A3, -- R/W ddress[3] input bitD => D, -- Write 1-bit data inputDPRA0 => DPRA0, -- Read-only address[0] input bitDPRA1 => DPRA1, -- Read-only address[1] input bitDPRA2 => DPRA2, -- Read-only address[2] input bitDPRA3 => DPRA3, -- Read-only address[3] input bitWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM16X1D_inst instantiation

Libraries Guide

10.1 www.xilinx.com 183

Page 184: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Verilog Instantiation Template// RAM16X1D: 16 x 1 positive edge write, asynchronous read dual-port distributed RAM// All FPGAs// Xilinx HDL Libraries Guide, version 10.1.2

RAM16X1D #(.INIT(16’h0000) // Initial contents of RAM) RAM16X1D_inst (.DPO(DPO), // Read-only 1-bit data output for DPRA.SPO(SPO), // R/W 1-bit data output for A0-A3.A0(A0), // R/W address[0] input bit.A1(A1), // R/W address[1] input bit.A2(A2), // R/W address[2] input bit.A3(A3), // R/W address[3] input bit.D(D), // Write 1-bit data input.DPRA0(DPRA0), // Read address[0] input bit.DPRA1(DPRA1), // Read address[1] input bit.DPRA2(DPRA2), // Read address[2] input bit.DPRA3(DPRA3), // Read address[3] input bit.WCLK(WCLK), // Write clock input.WE(WE) // Write enable input);

// End of RAM16X1D_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

184 www.xilinx.com 10.1

Page 185: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM16X1D_1

Primitive: 16-Deep by 1-Wide Static Dual Port Synchronous RAM with Negative-Edge Clock

IntroductionThis is a 16-word by 1-bit static dual port random access memory with synchronous write capability andnegative-edge clock. The device has two separate address ports: the read address (DPRA3–DPRA0) and the writeaddress (A3–A0). These two address ports are asynchronous. The read address controls the location of the datadriven out of the output pin (DPO), and the write address controls the destination of a valid write transaction.

When the write enable (WE) is set to Low, transitions on the write clock (WCLK) are ignored and data stored inthe RAM is not affected. When (WE) is High, any negative transition on (WCLK) loads the data on the datainput (D) into the word selected by the 4-bit write address. For predictable performance, write address anddata inputs must be stable before a High-to-Low WCLK transition. This RAM block assumes an active-High(WCLK). (WCLK) can be active-High or active-Low. Any inverter placed on the (WCLK) input net is absorbedinto the block.

You can initialize RAM16X1D_1 during configuration using the INIT attribute.

The SPO output reflects the data in the memory cell addressed by A3–A0. The DPO output reflects the datain the memory cell addressed by DPRA3–DPRA0.

Note The write process is not affected by the address on the read address port.

Logic TableMode selection is shown in the following logic table:

Inputs Outputs

WE (mode) WCLK D SPO DPO

0 (read) X X data_a data_d

1 (read) 0 X data_a data_d

1 (read) 1 X data_a data_d

1 (write) ↓ D D data_d

1 (read) ↑ X data_a data_d

data_a = word addressed by bits A3 – A0

data_d = word addressed by bits DPRA3-DPRA0

Libraries Guide

10.1 www.xilinx.com 185

Page 186: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Port DescriptionsPort Direction Width Function

DPO Output 1 Read-only 1-Bit data output

SPO Output 1 R/W 1-Bit data output

A0 Input 1 R/W address[0] input

A1 Input 1 R/W address[1] input

A2 Input 1 R/W address[2] input

A3 Input 1 R/W address[3] input

D Input 1 Write 1-Bit data input

DPRA0 Input 1 Read-only address[0] input

DPRA1 Input 1 Read-only address[1] input

DPRA2 Input 1 Read-only address[2] input

DPRA3 Input 1 Read-only address[3] input

WCLK Input 1 Write clock input

WE Input 1 Write enable input

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 16-Bit Value All zeros Initializes RAMs, registers, and look-uptables.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM16X1D_1: 16 x 1 negative edge write, asynchronous read dual-port distributed RAM-- All FPGA-- Xilinx HDL Libraries Guide, version 10.1.2

RAM16X1D_1_inst : RAM16X1D_1generic map (INIT => X"0000")port map (DPO => DPO, -- Read-only 1-bit data output for DPRASPO => SPO, -- R/W 1-bit data output for A0-A3A0 => A0, -- R/W address[0] input bitA1 => A1, -- R/W address[1] input bit

Libraries Guide

186 www.xilinx.com 10.1

Page 187: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

A2 => A2, -- R/W address[2] input bitA3 => A3, -- R/W ddress[3] input bitD => D, -- Write 1-bit data inputDPRA0 => DPRA0, -- Read-only address[0] input bitDPRA1 => DPRA1, -- Read-only address[1] input bitDPRA2 => DPRA2, -- Read-only address[2] input bitDPRA3 => DPRA3, -- Read-only address[3] input bitWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM16X1D_1_inst instantiation

Verilog Instantiation Template// RAM16X1D_1: 16 x 1 negative edge write, asynchronous read dual-port distributed RAM// Virtex/E/-II/-II-Pro, Spartan-II/IIE/3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

RAM16X1D_1 #(.INIT(16’h0000) // Initial contents of RAM) RAM16X1D_1_inst (.DPO(DPO), // Read-only 1-bit data output.SPO(SPO), // R/W 1-bit data output.A0(A0), // R/W address[0] input bit.A1(A1), // R/W address[1] input bit.A2(A2), // R/W address[2] input bit.A3(A3), // R/W address[3] input bit.D(D), // Write 1-bit data input.DPRA0(DPRA0), // Read-only address[0] input bit.DPRA1(DPRA1), // Read-only address[1] input bit.DPRA2(DPRA2), // Read-only address[2] input bit.DPRA3(DPRA3), // Read-only address[3] input bit.WCLK(WCLK), // Write clock input.WE(WE) // Write enable input);

// End of RAM16X1D_1_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 187

Page 188: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM16X1S

Primitive: 16-Deep by 1-Wide Static Synchronous RAM

IntroductionThis element is a 16-word by 1-bit static random access memory with synchronous write capability. When thewrite enable (WE) is set Low, transitions on the write clock (WCLK) are ignored and data stored in the RAM isnot affected. When WE is set High, any positive transition on WCLK loads the data on the data input (D) into theword selected by the 4-bit address (A3 – A0). This RAM block assumes an active-High WCLK. However, WCLKcan be active-High or active-Low. Any inverter placed on the WCLK input net is absorbed into the block.

The signal output on the data output pin (O) is the data that is stored in the RAM at the location defined by thevalues on the address pins. You can initialize RAM16X1S during configuration using the INIT attribute.

Logic TableInputs Outputs

WE(mode) WCLK D O

0 (read) X X Data

1 (read) 0 X Data

1 (read) 1 X Data

1 (write) ↑ D D

1 (read) ↓ X Data

Data = word addressed by bits A3 – A0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

188 www.xilinx.com 10.1

Page 189: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 16-Bit Value All zeros Specifies initial contents of theRAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM16X1S: 16 x 1 posedge write distributed => LUT RAM-- All FPGA-- Xilinx HDL Libraries Guide, version 10.1.2

RAM16X1S_inst : RAM16X1Sgeneric map (INIT => X"0000")port map (O => O, -- RAM outputA0 => A0, -- RAM address[0] inputA1 => A1, -- RAM address[1] inputA2 => A2, -- RAM address[2] inputA3 => A3, -- RAM address[3] inputD => D, -- RAM data inputWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM16X1S_inst instantiation

Verilog Instantiation Template// RAM16X1S: 16 x 1 posedge write distributed (LUT) RAM// All FPGA// Xilinx HDL Libraries Guide, version 10.1.2

RAM16X1S #(.INIT(16’h0000) // Initial contents of RAM) RAM16X1S_inst (.O(O), // RAM output.A0(A0), // RAM address[0] input.A1(A1), // RAM address[1] input.A2(A2), // RAM address[2] input.A3(A3), // RAM address[3] input.D(D), // RAM data input.WCLK(WCLK), // Write clock input.WE(WE) // Write enable input);

// End of RAM16X1S_inst instantiation

For More Information• See the Virtex-II User Guide.• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 189

Page 190: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM16X1S_1

Primitive: 16-Deep by 1-Wide Static Synchronous RAM with Negative-Edge Clock

IntroductionThis element is a 16-word by 1-bit static random access memory with synchronous write capability andnegative-edge clock. When the write enable (WE) is Low, transitions on the write clock (WCLK) are ignoredand data stored in the RAM is not affected. When (WE) is High, any negative transition on (WCLK) loads thedata on the data input (D) into the word selected by the 4-bit address (A3 – A0). For predictable performance,address and data inputs must be stable before a High-to-Low WCLK transition. This RAM block assumes anactive-Low (WCLK). However, (WCLK) can be active-High or active-Low. Any inverter placed on the (WCLK)input net is absorbed into the block.

The signal output on the data output pin (O) is the data that is stored in the RAM at the location defined bythe values on the address pins.

You can initialize this element during configuration using the INIT attribute.

Logic TableInputs Outputs

WE(mode) WCLK D O

0 (read) X X Data

1 (read) 0 X Data

1 (read) 1 X Data

1 (write) ↓ D D

1 (read) ↑ X Data

Data = word addressed by bits A3 – A0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

190 www.xilinx.com 10.1

Page 191: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 16-Bit Value All zeros Specifies initial contents of theRAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM16X1S_1: 16 x 1 negedge write distributed => LUT RAM-- All FPGA-- Xilinx HDL Libraries Guide, version 10.1.2

RAM16X1S_1_inst : RAM16X1S_1generic map (INIT => X"0000")port map (O => O, -- RAM outputA0 => A0, -- RAM address[0] inputA1 => A1, -- RAM address[1] inputA2 => A2, -- RAM address[2] inputA3 => A3, -- RAM address[3] inputD => D, -- RAM data inputWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM16X1S_1_inst instantiation

Verilog Instantiation Template// RAM16X1S_1: 16 x 1 negedge write distributed (LUT) RAM// All FPGA// Xilinx HDL Libraries Guide, version 10.1.2

RAM16X1S_1 #(.INIT(16’h0000) // Initial contents of RAM) RAM16X1S_1_inst (.O(O), // RAM output.A0(A0), // RAM address[0] input.A1(A1), // RAM address[1] input.A2(A2), // RAM address[2] input.A3(A3), // RAM address[3] input.D(D), // RAM data input.WCLK(WCLK), // Write clock input.WE(WE) // Write enable input);

// End of RAM16X1S_1_inst instantiation

For More Information• See the Virtex-II User Guide.• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 191

Page 192: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM16X2S

Primitive: 16-Deep by 2-Wide Static Synchronous RAM

IntroductionThis element is a 16-word by 2-bit static random access memory with synchronous write capability. When thewrite enable (WE) is Low, transitions on the write clock (WCLK) are ignored and data stored in the RAM is notaffected. When WE is High, any positive transition on WCLK loads the data on the data input (D1–D0) into theword selected by the 4-bit address (A3–A0). For predictable performance, address and data inputs must be stablebefore a Low-to-High WCLK transition. This RAM block assumes an active-High WCLK. However, WCLK canbe active-High or active-Low. Any inverter placed on the WCLK input net is absorbed into the block.

The signal output on the data output pins (O1–O0) is the data that is stored in the RAM at the location defined bythe values on the address pins.

You can use the INIT_xx properties to specify the initial contents of a Virtex-4 wide RAM. INIT_00 initializesthe RAM cells corresponding to the O0 output, INIT_01 initializes the cells corresponding to the O1 output,etc. For example, a RAM16X2S instance is initialized by INIT_00 and INIT_01 containing 4 hex characters each.A RAM16X8S instance is initialized by eight properties INIT_00 through INIT_07 containing 4 hex characterseach. A RAM64x2S instance is completely initialized by two properties INIT_00 and INIT_01 containing16 hex characters each.

Except for Virtex-4 devices, the initial contents of this element cannot be specified directly.

Logic TableInputs Outputs

WE (mode) WCLK D1-D0 O1-O0

0 (read) X X Data

1(read) 0 X Data

1(read) 1 X Data

1(write) ↑ D1-D0 D1-D0

1 (read) ↓ X Data

Data = word addressed by bits A3 – A0

Libraries Guide

192 www.xilinx.com 10.1

Page 193: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 to INIT_01 Hexadecimal Any 16-Bit Value All zeros Initializes RAMs, registers, andlook-up tables.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM16X2S: 16 x 2 posedge write distributed => LUT RAM-- Virtex-II/II-Pro, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

RAM16X2S_inst : RAM16X2Sgeneric map (INIT_00 => X"0000", -- INIT for bit 0 of RAMINIT_01 => X"0000") -- INIT for bit 1 of RAMport map (O0 => O0, -- RAM data[0] outputO1 => O1, -- RAM data[1] outputA0 => A0, -- RAM address[0] inputA1 => A1, -- RAM address[1] inputA2 => A2, -- RAM address[2] inputA3 => A3, -- RAM address[3] inputD0 => D0, -- RAM data[0] inputD1 => D1, -- RAM data[1] inputWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM16X2S_inst instantiation

Verilog Instantiation Template// RAM16X2S: 16 x 2 posedge write distributed (LUT) RAM// Virtex-II/II-Pro, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

RAM16X2S #(.INIT_00(16’h0000), // Initial contents of bit 0 of RAM.INIT_01(16’h0000) // Initial contents of bit 1 of RAM) RAM16X2S_inst (.O0(O0), // RAM data[0] output.O1(O1), // RAM data[1] output.A0(A0), // RAM address[0] input.A1(A1), // RAM address[1] input.A2(A2), // RAM address[2] input.A3(A3), // RAM address[3] input

Libraries Guide

10.1 www.xilinx.com 193

Page 194: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.D0(D0), // RAM data[0] input

.D1(D1), // RAM data[1] input

.WCLK(WCLK), // Write clock input

.WE(WE) // Write enable input);

// End of RAM16X2S_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

194 www.xilinx.com 10.1

Page 195: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM16X4S

Primitive: 16-Deep by 4-Wide Static Synchronous RAM

IntroductionThis element is a 16-word by 4-bit static random access memory with synchronous write capability. When thewrite enable (WE) is Low, transitions on the write clock (WCLK) are ignored and data stored in the RAM is notaffected. When WE is High, any positive transition on WCLK loads the data on the data input (D3 – D0) intothe word selected by the 4-bit address (A3 – A0). For predictable performance, address and data inputs mustbe stable before a Low-to-High WCLK transition. This RAM block assumes an active-High WCLK. However,WCLK can be active-High or active-Low. Any inverter placed on the WCLK input net is absorbed into the block.

The signal output on the data output pins (O3 – O0) is the data that is stored in the RAM at the location definedby the values on the address pins.

Logic TableInputs Outputs

WE (mode) WCLK D3 – D0 O3 – O0

0 (read) X X Data

1 (read) 0 X Data

1 (read) 1 X Data

1 (write) ↑ D3-D0 D3-D0

1 (read) ↓ X Data

Data = word addressed by bits A3 – A0.

Design Entry MethodInstantiation Yes

Inference Recommended

Libraries Guide

10.1 www.xilinx.com 195

Page 196: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 to INIT_03 Hexadecimal Any 16-Bit Value All zeros INIT for bit 0 of RAM

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM16X4S: 16 x 4 posedge write distributed => LUT RAM-- Virtex-II/II-Pro, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

RAM16X4S_inst : RAM16X4Sgeneric map (INIT_00 => X"0000", -- INIT for bit 0 of RAMINIT_01 => X"0000", -- INIT for bit 1 of RAMINIT_02 => X"0000", -- INIT for bit 2 of RAMINIT_03 => X"0000") -- INIT for bit 3 of RAMport map (O0 => O0, -- RAM data[0] outputO1 => O1, -- RAM data[1] outputO2 => O2, -- RAM data[2] outputO3 => O3, -- RAM data[3] outputA0 => A0, -- RAM address[0] inputA1 => A1, -- RAM address[1] inputA2 => A2, -- RAM address[2] inputA3 => A3, -- RAM address[3] inputD0 => D0, -- RAM data[0] inputD1 => D1, -- RAM data[1] inputD2 => D2, -- RAM data[2] inputD3 => D3, -- RAM data[3] inputWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM16X4S_inst instantiation

Verilog Instantiation Template// RAM16X4S: 16 x 4 posedge write distributed (LUT) RAM// Virtex-II/II-Pro, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

RAM16X4S #(.INIT_00(16’h0000), // INIT for bit 0 of RAM.INIT_01(16’h0000), // INIT for bit 1 of RAM.INIT_02(16’h0000), // INIT for bit 2 of RAM.INIT_03(16’h0000) // INIT for bit 3 of RAM) RAM16X4S_inst (.O0(O0), // RAM data[0] output.O1(O1), // RAM data[1] output.O2(O2), // RAM data[2] output.O3(O3), // RAM data[3] output.A0(A0), // RAM address[0] input

Libraries Guide

196 www.xilinx.com 10.1

Page 197: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.A1(A1), // RAM address[1] input

.A2(A2), // RAM address[2] input

.A3(A3), // RAM address[3] input

.D0(D0), // RAM data[0] input

.D1(D1), // RAM data[1] input

.D2(D2), // RAM data[2] input

.D3(D3), // RAM data[3] input

.WCLK(WCLK), // Write clock input

.WE(WE) // Write enable input);

// End of RAM16X4S_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 197

Page 198: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM16X8S

Primitive: 16-Deep by 8-Wide Static Synchronous RAM

IntroductionThis element is a 16-word by 8-bit static random access memory with synchronous write capability. When thewrite enable (WE) is Low, transitions on the write clock (WCLK) are ignored and data stored in the RAM is notaffected. When WE is High, any positive transition on WCLK loads the data on data inputs (D7–D0) into theword selected by the 4-bit address (A3–A0). For predictable performance, address and data inputs must be stablebefore a Low-to-High WCLK transition. This RAM block assumes an active-High WCLK. However, WCLK canbe active-High or active-Low. Any inverter placed on the WCLK input net is absorbed into the block.

The signal output on the data output pins (O7–O0) is the data that is stored in the RAM at the location defined bythe values on the address pins.

Logic TableInputs Outputs

WE (mode) WCLK D7-D0 O7-O0

0 (read) X X Data

1 (read) 0 X Data

1 (read) 1 X Data

1 (write) ↑ D7-D0 D7-D0

1 (read) ↓ X Data

Data = word addressed by bits A3–A0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

198 www.xilinx.com 10.1

Page 199: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 To INIT_07 Hexadecimal Any 16-Bit Value All zeros Initializes RAMs, registers, and look-uptables.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM16X8S: 16 x 8 posedge write distributed => LUT RAM-- Virtex-II/II-Pro-- Xilinx HDL Libraries Guide, version 10.1.2

RAM16X8S_inst : RAM16X8Sgeneric map (INIT_00 => X"0000", -- INIT for bit 0 of RAMINIT_01 => X"0000", -- INIT for bit 1 of RAMINIT_02 => X"0000", -- INIT for bit 2 of RAMINIT_03 => X"0000", -- INIT for bit 3 of RAMINIT_04 => X"0000", -- INIT for bit 4 of RAMINIT_05 => X"0000", -- INIT for bit 5 of RAMINIT_06 => X"0000", -- INIT for bit 6 of RAMINIT_07 => X"0000") -- INIT for bit 7 of RAMport map (O => O, -- 8-bit RAM data outputA0 => A0, -- RAM address[0] inputA1 => A1, -- RAM address[1] inputA2 => A2, -- RAM address[2] inputA3 => A3, -- RAM address[3] inputD => D, -- 8-bit RAM data inputWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM16X8S_inst instantiation

Verilog Instantiation Template// RAM16X8S: 16 x 8 posedge write distributed (LUT) RAM// Virtex-II/II-Pro// Xilinx HDL Libraries Guide, version 10.1.2

RAM16X8S #(.INIT_00(16’h0000), // INIT for bit 0 of RAM.INIT_01(16’h0000), // INIT for bit 1 of RAM.INIT_02(16’h0000), // INIT for bit 2 of RAM.INIT_03(16’h0000), // INIT for bit 3 of RAM.INIT_04(16’h0000), // INIT for bit 4 of RAM.INIT_05(16’h0000), // INIT for bit 5 of RAM.INIT_06(16’h0000), // INIT for bit 6 of RAM.INIT_07(16’h0000) // INIT for bit 7 of RAM) RAM16X8S_inst (.O(O), // 8-bit RAM data output.A0(A0), // RAM address[0] input.A1(A1), // RAM address[1] input.A2(A2), // RAM address[2] input.A3(A3), // RAM address[3] input.D(D), // 8-bit RAM data input.WCLK(WCLK), // Write clock input.WE(WE) // Write enable input

Libraries Guide

10.1 www.xilinx.com 199

Page 200: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

);

// End of RAM16X8S_inst instantiation

Libraries Guide

200 www.xilinx.com 10.1

Page 202: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM32X1DPrimitive: 32-Deep by 1-Wide Dual Static Port Synchronous RAM

IntroductionThe design element is a 32-word by 1-bit static dual port random access memory with synchronous writecapability. The device has two separate address ports: the read address (DPRA4 – DPRA0) and the write address(A4 – A0). These two address ports are completely asynchronous. The read address controls the location ofthe data driven out of the output pin (DPO), and the write address controls the destination of a valid writetransaction. When the write enable (WE) is Low, transitions on the write clock (WCLK) are ignored and datastored in the RAM is not affected. When WE is High, any positive transition on WCLK loads the data on thedata input (D) into the word selected by the 5-bit write address. For predictable performance, write address anddata inputs must be stable before a Low-to-High WCLK transition. This RAM block assumes an active-HighWCLK. WCLK can be active-High or active-Low. Any inverter placed on the WCLK input net is absorbed intothe block. You can initialize RAM32X1D during configuration using the INIT attribute. Mode selection isshown in the following logic table.

The SPO output reflects the data in the memory cell addressed by A4 – A0. The DPO output reflects the datain the memory cell addressed by DPRA4 – DPRA0. The write process is not affected by the address on theread address port.

Logic TableInputs Outputs

WE (Mode) WCLK D SPO DPO

0 (read) X X data_a data_d

1 (read) 0 X data_a data_d

1 (read) 1 X data_a data_d

1 (write) ↑ D D data_d

1 (read) ↓ X data_a data_d

Design Entry MethodInstantiation Yes

Inference Recommended

Libraries Guide

202 www.xilinx.com 10.1

Page 203: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Coregen and wizards No

Macro support No

Available Attributes

Attribute TypeAllowedValues Default Descriptions

INIT Hexadecimal Any 32-BitValue

All Zeros Initializes ROMs, RAMs, registers, and look-uptables.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM32X1D: 32 x 1 positive edge write, asynchronous read dual-port distributed RAM-- Virtex-II/II-Pro-- Xilinx HDL Libraries Guide, version 10.1.2

RAM32X1D_inst : RAM32X1Dgeneric map (INIT => X"00000000")port map (DPO => DPO, -- Read-only 1-bit data outputSPO => SPO, -- R/W 1-bit data outputA0 => A0, -- R/W address[0] input bitA1 => A1, -- R/W address[1] input bitA2 => A2, -- R/W address[2] input bitA3 => A3, -- R/W address[3] input bitA4 => A4, -- R/W address[4] input bitD => D, -- Write 1-bit data inputDPRA0 => DPRA0, -- Read-only address[0] input bitDPRA1 => DPRA1, -- Read-only address[1] input bitDPRA2 => DPRA2, -- Read-only address[2] input bitDPRA3 => DPRA3, -- Read-only address[3] input bitDPRA4 => DPRA4, -- Read-only address[4] input bitWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM32X1D_inst instantiation

Verilog Instantiation Template// RAM32X1D: 32 x 1 positive edge write, asynchronous read dual-port distributed RAM// Virtex-II/II-Pro/5// Xilinx HDL Libraries Guide, version 10.1.2

RAM32X1D #(.INIT(32’h00000000) // Initial contents of RAM) RAM32X1D_inst (.DPO(DPO), // Read-only 1-bit data output.SPO(SPO), // R/W 1-bit data output.A0(A0), // R/W address[0] input bit.A1(A1), // R/W address[1] input bit.A2(A2), // R/W address[2] input bit.A3(A3), // R/W address[3] input bit.A4(A4), // R/W address[4] input bit.D(D), // Write 1-bit data input

Libraries Guide

10.1 www.xilinx.com 203

Page 204: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.DPRA0(DPRA0), // Read-only address[0] input bit

.DPRA1(DPRA1), // Read-only address[1] input bit

.DPRA2(DPRA2), // Read-only address[2] input bit

.DPRA3(DPRA3), // Read-only address[3] input bit

.DPRA4(DPRA4), // Read-only address[4] input bit

.WCLK(WCLK), // Write clock input

.WE(WE) // Write enable input);

// End of RAM32X1D_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

204 www.xilinx.com 10.1

Page 205: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM32X1D_1

Primitive: 32-Deep by 1-Wide Static Dual Port Synchronous RAM with Negative-Edge Clock

IntroductionThis design element is a 32-word by 1-bit static dual port random access memory with synchronous writecapability and a negative-edge clock. The device has two separate address ports: the read address (DPRA4 –DPRA0) and the write address (A4 – A0). These two address ports are completely asynchronous. The readaddress controls the location of the data driven out of the output pin (DPO), and the write address controls thedestination of a valid write transaction.

When the write enable (WE) is Low, transitions on the write clock (WCLK) are ignored and data stored in theRAM is not affected. When WE is High, any negative transition on WCLK loads the data on the data input (D)into the word selected by the 5-bit write address. For predictable performance, write address and data inputsmust be stable before a High-to-Low WCLK transition. This RAM block assumes an active-Low WCLK. WCLKcan be active-High or active-Low. Any inverter placed on the WCLK input net is absorbed into the block.

You can initialize this design element during configuration using the INIT attribute.

The SPO output reflects the data in the memory cell addressed by A4 – A0. The DPO output reflects the datain the memory cell addressed by DPRA4 – DPRA0.

Note The write process is not affected by the address on the read address port.

Logic TableInputs Outputs

WE (mode) WCLK D SPO DPO

0 (read) X X data_a data_d

1 (read) 0 X data_a data_d

1 (read) 1 X data_a data_d

1 (write) ↓ D D data_d

1 (read) ↑ X data_a data_d

data_a = word addressed by bits A4-A0

data_d = word addressed by bits DPRA4-DPRA0

Libraries Guide

10.1 www.xilinx.com 205

Page 206: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodThis design element is only for use in schematics.

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 32-Bit Value All zeros Initializes ROMs, RAMs, registers, and look-uptables.

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

206 www.xilinx.com 10.1

Page 207: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM32X1S

Primitive: 32-Deep by 1-Wide Static Synchronous RAM

IntroductionThe design element is a 32-word by 1-bit static random access memory with synchronous write capability. Whenthe write enable is Low, transitions on the write clock (WCLK) are ignored and data stored in the RAM is notaffected. When (WE) is High, any positive transition on (WCLK) loads the data on the data input (D) into theword selected by the 5-bit address (A4-A0). For predictable performance, address and data inputs must be stablebefore a Low-to-High (WCLK) transition. This RAM block assumes an active-High (WCLK). However, (WCLK)can be active-High or active-Low. Any inverter placed on the (WCLK) input net is absorbed into the block.

The signal output on the data output pin (O) is the data that is stored in the RAM at the location defined by thevalues on the address pins. You can initialize RAM32X1S during configuration using the INIT attribute.

Logic TableInputs Outputs

WE (Mode) WCLK D O

0 (read) X X Data

1 (read) 0 X Data

1 (read) 1 X Data

1 (write) ↓ D D

1 (read) ↑ X Data

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

10.1 www.xilinx.com 207

Page 208: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available Attributes

Attribute Type Allowed Values Default Descriptions

INIT Hexadecimal Any 32-Bit Value All zeros Specifies initial contents of the RAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM32X1S: 32 x 1 posedge write distributed => LUT RAM-- All FPGA-- Xilinx HDL Libraries Guide, version 10.1.2

RAM32X1S_inst : RAM32X1Sgeneric map (INIT => X"00000000")port map (O => O, -- RAM outputA0 => A0, -- RAM address[0] inputA1 => A1, -- RAM address[1] inputA2 => A2, -- RAM address[2] inputA3 => A3, -- RAM address[3] inputA4 => A4, -- RAM address[4] inputD => D, -- RAM data inputWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM32X1S_inst instantiation

Verilog Instantiation Template// RAM32X1S: 32 x 1 posedge write distributed (LUT) RAM// All FPGA// Xilinx HDL Libraries Guide, version 10.1.2

RAM32X1S #(.INIT(32’h00000000) // Initial contents of RAM) RAM32X1S_inst (.O(O), // RAM output.A0(A0), // RAM address[0] input.A1(A1), // RAM address[1] input.A2(A2), // RAM address[2] input.A3(A3), // RAM address[3] input.A4(A4), // RAM address[4] input.D(D), // RAM data input.WCLK(WCLK), // Write clock input.WE(WE) // Write enable input);

// End of RAM32X1S_inst instantiation

For More Information• See the Virtex-II User Guide.• See the Virtex-II Data Sheets.

Libraries Guide

208 www.xilinx.com 10.1

Page 209: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM32X1S_1

Primitive: 32-Deep by 1-Wide Static Synchronous RAM with Negative-Edge Clock

IntroductionThe design element is a 32-word by 1-bit static random access memory with synchronous write capability. Whenthe write enable is Low, transitions on the write clock (WCLK) are ignored and data stored in the RAM is notaffected. When (WE) is High, any negative transition on (WCLK) loads the data on the data input (D) into theword selected by the 5-bit address (A4-A0). For predictable performance, address and data inputs must be stablebefore a High-to-Low (WCLK) transition. This RAM block assumes an active-Low (WCLK). However, (WCLK)can be active-High or active-Low. Any inverter placed on the (WCLK) input net is absorbed into the block.

The signal output on the data output pin (O) is the data that is stored in the RAM at the location defined by thevalues on the address pins. You can initialize RAM32X1S_1 during configuration using the INIT attribute.

Logic TableInputs Outputs

WE (Mode) WCLK D O

0 (read) X X Data

1 (read) 0 X Data

1 (read) 1 X Data

1 (write) ↓ D D

1 (read) ↑ X Data

Data = word addressed by bits A4 – A0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

10.1 www.xilinx.com 209

Page 210: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Descriptions

INIT Hexadecimal Any 32-Bit Value 0 Initializes RAMs, registers, and look-uptables.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM32X1S_1: 32 x 1 negedge write distributed => LUT RAM-- All FPGA-- Xilinx HDL Libraries Guide, version 10.1.2

RAM32X1S_1_inst : RAM32X1S_1generic map (INIT => X"00000000")port map (O => O, -- RAM outputA0 => A0, -- RAM address[0] inputA1 => A1, -- RAM address[1] inputA2 => A2, -- RAM address[2] inputA3 => A3, -- RAM address[3] inputA4 => A4, -- RAM address[4] inputD => D, -- RAM data inputWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM32X1S_1_inst instantiation

Verilog Instantiation Template// RAM32X1S_1: 32 x 1 negedge write distributed (LUT) RAM// Virtex/E/-II/-II-Pro, Spartan-II/IIE/3/3A// Xilinx HDL Libraries Guide, version 10.1.2

RAM32X1S_1 #(.INIT(32’h00000000) // Initial contents of RAM)RAM32X1S_1_inst (.O(O), // RAM output.A0(A0), // RAM address[0] input.A1(A1), // RAM address[1] input.A2(A2), // RAM address[2] input.A3(A3), // RAM address[3] input.A4(A4), // RAM address[4] input.D(D), // RAM data input.WCLK(WCLK), // Write clock input.WE(WE) // Write enable input);

// End of RAM32X1S_1_inst instantiation

Libraries Guide

210 www.xilinx.com 10.1

Page 212: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM32X2S

Primitive: 32-Deep by 2-Wide Static Synchronous RAM

IntroductionThe design element is a 32-word by 2-bit static random access memory with synchronous write capability. Whenthe write enable (WE) is Low, transitions on the write clock (WCLK) are ignored and data stored in the RAM isnot affected. When (WE) is High, any positive transition on (WCLK) loads the data on the data input (D1-D0)into the word selected by the 5-bit address (A4-A0). For predictable performance, address and data inputs mustbe stable before a Low-to-High (WCLK) transition. This RAM block assumes an active-High (WCLK). However,(WCLK) can be active-High or active-Low. Any inverter placed on the (WCLK) input net is absorbed into theblock. The signal output on the data output pins (O1-O0) is the data that is stored in the RAM at the locationdefined by the values on the address pins.

You can use the INIT_00 and INIT_01 properties to specify the initial contents of RAM32X2S.

Logic TableInputs Outputs

WE (Mode) WCLK D O0-O1

0 (read) X X Data

1 (read) 0 X Data

1 (read) 1 X Data

1 (write) ↑ D1-D0 D1-D0

1 (read) ↓ X Data

Data = word addressed by bits A4 A0

Design Entry MethodInstantiation Yes

Inference Recommended

Libraries Guide

212 www.xilinx.com 10.1

Page 213: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Descriptions

INIT_00 Hexadecimal Any 32-Bit Value All zeros INIT for bit 0 of RAM.

INIT_01 Hexadecimal Any 32-Bit Value All zeros INIT for bit 1 of RAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM32X2S: 32 x 2 posedge write distributed => LUT RAM-- Virtex-II/II-Pro, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

RAM32X2S_inst : RAM32X2Sgeneric map (INIT_00 => X"00000000", -- INIT for bit 0 of RAMINIT_01 => X"00000000") -- INIT for bit 1 of RAMport map (O0 => O0, -- RAM data[0] outputO1 => O1, -- RAM data[1] outputA0 => A0, -- RAM address[0] inputA1 => A1, -- RAM address[1] inputA2 => A2, -- RAM address[2] inputA3 => A3, -- RAM address[3] inputA4 => A4, -- RAM address[4] inputD0 => D0, -- RAM data[0] inputD1 => D1, -- RAM data[1] inputWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM32X2S_inst instantiation

Verilog Instantiation Template// RAM32X2S: 32 x 2 posedge write distributed (LUT) RAM// Virtex-II/II-Pro, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

RAM32X2S #(.INIT_00(32’h00000000), // INIT for bit 0 of RAM.INIT_01(32’h00000000) // INIT for bit 1 of RAM) RAM32X2S_inst (.O0(O0), // RAM data[0] output.O1(O1), // RAM data[1] output.A0(A0), // RAM address[0] input.A1(A1), // RAM address[1] input.A2(A2), // RAM address[2] input.A3(A3), // RAM address[3] input.A4(A4), // RAM address[4] input.D0(D0), // RAM data[0] input.D1(D1), // RAM data[1] input.WCLK(WCLK), // Write clock input

Libraries Guide

10.1 www.xilinx.com 213

Page 214: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.WE(WE) // Write enable input);

// End of RAM32X2S_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

214 www.xilinx.com 10.1

Page 215: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM32X4SPrimitive: 32-Deep by 4-Wide Static Synchronous RAM

IntroductionThis design element is a 32-word by 4-bit static random access memory with synchronous write capability. Whenthe write enable (WE) is Low, transitions on the write clock (WCLK) are ignored and data stored in the RAM isnot affected. When WE is High, any positive transition on WCLK loads the data on the data inputs (D3-D0) intothe word selected by the 5-bit address (A4-A0). For predictable performance, address and data inputs mustbe stable before a Low-to-High WCLK transition. This RAM block assumes an active-High WCLK. However,WCLK can be active-High or active-Low. Any inverter placed on the WCLK input net is absorbed into the block.

The signal output on the data output pins (O3-O0) is the data that is stored in the RAM at the location defined bythe values on the address pins.

Logic TableInputs Outputs

WE WCLK D3-D0 O3-O0

0 (read) X X Data

1 (read) 0 X Data

1 (read) 1 X Data

1 (write) ↑ D3-D0 D3-D0

1 (read) ↓ X Data

Data = word addressed by bits A4-A0

Design Entry MethodInstantiation Yes

Inference Recommended

Libraries Guide

10.1 www.xilinx.com 215

Page 216: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 Hexadecimal Any 32-Bit Value All zeros INIT for bit 0 of RAM.

INIT_01 Hexadecimal Any 32-Bit Value All zeros INIT for bit 1 of RAM.

INIT_02 Hexadecimal Any 32-Bit Value All zeros INIT for bit 2 of RAM.

INIT_03 Hexadecimal Any 32-Bit Value All zeros INIT for bit 3 of RAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM32X4S: 32 x 4 posedge write distributed => LUT RAM-- Virtex-II/II-Pro-- Xilinx HDL Libraries Guide, version 10.1.2

RAM32X4S_inst : RAM32X4Sgeneric map (INIT_00 => X"00000000", -- INIT for bit 0 of RAMINIT_01 => X"00000000", -- INIT for bit 1 of RAMINIT_02 => X"00000000", -- INIT for bit 2 of RAMINIT_03 => X"00000000") -- INIT for bit 3 of RAMport map (O0 => O0, -- RAM data[0] outputO1 => O1, -- RAM data[1] outputO2 => O2, -- RAM data[2] outputO3 => O3, -- RAM data[3] outputA0 => A0, -- RAM address[0] inputA1 => A1, -- RAM address[1] inputA2 => A2, -- RAM address[2] inputA3 => A3, -- RAM address[3] inputA4 => A4, -- RAM address[4] inputD0 => D0, -- RAM data[0] inputD1 => D1, -- RAM data[1] inputD2 => D2, -- RAM data[2] inputD3 => D3, -- RAM data[3] inputWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM32X4S_inst instantiation

Verilog Instantiation Template// RAM32X4S: 32 x 4 posedge write distributed (LUT) RAM// Virtex-II/II-Pro// Xilinx HDL Libraries Guide, version 10.1.2

RAM32X4S #(.INIT_00(32’h00000000), // INIT for bit 0 of RAM.INIT_01(32’h00000000), // INIT for bit 1 of RAM.INIT_02(32’h00000000), // INIT for bit 2 of RAM.INIT_03(32’h00000000) // INIT for bit 3 of RAM

Libraries Guide

216 www.xilinx.com 10.1

Page 217: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

) RAM32X4S_inst (.O0(O0), // RAM data[0] output.O1(O1), // RAM data[1] output.O2(O2), // RAM data[2] output.O3(O3), // RAM data[3] output.A0(A0), // RAM address[0] input.A1(A1), // RAM address[1] input.A2(A2), // RAM address[2] input.A3(A3), // RAM address[3] input.A4(A4), // RAM address[4] input.D0(D0), // RAM data[0] input.D1(D1), // RAM data[1] input.D2(D2), // RAM data[2] input.D3(D3), // RAM data[3] input.WCLK(WCLK), // Write clock input.WE(WE) // Write enable input);

// End of RAM32X4S_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 217

Page 218: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM32X8S

Primitive: 32-Deep by 8-Wide Static Synchronous RAM

IntroductionThis design element is a 32-word by 8-bit static random access memory with synchronous write capability. Whenthe write enable (WE) is Low, transitions on the write clock (WCLK) are ignored and data stored in the RAM isnot affected. When WE is High, any positive transition on WCLK loads the data on the data inputs (D7 – D0) intothe word selected by the 5-bit address (A4 – A0). For predictable performance, address and data inputs mustbe stable before a Low-to-High WCLK transition. This RAM block assumes an active-High WCLK. However,WCLK can be active-High or active-Low. Any inverter placed on the WCLK input net is absorbed into the block.

The signal output on the data output pins (O7 – O0) is the data that is stored in the RAM at the location definedby the values on the address pins.

Logic TableInputs Outputs

WE (mode) WCLK D7-D0 O7-O0

0 (read) X X Data

1 (read) 0 X Data

1 (read) 1 X Data

1 (write) ↑ D7-D0 D7-D0

1 (read) ↓ X Data

Data = word addressed by bits A4 – A0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

218 www.xilinx.com 10.1

Page 219: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 Hexadecimal Any 32-Bit Value All zeros INIT for bit 0 of RAM.

INIT_01 Hexadecimal Any 32-Bit Value All zeros INIT for bit 1 of RAM.

INIT_02 Hexadecimal Any 32-Bit Value All zeros INIT for bit 2 of RAM.

INIT_03 Hexadecimal Any 32-Bit Value All zeros INIT for bit 3 of RAM.

INIT_04 Hexadecimal Any 32-Bit Value All zeros INIT for bit 4 of RAM.

INIT_05 Hexadecimal Any 32-Bit Value All zeros INIT for bit 5 of RAM.

INIT_06 Hexadecimal Any 32-Bit Value All zeros INIT for bit 6 of RAM.

INIT_07 Hexadecimal Any 32-Bit Value All zeros INIT for bit 7 of RAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM32X8S: 32 x 8 posedge write distributed => LUT RAM-- Virtex-II/II-Pro-- Xilinx HDL Libraries Guide, version 10.1.2

RAM32X8S_inst : RAM32X8Sgeneric map (INIT_00 => X"00000000", -- INIT for bit 0 of RAMINIT_01 => X"00000000", -- INIT for bit 1 of RAMINIT_02 => X"00000000", -- INIT for bit 2 of RAMINIT_03 => X"00000000", -- INIT for bit 3 of RAMINIT_04 => X"00000000", -- INIT for bit 4 of RAMINIT_05 => X"00000000", -- INIT for bit 5 of RAMINIT_06 => X"00000000", -- INIT for bit 6 of RAMINIT_07 => X"00000000") -- INIT for bit 7 of RAMport map (O => O, -- 8-bit RAM data outputA0 => A0, -- RAM address[0] inputA1 => A1, -- RAM address[1] inputA2 => A2, -- RAM address[2] inputA3 => A3, -- RAM address[3] inputA4 => A4, -- RAM address[4] inputD => D, -- 8-bit RAM data inputWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM32X8S_inst instantiation

Verilog Instantiation Template// RAM32X8S: 32 x 8 posedge write distributed (LUT) RAM// Virtex-II/II-Pro// Xilinx HDL Libraries Guide, version 10.1.2

RAM32X8S #(.INIT_00(32’h00000000), // INIT for bit 0 of RAM.INIT_01(32’h00000000), // INIT for bit 1 of RAM.INIT_02(32’h00000000), // INIT for bit 2 of RAM.INIT_03(32’h00000000), // INIT for bit 3 of RAM

Libraries Guide

10.1 www.xilinx.com 219

Page 220: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_04(32’h00000000), // INIT for bit 4 of RAM

.INIT_05(32’h00000000), // INIT for bit 5 of RAM

.INIT_06(32’h00000000), // INIT for bit 6 of RAM

.INIT_07(32’h00000000) // INIT for bit 7 of RAM) RAM32X8S_inst (.O(O), // 8-bit RAM data output.A0(A0), // RAM address[0] input.A1(A1), // RAM address[1] input.A2(A2), // RAM address[2] input.A3(A3), // RAM address[3] input.A4(A4), // RAM address[4] input.D(D), // 8-bit RAM data input.WCLK(WCLK), // Write clock input.WE(WE) // Write enable input);

// End of RAM32X8S_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

220 www.xilinx.com 10.1

Page 221: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM64X1D

Primitive: 64-Deep by 1-Wide Dual Port Static Synchronous RAM

IntroductionThis design element is a 64-word by 1-bit static dual port random access memory with synchronous writecapability. The device has two separate address ports: the read address (DPRA5–DPRA0) and the write address(A5–A0). These two address ports are completely asynchronous. The read address controls the location ofthe data driven out of the output pin (DPO), and the write address controls the destination of a valid writetransaction. When the write enable (WE) is Low, transitions on the write clock (WCLK) are ignored and datastored in the RAM is not affected.

When WE is High, any positive transition on WCLK loads the data on the data input (D) into the word selectedby the 6-bit (A0–A5) write address. For predictable performance, write address and data inputs must be stablebefore a Low-to-High WCLK transition. This RAM block assumes an active-High WCLK. WCLK can beactive-High or active-Low. Any inverter placed on the WCLK input net is absorbed into the block.

The SPO output reflects the data in the memory cell addressed by A5–A0. The DPO output reflects the datain the memory cell addressed by DPRA5–DPRA0.

Note The write process is not affected by the address on the read address port.

Logic TableInputs Outputs

WE (mode) WCLK D SPO DPO

0 (read) X X data_a data_d

1 (read) 0 X data_a data_d

1 (read) 1 X data_a data_d

1 (write) ↑ D D data_d

1 (read) ↓ X data_a data_d

data_a = word addressed by bits A5–A0

data_d = word addressed by bits DPRA5–DPRA0

Libraries Guide

10.1 www.xilinx.com 221

Page 222: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 64-BitValue

All zeros Initializes RAMs, registers, and look-up tables.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM64X1D: 64 x 1 positive edge write, asynchronous read dual-port distributed RAM-- Virtex-II/II-Pro-- Xilinx HDL Libraries Guide, version 10.1.2

RAM64X1D_inst : RAM64X1Dgeneric map (INIT => X"0000000000000000")port map (DPO => DPO, -- Read-only 1-bit data outputSPO => SPO, -- R/W 1-bit data outputA0 => A0, -- R/W address[0] input bitA1 => A1, -- R/W address[1] input bitA2 => A2, -- R/W address[2] input bitA3 => A3, -- R/W address[3] input bitA4 => A4, -- R/W address[4] input bitA5 => A5, -- R/W address[5] input bitD => D, -- Write 1-bit data inputDPRA0 => DPRA0, -- address[0] input bitDPRA1 => DPRA1, -- Read-only address[1] input bitDPRA2 => DPRA2, -- Read-only address[2] input bitDPRA3 => DPRA3, -- Read-only address[3] input bitDPRA4 => DPRA4, -- Read-only address[4] input bitDPRA5 => DPRA5, -- Read-only address[5] input bitWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM64X1D_inst instantiation

Verilog Instantiation Template// RAM64X1D: 64 x 1 positive edge write, asynchronous read dual-port distributed RAM// Virtex-II/II-Pro/5// Xilinx HDL Libraries Guide, version 10.1.2

RAM64X1D #(.INIT(64’h0000000000000000) // Initial contents of RAM) RAM64X1D_inst (.DPO(DPO), // Read-only 1-bit data output

Libraries Guide

222 www.xilinx.com 10.1

Page 223: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.SPO(SPO), // R/W 1-bit data output

.A0(A0), // R/W address[0] input bit

.A1(A1), // R/W address[1] input bit

.A2(A2), // R/W address[2] input bit

.A3(A3), // R/W address[3] input bit

.A4(A4), // R/W address[4] input bit

.A5(A5), // R/W address[5] input bit

.D(D), // Write 1-bit data input

.DPRA0(DPRA0), // Read-only address[0] input bit

.DPRA1(DPRA1), // Read-only address[1] input bit

.DPRA2(DPRA2), // Read-only address[2] input bit

.DPRA3(DPRA3), // Read-only address[3] input bit

.DPRA4(DPRA4), // Read-only address[4] input bit

.DPRA5(DPRA5), // Read-only address[5] input bit

.WCLK(WCLK), // Write clock input

.WE(WE) // Write enable input);

// End of RAM64X1D_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 223

Page 224: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM64X1D_1

Primitive: 64-Deep by 1-Wide Dual Port Static Synchronous RAM with Negative-Edge Clock

IntroductionThis design element is a 64-word by 1-bit static dual port random access memory with synchronouswrite capability and a negative-edge clock. The device has two separate address ports: the read address(DPRA5–DPRA0) and the write address (A5–A0). These two address ports are completely asynchronous.The read address controls the location of the data driven out of the output pin (DPO), and the write addresscontrols the destination of a valid write transaction.

When the write enable (WE) is Low, transitions on the write clock (WCLK) are ignored and data stored in theRAM is not affected. When WE is High, any negative transition on WCLK loads the data on the data input (D)into the word selected by the 6-bit (A0–A5) write address. For predictable performance, write address and datainputs must be stable before a High-to-Low WCLK transition. This RAM block assumes an active-Low WCLK.WCLK can be active-High or active-Low. Any inverter placed on the WCLK input net is absorbed into the block.

You can initialize this design element during configuration using the INIT attribute. The SPO output reflects thedata in the memory cell addressed by A5–A0. The DPO output reflects the data in the memory cell addressed byDPRA5–DPRA0.

Note The write process is not affected by the address on the read address port.

Logic TableInputs Outputs

WE (mode) WCLK D SPO DPO

0 (read) X X data_a data_d

1 (read) 0 X data_a data_d

1 (read) 1 X data_a data_d

1 (write) ↓ D D data_d

1 (read) ↑ X data_a data_d

data_a = word addressed by bits A5–A0

data_d = word addressed by bits DPRA5–DPRA0

Libraries Guide

224 www.xilinx.com 10.1

Page 225: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 64-Bit Value All zeros Initializes RAMs, registers, and look-uptables.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM64X1D_1: 64 x 1 negative edge write, asynchronous read dual-port distributed RAM-- Virtex-II/II-Pro-- Xilinx HDL Libraries Guide, version 10.1.2

RAM64X1D_1_inst : RAM64X1D_1generic map (INIT => X"0000000000000000")port map (DPO => DPO, -- Port A 1-bit data outputSPO => SPO, -- Port B 1-bit data outputA0 => A0, -- R/W address[0] input bitA1 => A1, -- R/W address[1] input bitA2 => A2, -- R/W address[2] input bitA3 => A3, -- R/W address[3] input bitA4 => A4, -- R/W address[4] input bitA5 => A5, -- Port A address[5] input bitD => D, -- Port A 1-bit data inputDPRA0 => DPRA0, -- Read-only address[0] input bitDPRA1 => DPRA1, -- Read-only address[1] input bitDPRA2 => DPRA2, -- Read-only address[2] input bitDPRA3 => DPRA3, -- Read-only address[3] input bitDPRA4 => DPRA4, -- Read-only address[4] input bitDPRA5 => DPRA5, -- Read-only address[5] input bitWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM64X1D_1_inst instantiation

Verilog Instantiation Template// RAM64X1D_1: 64 x 1 negative edge write, asynchronous read dual-port distributed RAM// Virtex-II/II-Pro// Xilinx HDL Libraries Guide, version 10.1.2

RAM64X1D_1 #(.INIT(64’h0000000000000000) // Initial contents of RAM) RAM64X1D_1_inst (.DPO(DPO), // Read-only 1-bit data output

Libraries Guide

10.1 www.xilinx.com 225

Page 226: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.SPO(SPO), // R/W 1-bit data output

.A0(A0), // R/W address[0] input bit

.A1(A1), // R/W address[1] input bit

.A2(A2), // R/W address[2] input bit

.A3(A3), // R/W address[3] input bit

.A4(A4), // R/W address[4] input bit

.A5(A5), // R/W address[5] input bit

.D(D), // Write 1-bit data input

.DPRA0(DPRA0), // Read-only address[0] input bit

.DPRA1(DPRA1), // Read-only address[1] input bit

.DPRA2(DPRA2), // Read-only address[2] input bit

.DPRA3(DPRA3), // Read-only address[3] input bit

.DPRA4(DPRA4), // Read-only address[4] input bit

.DPRA5(DPRA5), // Read-only address[5] input bit

.WCLK(WCLK), // Write clock input

.WE(WE) // Write enable input);

// End of RAM64X1D_1_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

226 www.xilinx.com 10.1

Page 227: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM64X1S

Primitive: 64-Deep by 1-Wide Static Synchronous RAM

IntroductionThis design element is a 64-word by 1-bit static random access memory (RAM) with synchronous write capability.When the write enable is set Low, transitions on the write clock (WCLK) are ignored and data stored in the RAMis not affected. When WE is set High, any positive transition on WCLK loads the data on the data input (D) intothe word selected by the 6-bit address (A5 - A0). This RAM block assumes an active-High WCLK. However,WCLK can be active-High or active-Low. Any inverter placed on the WCLK input net is absorbed into the block.

The signal output on the data output pin (O) is the data that is stored in the RAM at the location defined bythe values on the address pins.

You can initialize this element during configuration using the INIT attribute.

Logic TableMode selection is shown in the following logic table

Inputs Outputs

WE (mode) WCLK D O

0 (read) X X Data

1 (read) 0 X Data

1 (read) 1 X Data

1 (write) ↑ D D

1 (read) ↓ X Data

Data = word addressed by bits A5 – A0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

10.1 www.xilinx.com 227

Page 228: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 64-Bit Value All zeros Initializes ROMs, RAMs, registers, and look-uptables.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM64X1S: 64 x 1 positive edge write, asynchronous read single-port distributed RAM-- Virtex-II/II-Pro/4/5, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

RAM64X1S_inst : RAM64X1Sgeneric map (INIT => X"0000000000000000")port map (O => O, -- 1-bit data outputA0 => A0, -- Address[0] input bitA1 => A1, -- Address[1] input bitA2 => A2, -- Address[2] input bitA3 => A3, -- Address[3] input bitA4 => A4, -- Address[4] input bitA5 => A5, -- Address[5] input bitD => D, -- 1-bit data inputWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM64X1S_inst instantiation

Verilog Instantiation Template// RAM64X1S: 64 x 1 positive edge write, asynchronous read single-port distributed RAM// Virtex-II/II-Pro/4/5, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

RAM64X1S #(.INIT(64’h0000000000000000) // Initial contents of RAM) RAM64X1S_inst (.O(O), // 1-bit data output.A0(A0), // Address[0] input bit.A1(A1), // Address[1] input bit.A2(A2), // Address[2] input bit.A3(A3), // Address[3] input bit.A4(A4), // Address[4] input bit.A5(A5), // Address[5] input bit.D(D), // 1-bit data input.WCLK(WCLK), // Write clock input.WE(WE) // Write enable input);

// End of RAM64X1S_inst instantiation

Libraries Guide

228 www.xilinx.com 10.1

Page 230: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM64X1S_1

Primitive: 64-Deep by 1-Wide Static Synchronous RAM with Negative-Edge Clock

IntroductionThis design element is a 64-word by 1-bit static random access memory with synchronous write capability. Whenthe write enable is Low, transitions on the write clock (WCLK) are ignored and data stored in the RAM is notaffected. When (WE) is High, any negative transition on (WCLK) loads the data on the data input (D) into theword selected by the 6-bit address (A5 – A0). For predictable performance, address and data inputs must be stablebefore a High-to-Low (WCLK) transition. This RAM block assumes an active-Low (WCLK). However, (WCLK)can be active-High or active-Low. Any inverter placed on the (WCLK) input net is absorbed into the block.

The signal output on the data output pin (O) is the data that is stored in the RAM at the location defined bythe values on the address pins.

You can initialize this element during configuration using the INIT attribute.

Logic TableInputs Outputs

WE (mode) WCLK D O

0 (read) X X Data

1 (read) 0 X Data

1 (read) 1 X Data

1 (write) ↓ D D

1 (read) ↑ X Data

Data = word addressed by bits A5 – A0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

230 www.xilinx.com 10.1

Page 231: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 64-Bit Value All zeros Initializes ROMs, RAMs, registers, and look-uptables.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM64X1S_1: 64 x 1 negative edge write, asynchronous read single-port distributed RAM-- Virtex-II/II-Pro, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

RAM64X1S_1_inst : RAM64X1S_1generic map (INIT => X"0000000000000000")port map (O => O, -- 1-bit data outputA0 => A0, -- Address[0] input bitA1 => A1, -- Address[1] input bitA2 => A2, -- Address[2] input bitA3 => A3, -- Address[3] input bitA4 => A4, -- Address[4] input bitA5 => A5, -- Address[5] input bitD => D, -- 1-bit data inputWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM64X1S_1_inst instantiation

Verilog Instantiation Template// RAM64X1S_1: 64 x 1 negative edge write, asynchronous read single-port distributed RAM// Virtex-II/II-Pro, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

RAM64X1S_1 #(.INIT(64’h0000000000000000) // Initial contents of RAM) RAM64X1S_1_inst (.O(O), // 1-bit data output.A0(A0), // Address[0] input bit.A1(A1), // Address[1] input bit.A2(A2), // Address[2] input bit.A3(A3), // Address[3] input bit.A4(A4), // Address[4] input bit.A5(A5), // Address[5] input bit.D(D), // 1-bit data input.WCLK(WCLK), // Write clock input.WE(WE) // Write enable input);

// End of RAM64X1S_1_inst instantiation

For More Information• See the Virtex-II User Guide.

Libraries Guide

10.1 www.xilinx.com 231

Page 232: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

• See the Virtex-II Data Sheets.

Libraries Guide

232 www.xilinx.com 10.1

Page 233: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAM64X2S

Primitive: 64-Deep by 2-Wide Static Synchronous RAM

IntroductionThis design element is a 64-word by 2-bit static random access memory with synchronous write capability. Whenthe write enable (WE) is Low, transitions on the write clock (WCLK) are ignored and data stored in the RAM isnot affected. When WE is High, any positive transition on WCLK loads the data on the data input (D1–D0) intothe word selected by the 6-bit address (A5–A0). For predictable performance, address and data inputs mustbe stable before a Low-to-High WCLK transition. This RAM block assumes an active-High WCLK. However,WCLK can be active-High or active-Low. Any inverter placed on the WCLK input net is absorbed into the block.

The signal output on the data output pins (O1–O0) is the data that is stored in the RAM at the location defined bythe values on the address pins. You can use the INIT_00 and INIT_01 properties to specify the initial contentsof this design element.

Logic TableInputs Outputs

WE (mode) WCLK D0–D1 O0–O1

0 (read) X X Data

1 (read) 0 X Data

1 (read) 1 X Data

1 (write) ↑ D1-D0 D1-D0

1 (read) ↓ X Data

Data = word addressed by bits A5–A0

Design Entry MethodInstantiation Yes

Inference Recommended

Libraries Guide

10.1 www.xilinx.com 233

Page 234: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 Hexadecimal Any 64-Bit Value All zeros Initializes RAMs, registers, and look-up tables.

INIT_01 Hexadecimal Any 64-Bit Value All zeros Initializes RAMs, registers, and look-up tables.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAM64X2S: 64 x 2 positive edge write, asynchronous read single-port distributed RAM-- Virtex-II/II-Pro/4/5-- Xilinx HDL Libraries Guide, version 10.1.2

RAM64X2S_inst : RAM64X2Sgeneric map (INIT_00 => X"0000000000000000", -- INIT for bit 0 of RAMINIT_01 => X"0000000000000000") -- INIT for bit 1 of RAMport map (O0 => O0, -- Data[0] outputO1 => O1, -- Data[1] output bitA0 => A0, -- Address[0] input bitA1 => A1, -- Address[1] input bitA2 => A2, -- Address[2] input bitA3 => A3, -- Address[3] input bitA4 => A4, -- Address[4] input bitA5 => A5, -- Address[5] input bitD0 => D0, -- Data[0] inputD1 => D1, -- Data[1] inputWCLK => WCLK, -- Write clock inputWE => WE -- Write enable input);

-- End of RAM64X2S_inst instantiation

Verilog Instantiation Template// RAM64X2S: 64 x 2 positive edge write, asynchronous read single-port distributed RAM// Virtex-II/II-Pro// Xilinx HDL Libraries Guide, version 10.1.2

RAM64X2S #(.INIT_00(64’h0000000000000000), // INIT for RAM bit 0.INIT_01(64’h0000000000000000) // INIT for RAM bit 1) RAM64X2S_inst (.O0(O0), // Data[0] output.O1(O1), // Data[1] output bit.A0(A0), // Address[0] input bit.A1(A1), // Address[1] input bit.A2(A2), // Address[2] input bit.A3(A3), // Address[3] input bit.A4(A4), // Address[4] input bit.A5(A5), // Address[5] input bit.D0(D0), // Data[0] input

Libraries Guide

234 www.xilinx.com 10.1

Page 235: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.D1(D1), // Data[1] input

.WCLK(WCLK), // Write clock input

.WE(WE) // Write enable input);

// End of RAM64X2S_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 235

Page 236: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S1

Primitive: 16K-bit Data and 2K-bit Parity Single-Port Synchronous Block RAM with 1-bit Port

IntroductionThis design element is a dedicated random access memory blocks with synchronous write capability. The blockRAM port has 16384 bits of data memory. The cell configuration for this element is listed in the following table.

Data Cells Parity Cells

Depth Width Depth Width Address Bus Data Bus Parity Bus

16384 1 - - (13:0) (0:0) -

The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, no data is written and theoutputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) is High, DOA and DOPAare set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable (WEA) is High, the memorycontents reflect the data at DIA and DIPA. When ENA is High and WEA is Low, the data stored in the RAMaddress (ADDRA) is read during the Low-to-High clock transition. By default, WRITE_MODE_A=WRITE_FIRST,when ENA and WEA are High, the data on the data inputs (DIA and DIPA) is loaded into the word selected bythe write address (ADDRA) during the Low-to-High clock transition and the data outputs (DOA and DOPA)reflect the selected (addressed) word.

The above description assumes an active High EN, WE, SSR, and CLK. However, the active level can be changedby placing an inverter on the port. Any inverter placed on a RAMB16 port is absorbed into the block anddoes not use a CLB resource.

Logic TableInputs Outputs

GSR EN SSR WE CLK ADDR DI DIP DO DOP RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT INIT No Change No Change

0 0 X X X X X X NoChange

NoChange No Change No Change

0 1 1 0 ↑ X X X SRVAL SRVAL No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL SRVAL RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

236 www.xilinx.com 10.1

Page 237: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR EN SSR WE CLK ADDR DI DIP DO DOP RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata NoChange(a)RAM(addr)(b)data(c)

NoChange(a)RAM(addr)(b)pdata(c)

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset signal

INIT=Value specified by the INIT attribute for data memory. Default is all zeros.

SRVAL=Value after assertion of SSR as specified by the SRVAL attribute.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

(a) WRITE_MODE=NO_CHANGE

(b) WRITE_MODE=READ_FIRST

(c) WRITE_MODE=WRITE_FIRST

InitializationInitializing Memory Contents

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16 is set by 64 initialization attributes (INIT_00 throughINIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

Any INIT_xx or INITP_xx attribute that is not specified is configured as zeros. Partial Strings are paddedwith zeros to the left.

Initializing the Output Register

In Spartan-3A, each bit in the output register can be initialized at power on to either a 0 or 1. In addition, theinitial state specified for power on can be different than the state that results from assertion of a set/reset. Twotypes of properties control initialization of the output register for a single-port RAMB16: INIT and SRVAL. TheINIT attribute specifies the output register value at power on. You can use the SRVAL attribute to define the stateresulting from assertion of the SSR (set/reset) input.

The INIT and SRVAL attributes specify the initialization value as a hexadecimal String containing one bit foreach bit in the output port. For example, for a RAMB16_S1 with port width equal to 1, the output registercontains 1 bit. Therefore, the INIT or SRVAL value can only be specified as a 1 or 0. For RAMB16_S4 with portwidth equal to 4, the output register contains 4 bits. In this case, you can specify a hexadecimal value from 0through F to initialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high orderbit position of the INIT or SRVAL value.

Selecting Write Mode

Libraries Guide

10.1 www.xilinx.com 237

Page 238: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The WRITE_MODE attribute controls RAMB16 memory and output contents. By default, the WRITE_MODE isset to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You can setthe WRITE_MODE to READ_FIRST to read the memory contents, pass the memory contents to the outputs, andthen write the input to memory. Or, you can set the WRITE_MODE to NO_CHANGE to have the input writtento memory without changing the output.

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Binary/Hexadecimal

Any Hex Value All zeros Identifies the initial value of theDO output port after completingconfiguration. The bit width is dependenton the width of the A or B port of theRAM.

INIT_00 - INIT_3F Binary/Hexadecimal

Any Hex Value All zeros Specifies the initial contents of the dataportion of the RAM array.

INITP_00 - INITP_07 Binary/Hexadecimal

Any Hex Value All zeros Specifies the initial contents of the parityportion of the RAM array.

SRVAL Binary/Hexadecimal

Any Hex Value All zeros Allows the individual selection ofwhether the DO output port sets (go toa one) or reset (go to a zero) upon theassertion of the SSR pin. The bit widthis dependent on the width of the A or Bport of the RAM.

WRITE_MODE String "WRITE_FIRST","READ_FIRST"or"NO_CHANGE"

"WRITE_FIRST" Specifies the behavior of the DO portupon a write command to the respectedport. If set to "WRITE_FIRST", thesame port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM to theoutput port prior to writing the new data."NO_CHANGE" keeps the previous valueon the output port and won’t update theoutput port upon a write command. Thisis the suggested mode if not using theread data from a particular port of theRAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

Libraries Guide

238 www.xilinx.com 10.1

Page 239: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

-- RAMB16_S1: Virtex-II/II-Pro, Spartan-3/3E 16kx1 Single-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S1_inst : RAMB16_S1generic map (INIT => X"0", -- Value of output RAM registers at startupSRVAL => X"0", -- Ouput value upon SSR assertionWRITE_MODE => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE-- The following INIT_xx declarations specify the intial contents of the RAM-- Address 0 to 4095INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 4096 to 8191INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 8192 to 12287INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 12288 to 16383INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

10.1 www.xilinx.com 239

Page 240: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_3C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DO => DO, -- 1-bit Data OutputADDR => ADDR, -- 14-bit Address InputCLK => CLK, -- ClockDI => DI, -- 1-bit Data InputEN => EN, -- RAM Enable InputSSR => SSR, -- Synchronous Set/Reset InputWE => WE -- Write Enable Input);

-- End of RAMB16_S1_inst instantiation

Verilog Instantiation Template// RAMB16_S1: Spartan-3/3E/3A/3AN/3AD 16kx1 Single-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S1 #(.INIT(1’b0), // Value of output RAM registers at startup.SRVAL(1’b0), // Output value upon SSR assertion.WRITE_MODE("WRITE_FIRST"), // WRITE_FIRST, READ_FIRST or NO_CHANGE

// The following INIT_xx declarations specify the initial contents of the RAM// Address 0 to 4095.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 4096 to 8191.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 8192 to 12287.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

240 www.xilinx.com 10.1

Page 241: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 12288 to 16383.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S1_inst (.DO(DO), // 1-bit Data Output.ADDR(ADDR), // 14-bit Address Input.CLK(CLK), // Clock.DI(DI), // 1-bit Data Input.EN(EN), // RAM Enable Input.SSR(SSR), // Synchronous Set/Reset Input.WE(WE) // Write Enable Input);

// End of RAMB16_S1_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 241

Page 242: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S1_S1

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 1-bit Ports

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

242 www.xilinx.com 10.1

Page 243: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

10.1 www.xilinx.com 243

Page 244: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

ComponentDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S1_S1 16384 x1

- (13:0) (0:0) - 16384 x 1 - (13:0) (0:0) -

(a) Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

244 www.xilinx.com 10.1

Page 245: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

The following tables shows address mapping for each port width.

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

Libraries Guide

10.1 www.xilinx.com 245

Page 246: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

Libraries Guide

246 www.xilinx.com 10.1

Page 247: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

Libraries Guide

10.1 www.xilinx.com 247

Page 248: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 To INIT_3F Binary/Hexadecimal

Any All zeros Specifies the initial contents of the dataportion of the RAM array.

INIT_A Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INIT_B Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INITP_00 ToINITP_07

Binary/Hexadecimal

Any All zeros Specifies the initial contents of theparity portion of the RAM array.

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_ X_ONLY”

"ALL” Specifies the behavior during simulationin the event of a data collision (databeing read or written to the sameaddress from both ports of the Ramsimultaneously. "ALL" issues a warningto simulator console and generate an Xor all unknown data due to the collision.This is the recommended setting."WARNING" generates a warning onlyand "GENERATE_X_ONLY" generatesan X for unknown data but won’toutput the occurrence to the simulationconsole. "NONE" completely ignoresthe error. It is suggested to only changethis attribute if you can ensure thedata generated during a collision isdiscarded.

SRVAL_A Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTA pin. For Type,the bit width is dependent on the widthof the A port of the RAM.

Libraries Guide

248 www.xilinx.com 10.1

Page 249: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

SRVAL_B Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTB pin. For Type,the bit width is dependent on the widthof the B port of the RAM.

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S1_S1: Virtex-II/II-Pro, Spartan-3/3E 16k x 1 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S1_S1_inst : RAMB16_S1_S1generic map (INIT_A => "0", -- Value of output RAM registers on Port A at startupINIT_B => "0", -- Value of output RAM registers on Port B at startupSRVAL_A => "0", -- Port A ouput value upon SSR assertionSRVAL_B => "0", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_COLLISION_CHECK => "ALL", -- "NONE", "WARNING", "GENERATE_X_ONLY", "ALL"-- The following INIT_xx declarations specify the initial contents of the RAM-- Address 0 to 4095INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

10.1 www.xilinx.com 249

Page 250: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 4096 to 8191INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 8192 to 12287INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 12288 to 16383INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000"),port map (DOA => DOA, -- Port A 1-bit Data OutputDOB => DOB, -- Port B 1-bit Data OutputADDRA => ADDRA, -- Port A 14-bit Address InputADDRB => ADDRB, -- Port B 14-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 1-bit Data InputDIB => DIB, -- Port B 1-bit Data InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- PortB RAM Enable Input

Libraries Guide

250 www.xilinx.com 10.1

Page 251: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

SSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S1_S1_inst instantiation

Verilog Instantiation Template// RAMB16_S1_S1: Spartan-3/3E/3A/3AN/3AD 16k x 1 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S1_S1 #(.INIT_A(1’b0), // Value of output RAM registers on Port A at startup.INIT_B(1’b0), // Value of output RAM registers on Port B at startup.SRVAL_A(1’b0), // Port A output value upon SSR assertion.SRVAL_B(1’b0), // Port B output 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_ONLY", "GENERATE_X_ONLY", "ALL"

// The following INIT_xx declarations specify the initial contents of the RAM// Address 0 to 4095.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 4096 to 8191.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 8192 to 12287.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

10.1 www.xilinx.com 251

Page 252: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 12288 to 16383.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S1_S1_inst (.DOA(DOA), // Port A 1-bit Data Output.DOB(DOB), // Port B 1-bit Data Output.ADDRA(ADDRA), // Port A 14-bit Address Input.ADDRB(ADDRB), // Port B 14-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 1-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_S1_S1_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

252 www.xilinx.com 10.1

Page 253: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S1_S18

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 1-bit and 18-bitPorts

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

10.1 www.xilinx.com 253

Page 254: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

254 www.xilinx.com 10.1

Page 255: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

ComponentDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S1_S18 16384 x1

- (13:0) (0:0) - 1024 x16

1024 x 2 (9:0) (15:0) (1:0)

(a) Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

10.1 www.xilinx.com 255

Page 256: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

The following tables shows address mapping for each port width.

Port Address Mapping for Data

DataWidthPort Data Addresses

1 16384 <-- 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

Libraries Guide

256 www.xilinx.com 10.1

Page 257: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

Libraries Guide

10.1 www.xilinx.com 257

Page 258: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Libraries Guide

258 www.xilinx.com 10.1

Page 259: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 ToINIT_3F

Binary/Hexidecimal

Any All zeros Specifies the initial contents of the data portionof the RAM array.

INIT_A Binary/Hexidecimal

Any All zeros Identifies the initial value of the DOA/DOBoutput port after completing configuration. ForType, the bit width is dependent on the width ofthe A or B port of the RAM.

INIT_B Binary/Hexidecimal

Any All zeros Identifies the initial value of the DOA/DOBoutput port after completing configuration. ForType, the bit width is dependent on the width ofthe A or B port of the RAM.

INITP_00 ToINITP_07

Binary/Hexidecimal

Any All zeros Specifies the initial contents of the parity portionof the RAM array.

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_X_ONLY”

"ALL” Specifies the behavior during simulation in theevent of a data collision (data being read orwritten to the same address from both ports ofthe Ram simultaneously. "ALL" issues a warningto simulator console and generate an X or allunknown data due to the collision. This is therecommended setting. "WARNING" generatesa warning only and "GENERATE_X_ONLY"generates an X for unknown data but won’toutput the occurrence to the simulation console."NONE" completely ignores the error. It issuggested to only change this attribute if youcan ensure the data generated during a collisionis discarded.

SRVAL_A Binary/Hexidecimal

Any All zeros Allows the individual selection of whether theDOA/DOB output port sets (go to a one) or reset(go to a zero) upon the assertion of the RSTApin. For Type, the bit width is dependent on thewidth of the A port of the RAM.

SRVAL_B Binary/Hexidecimal

Any All zeros Allows the individual selection of whether theDOA/DOB output port sets (go to a one) or reset(go to a zero) upon the assertion of the RSTBpin. For Type, the bit width is dependent on thewidth of the B port of the RAM.

Libraries Guide

10.1 www.xilinx.com 259

Page 260: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOB portupon a write command to the respected port.If set to "WRITE_FIRST", the same port that iswritten to displays the contents of the writtendata to the outputs upon completion of theoperation. "READ_FIRST" displays the priorcontents of the RAM to the output port prior towriting the new data. "NO_CHANGE" keepsthe previous value on the output port and won’tupdate the output port upon a write command.This is the suggested mode if not using the readdata from a particular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOB portupon a write command to the respected port.If set to "WRITE_FIRST", the same port that iswritten to displays the contents of the writtendata to the outputs upon completion of theoperation. "READ_FIRST" displays the priorcontents of the RAM to the output port prior towriting the new data. "NO_CHANGE" keepsthe previous value on the output port and won’tupdate the output port upon a write command.This is the suggested mode if not using the readdata from a particular port of the RAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S1_S18: Virtex-II/II-Pro, Spartan-3/3E 16k/1k x 1/16 + 0/2 Parity bits Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S1_S18_inst : RAMB16_S1_S18generic map (INIT_A => "0", -- Value of output RAM registers on Port A at startupINIT_B => X"00000", -- Value of output RAM registers on Port B at startupSRVAL_A => "0", -- Port A ouput value upon SSR assertionSRVAL_B => X"00000", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_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 255INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => 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 511INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

260 www.xilinx.com 10.1

Page 261: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => 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 767INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => 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 1023INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => 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 255INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port B Address 256 to 511INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port B Address 512 to 767INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port B Address 768 to 1023INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 1-bit Data OutputDOB => DOB, -- Port B 16-bit Data OutputDOPB => DOPB, -- Port B 2-bit Parity OutputADDRA => ADDRA, -- Port A 14-bit Address InputADDRB => ADDRB, -- Port B 10-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 1-bit Data InputDIB => DIB, -- Port B 16-bit Data InputDIPB => DIPB, -- Port-B 2-bit parity InputENA => ENA, -- Port A RAM Enable Input

Libraries Guide

10.1 www.xilinx.com 261

Page 262: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ENB => ENB, -- PortB RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S1_S18_inst instantiation

Verilog Instantiation Template// RAMB16_S1_S18: Spartan-3/3E/3A/3AN/3AD 16k/1k x 1/16 + 0/2 Parity bits Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S1_S18 #(.INIT_A(1’b0), // Value of output RAM registers on Port A at startup.INIT_B(18’h00000), // Value of output RAM registers on Port B at startup.SRVAL_A(1’b0), // Port A output value upon SSR assertion.SRVAL_B(18’h00000), // Port B output 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_ONLY", "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(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 4096 to 8191, Port B Address 256 to 511.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 8192 to 12287, Port B Address 512 to 767.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

262 www.xilinx.com 10.1

Page 263: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 12288 to 16383, Port B Address 768 to 1023.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000),

// The next set of INITP_xx are for the parity bits// Port B Address 0 to 255.INITP_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_01(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port B Address 256 to 511.INITP_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_03(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port B Address 512 to 767.INITP_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_05(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port B Address 768 to 1023.INITP_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_07(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S1_S18_inst (.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), // 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_S1_S18_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 263

Page 264: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S1_S2

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 1-bit and 2-bitPorts

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

264 www.xilinx.com 10.1

Page 265: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

10.1 www.xilinx.com 265

Page 266: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

Design ElementDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S1_S2 16384 x1

- (13:0) (0:0) - 8192 x 2 - (12:0) (1:0) -

(a)Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

266 www.xilinx.com 10.1

Page 267: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

The following tables show address mapping for each port width.

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

Libraries Guide

10.1 www.xilinx.com 267

Page 268: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

Libraries Guide

268 www.xilinx.com 10.1

Page 269: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

Libraries Guide

10.1 www.xilinx.com 269

Page 270: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 To INIT_3F Binary/Hexadecimal

Any All zeros Specifies the initial contents of the dataportion of the RAM array.

INIT_A Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INIT_B Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INITP_00 ToINITP_07

Binary/Hexadecimal

Any All zeros Specifies the initial contents of theparity portion of the RAM array.

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_ X_ONLY”

"ALL” Specifies the behavior during simulationin the event of a data collision (databeing read or written to the sameaddress from both ports of the Ramsimultaneously. "ALL" issues a warningto simulator console and generate an Xor all unknown data due to the collision.This is the recommended setting."WARNING" generates a warning onlyand "GENERATE_X_ONLY" generatesan X for unknown data but won’toutput the occurrence to the simulationconsole. "NONE" completely ignoresthe error. It is suggested to only changethis attribute if you can ensure thedata generated during a collision isdiscarded.

SRVAL_A Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTA pin. For Type,the bit width is dependent on the widthof the A port of the RAM.

Libraries Guide

270 www.xilinx.com 10.1

Page 271: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

SRVAL_B Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTB pin. For Type,the bit width is dependent on the widthof the B port of the RAM.

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S1_S2: Virtex-II/II-Pro, Spartan-3/3E 16k/8k x 1/2 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S1_S2_inst : RAMB16_S1_S2generic map (INIT_A => "0", -- Value of output RAM registers on Port A at startupINIT_B => X"0", -- Value of output RAM registers on Port B at startupSRVAL_A => "0", -- Port A ouput value upon SSR assertionSRVAL_B => X"0", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_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 2047INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

10.1 www.xilinx.com 271

Page 272: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 4096 to 8191, Port B Address 2048 to 4095INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",--Port A Address 8192 to 12287, Port B Address 4095 to 6143INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 12288 to 16383, Port B Address 6144 to 8091INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 1-bit Data OutputDOB => DOB, -- Port B 2-bit Data OutputADDRA => ADDRA, -- Port A 14-bit Address InputADDRB => ADDRB, -- Port B 13-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 1-bit Data InputDIB => DIB, -- Port B 2-bit Data InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- PortB RAM Enable Input

Libraries Guide

272 www.xilinx.com 10.1

Page 273: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

SSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S1_S2_inst instantiation

Verilog Instantiation Template// RAMB16_S1_S2: Spartan-3/3E/3A/3AN/3AD 16k/8k x 1/2 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S1_S2 #(.INIT_A(1’b0), // Value of output RAM registers on Port A at startup.INIT_B(2’b00), // Value of output RAM registers on Port B at startup.SRVAL_A(1’b0), // Port A output value upon SSR assertion.SRVAL_B(2’b00), // Port B output 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_ONLY", "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 2047.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 4096 to 8191, Port B Address 2048 to 4095.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 8192 to 12287, Port B Address 4095 to 6143.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

10.1 www.xilinx.com 273

Page 274: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 12288 to 16383, Port B Address 6144 to 8091.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S1_S2_inst (.DOA(DOA), // Port A 1-bit Data Output.DOB(DOB), // Port B 2-bit Data Output.ADDRA(ADDRA), // Port A 14-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 1-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_S1_S2_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

274 www.xilinx.com 10.1

Page 275: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S1_S36

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 1-bit and 36-bitPorts

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

10.1 www.xilinx.com 275

Page 276: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

276 www.xilinx.com 10.1

Page 277: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

ComponentDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S1_S36 16384 x1

- (13:0) (0:0) - 512 x 32 512 x 4 (8:0) (31:0) (3:0)

(a) Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

10.1 www.xilinx.com 277

Page 278: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

The following tables show address mapping for each port width.

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

Libraries Guide

278 www.xilinx.com 10.1

Page 279: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

Libraries Guide

10.1 www.xilinx.com 279

Page 280: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Libraries Guide

280 www.xilinx.com 10.1

Page 281: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 To INIT_3F Binary/Hexadecimal

Any All zeros Specifies the initial contents of the dataportion of the RAM array.

INIT_A Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INIT_B Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INITP_00 ToINITP_07

Binary/Hexadecimal

Any All zeros Specifies the initial contents of theparity portion of the RAM array.

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_ X_ONLY”

"ALL” Specifies the behavior during simulationin the event of a data collision (databeing read or written to the sameaddress from both ports of the Ramsimultaneously. "ALL" issues a warningto simulator console and generate an Xor all unknown data due to the collision.This is the recommended setting."WARNING" generates a warning onlyand "GENERATE_X_ONLY" generatesan X for unknown data but won’toutput the occurrence to the simulationconsole. "NONE" completely ignoresthe error. It is suggested to only changethis attribute if you can ensure thedata generated during a collision isdiscarded.

SRVAL_A Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTA pin. For Type,the bit width is dependent on the widthof the A port of the RAM.

SRVAL_B Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTB pin. For Type,the bit width is dependent on the widthof the B port of the RAM.

Libraries Guide

10.1 www.xilinx.com 281

Page 282: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S1_S36: Virtex-II/II-Pro, Spartan-3/3E 16k/512 x 1/32 + 0/4 Parity bits Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S1_S36_inst : RAMB16_S1_S36generic map (INIT_A => "0", -- Value of output RAM registers on Port A at startupINIT_B => X"000000000", -- Value of output RAM registers on Port B at startupSRVAL_A => "0", -- Port A ouput value upon SSR assertionSRVAL_B => X"000000000", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_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 127INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

282 www.xilinx.com 10.1

Page 283: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 4096 to 8191, Port B Address 128 to 255INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 8192 to 12287, Port B Address 256 to 383INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 12288 to 16383, Port B Address 384 to 512INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => 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 127INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port B Address 128 to 255INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port B Address 256 to 383INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port B Address 384 to 512INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 1-bit Data OutputDOB => DOB, -- Port B 32-bit Data OutputDOPB => DOPB, -- Port B 4-bit Parity OutputADDRA => ADDRA, -- Port A 14-bit Address Input

Libraries Guide

10.1 www.xilinx.com 283

Page 284: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ADDRB => ADDRB, -- Port B 9-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 1-bit Data InputDIB => DIB, -- Port B 32-bit Data InputDIPB => DIPB, -- Port-B 4-bit parity InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- PortB RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S1_S36_inst instantiation

Verilog Instantiation Template// RAMB16_S1_S36: Spartan-3/3E/3A/3AN/3AD 16k/512 x 1/32 + 0/4 Parity bits Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S1_S36 #(.INIT_A(1’b0), // Value of output RAM registers on Port A at startup.INIT_B(36’h000000000), // Value of output RAM registers on Port B at startup.SRVAL_A(1’b0), // Port A output value upon SSR assertion.SRVAL_B(36’h000000000), // Port B output 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_ONLY", "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 127.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 4096 to 8191, Port B Address 128 to 255.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 8192 to 12287, Port B Address 256 to 383.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

284 www.xilinx.com 10.1

Page 285: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 12288 to 16383, Port B Address 384 to 512.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000),

// The next set of INITP_xx are for the parity bits// Port B Address 0 to 127.INITP_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_01(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port B Address 128 to 255.INITP_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_03(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port B Address 256 to 383.INITP_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_05(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port B Address 384 to 512.INITP_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_07(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S1_S36_inst (.DOA(DOA), // Port A 1-bit Data Output.DOB(DOB), // Port B 32-bit Data Output.DOPB(DOPB), // Port B 4-bit Parity Output.ADDRA(ADDRA), // Port A 14-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 1-bit Data Input.DIB(DIB), // Port B 32-bit Data Input.DIPB(DIPB), // Port-B 4-bit parity 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_S1_S36_inst instantiation

For More Information• See the Virtex-II User Guide.• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 285

Page 286: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S1_S4

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 1-bit and 4-bitPorts

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

286 www.xilinx.com 10.1

Page 287: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

10.1 www.xilinx.com 287

Page 288: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

Design ElementDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S1_S4 16384 x1

- (13:0) (0:0) - 4096 x 4 - (11:0) (3:0) -

(a)Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

288 www.xilinx.com 10.1

Page 289: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

The following tables shows address mapping for each port width.

Port Address Mapping for Data

DataWidthPort Data Addresses

1 16384 <-- 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

Libraries Guide

10.1 www.xilinx.com 289

Page 290: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

Libraries Guide

290 www.xilinx.com 10.1

Page 291: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Libraries Guide

10.1 www.xilinx.com 291

Page 292: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 ToINIT_3F

Binary/Hexadecimal

Any All zeros Specifies the initial contents of the data portionof the RAM array.

INIT_A Binary/Hexadecimal

Any All zeros Identifies the initial value of the DOA/DOB outputport after completing configuration. For Type, thebit width is dependent on the width of the A or Bport of the RAM.

INIT_B Binary/Hexadecimal

Any All zeros Identifies the initial value of the DOA/DOB outputport after completing configuration. For Type, thebit width is dependent on the width of the A or Bport of the RAM.

INITP_00 ToINITP_07

Binary/Hexadecimal

Any All zeros Specifies the initial contents of the parity portionof the RAM array.

SIM_COLLISION_ CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_X_ONLY”

"ALL” Specifies the behavior during simulation in theevent of a data collision (data being read orwritten to the same address from both ports ofthe Ram simultaneously. "ALL" issues a warningto simulator console and generate an X or allunknown data due to the collision. This is therecommended setting. "WARNING" generatesa warning only and "GENERATE_X_ONLY"generates an X for unknown data but won’t outputthe occurrence to the simulation console. "NONE"completely ignores the error. It is suggested toonly change this attribute if you can ensure thedata generated during a collision is discarded.

SRVAL_A Binary/Hexadecimal

Any All zeros Allows the individual selection of whether theDOA/DOB output port sets (go to a one) or reset(go to a zero) upon the assertion of the RSTA pin.For Type, the bit width is dependent on the widthof the A port of the RAM.

SRVAL_B Binary/Hexadecimal

Any All zeros Allows the individual selection of whether theDOA/DOB output port sets (go to a one) or reset(go to a zero) upon the assertion of the RSTB pin.For Type, the bit width is dependent on the widthof the B port of the RAM.

Libraries Guide

292 www.xilinx.com 10.1

Page 293: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

WRITE_MODE_AString "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOB port upona write command to the respected port. If setto "WRITE_FIRST", the same port that is writtento displays the contents of the written data tothe outputs upon completion of the operation."READ_FIRST" displays the prior contents of theRAM to the output port prior to writing the newdata. "NO_CHANGE" keeps the previous valueon the output port and won’t update the outputport upon a write command. This is the suggestedmode if not using the read data from a particularport of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOB port upona write command to the respected port. If setto "WRITE_FIRST", the same port that is writtento displays the contents of the written data tothe outputs upon completion of the operation."READ_FIRST" displays the prior contents of theRAM to the output port prior to writing the newdata. "NO_CHANGE" keeps the previous valueon the output port and won’t update the outputport upon a write command. This is the suggestedmode if not using the read data from a particularport of the RAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S1_S4: Virtex-II/II-Pro, Spartan-3/3E 16k/4k x 1/4 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S1_S4_inst : RAMB16_S1_S4generic map (INIT_A => "0", -- Value of output RAM registers on Port A at startupINIT_B => X"0", -- Value of output RAM registers on Port B at startupSRVAL_A => "0", -- Port A ouput value upon SSR assertionSRVAL_B => X"0", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_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 1023INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 4096 to 8191, Port B Address 1024 to 2047INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

10.1 www.xilinx.com 293

Page 294: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 8192 to 12287, Port B Address 2048 to 3071INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 12288 to 16383, Port B Address 3072 to 4095INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 1-bit Data OutputDOB => DOB, -- Port B 4-bit Data OutputADDRA => ADDRA, -- Port A 14-bit Address InputADDRB => ADDRB, -- Port B 12-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 1-bit Data InputDIB => DIB, -- Port B 4-bit Data InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- PortB RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S1_S4_inst instantiation

Libraries Guide

294 www.xilinx.com 10.1

Page 295: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Verilog Instantiation Template// RAMB16_S1_S4: Spartan-3/3E/3A/3AN/3AD 16k/4k x 1/4 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S1_S4 #(.INIT_A(1’b0), // Value of output RAM registers on Port A at startup.INIT_B(4’h0), // Value of output RAM registers on Port B at startup.SRVAL_A(1’b0), // Port A output value upon SSR assertion.SRVAL_B(4’h0), // Port B output 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_ONLY", "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 1023.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 4096 to 8191, Port B Address 1024 to 2047.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 8192 to 12287, Port B Address 2048 to 3071.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 12288 to 16383, Port B Address 3072 to 4095.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

10.1 www.xilinx.com 295

Page 296: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S1_S4_inst (.DOA(DOA), // Port A 1-bit Data Output.DOB(DOB), // Port B 4-bit Data Output.ADDRA(ADDRA), // Port A 14-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 1-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_S1_S4_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

296 www.xilinx.com 10.1

Page 297: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S1_S9

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 1-bit and 9-bitPorts

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

10.1 www.xilinx.com 297

Page 298: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

298 www.xilinx.com 10.1

Page 299: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsEach port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

10.1 www.xilinx.com 299

Page 300: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

The following tables shows address mapping for each port width.

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

Libraries Guide

300 www.xilinx.com 10.1

Page 301: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

Libraries Guide

10.1 www.xilinx.com 301

Page 302: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Libraries Guide

302 www.xilinx.com 10.1

Page 303: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 To INIT_3F Binary/Hexadecimal

Any All zeros Specifies the initial contents of the dataportion of the RAM array.

INIT_A Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INIT_B Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INITP_00 ToINITP_07

Binary/Hexadecimal

Any All zeros Specifies the initial contents of theparity portion of the RAM array.

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_ X_ONLY”

"ALL” Specifies the behavior during simulationin the event of a data collision (databeing read or written to the sameaddress from both ports of the Ramsimultaneously. "ALL" issues a warningto simulator console and generate an Xor all unknown data due to the collision.This is the recommended setting."WARNING" generates a warning onlyand "GENERATE_X_ONLY" generatesan X for unknown data but won’toutput the occurrence to the simulationconsole. "NONE" completely ignoresthe error. It is suggested to only changethis attribute if you can ensure thedata generated during a collision isdiscarded.

SRVAL_A Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTA pin. For Type,the bit width is dependent on the widthof the A port of the RAM.

SRVAL_B Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTB pin. For Type,the bit width is dependent on the widthof the B port of the RAM.

Libraries Guide

10.1 www.xilinx.com 303

Page 304: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S1_S9: Virtex-II/II-Pro, Spartan-3/3E 16k/2k x 1/8 + 0/1 Parity bit Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S1_S9_inst : RAMB16_S1_S9generic map (INIT_A => "0", -- Value of output RAM registers on Port A at startupINIT_B => X"000", -- Value of output RAM registers on Port B at startupSRVAL_A => "0", -- Port A ouput value upon SSR assertionSRVAL_B => X"000", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_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 511INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

304 www.xilinx.com 10.1

Page 305: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_0C => 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 1023INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => 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 1535INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => 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 2047INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => 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 511INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port B Address 512 to 1023INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port B Address 1024 to 1535INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port B Address 1535 to 2047INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 1-bit Data OutputDOB => DOB, -- Port B 8-bit Data OutputDOPB => DOPB, -- Port B 1-bit Parity OutputADDRA => ADDRA, -- Port A 14-bit Address Input

Libraries Guide

10.1 www.xilinx.com 305

Page 306: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ADDRB => ADDRB, -- Port B 11-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 1-bit Data InputDIB => DIB, -- Port B 8-bit Data InputDIPB => DIPB, -- Port-B 1-bit parity InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- PortB RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S1_S9_inst instantiation

Verilog Instantiation Template// RAMB16_S1_S9: Spartan-3/3E/3A/3AN/3AD 16k/2k x 1/8 + 0/1 Parity bit Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S1_S9 #(.INIT_A(1’b0), // Value of output RAM registers on Port A at startup.INIT_B(9’h000), // Value of output RAM registers on Port B at startup.SRVAL_A(1’b0), // Port A output value upon SSR assertion.SRVAL_B(9’h000), // Port B output 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_ONLY", "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(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 4096 to 8191, Port B Address 512 to 1023.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 8192 to 12287, Port B Address 1024 to 1535.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

306 www.xilinx.com 10.1

Page 307: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 12288 to 16383, Port B Address 1535 to 2047.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000),

// The next set of INITP_xx are for the parity bits// Port B Address 0 to 511.INITP_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_01(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port B Address 512 to 1023.INITP_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_03(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port B Address 1024 to 1535.INITP_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_05(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port B Address 1535 to 2047.INITP_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_07(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S1_S9_inst (.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), // 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_S1_S9_inst instantiation

For More Information• See the Virtex-II User Guide.• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 307

Page 308: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S18

Primitive: 16K-bit Data + 2K-bit Parity Memory, Single-Port Synchronous Block RAM with 18-bitPort

IntroductionThis design element is a dedicated random access memory blocks with synchronous write capability. The blockRAM port has 16384 bits of data memory. The cell configuration for this element is listed in the following table.

Data Cells Parity Cells

Depth Width Depth Width Address Bus Data Bus Parity Bus

1024 16 1024 2 (9:0) (15:0) (1:0)

The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, no data is written and theoutputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) is High, DOA and DOPAare set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable (WEA) is High, the memorycontents reflect the data at DIA and DIPA. When ENA is High and WEA is Low, the data stored in the RAMaddress (ADDRA) is read during the Low-to-High clock transition. By default, WRITE_MODE_A=WRITE_FIRST,when ENA and WEA are High, the data on the data inputs (DIA and DIPA) is loaded into the word selected bythe write address (ADDRA) during the Low-to-High clock transition and the data outputs (DOA and DOPA)reflect the selected (addressed) word.

The above description assumes an active High EN, WE, SSR, and CLK. However, the active level can be changedby placing an inverter on the port. Any inverter placed on a RAMB16 port is absorbed into the block anddoes not use a CLB resource.

Logic TableInputs Outputs

GSR EN SSR WE CLK ADDR DI DIP DO DOP RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT INIT No Change No Change

0 0 X X X X X X NoChange

NoChange No Change No Change

0 1 1 0 ↑ X X X SRVAL SRVAL No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL SRVAL RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

308 www.xilinx.com 10.1

Page 309: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR EN SSR WE CLK ADDR DI DIP DO DOP RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata NoChange(a)RAM(addr)(b)data(c)

NoChange(a)RAM(addr)(b)pdata(c)

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset signal

INIT=Value specified by the INIT attribute for data memory. Default is all zeros.

SRVAL=Value after assertion of SSR as specified by the SRVAL attribute.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

(a) WRITE_MODE=NO_CHANGE

(b) WRITE_MODE=READ_FIRST

(c) WRITE_MODE=WRITE_FIRST

InitializationInitializing Memory Contents

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16 is set by 64 initialization attributes (INIT_00 throughINIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

Any INIT_xx or INITP_xx attribute that is not specified is configured as zeros. Partial Strings are paddedwith zeros to the left.

Initializing the Output Register

In Spartan-3A, each bit in the output register can be initialized at power on to either a 0 or 1. In addition, theinitial state specified for power on can be different than the state that results from assertion of a set/reset. Twotypes of properties control initialization of the output register for a single-port RAMB16: INIT and SRVAL. TheINIT attribute specifies the output register value at power on. You can use the SRVAL attribute to define the stateresulting from assertion of the SSR (set/reset) input.

The INIT and SRVAL attributes specify the initialization value as a hexadecimal String containing one bit foreach bit in the output port. For example, for a RAMB16_S1 with port width equal to 1, the output registercontains 1 bit. Therefore, the INIT or SRVAL value can only be specified as a 1 or 0. For RAMB16_S4 with portwidth equal to 4, the output register contains 4 bits. In this case, you can specify a hexadecimal value from 0through F to initialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high orderbit position of the INIT or SRVAL value.

Selecting Write Mode

Libraries Guide

10.1 www.xilinx.com 309

Page 310: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The WRITE_MODE attribute controls RAMB16 memory and output contents. By default, the WRITE_MODE isset to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You can setthe WRITE_MODE to READ_FIRST to read the memory contents, pass the memory contents to the outputs, andthen write the input to memory. Or, you can set the WRITE_MODE to NO_CHANGE to have the input writtento memory without changing the output.

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Binary/Hexadecimal

Any Hex Value All zeros Identifies the initial value of theDO output port after completingconfiguration. The bit width is dependenton the width of the A or B port of theRAM.

INIT_00 - INIT_3F Binary/Hexadecimal

Any Hex Value All zeros Specifies the initial contents of the dataportion of the RAM array.

INITP_00 - INITP_07 Binary/Hexadecimal

Any Hex Value All zeros Specifies the initial contents of the parityportion of the RAM array.

SRVAL Binary/Hexadecimal

Any Hex Value All zeros Allows the individual selection ofwhether the DO output port sets (go toa one) or reset (go to a zero) upon theassertion of the SSR pin. The bit widthis dependent on the width of the A or Bport of the RAM.

WRITE_MODE String "WRITE_FIRST","READ_FIRST"or"NO_CHANGE"

"WRITE_FIRST" Specifies the behavior of the DO portupon a write command to the respectedport. If set to "WRITE_FIRST", thesame port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM to theoutput port prior to writing the new data."NO_CHANGE" keeps the previous valueon the output port and won’t update theoutput port upon a write command. Thisis the suggested mode if not using theread data from a particular port of theRAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

Libraries Guide

310 www.xilinx.com 10.1

Page 311: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

-- RAMB16_S18: Virtex-II/II-Pro, Spartan-3/3E 1k x 16 + 2 Parity bits Single-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S18_inst : RAMB16_S18generic map (INIT => X"00000", -- Value of output RAM registers at startupSRVAL => X"00000", -- Ouput value upon SSR assertionWRITE_MODE => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE-- The following INIT_xx declarations specify the intial contents of the RAM-- Address 0 to 255INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 256 to 511INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 512 to 767INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 768 to 1023INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

10.1 www.xilinx.com 311

Page 312: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_3C => 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-- Address 0 to 255INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 256 to 511INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 512 to 767INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 768 to 1023INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DO => DO, -- 16-bit Data OutputDOP => DOP, -- 2-bit parity OutputADDR => ADDR, -- 10-bit Address InputCLK => CLK, -- ClockDI => DI, -- 16-bit Data InputDIP => DIP, -- 2-bit parity InputEN => EN, -- RAM Enable InputSSR => SSR, -- Synchronous Set/Reset InputWE => WE -- Write Enable Input);

-- End of RAMB16_S18_inst instantiation

Verilog Instantiation Template// RAMB16_S18: Virtex-II/II-Pro, Spartan-3/3E 1k x 16 + 2 Parity bits Single-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S18 #(.INIT(18’h00000), // Value of output RAM registers at startup.SRVAL(18’h000000), // Output value upon SSR assertion.WRITE_MODE("WRITE_FIRST"), // WRITE_FIRST, READ_FIRST or NO_CHANGE

// The following INIT_xx declarations specify the initial contents of the RAM// Address 0 to 255.INIT_00(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_01(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_02(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_03(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_04(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_05(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_06(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_07(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_08(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_09(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_0A(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_0B(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_0C(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_0D(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_0E(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_0F(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),// Address 256 to 511.INIT_10(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_11(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_12(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_13(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_14(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_15(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_16(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_17(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_18(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

Libraries Guide

312 www.xilinx.com 10.1

Page 313: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_19(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_1A(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_1B(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_1C(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_1D(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_1E(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_1F(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),// Address 512 to 767.INIT_20(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_21(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_22(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_23(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_24(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_25(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_26(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_27(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_28(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_29(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_2A(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_2B(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_2C(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_2D(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_2E(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_2F(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),// Address 768 to 1023.INIT_30(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_31(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_32(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_33(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_34(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_35(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_36(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_37(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_38(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_39(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_3A(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_3B(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_3C(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_3D(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_3E(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_3F(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

// The next set of INITP_xx are for the parity bits// Address 0 to 255.INITP_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_01(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 256 to 511.INITP_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_03(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 512 to 767.INITP_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_05(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 768 to 1023.INITP_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_07(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S18_inst (.DO(DO), // 16-bit Data Output.DOP(DOP), // 2-bit parity Output.ADDR(ADDR), // 10-bit Address Input.CLK(CLK), // Clock.DI(DI), // 16-bit Data Input.DIP(DIP), // 2-bit parity Input.EN(EN), // RAM Enable Input.SSR(SSR), // Synchronous Set/Reset Input.WE(WE) // Write Enable Input);

// End of RAMB16_S18_inst instantiation

Libraries Guide

10.1 www.xilinx.com 313

Page 315: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S18_S18

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 18-bit Ports

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Port DescriptionsPort A Port B

Design ElementDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S18_S18 1024 x16

1024 x 2 (9:0) (15:0) (1:0) 1024 x16

1024 x 2 (9:0) (15:0) (1:0)

(a)Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

10.1 www.xilinx.com 315

Page 316: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

The following tables show address mapping for each port width.

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

Libraries Guide

316 www.xilinx.com 10.1

Page 317: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

Libraries Guide

10.1 www.xilinx.com 317

Page 318: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Libraries Guide

318 www.xilinx.com 10.1

Page 319: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 To INIT_3F Binary/Hexadecimal

Any All zeros Specifies the initial contents of the dataportion of the RAM array.

INIT_A Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INIT_B Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INITP_00 ToINITP_07

Binary/Hexadecimal

Any All zeros Specifies the initial contents of theparity portion of the RAM array.

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_ X_ONLY”

"ALL” Specifies the behavior during simulationin the event of a data collision (databeing read or written to the sameaddress from both ports of the Ramsimultaneously. "ALL" issues a warningto simulator console and generate an Xor all unknown data due to the collision.This is the recommended setting."WARNING" generates a warning onlyand "GENERATE_X_ONLY" generatesan X for unknown data but won’toutput the occurrence to the simulationconsole. "NONE" completely ignoresthe error. It is suggested to only changethis attribute if you can ensure thedata generated during a collision isdiscarded.

SRVAL_A Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTA pin. For Type,the bit width is dependent on the widthof the A port of the RAM.

SRVAL_B Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTB pin. For Type,the bit width is dependent on the widthof the B port of the RAM.

Libraries Guide

10.1 www.xilinx.com 319

Page 320: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S18_S18: Virtex-II/II-Pro, Spartan-3/3E 1k x 16 + 2 Parity bits Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S18_S18_inst : RAMB16_S18_S18generic map (INIT_A => X"00000", -- Value of output RAM registers on Port A at startupINIT_B => X"00000", -- Value of output RAM registers on Port B at startupSRVAL_A => X"00000", -- Port A ouput value upon SSR assertionSRVAL_B => X"00000", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_COLLISION_CHECK => "ALL", -- "NONE", "WARNING", "GENERATE_X_ONLY", "ALL"-- The follosing INIT_xx declarations specify the intiial contents of the RAM-- Address 0 to 255INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

320 www.xilinx.com 10.1

Page 321: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 256 to 511INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 512 to 767INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 768 to 1023INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => 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-- Address 0 to 255INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 256 to 511INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 512 to 767INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 768 to 1023INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 16-bit Data OutputDOB => DOB, -- Port B 16-bit Data OutputDOPA => DOPA, -- Port A 2-bit Parity OutputDOPB => DOPB, -- Port B 2-bit Parity Output

Libraries Guide

10.1 www.xilinx.com 321

Page 322: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ADDRA => ADDRA, -- Port A 10-bit Address InputADDRB => ADDRB, -- Port B 10-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 16-bit Data InputDIB => DIB, -- Port B 16-bit Data InputDIPA => DIPA, -- Port A 2-bit parity InputDIPB => DIPB, -- Port-B 2-bit parity InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- PortB RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S18_S18_inst instantiation

Verilog Instantiation Template// RAMB16_S18_S18: Virtex-II/II-Pro, Spartan-3/3E 1k x 16 + 2 Parity bits Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S18_S18 #(.INIT_A(18’h00000), // Value of output RAM registers on Port A at startup.INIT_B(18’h00000), // Value of output RAM registers on Port B at startup.SRVAL_A(18’h00000), // Port A output value upon SSR assertion.SRVAL_B(18’h00000), // Port B output 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_ONLY", "GENERATE_X_ONLY", "ALL"

// The following INIT_xx declarations specify the initial contents of the RAM// Address 0 to 255.INIT_00(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_01(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_02(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_03(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_04(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_05(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_06(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_07(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_08(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_09(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_0A(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_0B(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_0C(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_0D(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_0E(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_0F(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),// Address 256 to 511.INIT_10(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_11(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_12(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_13(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_14(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_15(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_16(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_17(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_18(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_19(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_1A(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_1B(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_1C(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_1D(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_1E(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_1F(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),// Address 512 to 767.INIT_20(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

Libraries Guide

322 www.xilinx.com 10.1

Page 323: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_21(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_22(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_23(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_24(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_25(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_26(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_27(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_28(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_29(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_2A(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_2B(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_2C(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_2D(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_2E(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

.INIT_2F(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),// Address 768 to 1023.INIT_30(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_31(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_32(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_33(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_34(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_35(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_36(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_37(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_38(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_39(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_3A(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_3B(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_3C(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_3D(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_3E(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),.INIT_3F(256’h0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000),

// The next set of INITP_xx are for the parity bits// Address 0 to 255.INITP_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_01(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 256 to 511.INITP_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_03(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 512 to 767.INITP_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_05(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 768 to 1023.INITP_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_07(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S18_S18_inst (.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), // 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_S18_S18_inst instantiation

Libraries Guide

10.1 www.xilinx.com 323

Page 325: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S18_S36

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 18-bit and 36-bitPorts

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

10.1 www.xilinx.com 325

Page 326: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

326 www.xilinx.com 10.1

Page 327: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

Design ElementDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S18_S36 1024 x16

1024 x 2 (9:0) (15:0) (1:0) 512 x 32 512 x 4 (8:0) (31:0) (3:0)

(a)Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

10.1 www.xilinx.com 327

Page 328: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

The following tables shows address mapping for each port width.

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 25 24 23 22 21 2019 18 17 161514 1312 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

Libraries Guide

328 www.xilinx.com 10.1

Page 329: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

Libraries Guide

10.1 www.xilinx.com 329

Page 330: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Libraries Guide

330 www.xilinx.com 10.1

Page 331: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 To INIT_3F Binary/Hexadecimal

Any All zeros Specifies the initial contents of the dataportion of the RAM array.

INIT_A Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INIT_B Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INITP_00 ToINITP_07

Binary/Hexadecimal

Any All zeros Specifies the initial contents of theparity portion of the RAM array.

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_ X_ONLY”

"ALL” Specifies the behavior during simulationin the event of a data collision (databeing read or written to the sameaddress from both ports of the Ramsimultaneously. "ALL" issues a warningto simulator console and generate an Xor all unknown data due to the collision.This is the recommended setting."WARNING" generates a warning onlyand "GENERATE_X_ONLY" generatesan X for unknown data but won’toutput the occurrence to the simulationconsole. "NONE" completely ignoresthe error. It is suggested to only changethis attribute if you can ensure thedata generated during a collision isdiscarded.

SRVAL_A Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTA pin. For Type,the bit width is dependent on the widthof the A port of the RAM.

SRVAL_B Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTB pin. For Type,the bit width is dependent on the widthof the B port of the RAM.

Libraries Guide

10.1 www.xilinx.com 331

Page 332: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S18_S36: Virtex-II/II-Pro, Spartan-3/3E 1k/512 x 16/32 + 2/4 Parity bits Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S18_S36_inst : RAMB16_S18_S36generic map (INIT_A => X"00000", -- Value of output RAM registers on Port A at startupINIT_B => X"000000000", -- Value of output RAM registers on Port B at startupSRVAL_A => X"00000", -- Port A ouput value upon SSR assertionSRVAL_B => X"000000000", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_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 255, Port B Address 0 to 127INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

332 www.xilinx.com 10.1

Page 333: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 256 to 511, Port B Address 128 to 255INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 512 to 767, Port B Address 256 to 383INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 768 to 1023, Port B Address 384 to 511INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => 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 A Address 0 to 255, Port B Address 0 to 127INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 256 to 511, Port B Address 128 to 255INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 512 to 767, Port B Address 256 to 383INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 768 to 1023, Port B Address 384 to 511INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 16-bit Data OutputDOB => DOB, -- Port B 32-bit Data OutputDOPA => DOPA, -- Port A 2-bit Parity OutputDOPB => DOPB, -- Port B 4-bit Parity Output

Libraries Guide

10.1 www.xilinx.com 333

Page 334: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ADDRA => ADDRA, -- Port A 10-bit Address InputADDRB => ADDRB, -- Port B 9-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 16-bit Data InputDIB => DIB, -- Port B 32-bit Data InputDIPA => DIPA, -- Port A 2-bit parity InputDIPB => DIPB, -- Port-B 4-bit parity InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- PortB RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S18_S36_inst instantiation

Verilog Instantiation Template// RAMB16_S18_S36: Virtex-II/II-Pro, Spartan-3/3E 1k/512 x 16/32 + 2/4 Parity bits Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S18_S36 #(.INIT_A(18’h00000), // Value of output RAM registers on Port A at startup.INIT_B(36’h000000000), // Value of output RAM registers on Port B at startup.SRVAL_A(18’h00000), // Port A output value upon SSR assertion.SRVAL_B(36’h000000000), // Port B output 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_ONLY", "GENERATE_X_ONLY", "ALL"

// The following INIT_xx declarations specify the initial contents of the RAM// Port A Address 0 to 255, Port B Address 0 to 127.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 256 to 511, Port B Address 128 to 255.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 512 to 767, Port B Address 256 to 383.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

334 www.xilinx.com 10.1

Page 335: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 768 to 1023, Port B Address 384 to 511.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000),

// The next set of INITP_xx are for the parity bits// Port A Address 0 to 255, Port B Address 0 to 127.INITP_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_01(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 256 to 511, Port B Address 128 to 255.INITP_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_03(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 512 to 767, Port B Address 256 to 383.INITP_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_05(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 768 to 1023, Port B Address 384 to 511.INITP_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_07(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S18_S36_inst (.DOA(DOA), // Port A 16-bit Data Output.DOB(DOB), // Port B 32-bit Data Output.DOPA(DOPA), // Port A 2-bit Parity Output.DOPB(DOPB), // Port B 4-bit Parity Output.ADDRA(ADDRA), // Port A 10-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 16-bit Data Input.DIB(DIB), // Port B 32-bit Data Input.DIPA(DIPA), // Port A 2-bit parity Input.DIPB(DIPB), // Port-B 4-bit parity 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_S18_S36_inst instantiation

Libraries Guide

10.1 www.xilinx.com 335

Page 337: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S2

Primitive: 16K-bit Data and 2K-bit Parity Single-Port Synchronous Block RAM with 2-bit Port

IntroductionThis design element is a dedicated random access memory blocks with synchronous write capability. The blockRAM port has 16384 bits of data memory. The cell configuration for this element is listed in the following table.

Data Cells Parity Cells

Depth Width Depth Width Address Bus Data Bus Parity Bus

8192 2 - - (12:0) (1:0) -

The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, no data is written and theoutputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) is High, DOA and DOPAare set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable (WEA) is High, the memorycontents reflect the data at DIA and DIPA. When ENA is High and WEA is Low, the data stored in the RAMaddress (ADDRA) is read during the Low-to-High clock transition. By default, WRITE_MODE_A=WRITE_FIRST,when ENA and WEA are High, the data on the data inputs (DIA and DIPA) is loaded into the word selected bythe write address (ADDRA) during the Low-to-High clock transition and the data outputs (DOA and DOPA)reflect the selected (addressed) word.

The above description assumes an active High EN, WE, SSR, and CLK. However, the active level can be changedby placing an inverter on the port. Any inverter placed on a RAMB16 port is absorbed into the block anddoes not use a CLB resource.

Logic TableInputs Outputs

GSR EN SSR WE CLK ADDR DI DIP DO DOP RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT INIT No Change No Change

0 0 X X X X X X NoChange

NoChange No Change No Change

0 1 1 0 ↑ X X X SRVAL SRVAL No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL SRVAL RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

10.1 www.xilinx.com 337

Page 338: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR EN SSR WE CLK ADDR DI DIP DO DOP RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata NoChange(a)RAM(addr)(b)data(c)

NoChange(a)RAM(addr)(b)pdata(c)

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset signal

INIT=Value specified by the INIT attribute for data memory. Default is all zeros.

SRVAL=Value after assertion of SSR as specified by the SRVAL attribute.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

(a) WRITE_MODE=NO_CHANGE

(b) WRITE_MODE=READ_FIRST

(c) WRITE_MODE=WRITE_FIRST

InitializationInitializing Memory Contents

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16 is set by 64 initialization attributes (INIT_00 throughINIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

Any INIT_xx or INITP_xx attribute that is not specified is configured as zeros. Partial Strings are paddedwith zeros to the left.

Initializing the Output Register

In Spartan-3A, each bit in the output register can be initialized at power on to either a 0 or 1. In addition, theinitial state specified for power on can be different than the state that results from assertion of a set/reset. Twotypes of properties control initialization of the output register for a single-port RAMB16: INIT and SRVAL. TheINIT attribute specifies the output register value at power on. You can use the SRVAL attribute to define the stateresulting from assertion of the SSR (set/reset) input.

The INIT and SRVAL attributes specify the initialization value as a hexadecimal String containing one bit foreach bit in the output port. For example, for a RAMB16_S1 with port width equal to 1, the output registercontains 1 bit. Therefore, the INIT or SRVAL value can only be specified as a 1 or 0. For RAMB16_S4 with portwidth equal to 4, the output register contains 4 bits. In this case, you can specify a hexadecimal value from 0through F to initialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high orderbit position of the INIT or SRVAL value.

Selecting Write Mode

Libraries Guide

338 www.xilinx.com 10.1

Page 339: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The WRITE_MODE attribute controls RAMB16 memory and output contents. By default, the WRITE_MODE isset to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You can setthe WRITE_MODE to READ_FIRST to read the memory contents, pass the memory contents to the outputs, andthen write the input to memory. Or, you can set the WRITE_MODE to NO_CHANGE to have the input writtento memory without changing the output.

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Binary/Hexadecimal

Any Hex Value All zeros Identifies the initial value of theDO output port after completingconfiguration. The bit width is dependenton the width of the A or B port of theRAM.

INIT_00 - INIT_3F Binary/Hexadecimal

Any Hex Value All zeros Specifies the initial contents of the dataportion of the RAM array.

INITP_00 - INITP_07 Binary/Hexadecimal

Any Hex Value All zeros Specifies the initial contents of the parityportion of the RAM array.

SRVAL Binary/Hexadecimal

Any Hex Value All zeros Allows the individual selection ofwhether the DO output port sets (go toa one) or reset (go to a zero) upon theassertion of the SSR pin. The bit widthis dependent on the width of the A or Bport of the RAM.

WRITE_MODE String "WRITE_FIRST","READ_FIRST"or"NO_CHANGE"

"WRITE_FIRST" Specifies the behavior of the DO portupon a write command to the respectedport. If set to "WRITE_FIRST", thesame port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM to theoutput port prior to writing the new data."NO_CHANGE" keeps the previous valueon the output port and won’t update theoutput port upon a write command. Thisis the suggested mode if not using theread data from a particular port of theRAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S2: Virtex-II/II-Pro, Spartan-3/3E 8k x 2 Single-Port RAM

Libraries Guide

10.1 www.xilinx.com 339

Page 340: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S2_inst : RAMB16_S2generic map (INIT => X"0", -- Value of output RAM registers at startupSRVAL => X"0", -- Ouput value upon SSR assertionWRITE_MODE => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE-- The following INIT_xx declarations specify the initial contents of the RAM-- Address 0 to 2047INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 2048 to 4095INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 4096 to 6143INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 6143 to 8191INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

340 www.xilinx.com 10.1

Page 341: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_3D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DO => DO, -- 2-bit Data OutputADDR => ADDR, -- 13-bit Address InputCLK => CLK, -- ClockDI => DI, -- 2-bit Data InputEN => EN, -- RAM Enable InputSSR => SSR, -- Synchronous Set/Reset InputWE => WE -- Write Enable Input);

-- End of RAMB16_S2_inst instantiation

Verilog Instantiation Template// RAMB16_S2: Spartan-3/3E/3A/3AN/3AD 8k x 2 Single-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S2 #(.INIT(2’b00), // Value of output RAM registers at startup.SRVAL(2’b00), // Output value upon SSR assertion.WRITE_MODE("WRITE_FIRST"), // WRITE_FIRST, READ_FIRST or NO_CHANGE

// The following INIT_xx declarations specify the initial contents of the RAM// Address 0 to 2047.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 2048 to 4095.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 4096 to 6143.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

10.1 www.xilinx.com 341

Page 342: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 6143 to 8191.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S2_inst (.DO(DO), // 2-bit Data Output.ADDR(ADDR), // 13-bit Address Input.CLK(CLK), // Clock.DI(DI), // 2-bit Data Input.EN(EN), // RAM Enable Input.SSR(SSR), // Synchronous Set/Reset Input.WE(WE) // Write Enable Input);

// End of RAMB16_S2_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

342 www.xilinx.com 10.1

Page 343: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S2_S18

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 2-bit and 18-bitPorts

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

10.1 www.xilinx.com 343

Page 344: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

344 www.xilinx.com 10.1

Page 345: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

Design ElementDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S2_S18 8192 x 2 - (12:0) (1:0) - 1024 x16

1024 x 2 (9:0) (15:0) (1:0)

(a)Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

10.1 www.xilinx.com 345

Page 346: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

The following tables shows address mapping for each port width.

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 2524 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

Libraries Guide

346 www.xilinx.com 10.1

Page 347: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

Libraries Guide

10.1 www.xilinx.com 347

Page 348: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Libraries Guide

348 www.xilinx.com 10.1

Page 349: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 To INIT_3F Binary/Hexadecimal

Any All zeros Specifies the initial contents of the dataportion of the RAM array.

INIT_A Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INIT_B Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INITP_00 ToINITP_07

Binary/Hexadecimal

Any All zeros Specifies the initial contents of theparity portion of the RAM array.

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_ X_ONLY”

"ALL” Specifies the behavior during simulationin the event of a data collision (databeing read or written to the sameaddress from both ports of the Ramsimultaneously. "ALL" issues a warningto simulator console and generate an Xor all unknown data due to the collision.This is the recommended setting."WARNING" generates a warning onlyand "GENERATE_X_ONLY" generatesan X for unknown data but won’toutput the occurrence to the simulationconsole. "NONE" completely ignoresthe error. It is suggested to only changethis attribute if you can ensure thedata generated during a collision isdiscarded.

SRVAL_A Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTA pin. For Type,the bit width is dependent on the widthof the A port of the RAM.

SRVAL_B Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTB pin. For Type,the bit width is dependent on the widthof the B port of the RAM.

Libraries Guide

10.1 www.xilinx.com 349

Page 350: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM.

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

350 www.xilinx.com 10.1

Page 351: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S2_S2

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 2-bit Ports

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

10.1 www.xilinx.com 351

Page 352: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

352 www.xilinx.com 10.1

Page 353: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

Design ElementDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S2_S2 8192 x 2 - (12:0) (1:0) - 8192 x 2 - (12:0) (1:0) -

(a)Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

10.1 www.xilinx.com 353

Page 354: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

The following tables shows address mapping for each port width.

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

Libraries Guide

354 www.xilinx.com 10.1

Page 355: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

Libraries Guide

10.1 www.xilinx.com 355

Page 356: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Libraries Guide

356 www.xilinx.com 10.1

Page 357: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 ToINIT_3F

Binary/Hexidecimal

Any All zeros Specifies the initial contents of the data portionof the RAM array.

INIT_A Binary/Hexidecimal

Any All zeros Identifies the initial value of the DOA/DOB outputport after completing configuration. For Type, thebit width is dependent on the width of the A or Bport of the RAM.

INIT_B Binary/Hexidecimal

Any All zeros Identifies the initial value of the DOA/DOB outputport after completing configuration. For Type, thebit width is dependent on the width of the A or Bport of the RAM.

INITP_00 ToINITP_07

Binary/Hexidecimal

Any All zeros Specifies the initial contents of the parity portionof the RAM array.

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_X_ONLY”

"ALL” Specifies the behavior during simulation in theevent of a data collision (data being read orwritten to the same address from both ports ofthe Ram simultaneously. "ALL" issues a warningto simulator console and generate an X or allunknown data due to the collision. This is therecommended setting. "WARNING" generatesa warning only and "GENERATE_X_ONLY"generates an X for unknown data but won’t outputthe occurrence to the simulation console. "NONE"completely ignores the error. It is suggested toonly change this attribute if you can ensure thedata generated during a collision is discarded.

SRVAL_A Binary/Hexidecimal

Any All zeros Allows the individual selection of whether theDOA/DOB output port sets (go to a one) or reset(go to a zero) upon the assertion of the RSTA pin.For Type, the bit width is dependent on the widthof the A port of the RAM.

SRVAL_B Binary/Hexidecimal

Any All zeros Allows the individual selection of whether theDOA/DOB output port sets (go to a one) or reset(go to a zero) upon the assertion of the RSTB pin.For Type, the bit width is dependent on the widthof the B port of the RAM.

Libraries Guide

10.1 www.xilinx.com 357

Page 358: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

WRITE_MODE_AString "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOB port upona write command to the respected port. If setto "WRITE_FIRST", the same port that is writtento displays the contents of the written data tothe outputs upon completion of the operation."READ_FIRST" displays the prior contents of theRAM to the output port prior to writing the newdata. "NO_CHANGE" keeps the previous valueon the output port and won’t update the outputport upon a write command. This is the suggestedmode if not using the read data from a particularport of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOB port upona write command to the respected port. If setto "WRITE_FIRST", the same port that is writtento displays the contents of the written data tothe outputs upon completion of the operation."READ_FIRST" displays the prior contents of theRAM to the output port prior to writing the newdata. "NO_CHANGE" keeps the previous valueon the output port and won’t update the outputport upon a write command. This is the suggestedmode if not using the read data from a particularport of the RAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S2_S2: Virtex-II/II-Pro, Spartan-3/3E 8k x 2 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S2_S2_inst : RAMB16_S2_S2generic map (INIT_A => X"0", -- Value of output RAM registers on Port A at startupINIT_B => X"0", -- Value of output RAM registers on Port B at startupSRVAL_A => X"0", -- Port A ouput value upon SSR assertionSRVAL_B => X"0", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_COLLISION_CHECK => "ALL", -- "NONE", "WARNING", "GENERATE_X_ONLY", "ALL"-- The following INIT_xx declarations specify the initial contents of the RAM-- Address 0 to 2047INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 2048 to 4095INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

358 www.xilinx.com 10.1

Page 359: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 4096 to 6143INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 6143 to 8191INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 2-bit Data OutputDOB => DOB, -- Port B 2-bit Data OutputADDRA => ADDRA, -- Port A 13-bit Address InputADDRB => ADDRB, -- Port B 13-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 2-bit Data InputDIB => DIB, -- Port B 2-bit Data InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- Port B RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S2_S2_inst instantiation

Libraries Guide

10.1 www.xilinx.com 359

Page 360: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Verilog Instantiation Template// RAMB16_S2_S2: Spartan-3/3E/3A/3AN/3AD 8k x 2 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S2_S2 #(.INIT_A(2’b00), // Value of output RAM registers on Port A at startup.INIT_B(2’b00), // Value of output RAM registers on Port B at startup.SRVAL_A(2’b00), // Port A output value upon SSR assertion.SRVAL_B(2’b00), // Port B output 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_ONLY", "GENERATE_X_ONLY", "ALL"

// Address 0 to 2047.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 2048 to 4095.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 4096 to 6143.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 6143 to 8191.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

360 www.xilinx.com 10.1

Page 361: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S2_S2_inst (.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

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 361

Page 362: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S2_S36

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 2-bit and 36-bitPorts

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

362 www.xilinx.com 10.1

Page 363: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

10.1 www.xilinx.com 363

Page 364: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

Design ElementDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S2_S36 8192 x 2 - (12:0) (1:0) - 512 x 32 512 x 4 (8:0) (31:0) (3:0)

(a)Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

364 www.xilinx.com 10.1

Page 365: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

The following tables shows address mapping for each port width.

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 2524 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Libraries Guide

10.1 www.xilinx.com 365

Page 366: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

Libraries Guide

366 www.xilinx.com 10.1

Page 367: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

Libraries Guide

10.1 www.xilinx.com 367

Page 368: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 To INIT_3F Binary/Hexadecimal

Any All zeros Specifies the initial contents of the dataportion of the RAM array.

INIT_A Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INIT_B Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INITP_00 ToINITP_07

Binary/Hexadecimal

Any All zeros Specifies the initial contents of theparity portion of the RAM array.

Libraries Guide

368 www.xilinx.com 10.1

Page 369: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_ X_ONLY”

"ALL” Specifies the behavior during simulationin the event of a data collision (databeing read or written to the sameaddress from both ports of the Ramsimultaneously. "ALL" issues a warningto simulator console and generate an Xor all unknown data due to the collision.This is the recommended setting."WARNING" generates a warning onlyand "GENERATE_X_ONLY" generatesan X for unknown data but won’toutput the occurrence to the simulationconsole. "NONE" completely ignoresthe error. It is suggested to only changethis attribute if you can ensure thedata generated during a collision isdiscarded.

SRVAL_A Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTA pin. For Type,the bit width is dependent on the widthof the A port of the RAM.

SRVAL_B Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTB pin. For Type,the bit width is dependent on the widthof the B port of the RAM.

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM.

Libraries Guide

10.1 www.xilinx.com 369

Page 370: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S2_S36: Virtex-II/II-Pro, Spartan-3/3E 8k/512 x 2/32 + 0/4 Parity bits Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S2_S36_inst : RAMB16_S2_S36generic map (INIT_A => X"0", -- Value of output RAM registers on Port A at startupINIT_B => X"000000000", -- Value of output RAM registers on Port B at startupSRVAL_A => X"0", -- Port A ouput value upon SSR assertionSRVAL_B => X"000000000", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_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 2047, Port B Address 0 to 127INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 2048 to 4095, Port B Address 128 to 255INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 4096 to 6143, Port B Address 256 to 383INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 6144 to 8191, Port B Address 384 to 511INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

370 www.xilinx.com 10.1

Page 371: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => 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 127INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port B Address 128 to 255INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port B Address 256 to 383INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port B Address 384 to 511INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 2-bit Data OutputDOB => DOB, -- Port B 32-bit Data OutputDOPB => DOPB, -- Port B 4-bit Parity OutputADDRA => ADDRA, -- Port A 13-bit Address InputADDRB => ADDRB, -- Port B 9-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 2-bit Data InputDIB => DIB, -- Port B 32-bit Data InputDIPB => DIPB, -- Port-B 4-bit parity InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- PortB RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S2_S36_inst instantiation

Verilog Instantiation Template// RAMB16_S2_S36: Spartan-3/3E/3A/3AN/3AD 8k/512 x 2/32 + 0/4 Parity bits Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S2_S36 #(.INIT_A(2’b00), // Value of output RAM registers on Port A at startup.INIT_B(36’h000000000), // Value of output RAM registers on Port B at startup.SRVAL_A(2’b00), // Port A output value upon SSR assertion.SRVAL_B(36’h000000000), // Port B output 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_ONLY", "GENERATE_X_ONLY", "ALL"

// The following INIT_xx declarations specify the initial contents of the RAM// Port A Address 0 to 2047, Port B Address 0 to 127.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

10.1 www.xilinx.com 371

Page 372: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 2048 to 4095, Port B Address 128 to 255.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 4096 to 6143, Port B Address 256 to 383.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 6144 to 8191, Port B Address 384 to 511.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000),

// The next set of INITP_xx are for the parity bits// Port B Address 0 to 127.INITP_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_01(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port B Address 128 to 255.INITP_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_03(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port B Address 256 to 383.INITP_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_05(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

372 www.xilinx.com 10.1

Page 373: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

// Port B Address 384 to 511.INITP_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_07(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S2_S36_inst (.DOA(DOA), // Port A 2-bit Data Output.DOB(DOB), // Port B 32-bit Data Output.DOPB(DOPB), // Port B 4-bit Parity Output.ADDRA(ADDRA), // Port A 13-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 2-bit Data Input.DIB(DIB), // Port B 32-bit Data Input.DIPB(DIPB), // Port-B 4-bit parity 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_S36_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 373

Page 374: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S2_S4

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 2-bit and 4-bitPorts

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

374 www.xilinx.com 10.1

Page 375: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

10.1 www.xilinx.com 375

Page 376: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

Design Element

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S2_S4 8192 x 2 - (12:0) (1:0) - 4096 x 4 - (11:0) (3:0) -

(a) Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

376 www.xilinx.com 10.1

Page 377: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

The following tables shows address mapping for each port width.

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 2524 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Libraries Guide

10.1 www.xilinx.com 377

Page 378: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

Libraries Guide

378 www.xilinx.com 10.1

Page 379: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

Libraries Guide

10.1 www.xilinx.com 379

Page 380: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 To INIT_3F Binary/Hexidecimal

Any All zeros Specifies the initial contents of the data portionof the RAM array.

INIT_A Binary/Hexidecimal

Any All zeros Identifies the initial value of the DOA/DOBoutput port after completing configuration. ForType, the bit width is dependent on the widthof the A or B port of the RAM.

INIT_B Binary/Hexidecimal

Any All zeros Identifies the initial value of the DOA/DOBoutput port after completing configuration. ForType, the bit width is dependent on the widthof the A or B port of the RAM.

INITP_00 ToINITP_07

Binary/Hexidecimal

Any All zeros Specifies the initial contents of the parityportion of the RAM array.

Libraries Guide

380 www.xilinx.com 10.1

Page 381: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_X_ONLY”

"ALL” Specifies the behavior during simulation inthe event of a data collision (data being reador written to the same address from bothports of the Ram simultaneously. "ALL"issues a warning to simulator console andgenerate an X or all unknown data due to thecollision. This is the recommended setting."WARNING" generates a warning only and"GENERATE_X_ONLY" generates an X forunknown data but won’t output the occurrenceto the simulation console. "NONE" completelyignores the error. It is suggested to onlychange this attribute if you can ensure the datagenerated during a collision is discarded.

SRVAL_A Binary/Hexidecimal

Any All zeros Allows the individual selection of whether theDOA/DOB output port sets (go to a one) orreset (go to a zero) upon the assertion of theRSTA pin. For Type, the bit width is dependenton the width of the A port of the RAM.

SRVAL_B Binary/Hexidecimal

Any All zeros Allows the individual selection of whether theDOA/DOB output port sets (go to a one) orreset (go to a zero) upon the assertion of theRSTB pin. For Type, the bit width is dependenton the width of the B port of the RAM.

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOB portupon a write command to the respected port.If set to "WRITE_FIRST", the same port that iswritten to displays the contents of the writtendata to the outputs upon completion of theoperation. "READ_FIRST" displays the priorcontents of the RAM to the output port prior towriting the new data. "NO_CHANGE" keepsthe previous value on the output port and won’tupdate the output port upon a write command.This is the suggested mode if not using the readdata from a particular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOB portupon a write command to the respected port.If set to "WRITE_FIRST", the same port that iswritten to displays the contents of the writtendata to the outputs upon completion of theoperation. "READ_FIRST" displays the priorcontents of the RAM to the output port prior towriting the new data. "NO_CHANGE" keepsthe previous value on the output port and won’tupdate the output port upon a write command.This is the suggested mode if not using the readdata from a particular port of the RAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S2_S4: Virtex-II/II-Pro, Spartan-3/3E 8k/4k x 2/4 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S2_S4_inst : RAMB16_S2_S4

Libraries Guide

10.1 www.xilinx.com 381

Page 382: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

generic map (INIT_A => X"0", -- Value of output RAM registers on Port A at startupINIT_B => X"0", -- Value of output RAM registers on Port B at startupSRVAL_A => X"0", -- Port A ouput value upon SSR assertionSRVAL_B => X"0", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_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 2047, Port B Address 0 to 1023INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 2048 to 4095, Port B Address 1024 to 2047INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 4096 to 6143, Port B Address 2048 to 3071INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 6144 to 8191, Port B Address 3072 to 4095INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

382 www.xilinx.com 10.1

Page 383: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_3C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 2-bit Data OutputDOB => DOB, -- Port B 4-bit Data OutputADDRA => ADDRA, -- Port A 13-bit Address InputADDRB => ADDRB, -- Port B 12-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 2-bit Data InputDIB => DIB, -- Port B 4-bit Data InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- Port B RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S2_S4_inst instantiation

Verilog Instantiation Template// RAMB16_S2_S4: Spartan-3/3E/3A/3AN/3AD 8k/4k x 2/4 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S2_S4 #(.INIT_A(2’b00), // Value of output RAM registers on Port A at startup.INIT_B(4’h0), // Value of output RAM registers on Port B at startup.SRVAL_A(2’b00), // Port A output value upon SSR assertion.SRVAL_B(4’h0), // Port B output 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_ONLY", "GENERATE_X_ONLY", "ALL"

// The following INIT_xx declarations specify the initial contents of the RAM// Port A Address 0 to 2047, Port B Address 0 to 1023.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 2048 to 4095, Port B Address 1024 to 2047.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

10.1 www.xilinx.com 383

Page 384: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 4096 to 6143, Port B Address 2048 to 3071.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 6144 to 8191, Port B Address 3072 to 4095.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S2_S4_inst (.DOA(DOA), // Port A 2-bit Data Output.DOB(DOB), // Port B 4-bit Data Output.ADDRA(ADDRA), // Port A 13-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 2-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_S2_S4_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

384 www.xilinx.com 10.1

Page 385: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S2_S9

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 2-bit and 9-bitPorts

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

10.1 www.xilinx.com 385

Page 386: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

386 www.xilinx.com 10.1

Page 387: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

Design ElementDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S2_S9 8192 x 2 - (12:0) (1:0) - 2048 x 8 2048 x 1 (10:0) (7:0) (0:0)

(a)Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

10.1 www.xilinx.com 387

Page 388: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

The following tables shows address mapping for each port width.

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Libraries Guide

388 www.xilinx.com 10.1

Page 389: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

Libraries Guide

10.1 www.xilinx.com 389

Page 390: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

Libraries Guide

390 www.xilinx.com 10.1

Page 391: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 ToINIT_3F

Binary/Hexidecimal

Any All zeros Specifies the initial contents of the data portionof the RAM array.

INIT_A Binary/Hexidecimal

Any All zeros Identifies the initial value of the DOA/DOB outputport after completing configuration. For Type, thebit width is dependent on the width of the A or Bport of the RAM.

INIT_B Binary/Hexidecimal

Any All zeros Identifies the initial value of the DOA/DOB outputport after completing configuration. For Type, thebit width is dependent on the width of the A or Bport of the RAM.

INITP_00 ToINITP_07

Binary/Hexidecimal

Any All zeros Specifies the initial contents of the parity portionof the RAM array.

Libraries Guide

10.1 www.xilinx.com 391

Page 392: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_X_ONLY”

"ALL” Specifies the behavior during simulation in theevent of a data collision (data being read orwritten to the same address from both ports ofthe Ram simultaneously. "ALL" issues a warningto simulator console and generate an X or allunknown data due to the collision. This is therecommended setting. "WARNING" generatesa warning only and "GENERATE_X_ONLY"generates an X for unknown data but won’t outputthe occurrence to the simulation console. "NONE"completely ignores the error. It is suggested toonly change this attribute if you can ensure thedata generated during a collision is discarded.

SRVAL_A Binary/Hexidecimal

Any All zeros Allows the individual selection of whether theDOA/DOB output port sets (go to a one) or reset(go to a zero) upon the assertion of the RSTA pin.For Type, the bit width is dependent on the widthof the A port of the RAM.

SRVAL_B Binary/Hexidecimal

Any All zeros Allows the individual selection of whether theDOA/DOB output port sets (go to a one) or reset(go to a zero) upon the assertion of the RSTB pin.For Type, the bit width is dependent on the widthof the B port of the RAM.

WRITE_MODE_AString "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOB port upona write command to the respected port. If setto "WRITE_FIRST", the same port that is writtento displays the contents of the written data tothe outputs upon completion of the operation."READ_FIRST" displays the prior contents of theRAM to the output port prior to writing the newdata. "NO_CHANGE" keeps the previous valueon the output port and won’t update the outputport upon a write command. This is the suggestedmode if not using the read data from a particularport of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOB port upona write command to the respected port. If setto "WRITE_FIRST", the same port that is writtento displays the contents of the written data tothe outputs upon completion of the operation."READ_FIRST" displays the prior contents of theRAM to the output port prior to writing the newdata. "NO_CHANGE" keeps the previous valueon the output port and won’t update the outputport upon a write command. This is the suggestedmode if not using the read data from a particularport of the RAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S2_S9: Virtex-II/II-Pro, Spartan-3/3E 8k/2k x 2/8 + 0/1 Parity bit Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S2_S9_inst : RAMB16_S2_S9generic map (

Libraries Guide

392 www.xilinx.com 10.1

Page 393: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_A => X"0", -- Value of output RAM registers on Port A at startupINIT_B => X"000", -- Value of output RAM registers on Port B at startupSRVAL_A => X"0", -- Port A ouput value upon SSR assertionSRVAL_B => X"000", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_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 2047, Port B Address 0 to 511INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 2048 to 4095, Port B Address 512 to 1023INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 4096 to 6143, Port B Address 1024 to 1535INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 6144 to 8191, Port B Address 1536 to 2047INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

10.1 www.xilinx.com 393

Page 394: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

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 511INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port B Address 512 to 1023INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port B Address 1024 to 1535INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 6144 to 8191, Port B Address 1536 to 2047INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 2-bit Data OutputDOB => DOB, -- Port B 8-bit Data OutputDOPB => DOPB, -- Port B 1-bit Parity OutputADDRA => ADDRA, -- Port A 13-bit Address InputADDRB => ADDRB, -- Port B 11-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 2-bit Data InputDIB => DIB, -- Port B 8-bit Data InputDIPB => DIPB, -- Port-B 1-bit parity InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- Port B RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S2_S9_inst instantiation

Verilog Instantiation Template// RAMB16_S2_S9: Spartan-3/3E/3A/3AN/3AD 8k/2k x 2/8 + 0/1 Parity bit Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S2_S9 #(.INIT_A(2’b00), // Value of output RAM registers on Port A at startup.INIT_B(9’h000), // Value of output RAM registers on Port B at startup.SRVAL_A(2’b00), // Port A output value upon SSR assertion.SRVAL_B(9’h000), // Port B output 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_ONLY", "GENERATE_X_ONLY", "ALL"

// The following INIT_xx declarations specify the initial contents of the RAM// Port A Address 0 to 2047, Port B Address 0 to 511.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

394 www.xilinx.com 10.1

Page 395: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

// Port A Address 2048 to 4095, Port B Address 512 to 1023.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 4096 to 6143, Port B Address 1024 to 1535.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 6144 to 8191, Port B Address 1536 to 2047.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000),

// The next set of INITP_xx are for the parity bits// Port B Address 0 to 511.INITP_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_01(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port B Address 512 to 1023.INITP_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_03(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port B Address 1024 to 1535.INITP_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_05(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 6144 to 8191, Port B Address 1536 to 2047.INITP_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_07(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S2_S9_inst (.DOA(DOA), // Port A 2-bit Data Output.DOB(DOB), // Port B 8-bit Data Output.DOPB(DOPB), // Port B 1-bit Parity Output.ADDRA(ADDRA), // Port A 13-bit Address Input.ADDRB(ADDRB), // Port B 11-bit Address Input.CLKA(CLKA), // Port A Clock.CLKB(CLKB), // Port B Clock

Libraries Guide

10.1 www.xilinx.com 395

Page 396: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.DIA(DIA), // Port A 2-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), // 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_S9_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

396 www.xilinx.com 10.1

Page 397: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S36

Primitive: 16K-bit Data and 2K-bit Parity Single-Port Synchronous Block RAM with 36-bit Port

IntroductionThis design element is a dedicated random access memory blocks with synchronous write capability. The blockRAM port has 16384 bits of data memory. The cell configuration for this element is listed in the following table.

Data Cells Parity Cells

Depth Width Depth Width Address Bus Data Bus Parity Bus

512 32 512 4 (8:0) (31:0) (3:0)

The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, no data is written and theoutputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) is High, DOA and DOPAare set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable (WEA) is High, the memorycontents reflect the data at DIA and DIPA. When ENA is High and WEA is Low, the data stored in the RAMaddress (ADDRA) is read during the Low-to-High clock transition. By default, WRITE_MODE_A=WRITE_FIRST,when ENA and WEA are High, the data on the data inputs (DIA and DIPA) is loaded into the word selected bythe write address (ADDRA) during the Low-to-High clock transition and the data outputs (DOA and DOPA)reflect the selected (addressed) word.

The above description assumes an active High EN, WE, SSR, and CLK. However, the active level can be changedby placing an inverter on the port. Any inverter placed on a RAMB16 port is absorbed into the block anddoes not use a CLB resource.

Logic TableInputs Outputs

GSR EN SSR WE CLK ADDR DI DIP DO DOP RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT INIT No Change No Change

0 0 X X X X X X NoChange

NoChange No Change No Change

0 1 1 0 ↑ X X X SRVAL SRVAL No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL SRVAL RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

10.1 www.xilinx.com 397

Page 398: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR EN SSR WE CLK ADDR DI DIP DO DOP RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata NoChange(a)RAM(addr)(b)data(c)

NoChange(a)RAM(addr)(b)pdata(c)

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset signal

INIT=Value specified by the INIT attribute for data memory. Default is all zeros.

SRVAL=Value after assertion of SSR as specified by the SRVAL attribute.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

(a) WRITE_MODE=NO_CHANGE

(b) WRITE_MODE=READ_FIRST

(c) WRITE_MODE=WRITE_FIRST

InitializationInitializing Memory Contents

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16 is set by 64 initialization attributes (INIT_00 throughINIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

Any INIT_xx or INITP_xx attribute that is not specified is configured as zeros. Partial Strings are paddedwith zeros to the left.

Initializing the Output Register

In Spartan-3A, each bit in the output register can be initialized at power on to either a 0 or 1. In addition, theinitial state specified for power on can be different than the state that results from assertion of a set/reset. Twotypes of properties control initialization of the output register for a single-port RAMB16: INIT and SRVAL. TheINIT attribute specifies the output register value at power on. You can use the SRVAL attribute to define the stateresulting from assertion of the SSR (set/reset) input.

The INIT and SRVAL attributes specify the initialization value as a hexadecimal String containing one bit foreach bit in the output port. For example, for a RAMB16_S1 with port width equal to 1, the output registercontains 1 bit. Therefore, the INIT or SRVAL value can only be specified as a 1 or 0. For RAMB16_S4 with portwidth equal to 4, the output register contains 4 bits. In this case, you can specify a hexadecimal value from 0through F to initialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high orderbit position of the INIT or SRVAL value.

Selecting Write Mode

Libraries Guide

398 www.xilinx.com 10.1

Page 399: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The WRITE_MODE attribute controls RAMB16 memory and output contents. By default, the WRITE_MODE isset to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You can setthe WRITE_MODE to READ_FIRST to read the memory contents, pass the memory contents to the outputs, andthen write the input to memory. Or, you can set the WRITE_MODE to NO_CHANGE to have the input writtento memory without changing the output.

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Binary/Hexadecimal

Any Hex Value All zeros Identifies the initial value of theDO output port after completingconfiguration. The bit width is dependenton the width of the A or B port of theRAM.

INIT_00 - INIT_3F Binary/Hexadecimal

Any Hex Value All zeros Specifies the initial contents of the dataportion of the RAM array.

INITP_00 - INITP_07 Binary/Hexadecimal

Any Hex Value All zeros Specifies the initial contents of the parityportion of the RAM array.

SRVAL Binary/Hexadecimal

Any Hex Value All zeros Allows the individual selection ofwhether the DO output port sets (go toa one) or reset (go to a zero) upon theassertion of the SSR pin. The bit widthis dependent on the width of the A or Bport of the RAM.

WRITE_MODE String "WRITE_FIRST","READ_FIRST"or"NO_CHANGE"

"WRITE_FIRST" Specifies the behavior of the DO portupon a write command to the respectedport. If set to "WRITE_FIRST", thesame port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM to theoutput port prior to writing the new data."NO_CHANGE" keeps the previous valueon the output port and won’t update theoutput port upon a write command. Thisis the suggested mode if not using theread data from a particular port of theRAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S36: Virtex-II/II-Pro, Spartan-3/3E 512 x 32 + 4 Parity bits Single-Port RAM

Libraries Guide

10.1 www.xilinx.com 399

Page 400: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S36_inst : RAMB16_S36generic map (INIT => X"000000000", -- Value of output RAM registers at startupSRVAL => X"000000000", -- Ouput value upon SSR assertionWRITE_MODE => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE-- The following INIT_xx declarations specify the initial contents of the RAM-- Address 0 to 127INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 128 to 255INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 256 to 383INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 384 to 511INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

400 www.xilinx.com 10.1

Page 401: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_3D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000",-- The next set of INITP_xx are for the parity bits-- Address 0 to 127INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 128 to 255INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 256 to 383INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 384 to 511INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DO => DO, -- 32-bit Data OutputDOP => DOP, -- 4-bit parity OutputADDR => ADDR, -- 9-bit Address InputCLK => CLK, -- ClockDI => DI, -- 32-bit Data InputDIP => DIP, -- 4-bit parity InputEN => EN, -- RAM Enable InputSSR => SSR, -- Synchronous Set/Reset InputWE => WE -- Write Enable Input);

-- End of RAMB16_S36_inst instantiation

Verilog Instantiation Template// RAMB16_S36: Virtex-II/II-Pro, Spartan-3/3E 512 x 32 + 4 Parity bits Single-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S36 #(.INIT(36’h000000000), // Value of output RAM registers at startup.SRVAL(36’h000000000), // Output value upon SSR assertion.WRITE_MODE("WRITE_FIRST"), // WRITE_FIRST, READ_FIRST or NO_CHANGE

// The following INIT_xx declarations specify the initial contents of the RAM// Address 0 to 127.INIT_00(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_01(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_02(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_03(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_04(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_05(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_06(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_07(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_08(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_09(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_0A(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_0B(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_0C(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_0D(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_0E(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_0F(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),// Address 128 to 255.INIT_10(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_11(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_12(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_13(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_14(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_15(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_16(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_17(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_18(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_19(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_1A(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_1B(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

Libraries Guide

10.1 www.xilinx.com 401

Page 402: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_1C(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

.INIT_1D(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

.INIT_1E(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

.INIT_1F(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),// Address 256 to 383.INIT_20(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_21(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_22(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_23(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_24(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_25(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_26(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_27(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_28(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_29(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_2A(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_2B(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_2C(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_2D(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_2E(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_2F(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),// Address 384 to 511.INIT_30(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_31(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_32(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_33(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_34(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_35(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_36(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_37(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_38(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_39(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_3A(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_3B(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_3C(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_3D(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_3E(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_3F(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

// The next set of INITP_xx are for the parity bits// Address 0 to 127.INITP_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_01(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 128 to 255.INITP_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_03(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 256 to 383.INITP_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_05(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 384 to 511.INITP_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_07(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S36_inst (.DO(DO), // 32-bit Data Output.DOP(DOP), // 4-bit parity Output.ADDR(ADDR), // 9-bit Address Input.CLK(CLK), // Clock.DI(DI), // 32-bit Data Input.DIP(DIP), // 4-bit parity Input.EN(EN), // RAM Enable Input.SSR(SSR), // Synchronous Set/Reset Input.WE(WE) // Write Enable Input);

// End of RAMB16_S36_inst instantiation

For More Information• See the Virtex-II User Guide.

Libraries Guide

402 www.xilinx.com 10.1

Page 403: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 403

Page 404: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S36_S36

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with Two 36-bit Ports

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

404 www.xilinx.com 10.1

Page 405: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

10.1 www.xilinx.com 405

Page 406: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

Design ElementDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S36_S36 512 x 32 512 x 4 (8:0) (31:0) (3:0) 512 x 32 512 x 4 (8:0) (31:0) (3:0)

(a)Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

406 www.xilinx.com 10.1

Page 407: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

Libraries Guide

10.1 www.xilinx.com 407

Page 408: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

Libraries Guide

408 www.xilinx.com 10.1

Page 409: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Libraries Guide

10.1 www.xilinx.com 409

Page 410: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 To INIT_3F Binary/Hexadecimal

Any All zeros Specifies the initial contents of the dataportion of the RAM array.

INIT_A Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INIT_B Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INITP_00 ToINITP_07

Binary/Hexadecimal

Any All zeros Specifies the initial contents of theparity portion of the RAM array.

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_ X_ONLY”

"ALL” Specifies the behavior during simulationin the event of a data collision (databeing read or written to the sameaddress from both ports of the Ramsimultaneously. "ALL" issues a warningto simulator console and generate an Xor all unknown data due to the collision.This is the recommended setting."WARNING" generates a warning onlyand "GENERATE_X_ONLY" generatesan X for unknown data but won’toutput the occurrence to the simulationconsole. "NONE" completely ignoresthe error. It is suggested to only changethis attribute if you can ensure thedata generated during a collision isdiscarded.

SRVAL_A Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTA pin. For Type,the bit width is dependent on the widthof the A port of the RAM.

SRVAL_B Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTB pin. For Type,the bit width is dependent on the widthof the B port of the RAM.

Libraries Guide

410 www.xilinx.com 10.1

Page 411: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S36_S36: Virtex-II/II-Pro, Spartan-3/3E 512 x 32 + 4 Parity bits Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S36_S36_inst : RAMB16_S36_S36generic map (INIT_A => X"000000000", -- Value of output RAM registers on Port A at startupINIT_B => X"000000000", -- Value of output RAM registers on Port B at startupSRVAL_A => X"000000000", -- Port A ouput value upon SSR assertionSRVAL_B => X"000000000", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_COLLISION_CHECK => "ALL", -- "NONE", "WARNING", "GENERATE_X_ONLY", "ALL"-- The following INIT_xx declarations specify the initial contents of the RAM-- Address 0 to 127INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

10.1 www.xilinx.com 411

Page 412: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 128 to 255INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 256 to 383INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 384 to 511INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => 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-- Address 0 to 127INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 128 to 255INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 256 to 383INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 384 to 511INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 32-bit Data OutputDOB => DOB, -- Port B 32-bit Data OutputDOPA => DOPA, -- Port A 4-bit Parity OutputDOPB => DOPB, -- Port B 4-bit Parity Output

Libraries Guide

412 www.xilinx.com 10.1

Page 413: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ADDRA => ADDRA, -- Port A 9-bit Address InputADDRB => ADDRB, -- Port B 9-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 32-bit Data InputDIB => DIB, -- Port B 32-bit Data InputDIPA => DIPA, -- Port A 4-bit parity InputDIPB => DIPB, -- Port-B 4-bit parity InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- PortB RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S36_S36_inst instantiation

Verilog Instantiation Template// RAMB16_S36_S36: Virtex-II/II-Pro, Spartan-3/3E 512 x 32 + 4 Parity bits Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S36_S36 #(.INIT_A(36’h000000000), // Value of output RAM registers on Port A at startup.INIT_B(36’h000000000), // Value of output RAM registers on Port B at startup.SRVAL_A(36’h000000000), // Port A output value upon SSR assertion.SRVAL_B(36’h000000000), // Port B output 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_ONLY", "GENERATE_X_ONLY", "ALL"

// The following INIT_xx declarations specify the initial contents of the RAM// Address 0 to 127.INIT_00(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_01(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_02(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_03(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_04(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_05(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_06(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_07(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_08(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_09(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_0A(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_0B(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_0C(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_0D(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_0E(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_0F(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),// Address 128 to 255.INIT_10(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_11(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_12(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_13(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_14(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_15(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_16(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_17(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_18(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_19(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_1A(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_1B(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_1C(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_1D(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_1E(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_1F(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),// Address 256 to 383.INIT_20(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

Libraries Guide

10.1 www.xilinx.com 413

Page 414: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_21(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

.INIT_22(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

.INIT_23(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

.INIT_24(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

.INIT_25(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

.INIT_26(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

.INIT_27(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

.INIT_28(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

.INIT_29(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

.INIT_2A(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

.INIT_2B(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

.INIT_2C(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

.INIT_2D(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

.INIT_2E(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

.INIT_2F(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),// Address 384 to 511.INIT_30(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_31(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_32(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_33(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_34(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_35(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_36(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_37(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_38(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_39(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_3A(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_3B(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_3C(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_3D(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_3E(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),.INIT_3F(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),

// The next set of INITP_xx are for the parity bits// Address 0 to 127.INITP_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_01(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 128 to 255.INITP_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_03(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 256 to 383.INITP_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_05(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 384 to 511.INITP_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_07(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S36_S36_inst (.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), // 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_S36_S36_inst instantiation

Libraries Guide

414 www.xilinx.com 10.1

Page 416: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S4

Primitive: 16K-bit Data and 2K-bit Parity Single-Port Synchronous Block RAM with 4-bit Port

IntroductionThis design element is a dedicated random access memory blocks with synchronous write capability. The blockRAM port has 16384 bits of data memory. The cell configuration for this element is listed in the following table.

Data Cells Parity Cells

Depth Width Depth Width Address Bus Data Bus Parity Bus

4096 4 - - (11:0) (3:0) -

The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, no data is written and theoutputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) is High, DOA and DOPAare set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable (WEA) is High, the memorycontents reflect the data at DIA and DIPA. When ENA is High and WEA is Low, the data stored in the RAMaddress (ADDRA) is read during the Low-to-High clock transition. By default, WRITE_MODE_A=WRITE_FIRST,when ENA and WEA are High, the data on the data inputs (DIA and DIPA) is loaded into the word selected bythe write address (ADDRA) during the Low-to-High clock transition and the data outputs (DOA and DOPA)reflect the selected (addressed) word.

The above description assumes an active High EN, WE, SSR, and CLK. However, the active level can be changedby placing an inverter on the port. Any inverter placed on a RAMB16 port is absorbed into the block anddoes not use a CLB resource.

Logic TableInputs Outputs

GSR EN SSR WE CLK ADDR DI DIP DO DOP RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT INIT No Change No Change

0 0 X X X X X X NoChange

NoChange No Change No Change

0 1 1 0 ↑ X X X SRVAL SRVAL No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL SRVAL RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

416 www.xilinx.com 10.1

Page 417: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR EN SSR WE CLK ADDR DI DIP DO DOP RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata NoChange(a)RAM(addr)(b)data(c)

NoChange(a)RAM(addr)(b)pdata(c)

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset signal

INIT=Value specified by the INIT attribute for data memory. Default is all zeros.

SRVAL=Value after assertion of SSR as specified by the SRVAL attribute.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

(a) WRITE_MODE=NO_CHANGE

(b) WRITE_MODE=READ_FIRST

(c) WRITE_MODE=WRITE_FIRST

InitializationInitializing Memory Contents

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16 is set by 64 initialization attributes (INIT_00 throughINIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

Any INIT_xx or INITP_xx attribute that is not specified is configured as zeros. Partial Strings are paddedwith zeros to the left.

Initializing the Output Register

In Spartan-3A, each bit in the output register can be initialized at power on to either a 0 or 1. In addition, theinitial state specified for power on can be different than the state that results from assertion of a set/reset. Twotypes of properties control initialization of the output register for a single-port RAMB16: INIT and SRVAL. TheINIT attribute specifies the output register value at power on. You can use the SRVAL attribute to define the stateresulting from assertion of the SSR (set/reset) input.

The INIT and SRVAL attributes specify the initialization value as a hexadecimal String containing one bit foreach bit in the output port. For example, for a RAMB16_S1 with port width equal to 1, the output registercontains 1 bit. Therefore, the INIT or SRVAL value can only be specified as a 1 or 0. For RAMB16_S4 with portwidth equal to 4, the output register contains 4 bits. In this case, you can specify a hexadecimal value from 0through F to initialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high orderbit position of the INIT or SRVAL value.

Selecting Write Mode

Libraries Guide

10.1 www.xilinx.com 417

Page 418: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The WRITE_MODE attribute controls RAMB16 memory and output contents. By default, the WRITE_MODE isset to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You can setthe WRITE_MODE to READ_FIRST to read the memory contents, pass the memory contents to the outputs, andthen write the input to memory. Or, you can set the WRITE_MODE to NO_CHANGE to have the input writtento memory without changing the output.

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Binary/Hexadecimal

Any Hex Value All zeros Identifies the initial value of theDO output port after completingconfiguration. The bit width is dependenton the width of the A or B port of theRAM.

INIT_00 - INIT_3F Binary/Hexadecimal

Any Hex Value All zeros Specifies the initial contents of the dataportion of the RAM array.

INITP_00 - INITP_07 Binary/Hexadecimal

Any Hex Value All zeros Specifies the initial contents of the parityportion of the RAM array.

SRVAL Binary/Hexadecimal

Any Hex Value All zeros Allows the individual selection ofwhether the DO output port sets (go toa one) or reset (go to a zero) upon theassertion of the SSR pin. The bit widthis dependent on the width of the A or Bport of the RAM.

WRITE_MODE String "WRITE_FIRST","READ_FIRST"or"NO_CHANGE"

"WRITE_FIRST" Specifies the behavior of the DO portupon a write command to the respectedport. If set to "WRITE_FIRST", thesame port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM to theoutput port prior to writing the new data."NO_CHANGE" keeps the previous valueon the output port and won’t update theoutput port upon a write command. Thisis the suggested mode if not using theread data from a particular port of theRAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S4: Virtex-II/II-Pro, Spartan-3/3E 4k x 4 Single-Port RAM

Libraries Guide

418 www.xilinx.com 10.1

Page 419: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S4_inst : RAMB16_S4generic map (INIT => X"0", -- Value of output RAM registers at startupSRVAL => X"0", -- Ouput value upon SSR assertionWRITE_MODE => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE-- The following INIT_xx declarations specify the initial contents of the RAM-- Address 0 to 1023INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 1024 to 2047INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 2048 to 3071INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 3072 to 4095INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

10.1 www.xilinx.com 419

Page 420: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_3D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DO => DO, -- 4-bit Data OutputADDR => ADDR, -- 12-bit Address InputCLK => CLK, -- ClockDI => DI, -- 4-bit Data InputEN => EN, -- RAM Enable InputSSR => SSR, -- Synchronous Set/Reset InputWE => WE -- Write Enable Input);

-- End of RAMB16_S4_inst instantiation

Verilog Instantiation Template// RAMB16_S4: Spartan-3/3E/3A/3AN/3AD 4k x 4 Single-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S4 #(.INIT(4’h0), // Value of output RAM registers at startup.SRVAL(4’h0), // Output value upon SSR assertion.WRITE_MODE("WRITE_FIRST"), // WRITE_FIRST, READ_FIRST or NO_CHANGE

// The following INIT_xx declarations specify the initial contents of the RAM// Address 0 to 1023.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 1024 to 2047.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 2048 to 3071.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

420 www.xilinx.com 10.1

Page 421: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 3072 to 4095.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S4_inst (.DO(DO), // 4-bit Data Output.ADDR(ADDR), // 12-bit Address Input.CLK(CLK), // Clock.DI(DI), // 4-bit Data Input.EN(EN), // RAM Enable Input.SSR(SSR), // Synchronous Set/Reset Input.WE(WE) // Write Enable Input);

// End of RAMB16_S4_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 421

Page 422: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S4_S18

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 4-bit and 18-bitPorts

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

422 www.xilinx.com 10.1

Page 423: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

10.1 www.xilinx.com 423

Page 424: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

Design ElementDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S4_S18 4096 x 4 - (11:0) (3:0) - 1024 x16

1024 x 2 (9:0) (15:0) (1:0)

(a)Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

424 www.xilinx.com 10.1

Page 425: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

Libraries Guide

10.1 www.xilinx.com 425

Page 426: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

Libraries Guide

426 www.xilinx.com 10.1

Page 427: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Libraries Guide

10.1 www.xilinx.com 427

Page 428: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 To INIT_3F Binary/Hexadecimal

Any All zeros Specifies the initial contents of the dataportion of the RAM array.

INIT_A Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INIT_B Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INITP_00 ToINITP_07

Binary/Hexadecimal

Any All zeros Specifies the initial contents of theparity portion of the RAM array.

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_ X_ONLY”

"ALL” Specifies the behavior during simulationin the event of a data collision (databeing read or written to the sameaddress from both ports of the Ramsimultaneously. "ALL" issues a warningto simulator console and generate an Xor all unknown data due to the collision.This is the recommended setting."WARNING" generates a warning onlyand "GENERATE_X_ONLY" generatesan X for unknown data but won’toutput the occurrence to the simulationconsole. "NONE" completely ignoresthe error. It is suggested to only changethis attribute if you can ensure thedata generated during a collision isdiscarded.

SRVAL_A Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTA pin. For Type,the bit width is dependent on the widthof the A port of the RAM.

SRVAL_B Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTB pin. For Type,the bit width is dependent on the widthof the B port of the RAM.

Libraries Guide

428 www.xilinx.com 10.1

Page 429: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S4_S18: Virtex-II/II-Pro, Spartan-3/3E 4k/1k x 4/16 + 0/2 Parity bits Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S4_S18_inst : RAMB16_S4_S18generic map (INIT_A => X"0", -- Value of output RAM registers on Port A at startupINIT_B => X"00000", -- Value of output RAM registers on Port B at startupSRVAL_A => X"0", -- Port A ouput value upon SSR assertionSRVAL_B => X"00000", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_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 1023, Port B Address 0 to 255INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

10.1 www.xilinx.com 429

Page 430: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 1024 to 2047, Port B Address 256 to 511INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 2048 to 3071, Port B Address 512 to 767INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 3072 to 4095, Port B Address 768 to 1023INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => 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 A Address 0 to 1023, Port B Address 0 to 255INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 1024 to 2047, Port B Address 256 to 511INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 2048 to 3071, Port B Address 512 to 767INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 3072 to 4095, Port B Address 768 to 1023INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 4-bit Data OutputDOB => DOB, -- Port B 16-bit Data OutputDOPB => DOPB, -- Port B 2-bit Parity OutputADDRA => ADDRA, -- Port A 12-bit Address Input

Libraries Guide

430 www.xilinx.com 10.1

Page 431: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ADDRB => ADDRB, -- Port B 10-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 4-bit Data InputDIB => DIB, -- Port B 16-bit Data InputDIPB => DIPB, -- Port-B 2-bit parity InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- PortB RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S4_S18_inst instantiation

Verilog Instantiation Template// RAMB16_S4_S18: Spartan-3/3E/3A/3AN/3AD 4k/1k x 4/16 + 0/2 Parity bits Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S4_S18 #(.INIT_A(4’h0), // Value of output RAM registers on Port A at startup.INIT_B(18’h00000), // Value of output RAM registers on Port B at startup.SRVAL_A(4’h0), // Port A output value upon SSR assertion.SRVAL_B(18’h00000), // Port B output 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_ONLY", "GENERATE_X_ONLY", "ALL"

// The following INIT_xx declarations specify the initial contents of the RAM// Port A Address 0 to 1023, Port B Address 0 to 255.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 1024 to 2047, Port B Address 256 to 511.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 2048 to 3071, Port B Address 512 to 767.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

10.1 www.xilinx.com 431

Page 432: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 3072 to 4095, Port B Address 768 to 1023.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000),

// The next set of INITP_xx are for the parity bits// Port A Address 0 to 1023, Port B Address 0 to 255.INITP_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_01(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 1024 to 2047, Port B Address 256 to 511.INITP_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_03(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 2048 to 3071, Port B Address 512 to 767.INITP_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_05(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 3072 to 4095, Port B Address 768 to 1023.INITP_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_07(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S4_S18_inst (.DOA(DOA), // Port A 4-bit Data Output.DOB(DOB), // Port B 16-bit Data Output.DOPB(DOPB), // Port B 2-bit Parity Output.ADDRA(ADDRA), // Port A 12-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 4-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), // 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_S18_inst instantiation

For More Information• See the Virtex-II User Guide.• See the Virtex-II Data Sheets.

Libraries Guide

432 www.xilinx.com 10.1

Page 433: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S4_S36

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 4-bit and 36-bitPorts

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

10.1 www.xilinx.com 433

Page 434: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

434 www.xilinx.com 10.1

Page 435: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

Design ElementDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S4_S36 4096 x 4 - (11:0) (3:0) - 512 x 32 512 x 4 (8:0) (31:0) (3:0)

(a)Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

10.1 www.xilinx.com 435

Page 436: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

The following tables shows address mapping for each port width.

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

Libraries Guide

436 www.xilinx.com 10.1

Page 437: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

Libraries Guide

10.1 www.xilinx.com 437

Page 438: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Libraries Guide

438 www.xilinx.com 10.1

Page 439: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 To INIT_3F Binary/Hexadecimal

Any All zeros Specifies the initial contents of the dataportion of the RAM array.

INIT_A Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INIT_B Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INITP_00 ToINITP_07

Binary/Hexadecimal

Any All zeros Specifies the initial contents of theparity portion of the RAM array.

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_ X_ONLY”

"ALL” Specifies the behavior during simulationin the event of a data collision (databeing read or written to the sameaddress from both ports of the Ramsimultaneously. "ALL" issues a warningto simulator console and generate an Xor all unknown data due to the collision.This is the recommended setting."WARNING" generates a warning onlyand "GENERATE_X_ONLY" generatesan X for unknown data but won’toutput the occurrence to the simulationconsole. "NONE" completely ignoresthe error. It is suggested to only changethis attribute if you can ensure thedata generated during a collision isdiscarded.

SRVAL_A Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTA pin. For Type,the bit width is dependent on the widthof the A port of the RAM.

SRVAL_B Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTB pin. For Type,the bit width is dependent on the widthof the B port of the RAM.

Libraries Guide

10.1 www.xilinx.com 439

Page 440: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S4_S36: Virtex-II/II-Pro, Spartan-3/3E 4k/512 x 4/32 + 0/4 Parity bits Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S4_S36_inst : RAMB16_S4_S36generic map (INIT_A => X"0", -- Value of output RAM registers on Port A at startupINIT_B => X"000000000", -- Value of output RAM registers on Port B at startupSRVAL_A => X"0", -- Port A ouput value upon SSR assertionSRVAL_B => X"000000000", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_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 1023, Port B Address 0 to 127INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

440 www.xilinx.com 10.1

Page 441: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 1024 to 2047, Port B Address 128 to 255INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 2048 to 3071, Port B Address 256 to 383INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 3072 to 4095, Port B Address 384 to 511INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => 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 A Address 0 to 1023, Port B Address 0 to 127INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 1024 to 2047, Port B Address 128 to 255INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 2048 to 3071, Port B Address 256 to 383INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 3072 to 4095, Port B Address 384 to 511INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 4-bit Data OutputDOB => DOB, -- Port B 32-bit Data OutputDOPB => DOPB, -- Port B 4-bit Parity OutputADDRA => ADDRA, -- Port A 12-bit Address Input

Libraries Guide

10.1 www.xilinx.com 441

Page 442: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ADDRB => ADDRB, -- Port B 9-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 4-bit Data InputDIB => DIB, -- Port B 32-bit Data InputDIPB => DIPB, -- Port-B 4-bit parity InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- PortB RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S4_S36_inst instantiation

Verilog Instantiation Template// RAMB16_S4_S36: Spartan-3/3E/3A/3AN/3AD 4k/512 x 4/32 + 0/4 Parity bits Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S4_S36 #(.INIT_A(4’h0), // Value of output RAM registers on Port A at startup.INIT_B(36’h000000000), // Value of output RAM registers on Port B at startup.SRVAL_A(4’h0), // Port A output value upon SSR assertion.SRVAL_B(36’h000000000), // Port B output 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_ONLY", "GENERATE_X_ONLY", "ALL"

// The following INIT_xx declarations specify the initial contents of the RAM// Port A Address 0 to 1023, Port B Address 0 to 127.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 1024 to 2047, Port B Address 128 to 255.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 2048 to 3071, Port B Address 256 to 383.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

442 www.xilinx.com 10.1

Page 443: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 3072 to 4095, Port B Address 384 to 511.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000),

// The next set of INITP_xx are for the parity bits// Port A Address 0 to 1023, Port B Address 0 to 127.INITP_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_01(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 1024 to 2047, Port B Address 128 to 255.INITP_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_03(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 2048 to 3071, Port B Address 256 to 383.INITP_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_05(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 3072 to 4095, Port B Address 384 to 511.INITP_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_07(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S4_S36_inst (.DOA(DOA), // Port A 4-bit Data Output.DOB(DOB), // Port B 32-bit Data Output.DOPB(DOPB), // Port B 4-bit Parity Output.ADDRA(ADDRA), // Port A 12-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 4-bit Data Input.DIB(DIB), // Port B 32-bit Data Input.DIPB(DIPB), // Port-B 4-bit parity 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_S36_inst instantiation

For More Information• See the Virtex-II User Guide.• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 443

Page 444: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S4_S4

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 4-bit Ports

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

444 www.xilinx.com 10.1

Page 445: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

10.1 www.xilinx.com 445

Page 446: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

Design ElementDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S4_S4 4096 x 4 - (11:0) (3:0) - 4096 x 4 - (11:0) (3:0) -

(a)Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

446 www.xilinx.com 10.1

Page 447: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

The following tables shows address mapping for each port width.

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

Libraries Guide

10.1 www.xilinx.com 447

Page 448: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

Libraries Guide

448 www.xilinx.com 10.1

Page 449: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Libraries Guide

10.1 www.xilinx.com 449

Page 450: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 To INIT_3F Binary/Hexadecimal

Any All zeros Specifies the initial contents of the dataportion of the RAM array.

INIT_A Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INIT_B Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INITP_00 ToINITP_07

Binary/Hexadecimal

Any All zeros Specifies the initial contents of theparity portion of the RAM array.

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_ X_ONLY”

"ALL” Specifies the behavior during simulationin the event of a data collision (databeing read or written to the sameaddress from both ports of the Ramsimultaneously. "ALL" issues a warningto simulator console and generate an Xor all unknown data due to the collision.This is the recommended setting."WARNING" generates a warning onlyand "GENERATE_X_ONLY" generatesan X for unknown data but won’toutput the occurrence to the simulationconsole. "NONE" completely ignoresthe error. It is suggested to only changethis attribute if you can ensure thedata generated during a collision isdiscarded.

SRVAL_A Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTA pin. For Type,the bit width is dependent on the widthof the A port of the RAM.

SRVAL_B Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTB pin. For Type,the bit width is dependent on the widthof the B port of the RAM.

Libraries Guide

450 www.xilinx.com 10.1

Page 451: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S4_S4: Virtex-II/II-Pro, Spartan-3/3E 4k x 4 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S4_S4_inst : RAMB16_S4_S4generic map (INIT_A => X"0", -- Value of output RAM registers on Port A at startupINIT_B => X"0", -- Value of output RAM registers on Port B at startupSRVAL_A => X"0", -- Port A ouput value upon SSR assertionSRVAL_B => X"0", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_COLLISION_CHECK => "ALL", -- "NONE", "WARNING", "GENERATE_X_ONLY", "ALL"-- The following INIT_xx declarations specify the initial contents of the RAM-- Address 0 to 1023INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

10.1 www.xilinx.com 451

Page 452: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 1024 to 2047INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 2048 to 3071INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 3072 to 4095INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 4-bit Data OutputDOB => DOB, -- Port B 4-bit Data OutputADDRA => ADDRA, -- Port A 12-bit Address InputADDRB => ADDRB, -- Port B 12-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 4-bit Data InputDIB => DIB, -- Port B 4-bit Data InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- Port B RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S4_S4_inst instantiation

Libraries Guide

452 www.xilinx.com 10.1

Page 453: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Verilog Instantiation Template// RAMB16_S4_S4: Spartan-3/3E/3A/3AN/3AD 4k x 4 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S4_S4 #(.INIT_A(4’h0), // Value of output RAM registers on Port A at startup.INIT_B(4’h0), // Value of output RAM registers on Port B at startup.SRVAL_A(4’h0), // Port A output value upon SSR assertion.SRVAL_B(4’h0), // Port B output 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_ONLY", "GENERATE_X_ONLY", "ALL"

// The following INIT_xx declarations specify the initial contents of the RAM// Address 0 to 1023.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 1024 to 2047.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 2048 to 3071.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 3072 to 4095.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

10.1 www.xilinx.com 453

Page 454: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S4_S4_inst (.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

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

454 www.xilinx.com 10.1

Page 455: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S4_S9

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 4-bit and 9-bitPorts

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

10.1 www.xilinx.com 455

Page 456: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

456 www.xilinx.com 10.1

Page 457: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

Design ElementDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S4_S9 4096 x 4 - (11:0) (3:0) - 2048 x 8 2048 x 1 (10:0) (7:0) (0:0)

(a)Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

10.1 www.xilinx.com 457

Page 458: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

The following tables shows address mapping for each port width.

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

Libraries Guide

458 www.xilinx.com 10.1

Page 459: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

Libraries Guide

10.1 www.xilinx.com 459

Page 460: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Libraries Guide

460 www.xilinx.com 10.1

Page 461: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 To INIT_3F Binary/Hexadecimal

Any All zeros Specifies the initial contents of the dataportion of the RAM array.

INIT_A Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INIT_B Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INITP_00 ToINITP_07

Binary/Hexadecimal

Any All zeros Specifies the initial contents of theparity portion of the RAM array.

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_ X_ONLY”

"ALL” Specifies the behavior during simulationin the event of a data collision (databeing read or written to the sameaddress from both ports of the Ramsimultaneously. "ALL" issues a warningto simulator console and generate an Xor all unknown data due to the collision.This is the recommended setting."WARNING" generates a warning onlyand "GENERATE_X_ONLY" generatesan X for unknown data but won’toutput the occurrence to the simulationconsole. "NONE" completely ignoresthe error. It is suggested to only changethis attribute if you can ensure thedata generated during a collision isdiscarded.

SRVAL_A Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTA pin. For Type,the bit width is dependent on the widthof the A port of the RAM.

SRVAL_B Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTB pin. For Type,the bit width is dependent on the widthof the B port of the RAM.

Libraries Guide

10.1 www.xilinx.com 461

Page 462: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S4_S9: Virtex-II/II-Pro, Spartan-3/3E 4k/2k x 4/8 + 0/1 Parity bit Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S4_S9_inst : RAMB16_S4_S9generic map (INIT_A => X"0", -- Value of output RAM registers on Port A at startupINIT_B => X"000", -- Value of output RAM registers on Port B at startupSRVAL_A => X"0", -- Port A ouput value upon SSR assertionSRVAL_B => X"000", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_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 1023, Port B Address 0 to 511INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

462 www.xilinx.com 10.1

Page 463: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 1024 to 2047, Port B Address 512 to 1023INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 2048 to 3071, Port B Address 1024 to 1535INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 3072 to 4095, Port B Address 1536 to 2047INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => 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 511INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port B Address 512 to 1023INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port B Address 1024 to 1535INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port B Address 1536 to 2047INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 4-bit Data OutputDOB => DOB, -- Port B 8-bit Data OutputDOPB => DOPB, -- Port B 1-bit Parity OutputADDRA => ADDRA, -- Port A 12-bit Address Input

Libraries Guide

10.1 www.xilinx.com 463

Page 464: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ADDRB => ADDRB, -- Port B 11-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 4-bit Data InputDIB => DIB, -- Port B 8-bit Data InputDIPB => DIPB, -- Port-B 1-bit parity InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- PortB RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S4_S9_inst instantiation

Verilog Instantiation Template// RAMB16_S4_S9: Spartan-3/3E/3A/3AN/3AD 4k/2k x 4/8 + 0/1 Parity bit Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S4_S9 #(.INIT_A(4’h0), // Value of output RAM registers on Port A at startup.INIT_B(9’h000), // Value of output RAM registers on Port B at startup.SRVAL_A(4’h0), // Port A output value upon SSR assertion.SRVAL_B(9’h000), // Port B output 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_ONLY", "GENERATE_X_ONLY", "ALL"

// The following INIT_xx declarations specify the initial contents of the RAM// Port A Address 0 to 1023, Port B Address 0 to 511.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 1024 to 2047, Port B Address 512 to 1023.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 2048 to 3071, Port B Address 1024 to 1535.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

464 www.xilinx.com 10.1

Page 465: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 3072 to 4095, Port B Address 1536 to 2047.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000),

// The next set of INITP_xx are for the parity bits// Port B Address 0 to 511.INITP_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_01(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port B Address 512 to 1023.INITP_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_03(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port B Address 1024 to 1535.INITP_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_05(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port B Address 1536 to 2047.INITP_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_07(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S4_S9_inst (.DOA(DOA), // Port A 4-bit Data Output.DOB(DOB), // Port B 8-bit Data Output.DOPB(DOPB), // Port B 1-bit Parity Output.ADDRA(ADDRA), // Port A 12-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 4-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), // 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_S9_inst instantiation

For More Information• See the Virtex-II User Guide.• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 465

Page 466: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S9

Primitive: 16K-bit Data and 2K-bit Parity Single-Port Synchronous Block RAM with 9-bit Port

IntroductionThis design element is a dedicated random access memory blocks with synchronous write capability. The blockRAM port has 16384 bits of data memory. The cell configuration for this element is listed in the following table.

Data Cells Parity Cells

Depth Width Depth Width Address Bus Data Bus Parity Bus

2048 8 2048 1 (10:0) (7:0) (0:0)

The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, no data is written and theoutputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) is High, DOA and DOPAare set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable (WEA) is High, the memorycontents reflect the data at DIA and DIPA. When ENA is High and WEA is Low, the data stored in the RAMaddress (ADDRA) is read during the Low-to-High clock transition. By default, WRITE_MODE_A=WRITE_FIRST,when ENA and WEA are High, the data on the data inputs (DIA and DIPA) is loaded into the word selected bythe write address (ADDRA) during the Low-to-High clock transition and the data outputs (DOA and DOPA)reflect the selected (addressed) word.

The above description assumes an active High EN, WE, SSR, and CLK. However, the active level can be changedby placing an inverter on the port. Any inverter placed on a RAMB16 port is absorbed into the block anddoes not use a CLB resource.

Logic TableInputs Outputs

GSR EN SSR WE CLK ADDR DI DIP DO DOP RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT INIT No Change No Change

0 0 X X X X X X NoChange

NoChange No Change No Change

0 1 1 0 ↑ X X X SRVAL SRVAL No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL SRVAL RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

466 www.xilinx.com 10.1

Page 467: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR EN SSR WE CLK ADDR DI DIP DO DOP RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata NoChange(a)RAM(addr)(b)data(c)

NoChange(a)RAM(addr)(b)pdata(c)

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset signal

INIT=Value specified by the INIT attribute for data memory. Default is all zeros.

SRVAL=Value after assertion of SSR as specified by the SRVAL attribute.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

(a) WRITE_MODE=NO_CHANGE

(b) WRITE_MODE=READ_FIRST

(c) WRITE_MODE=WRITE_FIRST

InitializationInitializing Memory Contents

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16 is set by 64 initialization attributes (INIT_00 throughINIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

Any INIT_xx or INITP_xx attribute that is not specified is configured as zeros. Partial Strings are paddedwith zeros to the left.

Initializing the Output Register

In Spartan-3A, each bit in the output register can be initialized at power on to either a 0 or 1. In addition, theinitial state specified for power on can be different than the state that results from assertion of a set/reset. Twotypes of properties control initialization of the output register for a single-port RAMB16: INIT and SRVAL. TheINIT attribute specifies the output register value at power on. You can use the SRVAL attribute to define the stateresulting from assertion of the SSR (set/reset) input.

The INIT and SRVAL attributes specify the initialization value as a hexadecimal String containing one bit foreach bit in the output port. For example, for a RAMB16_S1 with port width equal to 1, the output registercontains 1 bit. Therefore, the INIT or SRVAL value can only be specified as a 1 or 0. For RAMB16_S4 with portwidth equal to 4, the output register contains 4 bits. In this case, you can specify a hexadecimal value from 0through F to initialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high orderbit position of the INIT or SRVAL value.

Selecting Write Mode

Libraries Guide

10.1 www.xilinx.com 467

Page 468: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The WRITE_MODE attribute controls RAMB16 memory and output contents. By default, the WRITE_MODE isset to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You can setthe WRITE_MODE to READ_FIRST to read the memory contents, pass the memory contents to the outputs, andthen write the input to memory. Or, you can set the WRITE_MODE to NO_CHANGE to have the input writtento memory without changing the output.

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Binary/Hexadecimal

Any Hex Value All zeros Identifies the initial value of theDO output port after completingconfiguration. The bit width is dependenton the width of the A or B port of theRAM.

INIT_00 - INIT_3F Binary/Hexadecimal

Any Hex Value All zeros Specifies the initial contents of the dataportion of the RAM array.

INITP_00 - INITP_07 Binary/Hexadecimal

Any Hex Value All zeros Specifies the initial contents of the parityportion of the RAM array.

SRVAL Binary/Hexadecimal

Any Hex Value All zeros Allows the individual selection ofwhether the DO output port sets (go toa one) or reset (go to a zero) upon theassertion of the SSR pin. The bit widthis dependent on the width of the A or Bport of the RAM.

WRITE_MODE String "WRITE_FIRST","READ_FIRST"or"NO_CHANGE"

"WRITE_FIRST" Specifies the behavior of the DO portupon a write command to the respectedport. If set to "WRITE_FIRST", thesame port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM to theoutput port prior to writing the new data."NO_CHANGE" keeps the previous valueon the output port and won’t update theoutput port upon a write command. Thisis the suggested mode if not using theread data from a particular port of theRAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

Libraries Guide

468 www.xilinx.com 10.1

Page 469: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

-- RAMB16_S9: Virtex-II/II-Pro, Spartan-3/3E 2k x 8 + 1 Parity bit Single-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S9_inst : RAMB16_S9generic map (INIT => X"000", -- Value of output RAM registers at startupSRVAL => X"000", -- Ouput value upon SSR assertionWRITE_MODE => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE-- The following INIT_xx declarations specify the initial contents of the RAM-- Address 0 to 511INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 512 to 1023INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 1024 to 1535INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 1536 to 2047INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

10.1 www.xilinx.com 469

Page 470: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_3C => 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-- Address 0 to 511INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 512 to 1023INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 1024 to 1535INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 1536 to 2047INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DO => DO, -- 8-bit Data OutputDOP => DOP, -- 1-bit parity OutputADDR => ADDR, -- 11-bit Address InputCLK => CLK, -- ClockDI => DI, -- 8-bit Data InputDIP => DIP, -- 1-bit parity InputEN => EN, -- RAM Enable InputSSR => SSR, -- Synchronous Set/Reset InputWE => WE -- Write Enable Input);

-- End of RAMB16_S9_inst instantiation

Verilog Instantiation Template// RAMB16_S9: Spartan-3/3E/3A/3AN/3AD 2k x 8 + 1 Parity bit Single-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S9 #(.INIT(9’h000), // Value of output RAM registers at startup.SRVAL(9’h000), // Output value upon SSR assertion.WRITE_MODE("WRITE_FIRST"), // WRITE_FIRST, READ_FIRST or NO_CHANGE

// The following INIT_xx declarations specify the initial contents of the RAM// Address 0 to 511.INIT_00(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_01(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_02(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_03(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_04(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_05(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_06(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_07(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_08(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_09(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_0A(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_0B(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_0C(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_0D(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_0E(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_0F(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),// Address 512 to 1023.INIT_10(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_11(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_12(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_13(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_14(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_15(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_16(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_17(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_18(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

Libraries Guide

470 www.xilinx.com 10.1

Page 471: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_19(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_1A(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_1B(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_1C(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_1D(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_1E(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_1F(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),// Address 1024 to 1535.INIT_20(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_21(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_22(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_23(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_24(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_25(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_26(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_27(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_28(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_29(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_2A(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_2B(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_2C(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_2D(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_2E(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_2F(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),// Address 1536 to 2047.INIT_30(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_31(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_32(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_33(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_34(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_35(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_36(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_37(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_38(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_39(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_3A(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_3B(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_3C(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_3D(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_3E(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_3F(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

// The next set of INITP_xx are for the parity bits// Address 0 to 511.INITP_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_01(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 512 to 1023.INITP_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_03(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 1024 to 1535.INITP_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_05(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 1536 to 2047.INITP_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_07(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S9_inst (.DO(DO), // 8-bit Data Output.DOP(DOP), // 1-bit parity Output.ADDR(ADDR), // 11-bit Address Input.CLK(CLK), // Clock.DI(DI), // 8-bit Data Input.DIP(DIP), // 1-bit parity Input.EN(EN), // RAM Enable Input.SSR(SSR), // Synchronous Set/Reset Input.WE(WE) // Write Enable Input);

// End of RAMB16_S9_inst instantiation

Libraries Guide

10.1 www.xilinx.com 471

Page 473: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S9_S18

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 9-bit and 18-bitPorts

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

10.1 www.xilinx.com 473

Page 474: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

474 www.xilinx.com 10.1

Page 475: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

ComponentDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S9_S18 2048 x 8 2048 x 1 (10:0) (7:0) (0:0) 1024 x16

1024 x 2 (9:0) (15:0) (1:0)

(a) Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

10.1 www.xilinx.com 475

Page 476: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

The following tables show address mapping for each port width.

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

Libraries Guide

476 www.xilinx.com 10.1

Page 477: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

Libraries Guide

10.1 www.xilinx.com 477

Page 478: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Libraries Guide

478 www.xilinx.com 10.1

Page 479: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 To INIT_3F Binary/Hexadecimal

Any All zeros Specifies the initial contents of the dataportion of the RAM array.

INIT_A Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INIT_B Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INITP_00 ToINITP_07

Binary/Hexadecimal

Any All zeros Specifies the initial contents of theparity portion of the RAM array.

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_ X_ONLY”

"ALL” Specifies the behavior during simulationin the event of a data collision (databeing read or written to the sameaddress from both ports of the Ramsimultaneously. "ALL" issues a warningto simulator console and generate an Xor all unknown data due to the collision.This is the recommended setting."WARNING" generates a warning onlyand "GENERATE_X_ONLY" generatesan X for unknown data but won’toutput the occurrence to the simulationconsole. "NONE" completely ignoresthe error. It is suggested to only changethis attribute if you can ensure thedata generated during a collision isdiscarded.

SRVAL_A Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTA pin. For Type,the bit width is dependent on the widthof the A port of the RAM.

SRVAL_B Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTB pin. For Type,the bit width is dependent on the widthof the B port of the RAM.

Libraries Guide

10.1 www.xilinx.com 479

Page 480: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S9_S18: Virtex-II/II-Pro, Spartan-3/3E 2k/1k x 8/16 + 1/2 Parity bits Parity bits Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S9_S18_inst : RAMB16_S9_S18generic map (INIT_A => X"000", -- Value of output RAM registers on Port A at startupINIT_B => X"00000", -- Value of output RAM registers on Port B at startupSRVAL_A => X"000", -- Port A ouput value upon SSR assertionSRVAL_B => X"00000", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_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 511, Port B Address 0 to 255INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

480 www.xilinx.com 10.1

Page 481: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 512 to 1023, Port B Address 256 to 511INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 1024 to 1535, Port B Address 512 to 767INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 1536 to 2047, Port B Address 768 to 1024INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => 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 A Address 0 to 511, Port B Address 0 to 255INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 512 to 1023, Port B Address 256 to 511INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 1024 to 1535, Port B Address 512 to 767INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 1536 to 2047, Port B Address 768 to 1024INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 8-bit Data OutputDOB => DOB, -- Port B 16-bit Data OutputDOPA => DOPA, -- Port A 1-bit Parity OutputDOPB => DOPB, -- Port B 2-bit Parity Output

Libraries Guide

10.1 www.xilinx.com 481

Page 482: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ADDRA => ADDRA, -- Port A 11-bit Address InputADDRB => ADDRB, -- Port B 10-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 8-bit Data InputDIB => DIB, -- Port B 16-bit Data InputDIPA => DIPA, -- Port A 1-bit parity InputDIPB => DIPB, -- Port-B 2-bit parity InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- PortB RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S9_S18_inst instantiation

Verilog Instantiation Template// RAMB16_S9_S18: Virtex-II/II-Pro, Spartan-3/3E 2k/1k x 8/16 + 1/2 Parity bits Parity bits Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S9_S18 #(.INIT_A(9’h000), // Value of output RAM registers on Port A at startup.INIT_B(18’h00000), // Value of output RAM registers on Port B at startup.SRVAL_A(9’h000), // Port A output value upon SSR assertion.SRVAL_B(18’h00000), // Port B output 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_ONLY", "GENERATE_X_ONLY", "ALL"

// The following INIT_xx declarations specify the initial contents of the RAM// Port A Address 0 to 511, Port B Address 0 to 255.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 512 to 1023, Port B Address 256 to 511.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 1024 to 1535, Port B Address 512 to 767.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

482 www.xilinx.com 10.1

Page 483: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 1536 to 2047, Port B Address 768 to 1024.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000),

// The next set of INITP_xx are for the parity bits// Port A Address 0 to 511, Port B Address 0 to 255.INITP_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_01(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 512 to 1023, Port B Address 256 to 511.INITP_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_03(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 1024 to 1535, Port B Address 512 to 767.INITP_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_05(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 1536 to 2047, Port B Address 768 to 1024.INITP_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_07(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S9_S18_inst (.DOA(DOA), // Port A 8-bit Data Output.DOB(DOB), // Port B 16-bit Data Output.DOPA(DOPA), // Port A 1-bit Parity Output.DOPB(DOPB), // Port B 2-bit Parity Output.ADDRA(ADDRA), // Port A 11-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 8-bit Data Input.DIB(DIB), // Port B 16-bit Data Input.DIPA(DIPA), // Port A 1-bit parity Input.DIPB(DIPB), // Port-B 2-bit parity 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_S9_S18_inst instantiation

Libraries Guide

10.1 www.xilinx.com 483

Page 485: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S9_S36

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 9-bit and 36-bitPorts

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

10.1 www.xilinx.com 485

Page 486: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

486 www.xilinx.com 10.1

Page 487: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

Design ElementDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S9_S36 2048 x 8 2048 x 1 (10:0) (7:0) (0:0) 512 x 32 512 x 4 (8:0) (31:0) (3:0)

(a)Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

10.1 www.xilinx.com 487

Page 488: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

The following tables shows address mapping for each port width.

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

Libraries Guide

488 www.xilinx.com 10.1

Page 489: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

Libraries Guide

10.1 www.xilinx.com 489

Page 490: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Libraries Guide

490 www.xilinx.com 10.1

Page 491: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 To INIT_3F Binary/Hexadecimal

Any All zeros Specifies the initial contents of the dataportion of the RAM array.

INIT_A Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INIT_B Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INITP_00 ToINITP_07

Binary/Hexadecimal

Any All zeros Specifies the initial contents of theparity portion of the RAM array.

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_ X_ONLY”

"ALL” Specifies the behavior during simulationin the event of a data collision (databeing read or written to the sameaddress from both ports of the Ramsimultaneously. "ALL" issues a warningto simulator console and generate an Xor all unknown data due to the collision.This is the recommended setting."WARNING" generates a warning onlyand "GENERATE_X_ONLY" generatesan X for unknown data but won’toutput the occurrence to the simulationconsole. "NONE" completely ignoresthe error. It is suggested to only changethis attribute if you can ensure thedata generated during a collision isdiscarded.

SRVAL_A Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTA pin. For Type,the bit width is dependent on the widthof the A port of the RAM.

SRVAL_B Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTB pin. For Type,the bit width is dependent on the widthof the B port of the RAM.

Libraries Guide

10.1 www.xilinx.com 491

Page 492: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S9_S36: Virtex-II/II-Pro, Spartan-3/3E 2k/512 x 8/32 + 1/4 Parity bits Parity bits Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S9_S36_inst : RAMB16_S9_S36generic map (INIT_A => X"000", -- Value of output RAM registers on Port A at startupINIT_B => X"000000000", -- Value of output RAM registers on Port B at startupSRVAL_A => X"000", -- Port A ouput value upon SSR assertionSRVAL_B => X"000000000", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_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 511, Port B Address 0 to 127INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

492 www.xilinx.com 10.1

Page 493: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 512 to 1023, Port B Address 128 to 255INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 1024 to 1535, Port B Address 255 to 383INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 1536 to 2047, Port B Address 384 to 511INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => 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 A Address 0 to 511, Port B Address 0 to 127INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 512 to 1023, Port B Address 128 to 255INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 1024 to 1535, Port B Address 256 to 383INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Port A Address 1536 to 2047, Port B Address 384 to 511INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 8-bit Data OutputDOB => DOB, -- Port B 32-bit Data OutputDOPA => DOPA, -- Port A 1-bit Parity OutputDOPB => DOPB, -- Port B 4-bit Parity Output

Libraries Guide

10.1 www.xilinx.com 493

Page 494: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ADDRA => ADDRA, -- Port A 11-bit Address InputADDRB => ADDRB, -- Port B 9-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 8-bit Data InputDIB => DIB, -- Port B 32-bit Data InputDIPA => DIPA, -- Port A 1-bit parity InputDIPB => DIPB, -- Port-B 4-bit parity InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- PortB RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S9_S36_inst instantiation

Verilog Instantiation Template// RAMB16_S9_S36: Virtex-II/II-Pro, Spartan-3/3E 2k/512 x 8/32 + 1/4 Parity bits Parity bits Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S9_S36 #(.INIT_A(9’h000), // Value of output RAM registers on Port A at startup.INIT_B(36’h000000000), // Value of output RAM registers on Port B at startup.SRVAL_A(9’h000), // Port A output value upon SSR assertion.SRVAL_B(36’h000000000), // Port B output 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_ONLY", "GENERATE_X_ONLY", "ALL"

// The following INIT_xx declarations specify the initial contents of the RAM// Port A Address 0 to 511, Port B Address 0 to 127.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 512 to 1023, Port B Address 128 to 255.INIT_10(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_11(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_12(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_13(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_14(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_15(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_16(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_17(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_18(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_19(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_1F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 1024 to 1535, Port B Address 255 to 383.INIT_20(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

494 www.xilinx.com 10.1

Page 495: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_21(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_22(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_23(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_24(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_25(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_26(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_27(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_28(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_29(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_2F(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 1536 to 2047, Port B Address 384 to 511.INIT_30(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_31(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_32(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_33(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_34(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_35(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_36(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_37(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_38(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_39(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_3F(256’h0000000000000000000000000000000000000000000000000000000000000000),

// The next set of INITP_xx are for the parity bits// Port A Address 0 to 511, Port B Address 0 to 127.INITP_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_01(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 512 to 1023, Port B Address 128 to 255.INITP_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_03(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 1024 to 1535, Port B Address 256 to 383.INITP_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_05(256’h0000000000000000000000000000000000000000000000000000000000000000),// Port A Address 1536 to 2047, Port B Address 384 to 511.INITP_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_07(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S9_S36_inst (.DOA(DOA), // Port A 8-bit Data Output.DOB(DOB), // Port B 32-bit Data Output.DOPA(DOPA), // Port A 1-bit Parity Output.DOPB(DOPB), // Port B 4-bit Parity Output.ADDRA(ADDRA), // Port A 11-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 8-bit Data Input.DIB(DIB), // Port B 32-bit Data Input.DIPA(DIPA), // Port A 1-bit parity Input.DIPB(DIPB), // Port-B 4-bit parity 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_S9_S36_inst instantiation

Libraries Guide

10.1 www.xilinx.com 495

Page 497: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB16_S9_S9

Primitive: 16K-bit Data and 2K-bit Parity Dual-Port Synchronous Block RAM with 9-bit Ports

IntroductionThis design element is a dual-ported dedicated random access memory block with synchronous write capability.Each block RAM port has 16384 bits of data memory. Ports configured as 9, 18, or 36-bits wide have an additional2048 bits of parity memory. Each port is independent of the other while accessing the same set of 16384 datamemory cells. Each port is independently configured to a specific data width. The possible port and cellconfigurations for this element are listed under "Port Descriptions."

Logic TableTruth Table A

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

1 X X X X X X X INIT_A INIT_A No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_A SRVAL_A No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_A SRVAL_A RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

Libraries Guide

10.1 www.xilinx.com 497

Page 498: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Inputs Outputs

GSR ENA SSRA WEA CLKA ADDRA DIA DIPA DOA DOPA RAM Contents

Data RAM Parity RAM

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)2,data3

No Change1,RAM(addr)2,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset

INIT_A=Value specified by the INIT_A attribute for output register. Default is all zeros.

SRVAL_A=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_A=NO_CHANGE.

2WRITE_MODE_A=READ_FIRST.

3WRITE_MODE_A=WRITE_FIRST.

Libraries Guide

498 www.xilinx.com 10.1

Page 499: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Truth Table B

Inputs Outputs

GSR ENB SSRB WEB CLKB ADDRB DIB DIPB DOB DOPB RAM Contents

Data RAMParityRAM

1 X X X X X X X INIT_B INIT_B No Change No Change

0 0 X X X X X X No Change No Change No Change No Change

0 1 1 0 ↑ X X X SRVAL_B SRVAL_B No Change No Change

0 1 1 1 ↑ addr data pdata SRVAL_B SRVAL_B RAM(addr)=>data

RAM(addr)=>pdata

0 1 0 0 ↑ addr X X RAM(addr) RAM(addr) No Change No Change

0 1 0 1 ↑ addr data pdata No Change1,RAM(addr)=>data,data3

No Change1,RAM(addr)=>data,pdata3

RAM(addr)=>data

RAM(addr)=>pdata

GSR=Global Set Reset.

INIT_B=Value specified by the INIT_B attribute for output registers. Default is all zeros.

SRVAL_B=register value.

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

pdata=RAM parity data.

1WRITE_MODE_B=NO_CHANGE.

2WRITE_MODE_B=READ_FIRST.

3WRITE_MODE_B=WRITE_FIRST.

Port DescriptionsPort A Port B

Design ElementDataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

DataCells(a)

ParityCells(a)

AddressBus

DataBus

ParityBus

RAMB16_S9_S9 2048 x 8 2048 x 1 (10:0) (7:0) (0:0) 2048 x 8 2048 x 1 (10:0) (7:0) (0:0)

(a)Depth x Width

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB. The enable ENA pin controls read, write, and reset for Port A. When ENA is Low, nodata is written and the outputs (DOA and DOPA) retain the last state. When ENA is High and reset (SSRA) isHigh, DOA and DOPA are set to SRVAL_A during the Low-to-High clock (CLKA) transition; if write enable(WEA) is High, the memory contents reflect the data at DIA and DIPA. When ENA is High and WEA is Low,the data stored in the RAM address (ADDRA) is read during the Low-to-High clock transition. By default,WRITE_MODE_A=WRITE_FIRST, when ENA and WEA are High, the data on the data inputs (DIA and DIPA) isloaded into the word selected by the write address (ADDRA) during the Low-to-High clock transition and thedata outputs (DOA and DOPA) reflect the selected (addressed) word.

Libraries Guide

10.1 www.xilinx.com 499

Page 500: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

The enable ENB pin controls read, write, and reset for Port B. When ENB is Low, no data is written and theoutputs (DOB and DOPB) retain the last state. When ENB is High and reset (SSRB) is High, DOB and DOPB areset to SRVAL_B during the Low-to-High clock (CLKB) transition; if write enable (WEB) is High, the memorycontents reflect the data at DIB and DIPB. When ENB is High and WEB is Low, the data stored in the RAMaddress (ADDRB) is read during the Low-to-High clock transition. By default, WRITE_MODE_B=WRITE_FIRST,when ENB and WEB are High, the data on the data inputs (DIB and PB) are loaded into the word selected by thewrite address (ADDRB) during the Low-to-High clock transition and the data outputs (DOB and DOPB) reflectthe selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA, SSRA,CLKA, ENB, WEB, SSRB, and CLKB). However, the active level can be changed by placing an inverter on theport. Any inverter placed on a RAMB16 port is absorbed into the block and does not use a CLB resource.

Address Mapping

Each port accesses the same set of 18432 memory cells using an addressing scheme that is dependent on thewidth of the port. For all port widths, 16384 memory cells are available for data as shown in the “Port AddressMapping for Data” table below. For 9-, 18-, and 36-bit wide ports, 2408 parity memory cells are also available asshown in “Port Address Mapping for Parity” table below. The physical RAM location that is addressed for aparticular width is determined from the following formula.

Start=((ADDR port+1)*(Widthport)) -1

End=(ADDRport)*(Widthport)

Port Address Mapping for Data

DataWidth Port Data Addresses

1 16384 <-- 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 8192 <-- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 4096 <-- 7 6 5 4 3 2 1 0

8 2048 <-- 3 2 1 0

16 1024 <-- 1 0

32 512 <-- 0

Port Address Mapping for Parity

ParityWidth Port Parity Addresses

1 2048 <----- 3 2 1 0

2 1024 <----- 1 0

4 512 <----- 0

Initializing Memory Contents of a Dual-Port RAMB16

You can use the INIT_xx attributes to specify an initialization value for the memory contents of a RAMB16 duringdevice configuration. The initialization of each RAMB16_Sm_Sn is set by 64 initialization attributes (INIT_00through INIT_3F) of 64 hex values for a total of 16384 bits.

You can use the INITP_xx attributes to specify an initial value for the parity memory during device configurationor assertion. The initialization of the parity memory for ports configured for 9, 18, or 36 bits is set by 8initialization attributes (INITP_00 through INITP_07) of 64 hex values for a total of 2048 bits.

If any INIT_xx or INITP_xx attribute is not specified, it is configured as zeros. Partial Strings are padded withzeros to the left.

Initializing the Output Register of a Dual-Port RAMB16

Libraries Guide

500 www.xilinx.com 10.1

Page 501: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

In Spartan-3A, each bit in an output register can be initialized at power on (when GSR is high) to either a 0 or 1.In addition, the initial state specified for power on can be different than the state that results from assertion of aset/reset. Four properties control initialization of the output register for a dual-port RAMB16: INIT_A, INIT_B,SRVAL_A, and SRVAL_B. The INIT_A attribute specifies the output register value at power on for Port A and theINIT_B attribute specifies the value for Port B. You can use the SRVAL_A attribute to define the state resultingfrom assertion of the SSR (set/reset) input on Port A. You can use the SRVAL_B attribute to define the stateresulting from assertion of the SSR input on Port B.

The INIT_A, INIT_B, SRVAL_A, and SRVAL_B attributes specify the initialization value as a hexadecimal String.The value is dependent upon the port width. For example, for a RAMB16_S1_S4 with Port A width equal to 1and Port B width equal to 4, the Port A output register contains 1 bit and the Port B output register contains 4bits. Therefore, the INIT_A or SRVAL_A value can only be specified as a 1 or 0. For Port B, the output registercontains 4 bits. In this case, you can use INIT_B or SRVAL_B to specify a hexadecimal value from 0 through F toinitialize the 4 bits of the output register.

For those ports that include parity bits, the parity portion of the output register is specified in the high order bitposition of the INIT_A, INIT_B, SRVAL_A, or SRVAL_B value.

The INIT and SRVAL attributes default to zero if they are not set by you.

Write Mode Selection

TheWRITE_MODE_A attribute controls the memory and output contents of Port A for a dual-port RAMB16. TheWRITE_MODE_B attribute does the same for Port B. By default, both WRITE_MODE_A and WRITE_MODE_Bare set to WRITE_FIRST. This means that input is read, written to memory, and then passed to output. You canset the write mode for Port A and Port B to READ_FIRST to read the memory contents, pass the memory contentsto the outputs, and then write the input to memory. Or, you can set the write mode to NO_CHANGE to have theinput written to memory without changing the output. The “Port A and Port B Conflict Resolution” sectiondescribes how read/write conflicts are resolved when both Port A and Port B are attempting to read/write tothe same memory cells.

Port A and Port B Conflict Resolution

Spartan-3A block SelectRAM is True Dual-Port RAM that allows both ports to simultaneously access the samememory cell. When one port writes to a given memory cell, the other port must not address that memory cell (fora write or a read) within the clock-to-clock setup window.

The following tables summarize the collision detection behavior of the dual-port RAMB16 based on theWRITE_MODE_A and WRITE_MODE_B settings.

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=NO_CHANGE

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X NoChange

X NoChange

DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

NoChange

NoChange

NoChange

X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

Libraries Guide

10.1 www.xilinx.com 501

Page 502: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM X X

WRITE_MODE_A= WRITE_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB DIA X DIPA X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X X X X X X

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=READ_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIB DIPB

WRITE_MODE_A=NO_CHANGE and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB NoChange

X NoChange

X X X

WRITE_MODE_A=READ_FIRST and WRITE_MODE_B=WRITE_FIRST

WEA WEB CLKA CLKB DIA DIB DIPA DIPB DOA DOB DOPA DOPBDataRAM

ParityRam

0 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM NoChange

NoChange

1 0 ↑ ↑ DIA DIB DIPA DIPB RAM RAM RAM RAM DIA DIPA

0 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIB DIPB

1 1 ↑ ↑ DIA DIB DIPA DIPB X DIB X DIPB DIA DIPA

Libraries Guide

502 www.xilinx.com 10.1

Page 503: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards Yes

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 To INIT_3F Binary/Hexadecimal

Any All zeros Specifies the initial contents of the dataportion of the RAM array.

INIT_A Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INIT_B Binary/Hexadecimal

Any All zeros Identifies the initial value of theDOA/DOB output port after completingconfiguration. For Type, the bit widthis dependent on the width of the A orB port of the RAM.

INITP_00 ToINITP_07

Binary/Hexadecimal

Any All zeros Specifies the initial contents of theparity portion of the RAM array.

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_ X_ONLY”

"ALL” Specifies the behavior during simulationin the event of a data collision (databeing read or written to the sameaddress from both ports of the Ramsimultaneously. "ALL" issues a warningto simulator console and generate an Xor all unknown data due to the collision.This is the recommended setting."WARNING" generates a warning onlyand "GENERATE_X_ONLY" generatesan X for unknown data but won’toutput the occurrence to the simulationconsole. "NONE" completely ignoresthe error. It is suggested to only changethis attribute if you can ensure thedata generated during a collision isdiscarded.

SRVAL_A Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTA pin. For Type,the bit width is dependent on the widthof the A port of the RAM.

SRVAL_B Binary/Hexadecimal

Any All zeros Allows the individual selection ofwhether the DOA/DOB output port sets(go to a one) or reset (go to a zero) uponthe assertion of the RSTB pin. For Type,the bit width is dependent on the widthof the B port of the RAM.

Libraries Guide

10.1 www.xilinx.com 503

Page 504: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Description

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOBport upon a write command to therespected port. If set to "WRITE_FIRST",the same port that is written to displaysthe contents of the written data tothe outputs upon completion of theoperation. "READ_FIRST" displaysthe prior contents of the RAM tothe output port prior to writing thenew data. "NO_CHANGE" keeps theprevious value on the output port andwon’t update the output port upon awrite command. This is the suggestedmode if not using the read data from aparticular port of the RAM.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB16_S9_S9: Virtex-II/II-Pro, Spartan-3/3E 2k x 8 + 1 Parity bit Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S9_S9_inst : RAMB16_S9_S9generic map (INIT_A => X"000", -- Value of output RAM registers on Port A at startupINIT_B => X"000", -- Value of output RAM registers on Port B at startupSRVAL_A => X"000", -- Port A ouput value upon SSR assertionSRVAL_B => X"000", -- Port B ouput value upon SSR assertionWRITE_MODE_A => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGEWRITE_MODE_B => "WRITE_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGESIM_COLLISION_CHECK => "ALL", -- "NONE", "WARNING", "GENERATE_X_ONLY", "ALL"-- The following INIT_xx declarations specify the initial contents of the RAM-- Address 0 to 511INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",

Libraries Guide

504 www.xilinx.com 10.1

Page 505: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 512 to 1023INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 1024 to 1535INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 1536 to 2047INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_3C => 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-- Address 0 to 511INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 512 to 1023INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 1024 to 1535INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",-- Address 1536 to 2047INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 8-bit Data OutputDOB => DOB, -- Port B 8-bit Data OutputDOPA => DOPA, -- Port A 1-bit Parity OutputDOPB => DOPB, -- Port B 1-bit Parity Output

Libraries Guide

10.1 www.xilinx.com 505

Page 506: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ADDRA => ADDRA, -- Port A 11-bit Address InputADDRB => ADDRB, -- Port B 11-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 8-bit Data InputDIB => DIB, -- Port B 8-bit Data InputDIPA => DIPA, -- Port A 1-bit parity InputDIPB => DIPB, -- Port-B 1-bit parity InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- PortB RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input);

-- End of RAMB16_S9_S9_inst instantiation

Verilog Instantiation Template// RAMB16_S9_S9: Spartan-3/3E/3A/3AN/3AD 2k x 8 + 1 Parity bit Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB16_S9_S9 #(.INIT_A(9’h000), // Value of output RAM registers on Port A at startup.INIT_B(9’h000), // Value of output RAM registers on Port B at startup.SRVAL_A(9’h000), // Port A output value upon SSR assertion.SRVAL_B(9’h000), // Port B output 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_ONLY", "GENERATE_X_ONLY", "ALL"

// The following INIT_xx declarations specify the initial contents of the RAM// Address 0 to 511.INIT_00(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_01(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_02(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_03(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_04(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_05(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_06(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_07(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_08(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_09(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_0A(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_0B(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_0C(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_0D(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_0E(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_0F(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),// Address 512 to 1023.INIT_10(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_11(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_12(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_13(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_14(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_15(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_16(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_17(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_18(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_19(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_1A(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_1B(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_1C(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_1D(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_1E(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_1F(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),// Address 1024 to 1535.INIT_20(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

Libraries Guide

506 www.xilinx.com 10.1

Page 507: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_21(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_22(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_23(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_24(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_25(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_26(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_27(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_28(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_29(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_2A(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_2B(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_2C(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_2D(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_2E(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

.INIT_2F(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),// Address 1536 to 2047.INIT_30(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_31(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_32(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_33(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_34(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_35(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_36(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_37(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_38(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_39(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_3A(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_3B(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_3C(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_3D(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_3E(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),.INIT_3F(256’h00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00),

// The next set of INITP_xx are for the parity bits// Address 0 to 511.INITP_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_01(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 512 to 1023.INITP_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_03(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 1024 to 1535.INITP_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_05(256’h0000000000000000000000000000000000000000000000000000000000000000),// Address 1536 to 2047.INITP_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INITP_07(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB16_S9_S9_inst (.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), // 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_S9_S9_inst instantiation

Libraries Guide

10.1 www.xilinx.com 507

Page 509: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S1Primitive: 4K-Bit Single-Port Synchronous Block RAM with Port Width Configured to 1 Bit

IntroductionThis design element is a dedicated, random access memory block with synchronous write capability. It providesthe capability for fast, discrete, large blocks of RAM in each device. This element is configured as indicated inthe following table:

Design Element Depth Width Address Bus Data Bus

RAMB4_S1 4096 1 (11:0) (0:0)

The enable (EN) pin controls read, write, and reset. When EN is Low, no data is written and the output (DO)retains the last state. When EN is High and reset (RST) is High, DO is cleared during the Low-to-High clock(CLK) transition; if write enable (WE) is High, the memory contents reflect the data at DI. When EN is Highand WE is Low, the data stored in the RAM address (ADDR) is read during the Low-to-High clock transition.When EN and WE are High, the data on the data input (DI) is loaded into the word selected by the write address(ADDR) during the Low-to-High clock transition and the data output (DO) reflects the selected (addressed)word. The above description assumes an active High EN, WE, RST, and CLK. However, the active level canbe changed by placing an inverter on the port. Any inverter placed on a RAMB4 port is absorbed into theblock and does not use a CLB resource.

This element can be initialized during configuration. Block RAM output registers are asynchronously cleared,output Low, when power is applied. The initial contents of the block RAM are not altered. For FPGA devices,power-on conditions are simulated when global set/reset (GSR) is active. GSR defaults to active-High but can beinverted by adding an inverter in front of the GSR input of the appropriate STARTUP_architecture symbol.

Logic TableInputs Outputs

EN RST WE CLK ADDR DI DO RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

Specifying Initial Contents of a Block RAM -

Libraries Guide

10.1 www.xilinx.com 509

Page 510: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

You can use the INIT_xx attributes to specify an initial value during device configuration. The initialization ofeach of these elements is set by 16 initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a totalof 4096 bits. If any INIT_0x attribute is not specified, it is configured as zeros. Partial initialization strings arepadded with zeros to the left.

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S1: Virtex/E, Spartan-II/IIE 4k x 1 Single-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S1_inst : RAMB4_S1generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DO => DO, -- 1-bit data outputADDR => ADDR, -- 12-bit address inputCLK => CLK, -- Clock inputDI => DI, -- 1-bit data inputEN => EN, -- RAM enable inputRST => RST, -- Synchronous reset inputWE => WE -- RAM write enable input);

-- End of RAMB4_S1_inst instantiation

Verilog Instantiation Template// RAMB4_S1: Virtex/E, Spartan-II/IIE 4k x 1 Single-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S1 #(// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

510 www.xilinx.com 10.1

Page 511: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S1_inst (.DO(DO), // 1-bit data output.ADDR(ADDR), // 12-bit address input.CLK(CLK), // Clock input.DI(DI), // 1-bit data input.EN(EN), // RAM enable input.RST(RST), // Synchronous reset input.WE(WE) // RAM write enable input);

// End of RAMB4_S1_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 511

Page 512: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S1_S1

Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to 1-bit

IntroductionThis design element is a 4096-bit dual-ported dedicated random access memory block with synchronous writecapability. Each port is independent of the other while accessing the same set of 4096 memory cells. Each port isindependently configured to a specific data width, as expressed in the following table:

Design ElementPort ADepth

Port AWidth

Port AADDR

Port ADI

Port BDepth

Port BWidth

Port BADDR Port B DI

RAMB4_S1_S1 4096 1 (11:0) (0:0) 4096 1 (11:0) (0:0)

ADDR=address bus for the port

DI=data input bus for the port

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB.

The enable ENA pin controls read, write, and reset for port A. When ENA is Low, no data is written and theoutput (DOA) retains the last state. When ENA is High and reset (RSTA) is High, DOA is cleared during theLow-to-High clock (CLKA) transition; if write enable (WEA) is High, the memory contents reflect the data atDIA. When ENA is High and WEA is Low, the data stored in the RAM address (ADDRA) is read during theLow-to-High clock transition. When ENA and WEA are High, the data on the data input (DIA) is loadedinto the word selected by the write address (ADDRA) during the Low-to-High clock transition and the dataoutput (DOA) reflects the selected (addressed) word.

The enable ENB pin controls read, write, and reset for port B. When ENB is Low, no data is written and theoutput (DOB) retains the last state. When ENB is High and reset (RSTB) is High, DOB is cleared during theLow-to-High clock (CLKB) transition; if write enable (WEB) is High, the memory contents reflect the data atDIB. When ENB is High and WEB is Low, the data stored in the RAM address (ADDRB) is read during theLow-to-High clock transition. When ENB and WEB are High, the data on the data input (DIB) is loaded into theword selected by the write address (ADDRB) during the Low-to-High clock transition and the data output (DOB)reflects the selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA,RSTA, CLKA, ENB, WEB, RSTB, and CLKB). However, the active level can be changed by placing an inverter onthe port. Any inverter placed on a RAMB4 port is absorbed into the block and does not use a CLB resource.

Block RAM output registers are asynchronously cleared, output Low, when power is applied. The initial contentsof the block RAM are not altered. For FPGA devices, power-on conditions are simulated when global set/reset(GSR) is active. GSR defaults to active-High but can be inverted by adding an inverter in front of the GSR inputof the appropriate STARTUP_architecture symbol.

Libraries Guide

512 www.xilinx.com 10.1

Page 513: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

You can use the INIT_0x attributes to specify an initial value during device configuration. There are 16initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a total of 4096 bits. If any INIT_0xattribute is not specified, it is configured as zeros. Partial initialization strings are padded with zeros to the left.

Logic TableInputs Outputs

EN(A/B) RST(A/B) WE(A/B) CLK(A/B) ADDR(A/B) DI(A/B) DO(A/B) RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address of port A/B

RAM(addr)=RAM contents at address ADDRA/ADDRB

data=RAM input data at pins DIA/DIB

Port DescriptionsAddress Mapping - Each port accesses the same set of 4096 memory cells using an addressing scheme that isdependent on the width of the port. The physical RAM location that is addressed for a particular width isdetermined from the following formula.• Start=((ADDR port+1)*(Widthport)) -1• End=(ADDRport)*(Widthport)

Port Width Port Addresses

1 4096 <----- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Port Conflict resolution - This design element is a true dual-ported RAM in that it allows simultaneous reads ofthe same memory cell. When one port is performing a write to a given memory cell, the other port should notaddress that memory cell (for a write or a read) within the clock-to-clock setup window.• If both ports write to the same memory cell simultaneously, violating the clock-to-setup requirement, the

data stored will be invalid.• If one port attempts to read from the same memory cell that the other is simultaneously writing to, violating

the clock setup requirement, the write will be successful but the data read will be invalid.

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

Libraries Guide

10.1 www.xilinx.com 513

Page 514: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S1_S1: Virtex/E, Spartan-II/IIE 4k x 1 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S1_S1_inst : RAMB4_S1_S1generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000"")port map (DOA => DOA, -- Port A 1-bit data outputDOB => DOB, -- Port B 1-bit data outputADDRA => ADDRA, -- Port A 12-bit address inputADDRB => ADDRB, -- Port B 12-bit address inputCLKA => CLKA, -- Port A clock inputCLKB => CLKB, -- Port B clock inputDIA => DIA, -- Port A 1-bit data inputDIB => DIB, -- Port B 1-bit data inputENA => ENA, -- Port A RAM enable inputENB => ENB, -- Port B RAM enable inputRSTA => RSTA, -- Port A Synchronous reset inputRSTB => RSTB, -- Port B Synchronous reset inputWEA => WEA, -- Port A RAM write enable inputWEB => WEB -- Port B RAM write enable input);

-- End of RAMB4_S1_S1_inst instantiation

Verilog Instantiation Template// RAMB4_S1_S1: Virtex/E, Spartan-II/IIE 4k x 1 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S1_S1 #(.SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

514 www.xilinx.com 10.1

Page 515: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S1_S1_inst (.DOA(DOA), // Port A 1-bit data output.DOB(DOB), // Port B 1-bit data output.ADDRA(ADDRA), // Port A 12-bit address input.ADDRB(ADDRB), // Port B 12-bit address input.CLKA(CLKA), // Port A clock input.CLKB(CLKB), // Port B clock input.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), // Port B RAM enable input.RSTA(RSTA), // Port A Synchronous reset input.RSTB(RSTB), // Port B Synchronous reset input.WEA(WEA), // Port A RAM write enable input.WEB(WEB) // Port B RAM write enable input);

// End of RAMB4_S1_S1_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 515

Page 516: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S1_S16Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to 1-bit and 16-bits

IntroductionThis design element is a 4096-bit dual-ported dedicated random access memory block with synchronous writecapability. Each port is independent of the other while accessing the same set of 4096 memory cells. Each port isindependently configured to a specific data width, as expressed in the following table:

Design ElementPort ADepth

Port AWidth

Port AADDR

Port ADI

Port BDepth

Port BWidth

Port BADDR Port B DI

RAMB4_S1_S16 4096 1 (11:0) (0:0) 256 16 (7:0) (15:0)

ADDR=address bus for the port

DI=data input bus for the port

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB.

The enable ENA pin controls read, write, and reset for port A. When ENA is Low, no data is written and theoutput (DOA) retains the last state. When ENA is High and reset (RSTA) is High, DOA is cleared during theLow-to-High clock (CLKA) transition; if write enable (WEA) is High, the memory contents reflect the data atDIA. When ENA is High and WEA is Low, the data stored in the RAM address (ADDRA) is read during theLow-to-High clock transition. When ENA and WEA are High, the data on the data input (DIA) is loadedinto the word selected by the write address (ADDRA) during the Low-to-High clock transition and the dataoutput (DOA) reflects the selected (addressed) word.

The enable ENB pin controls read, write, and reset for port B. When ENB is Low, no data is written and theoutput (DOB) retains the last state. When ENB is High and reset (RSTB) is High, DOB is cleared during theLow-to-High clock (CLKB) transition; if write enable (WEB) is High, the memory contents reflect the data atDIB. When ENB is High and WEB is Low, the data stored in the RAM address (ADDRB) is read during theLow-to-High clock transition. When ENB and WEB are High, the data on the data input (DIB) is loaded into theword selected by the write address (ADDRB) during the Low-to-High clock transition and the data output (DOB)reflects the selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA,RSTA, CLKA, ENB, WEB, RSTB, and CLKB). However, the active level can be changed by placing an inverter onthe port. Any inverter placed on a RAMB4 port is absorbed into the block and does not use a CLB resource.

Block RAM output registers are asynchronously cleared, output Low, when power is applied. The initial contentsof the block RAM are not altered. For FPGA devices, power-on conditions are simulated when global set/reset(GSR) is active. GSR defaults to active-High but can be inverted by adding an inverter in front of the GSR inputof the appropriate STARTUP_architecture symbol.

Libraries Guide

516 www.xilinx.com 10.1

Page 517: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

You can use the INIT_0x attributes to specify an initial value during device configuration. There are 16initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a total of 4096 bits. If any INIT_0xattribute is not specified, it is configured as zeros. Partial initialization strings are padded with zeros to the left.

Logic TableInputs Outputs

EN(A/B) RST(A/B) WE(A/B) CLK(A/B) ADDR(A/B) DI(A/B) DO(A/B) RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address of port A/B

RAM(addr)=RAM contents at address ADDRA/ADDRB

data=RAM input data at pins DIA/DIB

Port DescriptionsAddress Mapping - Each port accesses the same set of 4096 memory cells using an addressing scheme that isdependent on the width of the port. The physical RAM location that is addressed for a particular width isdetermined from the following formula.• Start=((ADDR port+1)*(Widthport)) -1• End=(ADDRport)*(Widthport)

Port Width Port Addresses

1 4096 <----- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

16 256 <----- 0

Port Conflict resolution - This design element is a true dual-ported RAM in that it allows simultaneous reads ofthe same memory cell. When one port is performing a write to a given memory cell, the other port should notaddress that memory cell (for a write or a read) within the clock-to-clock setup window.• If both ports write to the same memory cell simultaneously, violating the clock-to-setup requirement, the

data stored will be invalid.• If one port attempts to read from the same memory cell that the other is simultaneously writing to, violating

the clock setup requirement, the write will be successful but the data read will be invalid.

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

Libraries Guide

10.1 www.xilinx.com 517

Page 518: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S1_S16: Virtex/E, Spartan-II/IIE 4k/256 x 1/16 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S1_S16_inst : RAMB4_S1_S16generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 1-bit data outputDOB => DOB, -- Port B 16-bit data outputADDRA => ADDRA, -- Port A 12-bit address inputADDRB => ADDRB, -- Port B 8-bit address inputCLKA => CLKA, -- Port A clock inputCLKB => CLKB, -- Port B clock inputDIA => DIA, -- Port A 1-bit data inputDIB => DIB, -- Port B 16-bit data inputENA => ENA, -- Port A RAM enable inputENB => ENB, -- Port B RAM enable inputRSTA => RSTA, -- Port A Synchronous reset inputRSTB => RSTB, -- Port B Synchronous reset inputWEA => WEA, -- Port A RAM write enable inputWEB => WEB -- Port B RAM write enable input);

-- End of RAMB4_S1_S16_inst instantiation

Verilog Instantiation Template// RAMB4_S1_S16: Virtex/E, Spartan-II/IIE 4k/256 x 1/16 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S1_S16 #(.SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

518 www.xilinx.com 10.1

Page 519: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S1_S16_inst (.DOA(DOA), // Port A 1-bit data output.DOB(DOB), // Port B 16-bit data output.ADDRA(ADDRA), // Port A 12-bit address input.ADDRB(ADDRB), // Port B 8-bit address input.CLKA(CLKA), // Port A clock input.CLKB(CLKB), // Port B clock input.DIA(DIA), // Port A 1-bit data input.DIB(DIB), // Port B 16-bit data input.ENA(ENA), // Port A RAM enable input.ENB(ENB), // Port B RAM enable input.RSTA(RSTA), // Port A Synchronous reset input.RSTB(RSTB), // Port B Synchronous reset input.WEA(WEA), // Port A RAM write enable input.WEB(WEB) // Port B RAM write enable input);

// End of RAMB4_S1_S16_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 519

Page 520: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S1_S2Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to 1-bit and 2-bits

IntroductionThis design element is a 4096-bit dual-ported dedicated random access memory block with synchronous writecapability. Each port is independent of the other while accessing the same set of 4096 memory cells. Each port isindependently configured to a specific data width, as expressed in the following table:

Design ElementPort ADepth

Port AWidth

Port AADDR

Port ADI

Port BDepth

Port BWidth

Port BADDR Port B DI

RAMB4_S1_S2 4096 1 (11:0) (0:0) 2048 2 (10:0) (1:0)

ADDR=address bus for the port

DI=data input bus for the port

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB.

The enable ENA pin controls read, write, and reset for port A. When ENA is Low, no data is written and theoutput (DOA) retains the last state. When ENA is High and reset (RSTA) is High, DOA is cleared during theLow-to-High clock (CLKA) transition; if write enable (WEA) is High, the memory contents reflect the data atDIA. When ENA is High and WEA is Low, the data stored in the RAM address (ADDRA) is read during theLow-to-High clock transition. When ENA and WEA are High, the data on the data input (DIA) is loadedinto the word selected by the write address (ADDRA) during the Low-to-High clock transition and the dataoutput (DOA) reflects the selected (addressed) word.

The enable ENB pin controls read, write, and reset for port B. When ENB is Low, no data is written and theoutput (DOB) retains the last state. When ENB is High and reset (RSTB) is High, DOB is cleared during theLow-to-High clock (CLKB) transition; if write enable (WEB) is High, the memory contents reflect the data atDIB. When ENB is High and WEB is Low, the data stored in the RAM address (ADDRB) is read during theLow-to-High clock transition. When ENB and WEB are High, the data on the data input (DIB) is loaded into theword selected by the write address (ADDRB) during the Low-to-High clock transition and the data output (DOB)reflects the selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA,RSTA, CLKA, ENB, WEB, RSTB, and CLKB). However, the active level can be changed by placing an inverter onthe port. Any inverter placed on a RAMB4 port is absorbed into the block and does not use a CLB resource.

Block RAM output registers are asynchronously cleared, output Low, when power is applied. The initial contentsof the block RAM are not altered. For FPGA devices, power-on conditions are simulated when global set/reset(GSR) is active. GSR defaults to active-High but can be inverted by adding an inverter in front of the GSR inputof the appropriate STARTUP_architecture symbol.

Libraries Guide

520 www.xilinx.com 10.1

Page 521: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

You can use the INIT_0x attributes to specify an initial value during device configuration. There are 16initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a total of 4096 bits. If any INIT_0xattribute is not specified, it is configured as zeros. Partial initialization strings are padded with zeros to the left.

Logic TableInputs Outputs

EN(A/B) RST(A/B) WE(A/B) CLK(A/B) ADDR(A/B) DI(A/B) DO(A/B) RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address of port A/B

RAM(addr)=RAM contents at address ADDRA/ADDRB

data=RAM input data at pins DIA/DIB

Port DescriptionsAddress Mapping - Each port accesses the same set of 4096 memory cells using an addressing scheme that isdependent on the width of the port. The physical RAM location that is addressed for a particular width isdetermined from the following formula.• Start=((ADDR port+1)*(Widthport)) -1• End=(ADDRport)*(Widthport)

Port Width Port Addresses

1 4096 <----- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 2048 <----- 7 6 5 4 3 2 1 0

Port Conflict resolution - This design element is a true dual-ported RAM in that it allows simultaneous reads ofthe same memory cell. When one port is performing a write to a given memory cell, the other port should notaddress that memory cell (for a write or a read) within the clock-to-clock setup window.• If both ports write to the same memory cell simultaneously, violating the clock-to-setup requirement, the

data stored will be invalid.• If one port attempts to read from the same memory cell that the other is simultaneously writing to, violating

the clock setup requirement, the write will be successful but the data read will be invalid.

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

Libraries Guide

10.1 www.xilinx.com 521

Page 522: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT_00 ToINIT_3F

Binary/Hexidecimal

Any All zeros Specifies the initial contents of the data portionof the RAM array.

INIT_A Binary/Hexidecimal

Any All zeros Identifies the initial value of the DOA/DOBoutput port after completing configuration. ForType, the bit width is dependent on the width ofthe A or B port of the RAM.

INIT_B Binary/Hexidecimal

Any All zeros Identifies the initial value of the DOA/DOBoutput port after completing configuration. ForType, the bit width is dependent on the width ofthe A or B port of the RAM.

INITP_00 ToINITP_07

Binary/Hexidecimal

Any All zeros Specifies the initial contents of the parity portionof the RAM array.

SIM_COLLISION_CHECK

String "ALL”, ¨NONE”,¨WARNING”, or"GENERATE_X_ONLY”

"ALL” Specifies the behavior during simulation in theevent of a data collision (data being read orwritten to the same address from both ports ofthe Ram simultaneously. "ALL" issues a warningto simulator console and generate an X or allunknown data due to the collision. This is therecommended setting. "WARNING" generatesa warning only and "GENERATE_X_ONLY"generates an X for unknown data but won’t outputthe occurrence to the simulation console. "NONE"completely ignores the error. It is suggested toonly change this attribute if you can ensure thedata generated during a collision is discarded.

SRVAL_A Binary/Hexidecimal

Any All zeros Allows the individual selection of whether theDOA/DOB output port sets (go to a one) or reset(go to a zero) upon the assertion of the RSTA pin.For Type, the bit width is dependent on the widthof the A port of the RAM.

SRVAL_B Binary/Hexidecimal

Any All zeros Allows the individual selection of whether theDOA/DOB output port sets (go to a one) or reset(go to a zero) upon the assertion of the RSTB pin.For Type, the bit width is dependent on the widthof the B port of the RAM.

WRITE_MODE_A String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOB port upona write command to the respected port. If set to"WRITE_FIRST", the same port that is writtento displays the contents of the written data tothe outputs upon completion of the operation."READ_FIRST" displays the prior contents ofthe RAM to the output port prior to writing thenew data. "NO_CHANGE" keeps the previousvalue on the output port and won’t update theoutput port upon a write command. This is thesuggested mode if not using the read data from aparticular port of the RAM

WRITE_MODE_B String "WRITE_FIRST","READ_FIRST" or"NO_CHANGE”

"WRITE_FIRST”

Specifies the behavior of the DOA/DOB port upona write command to the respected port. If set to"WRITE_FIRST", the same port that is writtento displays the contents of the written data tothe outputs upon completion of the operation."READ_FIRST" displays the prior contents ofthe RAM to the output port prior to writing thenew data. "NO_CHANGE" keeps the previousvalue on the output port and won’t update the

Libraries Guide

522 www.xilinx.com 10.1

Page 523: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Attribute Type Allowed Values Default Descriptionoutput port upon a write command. This is thesuggested mode if not using the read data from aparticular port of the RAM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S1_S2: Virtex/E, Spartan-II/IIE 4k/2k x 1/2 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S1_S2_inst : RAMB4_S1_S2generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 1-bit data outputDOB => DOB, -- Port B 2-bit data outputADDRA => ADDRA, -- Port A 12-bit address inputADDRB => ADDRB, -- Port B 11-bit address inputCLKA => CLKA, -- Port A clock inputCLKB => CLKB, -- Port B clock inputDIA => DIA, -- Port A 1-bit data inputDIB => DIB, -- Port B 2-bit data inputENA => ENA, -- Port A RAM enable inputENB => ENB, -- Port B RAM enable inputRSTA => RSTA, -- Port A Synchronous reset inputRSTB => RSTB, -- Port B Synchronous reset inputWEA => WEA, -- Port A RAM write enable inputWEB => WEB -- Port B RAM write enable input);

-- End of RAMB4_S1_S2_inst instantiation

Verilog Instantiation Template// RAMB4_S1_S2: Virtex/E, Spartan-II/IIE 4k/2k x 1/2 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S1_S2 #(.SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

10.1 www.xilinx.com 523

Page 524: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S1_S2_inst (.DOA(DOA), // Port A 1-bit data output.DOB(DOB), // Port B 2-bit data output.ADDRA(ADDRA), // Port A 12-bit address input.ADDRB(ADDRB), // Port B 11-bit address input.CLKA(CLKA), // Port A clock input.CLKB(CLKB), // Port B clock input.DIA(DIA), // Port A 1-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.RSTA(RSTA), // Port A Synchronous reset input.RSTB(RSTB), // Port B Synchronous reset input.WEA(WEA), // Port A RAM write enable input.WEB(WEB) // Port B RAM write enable input);

// End of RAMB4_S1_S2_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

524 www.xilinx.com 10.1

Page 525: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S1_S4Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to 1-bit and 4-bits

IntroductionThis design element is a 4096-bit dual-ported dedicated random access memory block with synchronous writecapability. Each port is independent of the other while accessing the same set of 4096 memory cells. Each port isindependently configured to a specific data width, as expressed in the following table:

Design ElementPort ADepth

Port AWidth

Port AADDR

Port ADI

Port BDepth

Port BWidth

Port BADDR Port B DI

RAMB4_S1_S4 4096 1 (11:0) (0:0) 1024 4 (9:0) (3:0)

ADDR=address bus for the port

DI=data input bus for the port

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB.

The enable ENA pin controls read, write, and reset for port A. When ENA is Low, no data is written and theoutput (DOA) retains the last state. When ENA is High and reset (RSTA) is High, DOA is cleared during theLow-to-High clock (CLKA) transition; if write enable (WEA) is High, the memory contents reflect the data atDIA. When ENA is High and WEA is Low, the data stored in the RAM address (ADDRA) is read during theLow-to-High clock transition. When ENA and WEA are High, the data on the data input (DIA) is loadedinto the word selected by the write address (ADDRA) during the Low-to-High clock transition and the dataoutput (DOA) reflects the selected (addressed) word.

The enable ENB pin controls read, write, and reset for port B. When ENB is Low, no data is written and theoutput (DOB) retains the last state. When ENB is High and reset (RSTB) is High, DOB is cleared during theLow-to-High clock (CLKB) transition; if write enable (WEB) is High, the memory contents reflect the data atDIB. When ENB is High and WEB is Low, the data stored in the RAM address (ADDRB) is read during theLow-to-High clock transition. When ENB and WEB are High, the data on the data input (DIB) is loaded into theword selected by the write address (ADDRB) during the Low-to-High clock transition and the data output (DOB)reflects the selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA,RSTA, CLKA, ENB, WEB, RSTB, and CLKB). However, the active level can be changed by placing an inverter onthe port. Any inverter placed on a RAMB4 port is absorbed into the block and does not use a CLB resource.

Block RAM output registers are asynchronously cleared, output Low, when power is applied. The initial contentsof the block RAM are not altered. For FPGA devices, power-on conditions are simulated when global set/reset(GSR) is active. GSR defaults to active-High but can be inverted by adding an inverter in front of the GSR inputof the appropriate STARTUP_architecture symbol.

Libraries Guide

10.1 www.xilinx.com 525

Page 526: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

You can use the INIT_0x attributes to specify an initial value during device configuration. There are 16initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a total of 4096 bits. If any INIT_0xattribute is not specified, it is configured as zeros. Partial initialization strings are padded with zeros to the left.

Logic TableInputs Outputs

EN(A/B) RST(A/B) WE(A/B) CLK(A/B) ADDR(A/B) DI(A/B) DO(A/B) RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address of port A/B

RAM(addr)=RAM contents at address ADDRA/ADDRB

data=RAM input data at pins DIA/DIB

Port DescriptionsAddress Mapping - Each port accesses the same set of 4096 memory cells using an addressing scheme that isdependent on the width of the port. The physical RAM location that is addressed for a particular width isdetermined from the following formula.• Start=((ADDR port+1)*(Widthport)) -1• End=(ADDRport)*(Widthport)

Port Width Port Addresses

1 4096 <----- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

4 1024 <----- 3 2 1 0

Port Conflict resolution - This design element is a true dual-ported RAM in that it allows simultaneous reads ofthe same memory cell. When one port is performing a write to a given memory cell, the other port should notaddress that memory cell (for a write or a read) within the clock-to-clock setup window.• If both ports write to the same memory cell simultaneously, violating the clock-to-setup requirement, the

data stored will be invalid.• If one port attempts to read from the same memory cell that the other is simultaneously writing to, violating

the clock setup requirement, the write will be successful but the data read will be invalid.

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

Libraries Guide

526 www.xilinx.com 10.1

Page 527: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S1_S4: Virtex/E, Spartan-II/IIE 4k/1k x 1/4 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S1_S4_inst : RAMB4_S1_S4generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 1-bit data outputDOB => DOB, -- Port B 4-bit data outputADDRA => ADDRA, -- Port A 12-bit address inputADDRB => ADDRB, -- Port B 10-bit address inputCLKA => CLKA, -- Port A clock inputCLKB => CLKB, -- Port B clock inputDIA => DIA, -- Port A 1-bit data inputDIB => DIB, -- Port B 4-bit data inputENA => ENA, -- Port A RAM enable inputENB => ENB, -- Port B RAM enable inputRSTA => RSTA, -- Port A Synchronous reset inputRSTB => RSTB, -- Port B Synchronous reset inputWEA => WEA, -- Port A RAM write enable inputWEB => WEB -- Port B RAM write enable input);

-- End of RAMB4_S1_S4_inst instantiation

Verilog Instantiation Template// RAMB4_S1_S4: Virtex/E, Spartan-II/IIE 4k/1k x 1/4 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S1_S4 #(.SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

10.1 www.xilinx.com 527

Page 528: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S1_S4_inst (.DOA(DOA), // Port A 1-bit data output.DOB(DOB), // Port B 4-bit data output.ADDRA(ADDRA), // Port A 12-bit address input.ADDRB(ADDRB), // Port B 10-bit address input.CLKA(CLKA), // Port A clock input.CLKB(CLKB), // Port B clock input.DIA(DIA), // Port A 1-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.RSTA(RSTA), // Port A Synchronous reset input.RSTB(RSTB), // Port B Synchronous reset input.WEA(WEA), // Port A RAM write enable input.WEB(WEB) // Port B RAM write enable input);

// End of RAMB4_S1_S4_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

528 www.xilinx.com 10.1

Page 529: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S1_S8Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to 1-bit and 8-bits

IntroductionThis design element is a 4096-bit dual-ported dedicated random access memory block with synchronous writecapability. Each port is independent of the other while accessing the same set of 4096 memory cells. Each port isindependently configured to a specific data width, as expressed in the following table:

Design ElementPort ADepth

Port AWidth

Port AADDR

Port ADI

Port BDepth

Port BWidth

Port BADDR Port B DI

RAMB4_S1_S8 4096 1 (11:0) (0:0) 512 8 (8:0) (7:0)

ADDR=address bus for the port

DI=data input bus for the port

Each port is fully synchronous with independent clock pins. All Port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All Port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB.

The enable ENA pin controls read, write, and reset for port A. When ENA is Low, no data is written and theoutput (DOA) retains the last state. When ENA is High and reset (RSTA) is High, DOA is cleared during theLow-to-High clock (CLKA) transition; if write enable (WEA) is High, the memory contents reflect the data atDIA. When ENA is High and WEA is Low, the data stored in the RAM address (ADDRA) is read during theLow-to-High clock transition. When ENA and WEA are High, the data on the data input (DIA) is loadedinto the word selected by the write address (ADDRA) during the Low-to-High clock transition and the dataoutput (DOA) reflects the selected (addressed) word.

The enable ENB pin controls read, write, and reset for port B. When ENB is Low, no data is written and theoutput (DOB) retains the last state. When ENB is High and reset (RSTB) is High, DOB is cleared during theLow-to-High clock (CLKB) transition; if write enable (WEB) is High, the memory contents reflect the data atDIB. When ENB is High and WEB is Low, the data stored in the RAM address (ADDRB) is read during theLow-to-High clock transition. When ENB and WEB are High, the data on the data input (DIB) is loaded into theword selected by the write address (ADDRB) during the Low-to-High clock transition and the data output (DOB)reflects the selected (addressed) word. The above descriptions assume active High control pins (ENA, WEA,RSTA, CLKA, ENB, WEB, RSTB, and CLKB). However, the active level can be changed by placing an inverter onthe port. Any inverter placed on a RAMB4 port is absorbed into the block and does not use a CLB resource.

Block RAM output registers are asynchronously cleared, output Low, when power is applied. The initial contentsof the block RAM are not altered. For FPGA devices, power-on conditions are simulated when global set/reset(GSR) is active. GSR defaults to active-High but can be inverted by adding an inverter in front of the GSR inputof the appropriate STARTUP_architecture symbol.

Libraries Guide

10.1 www.xilinx.com 529

Page 530: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

You can use the INIT_0x attributes to specify an initial value during device configuration. There are 16initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a total of 4096 bits. If any INIT_0xattribute is not specified, it is configured as zeros. Partial initialization strings are padded with zeros to the left.

Logic TableInputs Outputs

EN(A/B) RST(A/B) WE(A/B) CLK(A/B) ADDR(A/B) DI(A/B) DO(A/B) RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address of port A/B

RAM(addr)=RAM contents at address ADDRA/ADDRB

data=RAM input data at pins DIA/DIB

Port DescriptionsAddress Mapping - Each port accesses the same set of 4096 memory cells using an addressing scheme that isdependent on the width of the port. The physical RAM location that is addressed for a particular width isdetermined from the following formula.• Start=((ADDR port+1)*(Widthport)) -1• End=(ADDRport)*(Widthport)

Port Width Port Addresses

1 4096 <----- 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

8 512 <----- 1 0

Port Conflict resolution - This design element is a true dual-ported RAM in that it allows simultaneous reads ofthe same memory cell. When one port is performing a write to a given memory cell, the other port should notaddress that memory cell (for a write or a read) within the clock-to-clock setup window.• If both ports write to the same memory cell simultaneously, violating the clock-to-setup requirement, the

data stored will be invalid.• If one port attempts to read from the same memory cell that the other is simultaneously writing to, violating

the clock setup requirement, the write will be successful but the data read will be invalid.

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

Libraries Guide

530 www.xilinx.com 10.1

Page 531: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S1_S8: Virtex/E, Spartan-II/IIE 4k/512 x 1/8 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S1_S8_inst : RAMB4_S1_S8generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 1-bit data outputDOB => DOB, -- Port B 8-bit data outputADDRA => ADDRA, -- Port A 12-bit address inputADDRB => ADDRB, -- Port B 9-bit address inputCLKA => CLKA, -- Port A clock inputCLKB => CLKB, -- Port B clock inputDIA => DIA, -- Port A 1-bit data inputDIB => DIB, -- Port B 8-bit data inputENA => ENA, -- Port A RAM enable inputENB => ENB, -- Port B RAM enable inputRSTA => RSTA, -- Port A Synchronous reset inputRSTB => RSTB, -- Port B Synchronous reset inputWEA => WEA, -- Port A RAM write enable inputWEB => WEB -- Port B RAM write enable input);

-- End of RAMB4_S1_S8_inst instantiation

Verilog Instantiation Template// RAMB4_S1_S8: Virtex/E, Spartan-II/IIE 4k/512 x 1/8 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S1_S8 #(.SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

10.1 www.xilinx.com 531

Page 532: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S1_S8_inst (.DOA(DOA), // Port A 1-bit data output.DOB(DOB), // Port B 8-bit data output.ADDRA(ADDRA), // Port A 12-bit address input.ADDRB(ADDRB), // Port B 9-bit address input.CLKA(CLKA), // Port A clock input.CLKB(CLKB), // Port B clock input.DIA(DIA), // Port A 1-bit data input.DIB(DIB), // Port B 8-bit data input.ENA(ENA), // Port A RAM enable input.ENB(ENB), // Port B RAM enable input.RSTA(RSTA), // Port A Synchronous reset input.RSTB(RSTB), // Port B Synchronous reset input.WEA(WEA), // Port A RAM write enable input.WEB(WEB) // Port B RAM write enable input);

// End of RAMB4_S1_S8_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

532 www.xilinx.com 10.1

Page 533: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S16Primitive: 4096-Bit Single-Port Synchronous Block RAM with Port Width Configured to 16 Bits

IntroductionThis design element is a dedicated, random access memory block with synchronous write capability. It providesthe capability for fast, discrete, large blocks of RAM in each device. This element is configured as indicated inthe following table:

Design Element Depth Width Address Bus Data Bus

RAMB4_S16 256 16 (7:0) (15:0)

The enable (EN) pin controls read, write, and reset. When EN is Low, no data is written and the output (DO)retains the last state. When EN is High and reset (RST) is High, DO is cleared during the Low-to-High clock(CLK) transition; if write enable (WE) is High, the memory contents reflect the data at DI. When EN is Highand WE is Low, the data stored in the RAM address (ADDR) is read during the Low-to-High clock transition.When EN and WE are High, the data on the data input (DI) is loaded into the word selected by the write address(ADDR) during the Low-to-High clock transition and the data output (DO) reflects the selected (addressed)word. The above description assumes an active High EN, WE, RST, and CLK. However, the active level canbe changed by placing an inverter on the port. Any inverter placed on a RAMB4 port is absorbed into theblock and does not use a CLB resource.

This element can be initialized during configuration. Block RAM output registers are asynchronously cleared,output Low, when power is applied. The initial contents of the block RAM are not altered. For FPGA devices,power-on conditions are simulated when global set/reset (GSR) is active. GSR defaults to active-High but can beinverted by adding an inverter in front of the GSR input of the appropriate STARTUP_architecture symbol.

Logic TableInputs Outputs

EN RST WE CLK ADDR DI DO RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

Specifying Initial Contents of a Block RAM -

Libraries Guide

10.1 www.xilinx.com 533

Page 534: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

You can use the INIT_xx attributes to specify an initial value during device configuration. The initialization ofeach of these elements is set by 16 initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a totalof 4096 bits. If any INIT_0x attribute is not specified, it is configured as zeros. Partial initialization strings arepadded with zeros to the left.

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S16: Virtex/E, Spartan-II/IIE 256 x 16 Single-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S16_inst : RAMB4_S16generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DO => DO, -- 16-bit data outputADDR => ADDR, -- 8-bit address inputCLK => CLK, -- Clock inputDI => DI, -- 16-bit data inputEN => EN, -- RAM enable inputRST => RST, -- Synchronous reset inputWE => WE -- RAM write enable input);

-- End of RAMB4_S16_inst instantiation

Verilog Instantiation Template// RAMB4_S16: Virtex/E, Spartan-II/IIE 256 x 16 Single-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S16 #(// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

534 www.xilinx.com 10.1

Page 535: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S16_inst (.DO(DO), // 16-bit data output.ADDR(ADDR), // 8-bit address input.CLK(CLK), // Clock input.DI(DI), // 16-bit data input.EN(EN), // RAM enable input.RST(RST), // Synchronous reset input.WE(WE) // RAM write enable input);

// End of RAMB4_S16_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 535

Page 536: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S16_S16Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to 16-bits

IntroductionThis design element is a 4096-bit dual-ported dedicated random access memory block with synchronous writecapability. Each port is independent of the other while accessing the same set of 4096 memory cells. Each port isindependently configured to a specific data width, as expressed in the following table:

Design Element Port A DepthPort AWidth

Port AADDR Port ADI

Port BDepth

Port BWidth

Port BADDR Port B DI

RAMB4_S16_S16 256 16 (7:0) (15:0) 256 16 (7:0) (15:0)

ADDR=address bus for the port

DI=data input bus for the port

All Port A input pins have setup time referenced to the CLKA pin and its data output bus DOA has a clock-to-outtime referenced to the CLKA. All Port B input pins have setup time referenced to the CLKB pin and its dataoutput bus DOB has a clock-to-out time referenced to the CLKB.

The enable ENA pin controls read, write, and reset for port A. When ENA is Low, no data is written and theoutput (DOA) retains the last state. When ENA is High and reset (RSTA) is High, DOA is cleared during theLow-to-High clock (CLKA) transition; if write enable (WEA) is High, the memory contents reflect the data atDIA. When ENA is High and WEA is Low, the data stored in the RAM address (ADDRA) is read during theLow-to-High clock transition. When ENA and WEA are High, the data on the data input (DIA) is loadedinto the word selected by the write address (ADDRA) during the Low-to-High clock transition and the dataoutput (DOA) reflects the selected (addressed) word.

The enable ENB pin controls read, write, and reset for port B. When ENB is Low, no data is written and theoutput (DOB) retains the last state. When ENB is High and reset (RSTB) is High, DOB is cleared during theLow-to-High clock (CLKB) transition; if write enable (WEB) is High, the memory contents reflect the data atDIB. When ENB is High and WEB is Low, the data stored in the RAM address (ADDRB) is read during theLow-to-High clock transition. When ENB and WEB are High, the data on the data input (DIB) is loaded into theword selected by the write address (ADDRB) during the Low-to-High clock transition and the data output (DOB)reflects the selected (addressed) word.

The above descriptions assume active High control pins (ENA, WEA, RSTA, CLKA, ENB, WEB, RSTB, andCLKB). However, the active level can be changed by placing an inverter on the port. Any inverter placed on aRAMB4 port is absorbed into the block and does not use a CLB resource.

Block RAM output registers are asynchronously cleared, output Low, when power is applied. The initial contentsof the block RAM are not altered. For FPGA devices, power-on conditions are simulated when global set/reset(GSR) is active. GSR defaults to active-High but can be inverted by adding an inverter in front of the GSR inputof the appropriate STARTUP_architecture symbol.

Libraries Guide

536 www.xilinx.com 10.1

Page 537: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

You can use the INIT_0x attributes to specify an initial value during device configuration. There are 16initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a total of 4096 bits. If any INIT_0xattribute is not specified, it is configured as zeros. Partial initialization strings are padded with zeros to the left.

Logic TableInputs Outputs

EN(A/B) RST(A/B) WE(A/B) CLK(A/B) ADDR(A/B) DI(A/B) DO(A/B) RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address of port A/B

RAM(addr)=RAM contents at address ADDRA/ADDRB

data=RAM input data at pins DIA/DIB

Port DescriptionsAddress Mapping - Each port accesses the same set of 4096 memory cells using an addressing scheme that isdependent on the width of the port. The physical RAM location that is addressed for a particular width isdetermined from the following formula.• Start=((ADDR port+1)*(Widthport)) -1• End=(ADDRport)*(Widthport)

Port Width Port Addresses

16 256 <----- 0

Port Conflict resolution - This design element is a true dual-ported RAM in that it allows simultaneous reads ofthe same memory cell. When one port is performing a write to a given memory cell, the other port should notaddress that memory cell (for a write or a read) within the clock-to-clock setup window.• If both ports write to the same memory cell simultaneously, violating the clock-to-setup requirement, the

data stored will be invalid.• If one port attempts to read from the same memory cell that the other is simultaneously writing to, violating

the clock setup requirement, the write will be successful but the data read will be invalid.

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

Libraries Guide

10.1 www.xilinx.com 537

Page 538: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S16_S16: Virtex/E, Spartan-II/IIE 256 x 16 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S16_S16_inst : RAMB4_S16_S16generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 16-bit data outputDOB => DOB, -- Port B 16-bit data outputADDRA => ADDRA, -- Port A 8-bit address inputADDRB => ADDRB, -- Port B 8-bit address inputCLKA => CLKA, -- Port A clock inputCLKB => CLKB, -- Port B clock inputDIA => DIA, -- Port A 16-bit data inputDIB => DIB, -- Port B 16-bit data inputENA => ENA, -- Port A RAM enable inputENB => ENB, -- Port B RAM enable inputRSTA => RSTA, -- Port A Synchronous reset inputRSTB => RSTB, -- Port B Synchronous reset inputWEA => WEA, -- Port A RAM write enable inputWEB => WEB -- Port B RAM write enable input);

-- End of RAMB4_S16_S16_inst instantiation

Verilog Instantiation Template// RAMB4_S16_S16: Virtex/E, Spartan-II/IIE 256 x 16 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S16_S16 #(.SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

538 www.xilinx.com 10.1

Page 539: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S16_S16_inst (.DOA(DOA), // Port A 16-bit data output.DOB(DOB), // Port B 16-bit data output.ADDRA(ADDRA), // Port A 8-bit address input.ADDRB(ADDRB), // Port B 8-bit address input.CLKA(CLKA), // Port A clock input.CLKB(CLKB), // Port B clock input.DIA(DIA), // Port A 16-bit data input.DIB(DIB), // Port B 16-bit data input.ENA(ENA), // Port A RAM enable input.ENB(ENB), // Port B RAM enable input.RSTA(RSTA), // Port A Synchronous reset input.RSTB(RSTB), // Port B Synchronous reset input.WEA(WEA), // Port A RAM write enable input.WEB(WEB) // Port B RAM write enable input);

// End of RAMB4_S16_S16_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 539

Page 540: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S2

Primitive: 4K-bit Single-Port Synchronous Block RAM with Port Width Configured to 2-bits

IntroductionThis design element is a dedicated, random access memory block with synchronous write capability. It providesthe capability for fast, discrete, large blocks of RAM in each device. This element is configured as indicated inthe following table:

Design Element Depth Width Address Bus Data Bus

RAMB4_S2 2048 2 (10:0) (1:0)

The enable (EN) pin controls read, write, and reset. When EN is Low, no data is written and the output (DO)retains the last state. When EN is High and reset (RST) is High, DO is cleared during the Low-to-High clock(CLK) transition; if write enable (WE) is High, the memory contents reflect the data at DI. When EN is Highand WE is Low, the data stored in the RAM address (ADDR) is read during the Low-to-High clock transition.When EN and WE are High, the data on the data input (DI) is loaded into the word selected by the write address(ADDR) during the Low-to-High clock transition and the data output (DO) reflects the selected (addressed)word. The above description assumes an active High EN, WE, RST, and CLK. However, the active level canbe changed by placing an inverter on the port. Any inverter placed on a RAMB4 port is absorbed into theblock and does not use a CLB resource.

This element can be initialized during configuration. Block RAM output registers are asynchronously cleared,output Low, when power is applied. The initial contents of the block RAM are not altered. For FPGA devices,power-on conditions are simulated when global set/reset (GSR) is active. GSR defaults to active-High but can beinverted by adding an inverter in front of the GSR input of the appropriate STARTUP_architecture symbol.

Logic TableInputs Outputs

EN RST WE CLK ADDR DI DO RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

Specifying Initial Contents of a Block RAM -

Libraries Guide

540 www.xilinx.com 10.1

Page 541: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

You can use the INIT_xx attributes to specify an initial value during device configuration. The initialization ofeach of these elements is set by 16 initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a totalof 4096 bits. If any INIT_0x attribute is not specified, it is configured as zeros. Partial initialization strings arepadded with zeros to the left.

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S2: Virtex/E, Spartan-II/IIE 2k x 2 Single-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S2_inst : RAMB4_S2generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DO => DO, -- 2-bit data outputADDR => ADDR, -- 11-bit address inputCLK => CLK, -- Clock inputDI => DI, -- 2-bit data inputEN => EN, -- RAM enable inputRST => RST, -- Synchronous reset inputWE => WE -- RAM write enable input);

-- End of RAMB4_S2_inst instantiation

Verilog Instantiation Template// RAMB4_S2: Virtex/E, Spartan-II/IIE 2k x 2 Single-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S2 #(// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

10.1 www.xilinx.com 541

Page 542: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S2_inst (.DO(DO), // 2-bit data output.ADDR(ADDR), // 11-bit address input.CLK(CLK), // Clock input.DI(DI), // 2-bit data input.EN(EN), // RAM enable input.RST(RST), // Synchronous reset input.WE(WE) // RAM write enable input);

// End of RAMB4_S2_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

542 www.xilinx.com 10.1

Page 543: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S2_S16

Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to 2-bits and16-bits

IntroductionThis design element is a 4096-bit dual-ported dedicated random access memory block with synchronous writecapability. Each port is independent of the other while accessing the same set of 4096 memory cells. Each port isindependently configured to a specific data width, as expressed in the following table:

Design ElementPort ADepth

Port AWidth

Port AADDR

Port ADI

Port BDepth

Port BWidth

Port BADDR Port B DI

RAMB4_S2_S16 2048 2 (10:0) (1:0) 256 16 (7:0) (15:0)

ADDR=address bus for the port.

DI=data input bus for the port.

All Port A input pins have setup time referenced to the CLKA pin and its data output bus DOA has a clock-to-outtime referenced to the CLKA. All Port B input pins have setup time referenced to the CLKB pin and its dataoutput bus DOB has a clock-to-out time referenced to the CLKB.

The enable ENA pin controls read, write, and reset for port A. When ENA is Low, no data is written and theoutput (DOA) retains the last state. When ENA is High and reset (RSTA) is High, DOA is cleared during theLow-to-High clock (CLKA) transition; if write enable (WEA) is High, the memory contents reflect the data atDIA. When ENA is High and WEA is Low, the data stored in the RAM address (ADDRA) is read during theLow-to-High clock transition. When ENA and WEA are High, the data on the data input (DIA) is loadedinto the word selected by the write address (ADDRA) during the Low-to-High clock transition and the dataoutput (DOA) reflects the selected (addressed) word.

The enable ENB pin controls read, write, and reset for port B. When ENB is Low, no data is written and theoutput (DOB) retains the last state. When ENB is High and reset (RSTB) is High, DOB is cleared during theLow-to-High clock (CLKB) transition; if write enable (WEB) is High, the memory contents reflect the data atDIB. When ENB is High and WEB is Low, the data stored in the RAM address (ADDRB) is read during theLow-to-High clock transition. When ENB and WEB are High, the data on the data input (DIB) is loaded into theword selected by the write address (ADDRB) during the Low-to-High clock transition and the data output (DOB)reflects the selected (addressed) word.

The above descriptions assume active High control pins (ENA, WEA, RSTA, CLKA, ENB, WEB, RSTB, andCLKB). However, the active level can be changed by placing an inverter on the port. Any inverter placed on aRAMB4 port is absorbed into the block and does not use a CLB resource.

Libraries Guide

10.1 www.xilinx.com 543

Page 544: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Block RAM output registers are asynchronously cleared, output Low, when power is applied. The initial contentsof the block RAM are not altered. For FPGA devices, power-on conditions are simulated when global set/reset(GSR) is active. GSR defaults to active-High but can be inverted by adding an inverter in front of the GSR inputof the appropriate STARTUP_architecture symbol.

You can use the INIT_0x attributes to specify an initial value during device configuration. There are 16initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a total of 4096 bits. If any INIT_0xattribute is not specified, it is configured as zeros. Partial initialization strings are padded with zeros to the left.

Logic TableInputs Outputs

EN(A/B) RST(A/B) WE(A/B) CLK(A/B) ADDR(A/B) DI(A/B) DO(A/B) RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address of port A/B

RAM(addr)=RAM contents at address ADDRA/ADDRB

data=RAM input data at pins DIA/DIB

Port DescriptionsAddress Mapping - Each port accesses the same set of 4096 memory cells using an addressing scheme that isdependent on the width of the port. The physical RAM location that is addressed for a particular width isdetermined from the following formula.• Start=((ADDR port+1)*(Widthport)) -1• End=(ADDRport)*(Widthport)

Port Width Port Addresses

2 2048 <----- 7 6 5 4 3 2 1 0

16 256 <----- 0

Port Conflict resolution - This design element is a true dual-ported RAM in that it allows simultaneous reads ofthe same memory cell. When one port is performing a write to a given memory cell, the other port should notaddress that memory cell (for a write or a read) within the clock-to-clock setup window.• If both ports write to the same memory cell simultaneously, violating the clock-to-setup requirement, the

data stored will be invalid.• If one port attempts to read from the same memory cell that the other is simultaneously writing to, violating

the clock setup requirement, the write will be successful but the data read will be invalid.

Design Entry MethodInstantiation Recommended

Inference No

Libraries Guide

544 www.xilinx.com 10.1

Page 545: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S2_S16: Virtex/E, Spartan-II/IIE 2k/256 x 2/16 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S2_S16_inst : RAMB4_S2_S16generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 2-bit data outputDOB => DOB, -- Port B 16-bit data outputADDRA => ADDRA, -- Port A 11-bit address inputADDRB => ADDRB, -- Port B 8-bit address inputCLKA => CLKA, -- Port A clock inputCLKB => CLKB, -- Port B clock inputDIA => DIA, -- Port A 2-bit data inputDIB => DIB, -- Port B 16-bit data inputENA => ENA, -- Port A RAM enable inputENB => ENB, -- Port B RAM enable inputRSTA => RSTA, -- Port A Synchronous reset inputRSTB => RSTB, -- Port B Synchronous reset inputWEA => WEA, -- Port A RAM write enable inputWEB => WEB -- Port B RAM write enable input);

-- End of RAMB4_S2_S16_inst instantiation

Verilog Instantiation Template// RAMB4_S2_S16: Virtex/E, Spartan-II/IIE 2k/256 x 2/16 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S2_S16 #(.SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

10.1 www.xilinx.com 545

Page 546: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S2_S16_inst (.DOA(DOA), // Port A 2-bit data output.DOB(DOB), // Port B 16-bit data output.ADDRA(ADDRA), // Port A 11-bit address input.ADDRB(ADDRB), // Port B 8-bit address input.CLKA(CLKA), // Port A clock input.CLKB(CLKB), // Port B clock input.DIA(DIA), // Port A 2-bit data input.DIB(DIB), // Port B 16-bit data input.ENA(ENA), // Port A RAM enable input.ENB(ENB), // Port B RAM enable input.RSTA(RSTA), // Port A Synchronous reset input.RSTB(RSTB), // Port B Synchronous reset input.WEA(WEA), // Port A RAM write enable input.WEB(WEB) // Port B RAM write enable input);

// End of RAMB4_S2_S16_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

546 www.xilinx.com 10.1

Page 547: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S2_S2Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to 2-bits and 2-bits

Introduction

Design ElementPort ADepth

Port AWidth

Port AADDR

Port ADI

Port BDepth

Port BWidth

Port BADDR Port B DI

RAMB4_S2_S2 2048 2 (10:0) (1:0) 2048 2 (10:0) (1:0)

ADDR=address bus for the port

DI=data input bus for the port

All Port A input pins have setup time referenced to the CLKA pin and its data output bus DOA has a clock-to-outtime referenced to the CLKA. All Port B input pins have setup time referenced to the CLKB pin and its dataoutput bus DOB has a clock-to-out time referenced to the CLKB.

The enable ENA pin controls read, write, and reset for port A. When ENA is Low, no data is written and theoutput (DOA) retains the last state. When ENA is High and reset (RSTA) is High, DOA is cleared during theLow-to-High clock (CLKA) transition; if write enable (WEA) is High, the memory contents reflect the data atDIA. When ENA is High and WEA is Low, the data stored in the RAM address (ADDRA) is read during theLow-to-High clock transition. When ENA and WEA are High, the data on the data input (DIA) is loadedinto the word selected by the write address (ADDRA) during the Low-to-High clock transition and the dataoutput (DOA) reflects the selected (addressed) word.

The enable ENB pin controls read, write, and reset for port B. When ENB is Low, no data is written and theoutput (DOB) retains the last state. When ENB is High and reset (RSTB) is High, DOB is cleared during theLow-to-High clock (CLKB) transition; if write enable (WEB) is High, the memory contents reflect the data atDIB. When ENB is High and WEB is Low, the data stored in the RAM address (ADDRB) is read during theLow-to-High clock transition. When ENB and WEB are High, the data on the data input (DIB) is loaded into theword selected by the write address (ADDRB) during the Low-to-High clock transition and the data output (DOB)reflects the selected (addressed) word.

The above descriptions assume active High control pins (ENA, WEA, RSTA, CLKA, ENB, WEB, RSTB, andCLKB). However, the active level can be changed by placing an inverter on the port. Any inverter placed on aRAMB4 port is absorbed into the block and does not use a CLB resource.

Block RAM output registers are asynchronously cleared, output Low, when power is applied. The initial contentsof the block RAM are not altered. For FPGA devices, power-on conditions are simulated when global set/reset(GSR) is active. GSR defaults to active-High but can be inverted by adding an inverter in front of the GSR inputof the appropriate STARTUP_architecture symbol.

You can use the INIT_0x attributes to specify an initial value during device configuration. There are 16initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a total of 4096 bits. If any INIT_0xattribute is not specified, it is configured as zeros. Partial initialization strings are padded with zeros to the left.

Libraries Guide

10.1 www.xilinx.com 547

Page 548: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Logic TableInputs Outputs

EN(A/B) RST(A/B) WE(A/B) CLK(A/B) ADDR(A/B) DI(A/B) DO(A/B) RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address of port A/B

RAM(addr)=RAM contents at address ADDRA/ADDRB

data=RAM input data at pins DIA/DIB

Port DescriptionsAddress Mapping - Each port accesses the same set of 4096 memory cells using an addressing scheme that isdependent on the width of the port. The physical RAM location that is addressed for a particular width isdetermined from the following formula.• Start=((ADDR port+1)*(Widthport)) -1• End=(ADDRport)*(Widthport)

Port Width Port Addresses

2 2048 <----- 7 6 5 4 3 2 1 0

Port Conflict resolution - This design element is a true dual-ported RAM in that it allows simultaneous reads ofthe same memory cell. When one port is performing a write to a given memory cell, the other port should notaddress that memory cell (for a write or a read) within the clock-to-clock setup window.• If both ports write to the same memory cell simultaneously, violating the clock-to-setup requirement, the

data stored will be invalid.• If one port attempts to read from the same memory cell that the other is simultaneously writing to, violating

the clock setup requirement, the write will be successful but the data read will be invalid.

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S2_S2: Virtex/E, Spartan-II/IIE 2k x 2 Dual-Port RAM

Libraries Guide

548 www.xilinx.com 10.1

Page 549: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S2_S2_inst : RAMB4_S2_S2generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 2-bit data outputDOB => DOB, -- Port B 2-bit data outputADDRA => ADDRA, -- Port A 11-bit address inputADDRB => ADDRB, -- Port B 11-bit address inputCLKA => CLKA, -- Port A clock inputCLKB => CLKB, -- Port B clock inputDIA => DIA, -- Port A 2-bit data inputDIB => DIB, -- Port B 2-bit data inputENA => ENA, -- Port A RAM enable inputENB => ENB, -- Port B RAM enable inputRSTA => RSTA, -- Port A Synchronous reset inputRSTB => RSTB, -- Port B Synchronous reset inputWEA => WEA, -- Port A RAM write enable inputWEB => WEB -- Port B RAM write enable input);

-- End of RAMB4_S2_S2_inst instantiation

Verilog Instantiation Template// RAMB4_S2_S2: Virtex/E, Spartan-II/IIE 2k x 2 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S2_S2 #(.SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S2_S2_inst (.DOA(DOA), // Port A 2-bit data output.DOB(DOB), // Port B 2-bit data output.ADDRA(ADDRA), // Port A 11-bit address input.ADDRB(ADDRB), // Port B 11-bit address input.CLKA(CLKA), // Port A clock input

Libraries Guide

10.1 www.xilinx.com 549

Page 550: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.CLKB(CLKB), // Port B clock input

.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

.RSTA(RSTA), // Port A Synchronous reset input

.RSTB(RSTB), // Port B Synchronous reset input

.WEA(WEA), // Port A RAM write enable input

.WEB(WEB) // Port B RAM write enable input);

// End of RAMB4_S2_S2_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

550 www.xilinx.com 10.1

Page 551: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S2_S4

Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to 2-bits and 4-bits

Introduction

Design Element Port A DepthPort AWidth

Port AADDR Port A DI

Port BDepth

Port BWidth

Port BADDR Port B DI

RAMB4_S2_S4 2048 2 (10:0) (1:0) 1024 4 (9:0) (3:0)

ADDR=address bus for the port.

DI=data input bus for the port.

All Port A input pins have setup time referenced to the CLKA pin and its data output bus DOA has a clock-to-outtime referenced to the CLKA. All Port B input pins have setup time referenced to the CLKB pin and its dataoutput bus DOB has a clock-to-out time referenced to the CLKB.

The enable ENA pin controls read, write, and reset for port A. When ENA is Low, no data is written and theoutput (DOA) retains the last state. When ENA is High and reset (RSTA) is High, DOA is cleared during theLow-to-High clock (CLKA) transition; if write enable (WEA) is High, the memory contents reflect the data atDIA. When ENA is High and WEA is Low, the data stored in the RAM address (ADDRA) is read during theLow-to-High clock transition. When ENA and WEA are High, the data on the data input (DIA) is loadedinto the word selected by the write address (ADDRA) during the Low-to-High clock transition and the dataoutput (DOA) reflects the selected (addressed) word.

The enable ENB pin controls read, write, and reset for port B. When ENB is Low, no data is written and theoutput (DOB) retains the last state. When ENB is High and reset (RSTB) is High, DOB is cleared during theLow-to-High clock (CLKB) transition; if write enable (WEB) is High, the memory contents reflect the data atDIB. When ENB is High and WEB is Low, the data stored in the RAM address (ADDRB) is read during theLow-to-High clock transition. When ENB and WEB are High, the data on the data input (DIB) is loaded into theword selected by the write address (ADDRB) during the Low-to-High clock transition and the data output (DOB)reflects the selected (addressed) word.

The above descriptions assume active High control pins (ENA, WEA, RSTA, CLKA, ENB, WEB, RSTB, andCLKB). However, the active level can be changed by placing an inverter on the port. Any inverter placed on aRAMB4 port is absorbed into the block and does not use a CLB resource.

This component can be initialized during configuration. See the logic table below.

Block RAM output registers are asynchronously cleared, output Low, when power is applied. The initial contentsof the block RAM are not altered. For FPGA devices, power-on conditions are simulated when global set/reset(GSR) is active. GSR defaults to active-High but can be inverted by adding an inverter in front of the GSR inputof the appropriate STARTUP_architecture symbol.

Libraries Guide

10.1 www.xilinx.com 551

Page 552: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

You can use the INIT_0x attributes to specify an initial value during device configuration. There are 16initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a total of 4096 bits. If any INIT_0xattribute is not specified, it is configured as zeros. Partial initialization strings are padded with zeros to the left.

Logic TableInputs Outputs

EN(A/B) RST(A/B) WE(A/B) CLK(A/B) ADDR(A/B) DI(A/B) DO(A/B) RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address of port A/B

RAM(addr)=RAM contents at address ADDRA/ADDRB

data=RAM input data at pins DIA/DIB

Port DescriptionsAddress Mapping - Each port accesses the same set of 4096 memory cells using an addressing scheme that isdependent on the width of the port. The physical RAM location that is addressed for a particular width isdetermined from the following formula.• Start=((ADDR port+1)*(Widthport)) -1• End=(ADDRport)*(Widthport)

Port Width Port Addresses

2 2048 <----- 7 6 5 4 3 2 1 0

4 1024 <----- 3 2 1 0

Port Conflict resolution - This design element is a true dual-ported RAM in that it allows simultaneous reads ofthe same memory cell. When one port is performing a write to a given memory cell, the other port should notaddress that memory cell (for a write or a read) within the clock-to-clock setup window.• If both ports write to the same memory cell simultaneously, violating the clock-to-setup requirement, the

data stored will be invalid.• If one port attempts to read from the same memory cell that the other is simultaneously writing to, violating

the clock setup requirement, the write will be successful but the data read will be invalid.

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

Libraries Guide

552 www.xilinx.com 10.1

Page 553: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S2_S4: Virtex/E, Spartan-II/IIE 2k/1k x 2/4 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S2_S4_inst : RAMB4_S2_S4generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 2-bit data outputDOB => DOB, -- Port B 4-bit data outputADDRA => ADDRA, -- Port A 11-bit address inputADDRB => ADDRB, -- Port B 10-bit address inputCLKA => CLKA, -- Port A clock inputCLKB => CLKB, -- Port B clock inputDIA => DIA, -- Port A 2-bit data inputDIB => DIB, -- Port B 4-bit data inputENA => ENA, -- Port A RAM enable inputENB => ENB, -- Port B RAM enable inputRSTA => RSTA, -- Port A Synchronous reset inputRSTB => RSTB, -- Port B Synchronous reset inputWEA => WEA, -- Port A RAM write enable inputWEB => WEB -- Port B RAM write enable input);

-- End of RAMB4_S2_S4_inst instantiation

Verilog Instantiation Template// RAMB4_S2_S4: Virtex/E, Spartan-II/IIE 2k/1k x 2/4 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S2_S4 #(.SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

10.1 www.xilinx.com 553

Page 554: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S2_S4_inst (.DOA(DOA), // Port A 2-bit data output.DOB(DOB), // Port B 4-bit data output.ADDRA(ADDRA), // Port A 11-bit address input.ADDRB(ADDRB), // Port B 10-bit address input.CLKA(CLKA), // Port A clock input.CLKB(CLKB), // Port B clock input.DIA(DIA), // Port A 2-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.RSTA(RSTA), // Port A Synchronous reset input.RSTB(RSTB), // Port B Synchronous reset input.WEA(WEA), // Port A RAM write enable input.WEB(WEB) // Port B RAM write enable input);

// End of RAMB4_S2_S4_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

554 www.xilinx.com 10.1

Page 555: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S2_S8Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to 2-bits and 8-bits

IntroductionThis design element is a 4096-bit dual-ported dedicated random access memory block with synchronous writecapability. Each port is independent of the other while accessing the same set of 4096 memory cells. Each port isindependently configured to a specific data width, as expressed in the following table:

DesignElement

Port ADepth

Port AWidth

Port AADDR Port A DI

Port BDepth

Port BWidth

Port BADDR Port B DI

RAMB4_S2_S8 2048 2 (10:0) (1:0) 512 8 (8:0) (7:0)

ADDR=address bus for the port.

DI=data input bus for the port.

All Port A input pins have setup time referenced to the CLKA pin and its data output bus DOA has a clock-to-outtime referenced to the CLKA. All Port B input pins have setup time referenced to the CLKB pin and its dataoutput bus DOB has a clock-to-out time referenced to the CLKB.

The enable ENA pin controls read, write, and reset for port A. When ENA is Low, no data is written and theoutput (DOA) retains the last state. When ENA is High and reset (RSTA) is High, DOA is cleared during theLow-to-High clock (CLKA) transition; if write enable (WEA) is High, the memory contents reflect the data atDIA. When ENA is High and WEA is Low, the data stored in the RAM address (ADDRA) is read during theLow-to-High clock transition. When ENA and WEA are High, the data on the data input (DIA) is loadedinto the word selected by the write address (ADDRA) during the Low-to-High clock transition and the dataoutput (DOA) reflects the selected (addressed) word.

The enable ENB pin controls read, write, and reset for port B. When ENB is Low, no data is written and theoutput (DOB) retains the last state. When ENB is High and reset (RSTB) is High, DOB is cleared during theLow-to-High clock (CLKB) transition; if write enable (WEB) is High, the memory contents reflect the data atDIB. When ENB is High and WEB is Low, the data stored in the RAM address (ADDRB) is read during theLow-to-High clock transition. When ENB and WEB are High, the data on the data input (DIB) is loaded into theword selected by the write address (ADDRB) during the Low-to-High clock transition and the data output (DOB)reflects the selected (addressed) word.

The above descriptions assume active High control pins (ENA, WEA, RSTA, CLKA, ENB, WEB, RSTB, andCLKB). However, the active level can be changed by placing an inverter on the port. Any inverter placed on aRAMB4 port is absorbed into the block and does not use a CLB resource.

Block RAM output registers are asynchronously cleared, output Low, when power is applied. The initial contentsof the block RAM are not altered. For FPGA devices, power-on conditions are simulated when global set/reset(GSR) is active. GSR defaults to active-High but can be inverted by adding an inverter in front of the GSR inputof the appropriate STARTUP_architecture symbol.

Libraries Guide

10.1 www.xilinx.com 555

Page 556: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

You can use the INIT_0x attributes to specify an initial value during device configuration. There are 16initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a total of 4096 bits. If any INIT_0xattribute is not specified, it is configured as zeros. Partial initialization strings are padded with zeros to the left.

Logic TableInputs Outputs

EN(A/B) RST(A/B) WE(A/B) CLK(A/B) ADDR(A/B) DI(A/B) DO(A/B) RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address of port A/B

RAM(addr)=RAM contents at address ADDRA/ADDRB

data=RAM input data at pins DIA/DIB

Port DescriptionsAddress Mapping - Each port accesses the same set of 4096 memory cells using an addressing scheme that isdependent on the width of the port. The physical RAM location that is addressed for a particular width isdetermined from the following formula.• Start=((ADDR port+1)*(Widthport)) -1• End=(ADDRport)*(Widthport)

Port Width Port Addresses

2 2048 <----- 7 6 5 4 3 2 1 0

8 512 <----- 1 0

Port Conflict resolution - This design element is a true dual-ported RAM in that it allows simultaneous reads ofthe same memory cell. When one port is performing a write to a given memory cell, the other port should notaddress that memory cell (for a write or a read) within the clock-to-clock setup window.• If both ports write to the same memory cell simultaneously, violating the clock-to-setup requirement, the

data stored will be invalid.• If one port attempts to read from the same memory cell that the other is simultaneously writing to, violating

the clock setup requirement, the write will be successful but the data read will be invalid.

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

Libraries Guide

556 www.xilinx.com 10.1

Page 557: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S2_S8: Virtex/E, Spartan-II/IIE 2k/512 x 2/8 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S2_S8_inst : RAMB4_S2_S8generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 2-bit data outputDOB => DOB, -- Port B 8-bit data outputADDRA => ADDRA, -- Port A 11-bit address inputADDRB => ADDRB, -- Port B 9-bit address inputCLKA => CLKA, -- Port A clock inputCLKB => CLKB, -- Port B clock inputDIA => DIA, -- Port A 2-bit data inputDIB => DIB, -- Port B 8-bit data inputENA => ENA, -- Port A RAM enable inputENB => ENB, -- Port B RAM enable inputRSTA => RSTA, -- Port A Synchronous reset inputRSTB => RSTB, -- Port B Synchronous reset inputWEA => WEA, -- Port A RAM write enable inputWEB => WEB -- Port B RAM write enable input);

-- End of RAMB4_S2_S8_inst instantiation

Verilog Instantiation Template// RAMB4_S2_S8: Virtex/E, Spartan-II/IIE 2k/512 x 2/8 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S2_S8 #(.SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

10.1 www.xilinx.com 557

Page 558: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S2_S8_inst (.DOA(DOA), // Port A 2-bit data output.DOB(DOB), // Port B 8-bit data output.ADDRA(ADDRA), // Port A 11-bit address input.ADDRB(ADDRB), // Port B 9-bit address input.CLKA(CLKA), // Port A clock input.CLKB(CLKB), // Port B clock input.DIA(DIA), // Port A 2-bit data input.DIB(DIB), // Port B 8-bit data input.ENA(ENA), // Port A RAM enable input.ENB(ENB), // Port B RAM enable input.RSTA(RSTA), // Port A Synchronous reset input.RSTB(RSTB), // Port B Synchronous reset input.WEA(WEA), // Port A RAM write enable input.WEB(WEB) // Port B RAM write enable input);

// End of RAMB4_S2_S8_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

558 www.xilinx.com 10.1

Page 559: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S4Primitive: 4k-bit Single-Port Synchronous Block RAM with Port Width Configured to 4-bits

IntroductionThis design element is a dedicated, random access memory block with synchronous write capability. It providesthe capability for fast, discrete, large blocks of RAM in each device. This element is configured as indicated inthe following table:

Design Element Depth Width Address Bus Data Bus

RAMB4_S4 1024 4 (9:0) (3:0)

The enable (EN) pin controls read, write, and reset. When EN is Low, no data is written and the output (DO)retains the last state. When EN is High and reset (RST) is High, DO is cleared during the Low-to-High clock(CLK) transition; if write enable (WE) is High, the memory contents reflect the data at DI. When EN is Highand WE is Low, the data stored in the RAM address (ADDR) is read during the Low-to-High clock transition.When EN and WE are High, the data on the data input (DI) is loaded into the word selected by the write address(ADDR) during the Low-to-High clock transition and the data output (DO) reflects the selected (addressed)word. The above description assumes an active High EN, WE, RST, and CLK. However, the active level canbe changed by placing an inverter on the port. Any inverter placed on a RAMB4 port is absorbed into theblock and does not use a CLB resource.

This element can be initialized during configuration. Block RAM output registers are asynchronously cleared,output Low, when power is applied. The initial contents of the block RAM are not altered. For FPGA devices,power-on conditions are simulated when global set/reset (GSR) is active. GSR defaults to active-High but can beinverted by adding an inverter in front of the GSR input of the appropriate STARTUP_architecture symbol.

Logic TableInputs Outputs

EN RST WE CLK ADDR DI DO RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

Specifying Initial Contents of a Block RAM -

Libraries Guide

10.1 www.xilinx.com 559

Page 560: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

You can use the INIT_xx attributes to specify an initial value during device configuration. The initialization ofeach of these elements is set by 16 initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a totalof 4096 bits. If any INIT_0x attribute is not specified, it is configured as zeros. Partial initialization strings arepadded with zeros to the left.

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

VHDL Instantiation Template-- RAMB4_S4: Virtex/E, Spartan-II/IIE 1k x 4 Single-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S4_inst : RAMB4_S4generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DO => DO, -- 4-bit data outputADDR => ADDR, -- 10-bit address inputCLK => CLK, -- Clock inputDI => DI, -- 4-bit data inputEN => EN, -- RAM enable inputRST => RST, -- Synchronous reset inputWE => WE -- RAM write enable input);

-- End of RAMB4_S4_inst instantiation

Verilog Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

// RAMB4_S4: Virtex/E, Spartan-II/IIE 1k x 4 Single-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S4 #(// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

560 www.xilinx.com 10.1

Page 561: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S4_inst (.DO(DO), // 4-bit data output.ADDR(ADDR), // 10-bit address input.CLK(CLK), // Clock input.DI(DI), // 4-bit data input.EN(EN), // RAM enable input.RST(RST), // Synchronous reset input.WE(WE) // RAM write enable input);

// End of RAMB4_S4_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 561

Page 562: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S4_S16

Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to 4-bits and16-bits

IntroductionThis design element is a 4096-bit dual-ported dedicated random access memory block with synchronous writecapability. Each port is independent of the other while accessing the same set of 4096 memory cells. Each port isindependently configured to a specific data width, as expressed in the following table:

DesignElement

Port ADepth

Port AWidth

Port AADDR

Port ADI

Port BDepth

Port BWidth

Port BADDR Port B DI

RAMB4_S4_S16 1024 4 (9:0) (3:0) 256 16 (7:0) (15:0)

ADDR=address bus for the port

DI=data input bus for the port

Each port is fully synchronous with independent clock pins. All port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB.

The enable ENA pin controls read, write, and reset for port A. When ENA is Low, no data is written and theoutput (DOA) retains the last state. When ENA is High and reset (RSTA) is High, DOA is cleared during theLow-to-High clock (CLKA) transition; if write enable (WEA) is High, the memory contents reflect the data atDIA. When ENA is High and WEA is Low, the data stored in the RAM address (ADDRA) is read during theLow-to-High clock transition. When ENA and WEA are High, the data on the data input (DIA) is loadedinto the word selected by the write address (ADDRA) during the Low-to-High clock transition and the dataoutput (DOA) reflects the selected (addressed) word.

The enable ENB pin controls read, write, and reset for port B. When ENB is Low, no data is written and theoutput (DOB) retains the last state. When ENB is High and reset (RSTB) is High, DOB is cleared during theLow-to-High clock (CLKB) transition; if write enable (WEB) is High, the memory contents reflect the data atDIB. When ENB is High and WEB is Low, the data stored in the RAM address (ADDRB) is read during theLow-to-High clock transition. When ENB and WEB are High, the data on the data input (DIB) is loaded into theword selected by the write address (ADDRB) during the Low-to-High clock transition and the data output (DOB)reflects the selected (addressed) word.

The above descriptions assume active High control pins (ENA, WEA, RSTA, CLKA, ENB, WEB, RSTB, andCLKB). However, the active level can be changed by placing an inverter on the port. Any inverter placed on aRAMB4 port is absorbed into the block and does not use a CLB resource.

Libraries Guide

562 www.xilinx.com 10.1

Page 563: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Block RAM output registers are asynchronously cleared, output Low, when power is applied. The initial contentsof the block RAM are not altered. For FPGA devices, power-on conditions are simulated when global set/reset(GSR) is active. GSR defaults to active-High but can be inverted by adding an inverter in front of the GSR inputof the appropriate STARTUP_architecture symbol.

You can use the INIT_0x attributes to specify an initial value during device configuration. There are 16initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a total of 4096 bits. If any INIT_0xattribute is not specified, it is configured as zeros. Partial initialization strings are padded with zeros to the left.

Logic TableInputs Outputs

EN(A/B) RST(A/B) WE(A/B) CLK(A/B) ADDR(A/B) DI(A/B) DO(A/B) RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address of port A/B

RAM(addr)=RAM contents at address ADDRA/ADDRB

data=RAM input data at pins DIA/DIB

Port DescriptionsAddress Mapping - Each port accesses the same set of 4096 memory cells using an addressing scheme that isdependent on the width of the port. The physical RAM location that is addressed for a particular width isdetermined from the following formula.• Start=((ADDR port+1)*(Widthport)) -1• End=(ADDRport)*(Widthport)

Port Width Port Addresses

4 1024 <----- 3 2 1 0

16 256 <----- 0

Port Conflict resolution - This design element is a true dual-ported RAM in that it allows simultaneous reads ofthe same memory cell. When one port is performing a write to a given memory cell, the other port should notaddress that memory cell (for a write or a read) within the clock-to-clock setup window.• If both ports write to the same memory cell simultaneously, violating the clock-to-setup requirement, the

data stored will be invalid.• If one port attempts to read from the same memory cell that the other is simultaneously writing to, violating

the clock setup requirement, the write will be successful but the data read will be invalid.

Design Entry MethodInstantiation Recommended

Inference No

Libraries Guide

10.1 www.xilinx.com 563

Page 564: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S4_S16: Virtex/E, Spartan-II/IIE 1k/256 x 4/16 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S4_S16_inst : RAMB4_S4_S16generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 4-bit data outputDOB => DOB, -- Port B 16-bit data outputADDRA => ADDRA, -- Port A 10-bit address inputADDRB => ADDRB, -- Port B 8-bit address inputCLKA => CLKA, -- Port A clock inputCLKB => CLKB, -- Port B clock inputDIA => DIA, -- Port A 4-bit data inputDIB => DIB, -- Port B 16-bit data inputENA => ENA, -- Port A RAM enable inputENB => ENB, -- Port B RAM enable inputRSTA => RSTA, -- Port A Synchronous reset inputRSTB => RSTB, -- Port B Synchronous reset inputWEA => WEA, -- Port A RAM write enable inputWEB => WEB -- Port B RAM write enable input);

-- End of RAMB4_S4_S16_inst instantiation

Verilog Instantiation Template// RAMB4_S4_S16: Virtex/E, Spartan-II/IIE 1k/256 x 4/16 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S4_S16 #(.SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

564 www.xilinx.com 10.1

Page 565: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S4_S16_inst (.DOA(DOA), // Port A 4-bit data output.DOB(DOB), // Port B 16-bit data output.ADDRA(ADDRA), // Port A 10-bit address input.ADDRB(ADDRB), // Port B 8-bit address input.CLKA(CLKA), // Port A clock input.CLKB(CLKB), // Port B clock input.DIA(DIA), // Port A 4-bit data input.DIB(DIB), // Port B 16-bit data input.ENA(ENA), // Port A RAM enable input.ENB(ENB), // Port B RAM enable input.RSTA(RSTA), // Port A Synchronous reset input.RSTB(RSTB), // Port B Synchronous reset input.WEA(WEA), // Port A RAM write enable input.WEB(WEB) // Port B RAM write enable input);

// End of RAMB4_S4_S16_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 565

Page 566: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S4_S4

Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to 4-bits and 4-bits

IntroductionThis design element is a 4096-bit dual-ported dedicated random access memory block with synchronous writecapability. Each port is independent of the other while accessing the same set of 4096 memory cells. Each port isindependently configured to a specific data width, as expressed in the following table:

DesignElement

Port ADepth

Port AWidth

Port AADDR

Port ADI

Port BDepth

Port BWidth

Port BADDR

Port BDI

RAMB4_S4_S4 1024 4 (9:0) (3:0) 1024 4 (9:0) (3:0)

ADDR=address bus for the port

DI=data input bus for the port

Each port is fully synchronous with independent clock pins. All port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB.

The enable ENA pin controls read, write, and reset for port A. When ENA is Low, no data is written and theoutput (DOA) retains the last state. When ENA is High and reset (RSTA) is High, DOA is cleared during theLow-to-High clock (CLKA) transition; if write enable (WEA) is High, the memory contents reflect the data atDIA. When ENA is High and WEA is Low, the data stored in the RAM address (ADDRA) is read during theLow-to-High clock transition. When ENA and WEA are High, the data on the data input (DIA) is loadedinto the word selected by the write address (ADDRA) during the Low-to-High clock transition and the dataoutput (DOA) reflects the selected (addressed) word.

The enable ENB pin controls read, write, and reset for port B. When ENB is Low, no data is written and theoutput (DOB) retains the last state. When ENB is High and reset (RSTB) is High, DOB is cleared during theLow-to-High clock (CLKB) transition; if write enable (WEB) is High, the memory contents reflect the data atDIB. When ENB is High and WEB is Low, the data stored in the RAM address (ADDRB) is read during theLow-to-High clock transition. When ENB and WEB are High, the data on the data input (DIB) is loaded into theword selected by the write address (ADDRB) during the Low-to-High clock transition and the data output (DOB)reflects the selected (addressed) word.

The above descriptions assume active High control pins (ENA, WEA, RSTA, CLKA, ENB, WEB, RSTB, andCLKB). However, the active level can be changed by placing an inverter on the port. Any inverter placed on aRAMB4 port is absorbed into the block and does not use a CLB resource.

Libraries Guide

566 www.xilinx.com 10.1

Page 567: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Block RAM output registers are asynchronously cleared, output Low, when power is applied. The initial contentsof the block RAM are not altered. For FPGA devices, power-on conditions are simulated when global set/reset(GSR) is active. GSR defaults to active-High but can be inverted by adding an inverter in front of the GSR inputof the appropriate STARTUP_architecture symbol.

You can use the INIT_0x attributes to specify an initial value during device configuration. There are 16initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a total of 4096 bits. If any INIT_0xattribute is not specified, it is configured as zeros. Partial initialization strings are padded with zeros to the left.

Logic TableInputs Outputs

EN(A/B) RST(A/B) WE(A/B) CLK(A/B) ADDR(A/B) DI(A/B) DO(A/B) RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address of port A/B

RAM(addr)=RAM contents at address ADDRA/ADDRB

data=RAM input data at pins DIA/DIB

Port DescriptionsAddress Mapping - Each port accesses the same set of 4096 memory cells using an addressing scheme that isdependent on the width of the port. The physical RAM location that is addressed for a particular width isdetermined from the following formula.• Start=((ADDR port+1)*(Widthport)) -1• End=(ADDRport)*(Widthport)

Port Width Port Addresses

4 1024 <----- 3 2 1 0

Port Conflict resolution - This design element is a true dual-ported RAM in that it allows simultaneous reads ofthe same memory cell. When one port is performing a write to a given memory cell, the other port should notaddress that memory cell (for a write or a read) within the clock-to-clock setup window.• If both ports write to the same memory cell simultaneously, violating the clock-to-setup requirement, the

data stored will be invalid.• If one port attempts to read from the same memory cell that the other is simultaneously writing to, violating

the clock setup requirement, the write will be successful but the data read will be invalid.

Design Entry MethodInstantiation Recommended

Inference No

Libraries Guide

10.1 www.xilinx.com 567

Page 568: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S4_S4: Virtex/E, Spartan-II/IIE 1k x 4 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S4_S4_inst : RAMB4_S4_S4generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 4-bit data outputDOB => DOB, -- Port B 4-bit data outputADDRA => ADDRA, -- Port A 10-bit address inputADDRB => ADDRB, -- Port B 10-bit address inputCLKA => CLKA, -- Port A clock inputCLKB => CLKB, -- Port B clock inputDIA => DIA, -- Port A 4-bit data inputDIB => DIB, -- Port B 4-bit data inputENA => ENA, -- Port A RAM enable inputENB => ENB, -- Port B RAM enable inputRSTA => RSTA, -- Port A Synchronous reset inputRSTB => RSTB, -- Port B Synchronous reset inputWEA => WEA, -- Port A RAM write enable inputWEB => WEB -- Port B RAM write enable input);

-- End of RAMB4_S4_S4_inst instantiation

Verilog Instantiation Template// RAMB4_S4_S4: Virtex/E, Spartan-II/IIE 1k x 4 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S4_S4 #(.SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

568 www.xilinx.com 10.1

Page 569: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S4_S4_inst (.DOA(DOA), // Port A 4-bit data output.DOB(DOB), // Port B 4-bit data output.ADDRA(ADDRA), // Port A 10-bit address input.ADDRB(ADDRB), // Port B 10-bit address input.CLKA(CLKA), // Port A clock input.CLKB(CLKB), // Port B clock input.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.RSTA(RSTA), // Port A Synchronous reset input.RSTB(RSTB), // Port B Synchronous reset input.WEA(WEA), // Port A RAM write enable input.WEB(WEB) // Port B RAM write enable input);

// End of RAMB4_S4_S4_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 569

Page 570: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S4_S8

Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to 4-bits and 8-bits

Introduction

Design Element Port A DepthPort AWidth

Port AADDR

Port ADI

Port BDepth

Port BWidth

Port BADDR

Port BDI

RAMB4_S4_S8 1024 4 (9:0) (3:0) 512 8 (8:0) (7:0)

ADDR=address bus for the port

DI=data input bus for the port

Each port is fully synchronous with independent clock pins. All port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB.

The enable ENA pin controls read, write, and reset for port A. When ENA is Low, no data is written and theoutput (DOA) retains the last state. When ENA is High and reset (RSTA) is High, DOA is cleared during theLow-to-High clock (CLKA) transition; if write enable (WEA) is High, the memory contents reflect the data atDIA. When ENA is High and WEA is Low, the data stored in the RAM address (ADDRA) is read during theLow-to-High clock transition. When ENA and WEA are High, the data on the data input (DIA) is loadedinto the word selected by the write address (ADDRA) during the Low-to-High clock transition and the dataoutput (DOA) reflects the selected (addressed) word.

The enable ENB pin controls read, write, and reset for port B. When ENB is Low, no data is written and theoutput (DOB) retains the last state. When ENB is High and reset (RSTB) is High, DOB is cleared during theLow-to-High clock (CLKB) transition; if write enable (WEB) is High, the memory contents reflect the data atDIB. When ENB is High and WEB is Low, the data stored in the RAM address (ADDRB) is read during theLow-to-High clock transition. When ENB and WEB are High, the data on the data input (DIB) is loaded into theword selected by the write address (ADDRB) during the Low-to-High clock transition and the data output (DOB)reflects the selected (addressed) word.

The above descriptions assume active High control pins (ENA, WEA, RSTA, CLKA, ENB, WEB, RSTB, andCLKB). However, the active level can be changed by placing an inverter on the port. Any inverter placed on aRAMB4 port is absorbed into the block and does not use a CLB resource.

Block RAM output registers are asynchronously cleared, output Low, when power is applied. The initial contentsof the block RAM are not altered. For FPGA devices, power-on conditions are simulated when global set/reset(GSR) is active. GSR defaults to active-High but can be inverted by adding an inverter in front of the GSR inputof the appropriate STARTUP_architecture symbol.

Libraries Guide

570 www.xilinx.com 10.1

Page 571: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

You can use the INIT_0x attributes to specify an initial value during device configuration. There are 16initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a total of 4096 bits. If any INIT_0xattribute is not specified, it is configured as zeros. Partial initialization strings are padded with zeros to the left.

Logic TableInputs Outputs

EN(A/B) RST(A/B) WE(A/B) CLK(A/B) ADDR(A/B) DI(A/B) DO(A/B) RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address of port A/B

RAM(addr)=RAM contents at address ADDRA/ADDRB

data=RAM input data at pins DIA/DIB

Port DescriptionsAddress Mapping - Each port accesses the same set of 4096 memory cells using an addressing scheme that isdependent on the width of the port. The physical RAM location that is addressed for a particular width isdetermined from the following formula.• Start=((ADDR port+1)*(Widthport)) -1• End=(ADDRport)*(Widthport)

Port Width Port Addresses

4 1024 <----- 3 2 1 0

8 512 <----- 1 0

Port Conflict resolution - This design element is a true dual-ported RAM in that it allows simultaneous reads ofthe same memory cell. When one port is performing a write to a given memory cell, the other port should notaddress that memory cell (for a write or a read) within the clock-to-clock setup window.• If both ports write to the same memory cell simultaneously, violating the clock-to-setup requirement, the

data stored will be invalid.• If one port attempts to read from the same memory cell that the other is simultaneously writing to, violating

the clock setup requirement, the write will be successful but the data read will be invalid.

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

Libraries Guide

10.1 www.xilinx.com 571

Page 572: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S4_S8: Virtex/E, Spartan-II/IIE 1k/512 x 4/8 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S4_S8_inst : RAMB4_S4_S8generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 4-bit data outputDOB => DOB, -- Port B 8-bit data outputADDRA => ADDRA, -- Port A 10-bit address inputADDRB => ADDRB, -- Port B 9-bit address inputCLKA => CLKA, -- Port A clock inputCLKB => CLKB, -- Port B clock inputDIA => DIA, -- Port A 4-bit data inputDIB => DIB, -- Port B 8-bit data inputENA => ENA, -- Port A RAM enable inputENB => ENB, -- Port B RAM enable inputRSTA => RSTA, -- Port A Synchronous reset inputRSTB => RSTB, -- Port B Synchronous reset inputWEA => WEA, -- Port A RAM write enable inputWEB => WEB -- Port B RAM write enable input);

-- End of RAMB4_S4_S8_inst instantiation

Verilog Instantiation Template// RAMB4_S4_S8: Virtex/E, Spartan-II/IIE 1k/512 x 4/8 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S4_S8 #(.SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

572 www.xilinx.com 10.1

Page 573: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S4_S8_inst (.DOA(DOA), // Port A 4-bit data output.DOB(DOB), // Port B 8-bit data output.ADDRA(ADDRA), // Port A 10-bit address input.ADDRB(ADDRB), // Port B 9-bit address input.CLKA(CLKA), // Port A clock input.CLKB(CLKB), // Port B clock input.DIA(DIA), // Port A 4-bit data input.DIB(DIB), // Port B 8-bit data input.ENA(ENA), // Port A RAM enable input.ENB(ENB), // Port B RAM enable input.RSTA(RSTA), // Port A Synchronous reset input.RSTB(RSTB), // Port B Synchronous reset input.WEA(WEA), // Port A RAM write enable input.WEB(WEB) // Port B RAM write enable input);

// End of RAMB4_S4_S8_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 573

Page 574: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S8Primitive: 4k-bit Single-Port Synchronous Block RAM with Port Width Configured to 8-bits

IntroductionThis design element is a dedicated, random access memory block with synchronous write capability. It providesthe capability for fast, discrete, large blocks of RAM in each device. This element is configured as indicated inthe following table:

Design Element Depth Width Address Bus Data Bus

RAMB4_S8 512 8 (8:0) (7:0)

The enable (EN) pin controls read, write, and reset. When EN is Low, no data is written and the output (DO)retains the last state. When EN is High and reset (RST) is High, DO is cleared during the Low-to-High clock(CLK) transition; if write enable (WE) is High, the memory contents reflect the data at DI. When EN is Highand WE is Low, the data stored in the RAM address (ADDR) is read during the Low-to-High clock transition.When EN and WE are High, the data on the data input (DI) is loaded into the word selected by the write address(ADDR) during the Low-to-High clock transition and the data output (DO) reflects the selected (addressed)word. The above description assumes an active High EN, WE, RST, and CLK. However, the active level canbe changed by placing an inverter on the port. Any inverter placed on a RAMB4 port is absorbed into theblock and does not use a CLB resource.

This element can be initialized during configuration. Block RAM output registers are asynchronously cleared,output Low, when power is applied. The initial contents of the block RAM are not altered. For FPGA devices,power-on conditions are simulated when global set/reset (GSR) is active. GSR defaults to active-High but can beinverted by adding an inverter in front of the GSR input of the appropriate STARTUP_architecture symbol.

Logic TableInputs Outputs

EN RST WE CLK ADDR DI DO RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address.

RAM(addr)=RAM contents at address ADDR.

data=RAM input data.

Specifying Initial Contents of a Block RAM -

Libraries Guide

574 www.xilinx.com 10.1

Page 575: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

You can use the INIT_xx attributes to specify an initial value during device configuration. The initialization ofeach of these elements is set by 16 initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a totalof 4096 bits. If any INIT_0x attribute is not specified, it is configured as zeros. Partial initialization strings arepadded with zeros to the left.

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S8: Virtex/E, Spartan-II/IIE 512 x 8 Single-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S8_inst : RAMB4_S8generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DO => DO, -- 8-bit data outputADDR => ADDR, -- 9-bit address inputCLK => CLK, -- Clock inputDI => DI, -- 8-bit data inputEN => EN, -- RAM enable inputRST => RST, -- Synchronous reset inputWE => WE -- RAM write enable input);

-- End of RAMB4_S8_inst instantiation

Verilog Instantiation Template// RAMB4_S8: Virtex/E, Spartan-II/IIE 512 x 8 Single-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S8 #(// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

10.1 www.xilinx.com 575

Page 576: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S8_inst (.DO(DO), // 8-bit data output.ADDR(ADDR), // 9-bit address input.CLK(CLK), // Clock input.DI(DI), // 8-bit data input.EN(EN), // RAM enable input.RST(RST), // Synchronous reset input.WE(WE) // RAM write enable input);

// End of RAMB4_S8_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

576 www.xilinx.com 10.1

Page 577: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S8_S16

Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to 8-bits and16-bits

IntroductionThis design element is a 4096-bit dual-ported dedicated random access memory block with synchronous writecapability. Each port is independent of the other while accessing the same set of 4096 memory cells. Each port isindependently configured to a specific data width, as expressed in the following table:

Design Element Port A DepthPort AWidth

Port AADDR Port A DI

Port BDepth

Port BWidth

Port BADDR Port B DI

RAMB4_S8_S16 512 8 (8:0) (7:0) 256 16 (7:0) (15:0)

ADDR=address bus for the port.

DI=data input bus for the port.

All Port A input pins have setup time referenced to the CLKA pin and its data output bus DOA has a clock-to-outtime referenced to the CLKA. All Port B input pins have setup time referenced to the CLKB pin and its dataoutput bus DOB has a clock-to-out time referenced to the CLKB.

The enable ENA pin controls read, write, and reset for port A. When ENA is Low, no data is written and theoutput (DOA) retains the last state. When ENA is High and reset (RSTA) is High, DOA is cleared during theLow-to-High clock (CLKA) transition; if write enable (WEA) is High, the memory contents reflect the data atDIA. When ENA is High and WEA is Low, the data stored in the RAM address (ADDRA) is read during theLow-to-High clock transition. When ENA and WEA are High, the data on the data input (DIA) is loadedinto the word selected by the write address (ADDRA) during the Low-to-High clock transition and the dataoutput (DOA) reflects the selected (addressed) word.

The enable ENB pin controls read, write, and reset for port B. When ENB is Low, no data is written and theoutput (DOB) retains the last state. When ENB is High and reset (RSTB) is High, DOB is cleared during theLow-to-High clock (CLKB) transition; if write enable (WEB) is High, the memory contents reflect the data atDIB. When ENB is High and WEB is Low, the data stored in the RAM address (ADDRB) is read during theLow-to-High clock transition. When ENB and WEB are High, the data on the data input (DIB) is loaded into theword selected by the write address (ADDRB) during the Low-to-High clock transition and the data output (DOB)reflects the selected (addressed) word.

The above descriptions assume active High control pins (ENA, WEA, RSTA, CLKA, ENB, WEB, RSTB, andCLKB). However, the active level can be changed by placing an inverter on the port. Any inverter placed on aRAMB4 port is absorbed into the block and does not use a CLB resource.

Libraries Guide

10.1 www.xilinx.com 577

Page 578: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Block RAM output registers are asynchronously cleared, output Low, when power is applied. The initial contentsof the block RAM are not altered. For FPGA devices, power-on conditions are simulated when global set/reset(GSR) is active. GSR defaults to active-High but can be inverted by adding an inverter in front of the GSR inputof the appropriate STARTUP_architecture symbol.

You can use the INIT_0x attributes to specify an initial value during device configuration. There are 16initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a total of 4096 bits. If any INIT_0xattribute is not specified, it is configured as zeros. Partial initialization strings are padded with zeros to the left.

Logic TableInputs Outputs

EN(A/B) RST(A/B) WE(A/B) CLK(A/B) ADDR(A/B) DI(A/B) DO(A/B) RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address of port A/B

RAM(addr)=RAM contents at address ADDRA/ADDRB

data=RAM input data at pins DIA/DIB

Port DescriptionsAddress Mapping - Each port accesses the same set of 4096 memory cells using an addressing scheme that isdependent on the width of the port. The physical RAM location that is addressed for a particular width isdetermined from the following formula.• Start=((ADDR port+1)*(Widthport)) -1• End=(ADDRport)*(Widthport)

Port Width Port Addresses

8 512 <----- 1 0

16 256 <----- 0

Port Conflict resolution - This design element is a true dual-ported RAM in that it allows simultaneous reads ofthe same memory cell. When one port is performing a write to a given memory cell, the other port should notaddress that memory cell (for a write or a read) within the clock-to-clock setup window.• If both ports write to the same memory cell simultaneously, violating the clock-to-setup requirement, the

data stored will be invalid.• If one port attempts to read from the same memory cell that the other is simultaneously writing to, violating

the clock setup requirement, the write will be successful but the data read will be invalid.

Design Entry MethodInstantiation Recommended

Inference No

Libraries Guide

578 www.xilinx.com 10.1

Page 579: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S8_S16: Virtex/E, Spartan-II/IIE 512/256 x 8/16 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S8_S16_inst : RAMB4_S8_S16generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 8-bit data outputDOB => DOB, -- Port B 16-bit data outputADDRA => ADDRA, -- Port A 9-bit address inputADDRB => ADDRB, -- Port B 8-bit address inputCLKA => CLKA, -- Port A clock inputCLKB => CLKB, -- Port B clock inputDIA => DIA, -- Port A 8-bit data inputDIB => DIB, -- Port B 16-bit data inputENA => ENA, -- Port A RAM enable inputENB => ENB, -- Port B RAM enable inputRSTA => RSTA, -- Port A Synchronous reset inputRSTB => RSTB, -- Port B Synchronous reset inputWEA => WEA, -- Port A RAM write enable inputWEB => WEB -- Port B RAM write enable input);

-- End of RAMB4_S8_S16_inst instantiation

Verilog Instantiation Template// RAMB4_S8_S16: Virtex/E, Spartan-II/IIE 512/256 x 8/16 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S8_S16 #(.SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

10.1 www.xilinx.com 579

Page 580: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S8_S16_inst (.DOA(DOA), // Port A 8-bit data output.DOB(DOB), // Port B 16-bit data output.ADDRA(ADDRA), // Port A 9-bit address input.ADDRB(ADDRB), // Port B 8-bit address input.CLKA(CLKA), // Port A clock input.CLKB(CLKB), // Port B clock input.DIA(DIA), // Port A 8-bit data input.DIB(DIB), // Port B 16-bit data input.ENA(ENA), // Port A RAM enable input.ENB(ENB), // Port B RAM enable input.RSTA(RSTA), // Port A Synchronous reset input.RSTB(RSTB), // Port B Synchronous reset input.WEA(WEA), // Port A RAM write enable input.WEB(WEB) // Port B RAM write enable input);

// End of RAMB4_S8_S16_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

580 www.xilinx.com 10.1

Page 581: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

RAMB4_S8_S8

Primitive: 4K-bit Dual-Port Synchronous Block RAM with Port Widths Configured to 8-bits

IntroductionThis design element is a 4096-bit dual-ported dedicated random access memory block with synchronous writecapability. Each port is independent of the other while accessing the same set of 4096 memory cells. Each port isindependently configured to a specific data width, as expressed in the following table:

DesignElement

Port ADepth

Port AWidth

Port AADDR

Port ADI

Port BDepth

Port BWidth

Port BADDR Port B DI

RAMB4_S8_S8 512 8 (8:0) (7:0) 512 8 (8:0) (7:0)

ADDR=address bus for the port

DI=data input bus for the port

Each port is fully synchronous with independent clock pins. All port A input pins have setup time referencedto the CLKA pin and its data output bus DOA has a clock-to-out time referenced to the CLKA. All port Binput pins have setup time referenced to the CLKB pin and its data output bus DOB has a clock-to-out timereferenced to the CLKB.

The enable ENA pin controls read, write, and reset for port A. When ENA is Low, no data is written and theoutput (DOA) retains the last state. When ENA is High and reset (RSTA) is High, DOA is cleared during theLow-to-High clock (CLKA) transition; if write enable (WEA) is High, the memory contents reflect the data atDIA. When ENA is High and WEA is Low, the data stored in the RAM address (ADDRA) is read during theLow-to-High clock transition. When ENA and WEA are High, the data on the data input (DIA) is loadedinto the word selected by the write address (ADDRA) during the Low-to-High clock transition and the dataoutput (DOA) reflects the selected (addressed) word.

The enable ENB pin controls read, write, and reset for port B. When ENB is Low, no data is written and theoutput (DOB) retains the last state. When ENB is High and reset (RSTB) is High, DOB is cleared during theLow-to-High clock (CLKB) transition; if write enable (WEB) is High, the memory contents reflect the data atDIB. When ENB is High and WEB is Low, the data stored in the RAM address (ADDRB) is read during theLow-to-High clock transition. When ENB and WEB are High, the data on the data input (DIB) is loaded into theword selected by the write address (ADDRB) during the Low-to-High clock transition and the data output (DOB)reflects the selected (addressed) word.

The above descriptions assume active High control pins (ENA, WEA, RSTA, CLKA, ENB, WEB, RSTB, andCLKB). However, the active level can be changed by placing an inverter on the port. Any inverter placed on aRAMB4 port is absorbed into the block and does not use a CLB resource.

Libraries Guide

10.1 www.xilinx.com 581

Page 582: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Block RAM output registers are asynchronously cleared, output Low, when power is applied. The initial contentsof the block RAM are not altered. For FPGA devices, power-on conditions are simulated when global set/reset(GSR) is active. GSR defaults to active-High but can be inverted by adding an inverter in front of the GSR inputof the appropriate STARTUP_architecture symbol.

You can use the INIT_0x attributes to specify an initial value during device configuration. There are 16initialization attributes (INIT_00 through INIT_0F) of 64 hex values for a total of 4096 bits. If any INIT_0xattribute is not specified, it is configured as zeros. Partial initialization strings are padded with zeros to the left.

Logic TableInputs Outputs

EN(A/B) RST(A/B) WE(A/B) CLK(A/B) ADDR(A/B) DI(A/B) DO(A/B) RAM Contents

0 X X X X X No Change No Change

1 1 0 ↑ X X 0 No Change

1 1 1 ↑ addr data 0 RAM(addr) =>data

1 0 0 ↑ addr X RAM(addr) No Change

1 0 1 ↑ addr data data RAM(addr) =>data

addr=RAM address of port A/B

RAM(addr)=RAM contents at address ADDRA/ADDRB

data=RAM input data at pins DIA/DIB

Port DescriptionsAddress Mapping - Each port accesses the same set of 4096 memory cells using an addressing scheme that isdependent on the width of the port. The physical RAM location that is addressed for a particular width isdetermined from the following formula.• Start=((ADDR port+1)*(Widthport)) -1• End=(ADDRport)*(Widthport)

Port Width Port Addresses

8 512 <----- 1 0

Port Conflict resolution - This design element is a true dual-ported RAM in that it allows simultaneous reads ofthe same memory cell. When one port is performing a write to a given memory cell, the other port should notaddress that memory cell (for a write or a read) within the clock-to-clock setup window.• If both ports write to the same memory cell simultaneously, violating the clock-to-setup requirement, the

data stored will be invalid.• If one port attempts to read from the same memory cell that the other is simultaneously writing to, violating

the clock setup requirement, the write will be successful but the data read will be invalid.

Design Entry MethodInstantiation Recommended

Inference No

Libraries Guide

582 www.xilinx.com 10.1

Page 583: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- RAMB4_S8_S8: Virtex/E, Spartan-II/IIE 512 x 8 Dual-Port RAM-- Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S8_S8_inst : RAMB4_S8_S8generic map (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_06 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000")port map (DOA => DOA, -- Port A 8-bit data outputDOB => DOB, -- Port B 8-bit data outputADDRA => ADDRA, -- Port A 9-bit address inputADDRB => ADDRB, -- Port B 9-bit address inputCLKA => CLKA, -- Port A clock inputCLKB => CLKB, -- Port B clock inputDIA => DIA, -- Port A 8-bit data inputDIB => DIB, -- Port B 8-bit data inputENA => ENA, -- Port A RAM enable inputENB => ENB, -- Port B RAM enable inputRSTA => RSTA, -- Port A Synchronous reset inputRSTB => RSTB, -- Port B Synchronous reset inputWEA => WEA, -- Port A RAM write enable inputWEB => WEB -- Port B RAM write enable input);

-- End of RAMB4_S8_S8_inst instantiation

Verilog Instantiation Template// RAMB4_S8_S8: Virtex/E, Spartan-II/IIE 512 x 8 Dual-Port RAM// Xilinx HDL Libraries Guide, version 10.1.2

RAMB4_S8_S8 #(.SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"// The following INIT_xx declarations specify the initial contents of the RAM.INIT_00(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_01(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_02(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_03(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_04(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_05(256’h0000000000000000000000000000000000000000000000000000000000000000),.INIT_06(256’h0000000000000000000000000000000000000000000000000000000000000000),

Libraries Guide

10.1 www.xilinx.com 583

Page 584: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.INIT_07(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_08(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_09(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0A(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0B(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0C(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0D(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0E(256’h0000000000000000000000000000000000000000000000000000000000000000),

.INIT_0F(256’h0000000000000000000000000000000000000000000000000000000000000000)) RAMB4_S8_S8_inst (.DOA(DOA), // Port A 8-bit data output.DOB(DOB), // Port B 8-bit data output.ADDRA(ADDRA), // Port A 9-bit address input.ADDRB(ADDRB), // Port B 9-bit address input.CLKA(CLKA), // Port A clock input.CLKB(CLKB), // Port B clock input.DIA(DIA), // Port A 8-bit data input.DIB(DIB), // Port B 8-bit data input.ENA(ENA), // Port A RAM enable input.ENB(ENB), // Port B RAM enable input.RSTA(RSTA), // Port A Synchronous reset input.RSTB(RSTB), // Port B Synchronous reset input.WEA(WEA), // Port A RAM write enable input.WEB(WEB) // Port B RAM write enable input);

// End of RAMB4_S8_S8_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

584 www.xilinx.com 10.1

Page 585: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ROM128X1

Primitive: 128-Deep by 1-Wide ROM

IntroductionThis design element is a 128-word by 1-bit read-only memory. The data output (O) reflects the word selected bythe 7-bit address (A6 – A0). The ROM is initialized to a known value during configuration with the INIT=valueparameter. The value consists of 32 hexadecimal digits that are written into the ROM from the most-significantdigit A=FH to the least-significant digit A=0H. An error occurs if the INIT=value is not specified.

Logic TableInput Output

I0 I1 I2 I3 O

0 0 0 0 INIT(0)

0 0 0 1 INIT(1)

0 0 1 0 INIT(2)

0 0 1 1 INIT(3)

0 1 0 0 INIT(4)

0 1 0 1 INIT(5)

0 1 1 0 INIT(6)

0 1 1 1 INIT(7)

1 0 0 0 INIT(8)

1 0 0 1 INIT(9)

1 0 1 0 INIT(10)

1 0 1 1 INIT(11)

1 1 0 0 INIT(12)

1 1 0 1 INIT(13)

1 1 1 0 INIT(14)

1 1 1 1 INIT(15)

Libraries Guide

10.1 www.xilinx.com 585

Page 586: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 128-Bit Value All zeros Specifies the contents of the ROM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- ROM128X1: 128 x 1 Asynchronous Distributed => LUT ROM-- Virtex-II/II-Pro/4/5, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

ROM128X1_inst : ROM128X1generic map (INIT => X"00000000000000000000000000000000")port map (O => O, -- ROM outputA0 => A0, -- ROM address[0]A1 => A1, -- ROM address[1]A2 => A2, -- ROM address[2]A3 => A3, -- ROM address[3]A4 => A4, -- ROM address[4]A5 => A5, -- ROM address[5]A6 => A6 -- ROM address[6]);

-- End of ROM128X1_inst instantiation

Verilog Instantiation Template// ROM128X1: 128 x 1 Asynchronous Distributed (LUT) ROM// Virtex-II/II-Pro/4/5, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

ROM128X1 #(.INIT(128’h00000000000000000000000000000000) // Contents of ROM) ROM128X1_inst (.O(O), // ROM output.A0(A0), // ROM address[0].A1(A1), // ROM address[1].A2(A2), // ROM address[2].A3(A3), // ROM address[3].A4(A4), // ROM address[4].A5(A5), // ROM address[5].A6(A6) // ROM address[6]);

// End of ROM128X1_inst instantiation

Libraries Guide

586 www.xilinx.com 10.1

Page 588: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ROM16X1

Primitive: 16-Deep by 1-Wide ROM

IntroductionThis design element is a 16-word by 1-bit read-only memory. The data output (O) reflects the word selected bythe 4-bit address (A3 – A0). The ROM is initialized to a known value during configuration with the INIT=valueparameter. The value consists of four hexadecimal digits that are written into the ROM from the most-significantdigit A=FH to the least-significant digit A=0H. For example, the INIT=10A7 parameter produces the data stream:0001 0000 1010 0111 An error occurs if the INIT=value is not specified.

Logic TableInput Output

I0 I1 I2 I3 O

0 0 0 0 INIT(0)

0 0 0 1 INIT(1)

0 0 1 0 INIT(2)

0 0 1 1 INIT(3)

0 1 0 0 INIT(4)

0 1 0 1 INIT(5)

0 1 1 0 INIT(6)

0 1 1 1 INIT(7)

1 0 0 0 INIT(8)

1 0 0 1 INIT(9)

1 0 1 0 INIT(10)

1 0 1 1 INIT(11)

1 1 0 0 INIT(12)

1 1 0 1 INIT(13)

1 1 1 0 INIT(14)

1 1 1 1 INIT(15)

Libraries Guide

588 www.xilinx.com 10.1

Page 589: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 16-Bit Value All zeros Specifies the contents of the ROM.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- ROM16X1: 16 x 1 Asynchronous Distributed => LUT ROM-- Xilinx HDL Libraries Guide, version 10.1.2

ROM16X1_inst : ROM16X1generic map (INIT => X"0000")port map (O => O, -- ROM outputA0 => A0, -- ROM address[0]A1 => A1, -- ROM address[1]A2 => A2, -- ROM address[2]A3 => A3 -- ROM address[3]);

-- End of ROM16X1_inst instantiation

Verilog Instantiation Template// ROM16X1: 16 x 1 Asynchronous Distributed (LUT) ROM// All FPGAs// Xilinx HDL Libraries Guide, version 10.1.2

ROM16X1 #(.INIT(16’h0000) // Contents of ROM) ROM16X1_inst (.O(O), // ROM output.A0(A0), // ROM address[0].A1(A1), // ROM address[1].A2(A2), // ROM address[2].A3(A3) // ROM address[3]);

// End of ROM16X1_inst instantiation

Libraries Guide

10.1 www.xilinx.com 589

Page 591: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ROM256X1

Primitive: 256-Deep by 1-Wide ROM

IntroductionThis design element is a 256-word by 1-bit read-only memory. The data output (O) reflects the word selected bythe 8-bit address (A7– A0). The ROM is initialized to a known value during configuration with the INIT=valueparameter. The value consists of 64 hexadecimal digits that are written into the ROM from the most-significantdigit A=FH to the least-significant digit A=0H.

An error occurs if the INIT=value is not specified.

Logic TableInput Output

I0 I1 I2 I3 O

0 0 0 0 INIT(0)

0 0 0 1 INIT(1)

0 0 1 0 INIT(2)

0 0 1 1 INIT(3)

0 1 0 0 INIT(4)

0 1 0 1 INIT(5)

0 1 1 0 INIT(6)

0 1 1 1 INIT(7)

1 0 0 0 INIT(8)

1 0 0 1 INIT(9)

1 0 1 0 INIT(10)

1 0 1 1 INIT(11)

1 1 0 0 INIT(12)

1 1 0 1 INIT(13)

1 1 1 0 INIT(14)

1 1 1 1 INIT(15)

Libraries Guide

10.1 www.xilinx.com 591

Page 592: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 256-Bit Value All zeros Specifies the contents of the ROM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- ROM256X1: 256 x 1 Asynchronous Distributed => LUT ROM-- Virtex-II/II-Pro/4/5, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

ROM256X1_inst : ROM256X1generic map (INIT => X"0000000000000000000000000000000000000000000000000000000000000000")port map (O => O, -- ROM outputA0 => A0, -- ROM address[0]A1 => A1, -- ROM address[1]A2 => A2, -- ROM address[2]A3 => A3, -- ROM address[3]A4 => A4, -- ROM address[4]A5 => A5, -- ROM address[5]A6 => A6, -- ROM address[6]A7 => A7 -- ROM address[7]);

-- End of ROM256X1_inst instantiation

Verilog Instantiation Template// ROM256X1: 256 x 1 Asynchronous Distributed (LUT) ROM// Virtex-II/II-Pro/4/5, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

ROM256X1 #(.INIT(256’h0000000000000000000000000000000000000000000000000000000000000000) // Contents of ROM) ROM256X1_inst (.O(O), // ROM output.A0(A0), // ROM address[0].A1(A1), // ROM address[1].A2(A2), // ROM address[2].A3(A3), // ROM address[3].A4(A4), // ROM address[4].A5(A5), // ROM address[5].A6(A6), // ROM address[6].A7(A7) // ROM address[7]);

Libraries Guide

592 www.xilinx.com 10.1

Page 593: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

// End of ROM256X1_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 593

Page 594: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ROM32X1

Primitive: 32-Deep by 1-Wide ROM

IntroductionThis design element is a 32-word by 1-bit read-only memory. The data output (O) reflects the word selected bythe 5-bit address (A4 – A0). The ROM is initialized to a known value during configuration with the INIT=valueparameter. The value consists of eight hexadecimal digits that are written into the ROM from the most-significantdigit A=1FH to the least-significant digit A=00H.

For example, the INIT=10A78F39 parameter produces the data stream: 0001 0000 1010 0111 1000 1111 0011 1001An error occurs if the INIT=value is not specified.

Logic TableInput Output

I0 I1 I2 I3 O

0 0 0 0 INIT(0)

0 0 0 1 INIT(1)

0 0 1 0 INIT(2)

0 0 1 1 INIT(3)

0 1 0 0 INIT(4)

0 1 0 1 INIT(5)

0 1 1 0 INIT(6)

0 1 1 1 INIT(7)

1 0 0 0 INIT(8)

1 0 0 1 INIT(9)

1 0 1 0 INIT(10)

1 0 1 1 INIT(11)

1 1 0 0 INIT(12)

1 1 0 1 INIT(13)

1 1 1 0 INIT(14)

1 1 1 1 INIT(15)

Libraries Guide

594 www.xilinx.com 10.1

Page 595: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 32-Bit Value All zeros Specifies the contents of the ROM.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- ROM32X1: 32 x 1 Asynchronous Distributed => LUT ROM-- Xilinx HDL Libraries Guide, version 10.1.2

ROM32X1_inst : ROM32X1generic map (INIT => X"00000000")port map (O => O, -- ROM outputA0 => A0, -- ROM address[0]A1 => A1, -- ROM address[1]A2 => A2, -- ROM address[2]A3 => A3, -- ROM address[3]A4 => A4 -- ROM address[4]);-- End of ROM32X1_inst instantiation

Verilog Instantiation Template// ROM32X1: 32 x 1 Asynchronous Distributed (LUT) ROM// All FPGAs// Xilinx HDL Libraries Guide, version 10.1.2

ROM32X1 #(.INIT(32’h00000000) // Contents of ROM) ROM32X1_inst (.O(O), // ROM output.A0(A0), // ROM address[0].A1(A1), // ROM address[1].A2(A2), // ROM address[2].A3(A3), // ROM address[3].A4(A4) // ROM address[4]);

// End of ROM32X1_inst instantiation

Libraries Guide

10.1 www.xilinx.com 595

Page 597: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

ROM64X1

Primitive: 64-Deep by 1-Wide ROM

IntroductionThis design element is a 64-word by 1-bit read-only memory. The data output (O) reflects the word selected bythe 6-bit address (A5 – A0). The ROM is initialized to a known value during configuration with the INIT=valueparameter. The value consists of 16 hexadecimal digits that are written into the ROM from the most-significantdigit A=FH to the least-significant digit A=0H. An error occurs if the INIT=value is not specified.

Logic TableInput Output

I0 I1 I2 I3 O

0 0 0 0 INIT(0)

0 0 0 1 INIT(1)

0 0 1 0 INIT(2)

0 0 1 1 INIT(3)

0 1 0 0 INIT(4)

0 1 0 1 INIT(5)

0 1 1 0 INIT(6)

0 1 1 1 INIT(7)

1 0 0 0 INIT(8)

1 0 0 1 INIT(9)

1 0 1 0 INIT(10)

1 0 1 1 INIT(11)

1 1 0 0 INIT(12)

1 1 0 1 INIT(13)

1 1 1 0 INIT(14)

1 1 1 1 INIT(15)

Libraries Guide

10.1 www.xilinx.com 597

Page 598: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 64-Bit Value All zeros Specifies the contents of the ROM.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- ROM64X1: 64 x 1 Asynchronous Distributed => LUT ROM-- Virtex-II/II-Pro/4/5, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

ROM64X1_inst : ROM64X1generic map (INIT => X"0000000000000000")port map (O => O, -- ROM outputA0 => A0, -- ROM address[0]A1 => A1, -- ROM address[1]A2 => A2, -- ROM address[2]A3 => A3, -- ROM address[3]A4 => A4, -- ROM address[4]A5 => A5 -- ROM address[5]);

-- End of ROM64X1_inst instantiation

Verilog Instantiation Template// ROM64X1: 64 x 1 Asynchronous Distributed (LUT) ROM// Virtex-II/II-Pro/4/5, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

ROM64X1 #(.INIT(64’h0000000000000000) // Contents of ROM) ROM64X1_inst (.O(O), // ROM output.A0(A0), // ROM address[0].A1(A1), // ROM address[1].A2(A2), // ROM address[2].A3(A3), // ROM address[3].A4(A4), // ROM address[4].A5(A5) // ROM address[5]);

// End of ROM64X1_inst instantiation

Libraries Guide

598 www.xilinx.com 10.1

Page 600: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

SRL16Primitive: 16-Bit Shift Register Look-Up-Table (LUT)

IntroductionThis design element is a shift register look-up table (LUT). The inputs A3, A2, A1, and A0 select the outputlength of the shift register.

The shift register can be of a fixed, static length or it can be dynamically adjusted.• To create a fixed-length shift register - Drive the A3 through A0 inputs with static values. The length of

the shift register can vary from 1 bit to 16 bits, as determined by the following formula: Length = (8 x A3)+(4 x A2) + (2 x A1) + A0 +1 If A3, A2, A1, and A0 are all zeros (0000), the shift register is one bit long. Ifthey are all ones (1111), it is 16 bits long.

• To change the length of the shift register dynamically - Change the values driving the A3 through A0inputs. For example, if A2, A1, and A0 are all ones (111) and A3 toggles between a one (1) and a zero (0), thelength of the shift register changes from 16 bits to 8 bits. Internally, the length of the shift register is always 16bits and the input lines A3 through A0 select which of the 16 bits reach the output.

The shift register LUT contents are initialized by assigning a four-digit hexadecimal number to an INIT attribute.The first, or the left-most, hexadecimal digit is the most significant bit. If an INIT value is not specified, it defaultsto a value of four zeros (0000) so that the shift register LUT is cleared during configuration.

The data (D) is loaded into the first bit of the shift register during the Low-to-High clock (CLK) transition. Duringsubsequent Low-to-High clock transitions data shifts to the next highest bit position while new data is loaded.The data appears on the Q output when the shift register length determined by the address inputs is reached.

Logic TableInputs Output

Am CLK D Q

Am X X Q(Am)

Am ↑ D Q(Am - 1)

m= 0, 1, 2, 3

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

600 www.xilinx.com 10.1

Page 601: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 16-Bit Value All zeros Sets the initial value of Q output afterconfiguration.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- SRL16: 16-bit shift register LUT operating on posedge of clock-- All FPGAs-- Xilinx HDL Libraries Guide, version 10.1.2

SRL16_inst : SRL16generic map (INIT => X"0000")port map (Q => Q, -- SRL data outputA0 => A0, -- Select[0] inputA1 => A1, -- Select[1] inputA2 => A2, -- Select[2] inputA3 => A3, -- Select[3] inputCLK => CLK, -- Clock inputD => D -- SRL data input);

-- End of SRL16_inst instantiation

Verilog Instantiation Template// SRL16: 16-bit shift register LUT operating on posedge of clock// All FPGAs// Xilinx HDL Libraries Guide, version 10.1.2

SRL16 #(.INIT(16’h0000) // Initial Value of Shift Register) SRL16_inst (.Q(Q), // SRL data output.A0(A0), // Select[0] input.A1(A1), // Select[1] input.A2(A2), // Select[2] input.A3(A3), // Select[3] input.CLK(CLK), // Clock input.D(D) // SRL data input);

// End of SRL16_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 601

Page 602: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

SRL16_1

Primitive: 16-Bit Shift Register Look-Up-Table (LUT) with Negative-Edge Clock

IntroductionThis design element is a shift register look-up table (LUT). The inputs A3, A2, A1, and A0 select the outputlength of the shift register.

The shift register can be of a fixed, static length or it can be dynamically adjusted.• To create a fixed-length shift register - Drive the A3 through A0 inputs with static values. The length of

the shift register can vary from 1 bit to 16 bits, as determined by the following formula: Length = (8 x A3)+(4 x A2) + (2 x A1) + A0 +1 If A3, A2, A1, and A0 are all zeros (0000), the shift register is one bit long. Ifthey are all ones (1111), it is 16 bits long.

• To change the length of the shift register dynamically - Change the values driving the A3 through A0inputs. For example, if A2, A1, and A0 are all ones (111) and A3 toggles between a one (1) and a zero (0), thelength of the shift register changes from 16 bits to 8 bits. Internally, the length of the shift register is always 16bits and the input lines A3 through A0 select which of the 16 bits reach the output.

The shift register LUT contents are initialized by assigning a four-digit hexadecimal number to an INIT attribute.The first, or the left-most, hexadecimal digit is the most significant bit. If an INIT value is not specified, it defaultsto a value of four zeros (0000) so that the shift register LUT is cleared during configuration.

The data (D) is loaded into the first bit of the shift register during the High-to-Low clock (CLK) transition. Duringsubsequent High-to-Low clock transitions data shifts to the next highest bit position as new data is loaded. Thedata appears on the Q output when the shift register length determined by the address inputs is reached.

Logic TableInputs Output

Am CLK D Q

Am X X Q(Am)

Am ↓ D Q(Am - 1)

m= 0, 1, 2, 3

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

602 www.xilinx.com 10.1

Page 603: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 16-Bit Value All zeros Sets the initial value of Q output afterconfiguration

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- SRL16_1: 16-bit shift register LUT operating on negedge of clock-- All FPGAs-- Xilinx HDL Libraries Guide, version 10.1.2

SRL16_1_inst : SRL16_1generic map (INIT => X"0000")port map (Q => Q, -- SRL data outputA0 => A0, -- Select[0] inputA1 => A1, -- Select[1] inputA2 => A2, -- Select[2] inputA3 => A3, -- Select[3] inputCLK => CLK, -- Clock inputD => D -- SRL data input);

-- End of SRL16_1_inst instantiation

Verilog Instantiation Template// SRL16_1: 16-bit shift register LUT operating on negedge of clock// All FPGAs// Xilinx HDL Libraries Guide, version 10.1.2

SRL16_1 #(.INIT(16’h0000) // Initial Value of Shift Register) SRL16_1_inst (.Q(Q), // SRL data output.A0(A0), // Select[0] input.A1(A1), // Select[1] input.A2(A2), // Select[2] input.A3(A3), // Select[3] input.CLK(CLK), // Clock input.D(D) // SRL data input);

// End of SRL16_1_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 603

Page 604: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

SRL16E

Primitive: 16-Bit Shift Register Look-Up-Table (LUT) with Clock Enable

IntroductionThis design element is a shift register look-up table (LUT). The inputs A3, A2, A1, and A0 select the outputlength of the shift register.

The shift register can be of a fixed, static length or it can be dynamically adjusted.• To create a fixed-length shift register - Drive the A3 through A0 inputs with static values. The length of

the shift register can vary from 1 bit to 16 bits, as determined by the following formula: Length = (8 x A3)+(4 x A2) + (2 x A1) + A0 +1 If A3, A2, A1, and A0 are all zeros (0000), the shift register is one bit long. Ifthey are all ones (1111), it is 16 bits long.

• To change the length of the shift register dynamically - Change the values driving the A3 through A0inputs. For example, if A2, A1, and A0 are all ones (111) and A3 toggles between a one (1) and a zero (0), thelength of the shift register changes from 16 bits to 8 bits. Internally, the length of the shift register is always 16bits and the input lines A3 through A0 select which of the 16 bits reach the output.

The shift register LUT contents are initialized by assigning a four-digit hexadecimal number to an INIT attribute.The first, or the left-most, hexadecimal digit is the most significant bit. If an INIT value is not specified, it defaultsto a value of four zeros (0000) so that the shift register LUT is cleared during configuration.

When CE is High, the data (D) is loaded into the first bit of the shift register during the Low-to-High clock (CLK)transition. During subsequent Low-to-High clock transitions, when CE is High, data shifts to the next highest bitposition as new data is loaded. The data appears on the Q output when the shift register length determined bythe address inputs is reached. When CE is Low, the register ignores clock transitions.

Logic TableInputs Output

Am CE CLK D Q

Am 0 X X Q(Am)

Am 1 ↑ D Q(Am - 1)

m= 0, 1, 2, 3

Design Entry MethodInstantiation Yes

Inference Recommended

Libraries Guide

604 www.xilinx.com 10.1

Page 605: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Coregen and wizards No

Macro support No

Libraries Guide

10.1 www.xilinx.com 605

Page 606: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 16-Bit Value All zeros Sets the initial value of content and output of shiftregister after configuration.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- SRL16E: 16-bit shift register LUT with clock enable operating on posedge of clock-- All FPGAs-- Xilinx HDL Libraries Guide, version 10.1.2

SRL16E_inst : SRL16Egeneric map (INIT => X"0000")port map (Q => Q, -- SRL data outputA0 => A0, -- Select[0] inputA1 => A1, -- Select[1] inputA2 => A2, -- Select[2] inputA3 => A3, -- Select[3] inputCE => CE, -- Clock enable inputCLK => CLK, -- Clock inputD => D -- SRL data input);

-- End of SRL16E_inst instantiation

Verilog Instantiation Template// SRL16E: 16-bit shift register LUT with clock enable operating on posedge of clock// All FPGAs// Xilinx HDL Libraries Guide, version 10.1.2

SRL16E #(.INIT(16’h0000) // Initial Value of Shift Register) SRL16E_inst (.Q(Q), // SRL data output.A0(A0), // Select[0] input.A1(A1), // Select[1] input.A2(A2), // Select[2] input.A3(A3), // Select[3] input.CE(CE), // Clock enable input.CLK(CLK), // Clock input.D(D) // SRL data input);

// End of SRL16E_inst instantiation

For More Information• See the Virtex-II User Guide.• See the Virtex-II Data Sheets.

Libraries Guide

606 www.xilinx.com 10.1

Page 607: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

SRL16E_1

Primitive: 16-Bit Shift Register Look-Up-Table (LUT) with Negative-Edge Clock and Clock Enable

IntroductionThis design element is a shift register look up table (LUT) with clock enable (CE). The inputs A3, A2, A1, and A0select the output length of the shift register.

The shift register can be of a fixed, static length or it can be dynamically adjusted.• To create a fixed-length shift register - Drive the A3 through A0 inputs with static values. The length of

the shift register can vary from 1 bit to 16 bits, as determined by the following formula: Length = (8 x A3)+(4 x A2) + (2 x A1) + A0 +1 If A3, A2, A1, and A0 are all zeros (0000), the shift register is one bit long. Ifthey are all ones (1111), it is 16 bits long.

• To change the length of the shift register dynamically - Change the values driving the A3 through A0inputs. For example, if A2, A1, and A0 are all ones (111) and A3 toggles between a one (1) and a zero (0), thelength of the shift register changes from 16 bits to 8 bits. Internally, the length of the shift register is always 16bits and the input lines A3 through A0 select which of the 16 bits reach the output.

The shift register LUT contents are initialized by assigning a four-digit hexadecimal number to an INIT attribute.The first, or the left-most, hexadecimal digit is the most significant bit. If an INIT value is not specified, it defaultsto a value of four zeros (0000) so that the shift register LUT is cleared during configuration.

When CE is High, the data (D) is loaded into the first bit of the shift register during the High-to-Low clock (CLK)transition. During subsequent High-to-Low clock transitions, when CE is High, data is shifted to the next highestbit position as new data is loaded. The data appears on the Q output when the shift register length determinedby the address inputs is reached. When CE is Low, the register ignores clock transitions.

Logic TableInputs Output

Am CE CLK D Q

Am 0 X X Q(Am)

Am 1 ↓ D Q(Am - 1)

m= 0, 1, 2, 3

Design Entry MethodInstantiation Yes

Inference Recommended

Libraries Guide

10.1 www.xilinx.com 607

Page 608: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Coregen and wizards No

Macro support No

Available Attributes

Attribute TypeAllowedValues Default Description

INIT Hexadecimal Any 16-BitValue

All zeros Sets the initial value of content and output of shiftregister after configuration.

VHDL Instantiation Template

Unless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- SRL16E_1: 16-bit shift register LUT with clock enable operating on negedge of clock-- All FPGAs-- Xilinx HDL Libraries Guide, version 10.1.2

SRL16E_1_inst : SRL16E_1generic map (INIT => X"0000")port map (Q => Q, -- SRL data outputA0 => A0, -- Select[0] inputA1 => A1, -- Select[1] inputA2 => A2, -- Select[2] inputA3 => A3, -- Select[3] inputCE => CE, -- Clock enable inputCLK => CLK, -- Clock inputD => D -- SRL data input);

-- End of SRL16E_1_inst instantiation

Verilog Instantiation Template// SRL16E_1: 16-bit shift register LUT with clock enable operating on negedge of clock// All FPGAs// Xilinx HDL Libraries Guide, version 10.1.2

SRL16E_1 #(.INIT(16’h0000) // Initial Value of Shift Register) SRL16E_1_inst (.Q(Q), // SRL data output.A0(A0), // Select[0] input.A1(A1), // Select[1] input.A2(A2), // Select[2] input.A3(A3), // Select[3] input.CE(CE), // Clock enable input.CLK(CLK), // Clock input.D(D) // SRL data input);

// End of SRL16E_1_inst instantiation

Libraries Guide

608 www.xilinx.com 10.1

Page 610: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

SRLC16Primitive: 16-Bit Shift Register Look-Up Table (LUT) with Carry

IntroductionThis design element is a shift register look-up table (LUT) with Carry. The inputs A3, A2, A1, and A0 select theoutput length of the shift register.

The shift register can be of a fixed, static length or it can be dynamically adjusted.• To create a fixed-length shift register - Drive the A3 through A0 inputs with static values. The length of

the shift register can vary from 1 bit to 16 bits, as determined by the following formula: Length = (8 x A3)+(4 x A2) + (2 x A1) + A0 +1 If A3, A2, A1, and A0 are all zeros (0000), the shift register is one bit long. Ifthey are all ones (1111), it is 16 bits long.

• To change the length of the shift register dynamically - Change the values driving the A3 through A0inputs. For example, if A2, A1, and A0 are all ones (111) and A3 toggles between a one (1) and a zero (0), thelength of the shift register changes from 16 bits to 8 bits. Internally, the length of the shift register is always 16bits and the input lines A3 through A0 select which of the 16 bits reach the output.

The shift register LUT contents are initialized by assigning a four-digit hexadecimal number to an INIT attribute.The first, or the left-most, hexadecimal digit is the most significant bit. If an INIT value is not specified, it defaultsto a value of four zeros (0000) so that the shift register LUT is cleared during configuration.

The data (D) is loaded into the first bit of the shift register during the Low-to-High clock (CLK) transition. Duringsubsequent Low-to-High clock transitions data shifts to the next highest bit position as new data is loaded. Thedata appears on the Q output when the shift register length determined by the address inputs is reached. TheQ15 output is available for you in cascading to multiple shift register LUTs to create larger shift registers.

Logic TableInputs Output

Am CLK D Q

Am X X Q(Am)

Am ↑ D Q(Am - 1)

m= 0, 1, 2, 3

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

610 www.xilinx.com 10.1

Page 611: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 16-Bit Value All zeros Sets the initial value of content and output of shiftregister after configuration.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- SRLC16: 16-bit cascadable shift register LUT operating on posedge of clock-- Virtex-II/II-Pro, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

SRLC16_inst : SRLC16generic map (INIT => X"0000")port map (Q => Q, -- SRL data outputQ15 => Q15, -- Carry output (connect to next SRL)A0 => A0, -- Select[0] inputA1 => A1, -- Select[1] inputA2 => A2, -- Select[2] inputA3 => A3, -- Select[3] inputCLK => CLK, -- Clock inputD => D -- SRL data input);

-- End of SRLC16_inst instantiation

Verilog Instantiation Template// SRLC16: 16-bit cascadable shift register LUT operating on posedge of clock// Virtex-II/II-Pro/4, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

SRLC16 #(.INIT(16’h0000) // Initial Value of Shift Register) SRLC16_inst (.Q(Q), // SRL data output.Q15(Q15), // Carry output (connect to next SRL).A0(A0), // Select[0] input.A1(A1), // Select[1] input.A2(A2), // Select[2] input.A3(A3), // Select[3] input.CLK(CLK), // Clock input.D(D) // SRL data input);

// End of SRLC16_inst instantiation

For More Information• See the Virtex-II User Guide.• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 611

Page 612: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

SRLC16_1

Primitive: 16-Bit Shift Register Look-Up Table (LUT) with Carry and Negative-Edge Clock

IntroductionThis design element is a shift register look-up table (LUT) with carry and a negative-edge clock. The inputs A3,A2, A1, and A0 select the output length of the shift register.

The shift register can be of a fixed, static length or it can be dynamically adjusted.• To create a fixed-length shift register - Drive the A3 through A0 inputs with static values. The length of

the shift register can vary from 1 bit to 16 bits, as determined by the following formula: Length = (8 x A3)+(4 x A2) + (2 x A1) + A0 +1 If A3, A2, A1, and A0 are all zeros (0000), the shift register is one bit long. Ifthey are all ones (1111), it is 16 bits long.

• To change the length of the shift register dynamically - Change the values driving the A3 through A0inputs. For example, if A2, A1, and A0 are all ones (111) and A3 toggles between a one (1) and a zero (0), thelength of the shift register changes from 16 bits to 8 bits. Internally, the length of the shift register is always 16bits and the input lines A3 through A0 select which of the 16 bits reach the output.

The shift register LUT contents are initialized by assigning a four-digit hexadecimal number to an INIT attribute.The first, or the left-most, hexadecimal digit is the most significant bit. If an INIT value is not specified, it defaultsto a value of four zeros (0000) so that the shift register LUT is cleared during configuration.

The Q15 output is available for your use in cascading multiple shift register LUTs to create larger shift registers.

Logic TableInputs Output

Am CLK D Q Q15

Am X X Q(Am) No Change

Am ↓ D Q(Am - 1) Q14

m= 0, 1, 2, 3

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Libraries Guide

612 www.xilinx.com 10.1

Page 613: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 16-Bit Value All zeros Sets the initial value of content and output of shiftregister after configuration.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- SRLC16_1: 16-bit cascadable shift register LUT operating on negedge of clock-- Virtex-II/II-Pro, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

SRLC16_1_inst : SRLC16_1generic map (INIT => X"0000")port map (Q => Q, -- SRL data outputQ15 => Q15, -- Carry output (connect to next SRL)A0 => A0, -- Select[0] inputA1 => A1, -- Select[1] inputA2 => A2, -- Select[2] inputA3 => A3, -- Select[3] inputCLK => CLK, -- Clock inputD => D -- SRL data input);

-- End of SRLC16_1_inst instantiation

Verilog Instantiation Template// SRLC16_1: 16-bit cascadable shift register LUT operating on negedge of clock// Virtex-II/II-Pro/4, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

SRLC16_1 #(.INIT(16’h0000) // Initial Value of Shift Register) SRLC16_1_inst (.Q(Q), // SRL data output.Q15(Q15), // Carry output (connect to next SRL).A0(A0), // Select[0] input.A1(A1), // Select[1] input.A2(A2), // Select[2] input.A3(A3), // Select[3] input.CLK(CLK), // Clock input.D(D) // SRL data input);

// End of SRLC16_1_inst instantiation

For More Information• See the Virtex-II User Guide.• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 613

Page 614: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

SRLC16EPrimitive: 16-Bit Shift Register Look-Up Table (LUT) with Carry and Clock Enable

IntroductionThis design element is a shift register look-up table (LUT) with carry and clock enable. The inputs A3, A2, A1,and A0 select the output length of the shift register.

The shift register can be of a fixed, static length or it can be dynamically adjusted.• To create a fixed-length shift register - Drive the A3 through A0 inputs with static values. The length of

the shift register can vary from 1 bit to 16 bits, as determined by the following formula: Length = (8 x A3)+(4 x A2) + (2 x A1) + A0 +1 If A3, A2, A1, and A0 are all zeros (0000), the shift register is one bit long. Ifthey are all ones (1111), it is 16 bits long.

• To change the length of the shift register dynamically - Change the values driving the A3 through A0inputs. For example, if A2, A1, and A0 are all ones (111) and A3 toggles between a one (1) and a zero (0), thelength of the shift register changes from 16 bits to 8 bits. Internally, the length of the shift register is always 16bits and the input lines A3 through A0 select which of the 16 bits reach the output.

The shift register LUT contents are initialized by assigning a four-digit hexadecimal number to an INIT attribute.The first, or the left-most, hexadecimal digit is the most significant bit. If an INIT value is not specified, it defaultsto a value of four zeros (0000) so that the shift register LUT is cleared during configuration.

The data (D) is loaded into the first bit of the shift register during the Low-to-High clock (CLK) transition.When CE is High, during subsequent Low-to-High clock transitions, data shifts to the next highest bit positionas new data is loaded. The data appears on the Q output when the shift register length determined by theaddress inputs is reached.

The Q15 output is available for you in cascading to multiple shift register LUTs to create larger shift registers.

Logic TableInputs Output

Am CLK CE D Q Q15

Am X 0 X Q(Am) Q(15)

Am X 1 X Q(Am) Q(15)

Am ↑ 1 D Q(Am - 1) Q15

m= 0, 1, 2, 3

Design Entry MethodInstantiation Yes

Inference Recommended

Libraries Guide

614 www.xilinx.com 10.1

Page 615: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Coregen and wizards No

Macro support No

Libraries Guide

10.1 www.xilinx.com 615

Page 616: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Available AttributesAttribute Type Allowed Values Default Description

INIT Hexadecimal Any 16-Bit Value All zeros Sets the initial value of content and output of shiftregister after configuration.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- SRLC16E: 16-bit cascable shift register LUT with clock enable operating on posedge of clock-- Virtex-II/II-Pro, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

SRLC16E_inst : SRLC16Egeneric map (INIT => X"0000")port map (Q => Q, -- SRL data outputQ15 => Q15, -- Carry output (connect to next SRL)A0 => A0, -- Select[0] inputA1 => A1, -- Select[1] inputA2 => A2, -- Select[2] inputA3 => A3, -- Select[3] inputCE => CE, -- Clock enable inputCLK => CLK, -- Clock inputD => D -- SRL data input);

-- End of SRLC16E_inst instantiation

Verilog Instantiation Template// SRLC16E: 16-bit cascadable shift register LUT with clock enable operating on posedge of clock// Virtex-II/II-Pro/4, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

SRLC16E #(.INIT(16’h0000) // Initial Value of Shift Register) SRLC16E_inst (.Q(Q), // SRL data output.Q15(Q15), // Carry output (connect to next SRL).A0(A0), // Select[0] input.A1(A1), // Select[1] input.A2(A2), // Select[2] input.A3(A3), // Select[3] input.CE(CE), // Clock enable input.CLK(CLK), // Clock input.D(D) // SRL data input);

// End of SRLC16E_inst instantiation

For More Information• See the Virtex-II User Guide.• See the Virtex-II Data Sheets.

Libraries Guide

616 www.xilinx.com 10.1

Page 617: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

SRLC16E_1

Primitive: 16-Bit Shift Register Look-Up Table (LUT) with Carry, Negative-Edge Clock, and ClockEnable

IntroductionThis design element is a shift register look-up table (LUT) with carry, clock enable, and negative-edge clock. Theinputs A3, A2, A1, and A0 select the output length of the shift register.

The shift register can be of a fixed, static length or it can be dynamically adjusted.

• To create a fixed-length shift register - Drive the A3 through A0 inputs with static values. The length ofthe shift register can vary from 1 bit to 16 bits, as determined by the following formula: Length = (8 x A3)+(4 x A2) + (2 x A1) + A0 +1 If A3, A2, A1, and A0 are all zeros (0000), the shift register is one bit long. Ifthey are all ones (1111), it is 16 bits long.

• To change the length of the shift register dynamically - Change the values driving the A3 through A0inputs. For example, if A2, A1, and A0 are all ones (111) and A3 toggles between a one (1) and a zero (0), thelength of the shift register changes from 16 bits to 8 bits. Internally, the length of the shift register is always 16bits and the input lines A3 through A0 select which of the 16 bits reach the output.

The shift register LUT contents are initialized by assigning a four-digit hexadecimal number to an INIT attribute.The first, or the left-most, hexadecimal digit is the most significant bit. If an INIT value is not specified, it defaultsto a value of four zeros (0000) so that the shift register LUT is cleared during configuration.

When CE is High, the data (D) is loaded into the first bit of the shift register during the High-to-Low clock (CLK)transition. During subsequent High-to-Low clock transitions data shifts to the next highest bit position as newdata is loaded when CE is High. The data appears on the Q output when the shift register length determined bythe address inputs is reached.

The Q15 output is available for your use in cascading multiple shift register LUTs to create larger shift registers.

Logic TableInputs Output

Am CE CLK D Q Q15

Am 0 X X Q(Am) No Change

Am 1 X X Q(Am) No Change

Am 1 ↓ D Q(Am -1 ) Q14

m= 0, 1, 2, 3

Libraries Guide

10.1 www.xilinx.com 617

Page 618: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

Available Attributes

Attribute TypeAllowedValues Default Description

INIT Hexadecimal Any 16-BitValue

All zeros Sets the initial value of content and output of shift registerafter configuration.

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- SRLC16E_1: 16-bit shift register LUT with clock enable operating on negedge of clock-- Virtex-II/II-Pro, Spartan-3/3E/3A-- Xilinx HDL Libraries Guide, version 10.1.2

SRLC16E_1_inst : SRLC16E_1generic map (INIT => X"0000")port map (Q => Q, -- SRL data outputQ15 => Q15, -- Carry output (connect to next SRL)A0 => A0, -- Select[0] inputA1 => A1, -- Select[1] inputA2 => A2, -- Select[2] inputA3 => A3, -- Select[3] inputCE => CE, -- Clock enable inputCLK => CLK, -- Clock inputD => D -- SRL data input);

-- End of SRLC16E_1_inst instantiation

Verilog Instantiation Template// SRLC16E_1: 16-bit shift register LUT with clock enable operating on negedge of clock// Virtex-II/II-Pro/4, Spartan-3/3E/3A// Xilinx HDL Libraries Guide, version 10.1.2

SRLC16E_1 #(.INIT(16’h0000) // Initial Value of Shift Register) SRLC16E_1_inst (.Q(Q), // SRL data output.Q15(Q15), // Carry output (connect to next SRL).A0(A0), // Select[0] input.A1(A1), // Select[1] input.A2(A2), // Select[2] input.A3(A3), // Select[3] input.CE(CE), // Clock enable input.CLK(CLK), // Clock input

Libraries Guide

618 www.xilinx.com 10.1

Page 619: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

.D(D) // SRL data input);

// End of SRLC16E_1_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 619

Page 620: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

STARTUP_VIRTEX2Primitive: Virtex-II, Virtex-II Pro, and Virtex-II User Interface to Global Clock, Reset, and 3-StateControls

IntroductionThis design element is used for Global Set/Reset, global 3-state control, and the user configuration clock. TheGlobal Set/Reset (GSR) input, when High, sets or resets all flip-flops, all latches, and every block RAMB16output register in the device, depending on the initialization state (INIT=1 or 0) of the component. For Virtexand Virtex-E, see “STARTUP_VIRTEX”.

Note Block RAM content, LUT RAMs, the Digital Clock Manager (DCM), and shift register LUTs (SRL16,SRL16_1, SRL16E, SRL16E_1, SRLC16, SRLC16_1, SRLC16E, and SRLC16E_1) are not set/reset.

Following configuration, the global 3-state control (GTS), when High—and BSCAN is not enabled and executingan EXTEST instruction—forces all the IOB outputs into high impedance mode, which isolates the device outputsfrom the circuit but leaves the inputs active.

Note GTS= Global 3-State

Including the STARTUP_VIRTEX2 symbol in a design is optional. You must include the symbol under thefollowing conditions.• To exert external control over global set/reset, connect the GSR pin to a top level port and an IBUF.• To exert external control over global 3-state, connect the GTS pin to a top level port and IBUF.• To synchronize startup to a user clock, connect the user clock signal to the CLK input. Furthermore, “user

clock” must be selected in the BitGen program.

You can use location constraints to specify the pin from which GSR or GTS (or both) is accessed.

Design Entry MethodInstantiation Recommended

Inference No

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- STARTUP_VIRTEX2: Startup primitive for GSR, GTS or startup sequence-- control. Virtex-II/II-Pro-- Xilinx HDL Libraries Guide, version 10.1.2

STARTUP_VIRTEX2_inst : STARTUP_VIRTEX2port map (CLK => CLK, -- Clock input for start-up sequenceGSR => GSR_PORT, -- Global Set/Reset input (GSR cannot be used for the port name)

Libraries Guide

620 www.xilinx.com 10.1

Page 621: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

GTS => GTS_PORT -- Global 3-state input (GTS cannot be used for the port name));

-- End of STARTUP_VIRTEX2_inst instantiation

Verilog Instantiation Template// STARTUP_VIRTEX2: Startup primitive for GSR, GTS or startup sequence// control. Virtex-II/II-Pro// Xilinx HDL Libraries Guide, version 10.1.2

STARTUP_VIRTEX2 STARTUP_VIRTEX2_inst (.CLK(CLK), // Clock input for start-up sequence.GSR(GSR_PORT), // Global Set/Reset input (GSR can not be used as a port name).GTS(GTS_PORT) // Global 3-state input (GTS can not be used as a port name));

// End of STARTUP_VIRTEX2_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 621

Page 622: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

XORCY

Primitive: XOR for Carry Logic with General Output

IntroductionThis design element is a special XOR with general O output that generates faster and smaller arithmeticfunctions. The XORCY primitive is a dedicated XOR function within the carry-chain logic of the slice. It allowsfor fast and efficient creation of arithmetic (add/subtract) or wide logic functions (large AND/OR gate).

Logic TableInput Output

LI CI O

0 0 0

0 1 1

1 0 1

1 1 0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- XORCY: Carry-Chain XOR-gate with general output-- Xilinx HDL Libraries Guide, version 10.1.2

XORCY_inst : XORCYport map (O => O, -- XOR output signalCI => CI, -- Carry input signalLI => LI -- LUT4 input signal);

-- End of XORCY_inst instantiation

Libraries Guide

622 www.xilinx.com 10.1

Page 623: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Verilog Instantiation Template// XORCY: Carry-Chain XOR-gate with general output// For use with All FPGAs// Xilinx HDL Libraries Guide, version 10.1.2

XORCY XORCY_inst (.O(O), // XOR output signal.CI(CI), // Carry input signal.LI(LI) // LUT4 input signal);

// End of XORCY_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 623

Page 624: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

XORCY_D

Primitive: XOR for Carry Logic with Dual Output

IntroductionThis design element is a special XOR that generates faster and smaller arithmetic functions.

Logic TableInput Output

LI CI O and LO

0 0 0

0 1 1

1 0 1

1 1 0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- XORCY_D: Carry-Chain XOR-gate with local and general outputs-- Xilinx HDL Libraries Guide, version 10.1.2

XORCY_D_inst : XORCY_Dport map (LO => LO, -- XOR local output signalO => O, -- XOR general output signalCI => CI, -- Carry input signalLI => LI -- LUT4 input signal);

-- End of XORCY_D_inst instantiation

Libraries Guide

624 www.xilinx.com 10.1

Page 625: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Verilog Instantiation Template// XORCY_D: Carry-Chain XOR-gate with local and general outputs// For use with All FPGAs// Xilinx HDL Libraries Guide, version 10.1.2

XORCY_D XORCY_D_inst (.LO(LO), // XOR local output signal.O(O), // XOR general output signal.CI(CI), // Carry input signal.LI(LI) // LUT4 input signal);

// End of XORCY_D_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 625

Page 626: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

XORCY_L

Primitive: XOR for Carry Logic with Local Output

IntroductionThis design element is a special XOR with local LO output that generates faster and smaller arithmetic functions.

Logic TableInput Output

LI CI LO

0 0 0

0 1 1

1 0 1

1 1 0

Design Entry MethodInstantiation Yes

Inference Recommended

Coregen and wizards No

Macro support No

VHDL Instantiation TemplateUnless they already exist, copy the following two statements and paste them before the entity declaration.Library UNISIM;use UNISIM.vcomponents.all;

-- XORCY_L: Carry-Chain XOR-gate with local => direct-connect ouput-- Xilinx HDL Libraries Guide, version 10.1.2

XORCY_L_inst : XORCY_Lport map (LO => LO, -- XOR local output signalCI => CI, -- Carry input signalLI => LI -- LUT4 input signal);

-- End of XORCY_L_inst instantiation

Libraries Guide

626 www.xilinx.com 10.1

Page 627: ISE10.1 Designs Virtex-IILibrariesGuideforHDL

About Design Elements

Verilog Instantiation Template// XORCY_L: Carry-Chain XOR-gate with local (direct-connect) ouput// For use with All FPGAs// Xilinx HDL Libraries Guide, version 10.1.2

XORCY_L XORCY_L_inst (.LO(LO), // XOR local output signal.CI(CI), // Carry input signal.LI(LI) // LUT4 input signal);

// End of XORCY_L_inst instantiation

For More Information• See the Virtex-II User Guide.

• See the Virtex-II Data Sheets.

Libraries Guide

10.1 www.xilinx.com 627


Recommended