cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
dkartis2
Observer
Observer
9,146 Views
Registered: ‎11-07-2013

Transition from DSP48A1 design to DSP48E1

Jump to solution

Hi,

 

I have a Spartan 6 design that I want to move to a 7 series chip, specifically an Artix-7, but the DSP48A1 is not in the FPGA. There have been significant changed between the two DSPs and I was wondering if there's a transition guide because I have yet to find one. I don't see anything about RSTTYPE in 48E1 and the OPMODE appears to be completely different.

0 Kudos
1 Solution

Accepted Solutions
electriccogs
Visitor
Visitor
16,966 Views
Registered: ‎02-23-2016

The DSP48E1 significantly expands on the capabilities of the A1, but is capable of fully emulating an A1, provided that:

 

  • RSTTYPE was set to "SYNC" in the A1 instantiation
  • The concatenation path (D:A:B) and the preadder path are not dynamically used in your design

 

In the E1, the resets are always synchronous. The preadder has also been changed to use D+/-A instead of B, while the concatenation path is in the form of A:B. Because of this, if you need to dynamically switch between the preadder and the A:B path, you'll need to either modify your code, or add a multiplexer to swap A & B when using the preadder.

 

The 18-bit inputs for an A1 will need to be sign-extened for the E1. Because the concatenation path now uses just A:B instead of D:A:B, you may need to move your D[11:0] input onto the E1's A[29:18].

 

The configuration parameters have changed significantly to support dynamically switching the A & B register delays. It's best to consult the DSP48E1 user's guide directly for supporting your specific use case.

 

The E1 now features ALUMODE, INMODE, and OPMODE, which are supersets of the A1's OPMODE register. If you want to continue using the A1's OPMODE format, the mapping is as follows:

 

ALUMODE[3:0] = {2'b00, A1_OPMODE[7], A1_OPMODE[7]}

OPMODE[6:0] = {1'b0, A1_OPCODE[3:2], 1'b0, ~A1_OPMODE[1] & A1_OPMODE[0], A1_OPMODE[1:0]}

INMODE[4:0] = {1'b0, A1_OPMODE[6] & A1_OPMODE[4], A1_OPMODE[4], 2'b00}

 

Finally, you'll want to set CARRYINSEL appropriately. If you were using A1_OPMODE[5], set it to 3'b000.

 

Of course, this is all if you solely want to migrate a DSP48A1 design to the DSP48E1 as quickly as possible. The E1 has some fantastic new features, like rounding, pattern detection, bitwise operands, a 3-input adder, and built-in 17-bit shifts to easily implement wide multiplies. They'll require a more serious rewrite of your HDL, but the benefits may be worth it.

View solution in original post

3 Replies
electriccogs
Visitor
Visitor
16,967 Views
Registered: ‎02-23-2016

The DSP48E1 significantly expands on the capabilities of the A1, but is capable of fully emulating an A1, provided that:

 

  • RSTTYPE was set to "SYNC" in the A1 instantiation
  • The concatenation path (D:A:B) and the preadder path are not dynamically used in your design

 

In the E1, the resets are always synchronous. The preadder has also been changed to use D+/-A instead of B, while the concatenation path is in the form of A:B. Because of this, if you need to dynamically switch between the preadder and the A:B path, you'll need to either modify your code, or add a multiplexer to swap A & B when using the preadder.

 

The 18-bit inputs for an A1 will need to be sign-extened for the E1. Because the concatenation path now uses just A:B instead of D:A:B, you may need to move your D[11:0] input onto the E1's A[29:18].

 

The configuration parameters have changed significantly to support dynamically switching the A & B register delays. It's best to consult the DSP48E1 user's guide directly for supporting your specific use case.

 

The E1 now features ALUMODE, INMODE, and OPMODE, which are supersets of the A1's OPMODE register. If you want to continue using the A1's OPMODE format, the mapping is as follows:

 

ALUMODE[3:0] = {2'b00, A1_OPMODE[7], A1_OPMODE[7]}

OPMODE[6:0] = {1'b0, A1_OPCODE[3:2], 1'b0, ~A1_OPMODE[1] & A1_OPMODE[0], A1_OPMODE[1:0]}

INMODE[4:0] = {1'b0, A1_OPMODE[6] & A1_OPMODE[4], A1_OPMODE[4], 2'b00}

 

Finally, you'll want to set CARRYINSEL appropriately. If you were using A1_OPMODE[5], set it to 3'b000.

 

Of course, this is all if you solely want to migrate a DSP48A1 design to the DSP48E1 as quickly as possible. The E1 has some fantastic new features, like rounding, pattern detection, bitwise operands, a 3-input adder, and built-in 17-bit shifts to easily implement wide multiplies. They'll require a more serious rewrite of your HDL, but the benefits may be worth it.

View solution in original post

dkartis2
Observer
Observer
9,087 Views
Registered: ‎11-07-2013

That was a thorough response and exactly what I needed. The DSP48A1 instance was in SYNC mode and I used OPMODE5 so you provided me with what I need to do a basic update. Thank you very much for your assistance.

0 Kudos
dkartis2
Observer
Observer
9,078 Views
Registered: ‎11-07-2013

In the line:

 

OPMODE[6:0] = {1'b0, A1_OPCODE[3:2], 1'b0, ~A1_OPMODE[1] & A1_OPMODE[0], A1_OPMODE[1:0]}

 

I assume A1_OPCODE[3:2] supposed to be A1_OPMODE[3:2]?

0 Kudos