In Spartan-3E and Spartan-3A Engineering Samples (ES), the new ODDR2 flip-flop does not support ALIGNMENT set to C0 or C1. The data sheet includes the following statement:
"Caution! The C0 or C1 alignment feature of the ODDR2 flip-flop, originally introduced in the Spartan-3E FPGA family, is not recommend or supported in the ISE development software.
The ODDR2 flip-flop without the alignment feature remains fully supported. Without the alignment feature, the ODDR2 feature behaves equivalent to the ODDR flip-flop on previous Xilinx FPGA families."
Is there a way to implement an equivalent functionality to the ODDR2 with C0/C1 alignment?
For all Spartan-3E and ES silicon of Spartan-3A, ODDR2 with DDR_ALIGNMENT set to C0 or C1 is not supported in the software and might result in data corruption when implemented in the hardware. For Production silicon of Spartan-3A, C0 and C1 alignment is fully functional and supported.
Note that when using the ODDR2, the default alignment is DDR_ALIGNMENT=NONE, which is used in the majority of designs. Also, note that IDDR2 fully supports all DDR_ALIGNMENT options.
Below are three possible ways to work around the ODDR2 C0/C1 alignment known issue:
Solution 1: Using ODDR With Alignment=NONE
Use the ODDR2 without the alignment feature. Set DDR_ALIGNMENT=NONE for the ODDR2 flip-flop.
The flip-flop still has its full DDR functionality and no data corruption is evident. This implementation uses no extra logic, but is not the same design, logically, as the original. The design must be re-simulated.
Solution 2: Using ODDR With Alignment=NONE (1 extra CLB flip-flop)
As the data sheet states, you must use the ODDR2 flip-flop with DDR_ALIGNMENT=NONE.
This allows you to implement alignment in the fabric using a CLB flip-flop and the IOB ODDR flip-flops.
This design adds one flip-flop, but is logically identical to the original. Example code is provided below to help implement the design:
Solution 3: Using ODDR With Alignment=NONE (3 extra CLB flip-flops)
This solution implements similar functionality to the ODDR2 using alignment, but it uses three CLB flip-flops with the ODDR flip-flops.
This adds three flip-flops for the highest possible performance, but also adds one clock cycle to the timing of the original (which is typically not a problem in source-synchronous systems).
This solution should be used in designs requiring higher performance. You can reference the following code to implement the setup and help with the necessary floorplanning to achieve higher speeds:
For more information, reference:
The "Spartan-3E FPGA Family Complete Data Sheet (All four modules)" (DS312):
The "Spartan-3A FPGA Family Data Sheet" (DS529):
The "Spartan-3 Generation FPGA User Guide" (UG331):