Diferentes maneras de usar los cortes DSP en Spartan 6 FPGA

2

Estoy leyendo la guía del usuario del segmento DSP de Spartan 6, y necesito usar el segmento DSP en un proyecto mío.

Me topé con esta pregunta, que Básicamente sugiere 3 formas de usar los cortes DSP

  1. Inferir el segmento DSP
  2. Uso del generador Core
  3. Uso de la plantilla de creación de instancias RAW DSP

La segunda opción es casi autoexplicativa, pero de alguna manera no tengo ganas de usarla, ya que se siente algo superficial. Estoy interesado en usar las opciones primera y tercera, ya que esas opciones son las más personalizables, pero me cuesta entender por dónde empezar.

Estas son las preguntas que tengo en mente:

  • ¿Cuáles son las diferentes formas en que puede inferir un segmento DSP en su diseño?
  • ¿Dónde encuentro la plantilla de creación de instancias de RAW DSP? He estado buscando en Google para ello, pero no encontré una guía definitiva para ello.
  • Sobre la base de mi segunda pregunta, hay muchos documentos de xilinx que se pueden leer para obtener información sobre muchas cosas. Ya que soy un noob, siempre me confundo sobre qué leer, y siempre me gusta tener un mapa mental de lo que está ahí fuera, y qué opciones tengo. ¿Hay algún lugar donde se enumeren todos los documentos de xilinx con su descripción, o qué documentos puedo consultar para una aplicación en particular?
pregunta ironstein

4 respuestas

3

Inferir rodajas DSP es en realidad bastante sencillo. El Spartan 6 tiene DSP48A1 DSP slices, así que eche un vistazo a Xilinx UG389. La página 15 tiene un diagrama de bloques del segmento DSP. XST es bastante bueno para inferir cortes DSP. Solo asegúrese de obtener todos los registros de tuberías allí para obtener el máximo rendimiento, y asegúrese de que todos los anchos de bits no sean más anchos que los que se muestran en el diagrama de bloques. Aquí hay un simple multiplicador con interfaces de flujo AXI que infiere un segmento DSP en un Spartan 6: enlace .

Consulte también la guía del usuario de XST, ug627, páginas 98-121. Una cosa bastante molesta a tener en cuenta: los multiplicadores canalizados en esa sección no se sintetizarán en segmentos DSP48 completamente segmentados (probablemente inferirán segmentos, pero obtendrá una penalización de rendimiento ya que los registros no necesariamente estarán en las ubicaciones correctas). Por ejemplo, los ejemplos de codificación y el diagrama de bloques en las páginas 104-108 muestran un multiplicador con un registro de tubería antes y tres después. Cuando lo vi por primera vez, asumí que XST sería lo suficientemente inteligente como para mover los registros para que coincidan con el segmento DSP real (es posible mover los registros "a través" del multiplicador sin cambiar la operación). No lo es Debe agregar registros (¡con solo restablecimientos sincrónicos!) Exactamente como se muestra en el manual de división de DSP para que XST deduzca correctamente una porción de DSP con los registros de canalización en los lugares correctos para obtener el máximo rendimiento (tenga en cuenta que estos registros se implementan internamente en el División DSP: la adición de todos los registros de canalización que se muestran en la guía del usuario de la división DSP solo resultará en una penalización de latencia (no consumirán flip-flops de tejido). Recomendaría imprimir el diagrama de bloques de secciones DSP y pegarlo en la pared como referencia. Y tampoco se olvide de mirar los registros de síntesis para asegurarse de que los segmentos DSP estén tirando de los registros de la tubería correctamente.

En cuanto a una lista de documentación, no hay un buen lugar para todo (FPGAs, núcleos IP, software, etc.). Solo para las características de un único FPGA, eche un vistazo a la página del producto. Por ejemplo, enlace . Asegúrese de seleccionar 'guías de usuario', no 'hojas de datos'. Eso debería darle una lista bastante completa de la documentación de Spartan 6.

    
respondido por el alex.forencich
1

Alex ya ha escrito mucho sobre inferir los cortes de DSP. Mi respuesta se enfoca solo en:

  

¿Dónde encuentro la plantilla de creación de instancias RAW DSP? He estado buscando en Google para ello, pero no encontré una guía definitiva para ello.

La plantilla se puede encontrar en la Guía de bibliotecas para diseños HDL de Xilinx. Para su Spartan-6 FPGA es UG615 . La descripción de los segmentos DSP48A1 se puede encontrar en page 92 ff. . La plantilla de instanciación VHDL es, por ejemplo:

Library UNISIM;
use UNISIM.vcomponents.all;

-- DSP48A1: 48-bit Multi-Functional Arithmetic Block
-- Spartan-6
-- Xilinx HDL Libraries Guide, version 14.7

DSP48A1_inst : DSP48A1
generic map (
    A0REG => 0, -- First stage A input pipeline register (0/1)
    A1REG => 1, -- Second stage A input pipeline register (0/1)
    B0REG => 0, -- First stage B input pipeline register (0/1)
    B1REG => 1, -- Second stage B input pipeline register (0/1)
    CARRYINREG => 1, -- CARRYIN input pipeline register (0/1)
    CARRYINSEL => "OPMODE5", -- Specify carry-in source, "CARRYIN" or "OPMODE5"
    CARRYOUTREG => 1, -- CARRYOUT output pipeline register (0/1)
    CREG => 1, -- C input pipeline register (0/1)
    DREG => 1, -- D pre-adder input pipeline register (0/1)
    MREG => 1, -- M pipeline register (0/1)
    OPMODEREG => 1, -- Enable=1/disable=0 OPMODE input pipeline registers
    PREG => 1, -- P output pipeline register (0/1)
    RSTTYPE => "SYNC" -- Specify reset type, "SYNC" or "ASYNC"
)
port map (
    -- Cascade Ports: 18-bit (each) output: Ports to cascade from one DSP48 to another
    BCOUT => BCOUT, -- 18-bit output: B port cascade output
    PCOUT => PCOUT, -- 48-bit output: P cascade output (if used, connect to PCIN of another DSP48A1)

    -- Data Ports: 1-bit (each) output: Data input and output ports
    CARRYOUT => CARRYOUT, -- 1-bit output: carry output (if used, connect to CARRYIN pin of another
                          -- DSP48A1)
    CARRYOUTF => CARRYOUTF, -- 1-bit output: fabric carry output
    M => M, -- 36-bit output: fabric multiplier data output
    P => P, -- 48-bit output: data output

    -- Cascade Ports: 48-bit (each) input: Ports to cascade from one DSP48 to another
    PCIN => PCIN, -- 48-bit input: P cascade input (if used, connect to PCOUT of another DSP48A1)

    -- Control Input Ports: 1-bit (each) input: Clocking and operation mode
    CLK => CLK, -- 1-bit input: clock input
    OPMODE => OPMODE, -- 8-bit input: operation mode input

    -- Data Ports: 18-bit (each) input: Data input and output ports
    A => A, -- 18-bit input: A data input
    B => B, -- 18-bit input: B data input (connected to fabric or BCOUT of adjacent DSP48A1)
    C => C, -- 48-bit input: C data input
    CARRYIN => CARRYIN, -- 1-bit input: carry input signal (if used, connect to CARRYOUT pin of another
                        -- DSP48A1)
    D => D, -- 18-bit input: B pre-adder data input

    -- Reset/Clock Enable Input Ports: 1-bit (each) input: Reset and enable input ports
    CEA => CEA, -- 1-bit input: active high clock enable input for A registers
    CEB => CEB, -- 1-bit input: active high clock enable input for B registers
    CEC => CEC, -- 1-bit input: active high clock enable input for C registers
    CECARRYIN => CECARRYIN, -- 1-bit input: active high clock enable input for CARRYIN registers
    CED => CED, -- 1-bit input: active high clock enable input for D registers
    CEM => CEM, -- 1-bit input: active high clock enable input for multiplier registers
    CEOPMODE => CEOPMODE, -- 1-bit input: active high clock enable input for OPMODE registers
    CEP => CEP, -- 1-bit input: active high clock enable input for P registers
    RSTA => RSTA, -- 1-bit input: reset input for A pipeline registers
    RSTB => RSTB, -- 1-bit input: reset input for B pipeline registers
    RSTC => RSTC, -- 1-bit input: reset input for C pipeline registers
    RSTCARRYIN => RSTCARRYIN, -- 1-bit input: reset input for CARRYIN pipeline registers
    RSTD => RSTD, -- 1-bit input: reset input for D pipeline registers
    RSTM => RSTM, -- 1-bit input: reset input for M pipeline registers
    RSTOPMODE => RSTOPMODE, -- 1-bit input: reset input for OPMODE pipeline registers
    RSTP => RSTP -- 1-bit input: reset input for P pipeline registers
);
    
respondido por el Martin Zabel
1

Sobre el problema de los documentos de Xilinx, Xilinx hizo una buena herramienta para ayudar con ese problema: DocNav .

Es un catálogo explorable de toda la documentación de Xilinx, con categorías filtrables para las cosas que le interesan o no, y una búsqueda razonablemente buena dentro de los documentos.

Si lo usa, asegúrese de obtener la correcta (las pestañas Vivado vs ISE en la página de descarga, aunque el instalador ISE todavía tiene la marca Vivado por alguna razón) y actualice el catálogo cuando lo use por primera vez.

    
respondido por el FusterCluck
1

Me encuentro en una situación similar, Ironstein. En mi solicitud, necesito admitir los FPGA de Spartan-6 (que requieren el uso de XST) y también los FPGA de Artix-7 (que requieren Vivado en algunos casos, y XST o Vivado con otros modelos). Me he vuelto fácil con los mosaicos de gestión de memoria y reloj.

Estoy de acuerdo con su evaluación de que el uso de IPcores es más fácil, pero desde el punto de vista de la gestión de proyectos, creo que puede ser difícil de administrar, ya que hay muchos archivos que deben estar en la ubicación correcta "solo así". Prefiero usar solo IPcores para crear instancias de elementos de memoria distribuida.

Desconfío un poco de los diseños inferidos en general ya que el cambio más pequeño puede "romper" la arquitectura DSP, o algunas de las sutilezas de cómo se asignan los registros como lo señaló Alex.Forencich.

Prefiero tener control explícito de lo que está sucediendo precisamente, por lo que estoy en la ardua curva de aprendizaje para entender el bloque DSP48A1 y los bloques de macros relacionados: ADDMACC_MACRO, ADDSUB_MACRO, COUNTER_LOAD_MACRO, MULT_MACRO y MACC_MACRO. Estas macros abordan funciones comunes que pueden ayudarlo a comenzar sin tener que conocer toda la complejidad de la primitiva DSP48A1 completa de la familia Spartan-6.

Puede encontrar plantillas VHDL / Verilog para la primitiva DSP48A1 y estas macros en la guía del usuario de UG615 como se ha sugerido. Sin embargo, estas plantillas son lo suficientemente largas como para que yo prefiera utilizar la función de plantillas de idioma en XST para copiarlas y pegarlas más directamente en mis diseños. Se accede a través de "Editar > Plantillas de idioma ... > VHDL || Verilog > Instanciación de macros de dispositivo" (para macros) o "Editar > Plantillas de idioma ... > VHDL || Verilog > Primitivas de macro de dispositivo" (para módulos primitivos). A continuación, selecciona la familia FPGA y DSP, y ya está todo listo. Como mis diseños también abarcan las familias Spartan-6 / Artix-7 que son compatibles con XST, creo que la función de Plantillas de idioma es bastante útil.

    
respondido por el Bert Sierra

Lea otras preguntas en las etiquetas