Multiplicación de números con signo en FPGA

Estoy tratando de multiplicar números con signo en una placa de desarrollo FPGA Nexys A7-100T con VHDL.

Consulte el enlace de la página web del manual de referencia para obtener información sobre el hardware de la placa FPGA.

Consulte también este enlace (comienza en la página 78) para ver la guía VGDL del usuario de la guía de síntesis de diseño Vivado de Vivado , que muestra cómo usar la lógica del multiplicador de hardware.

Sé que esto funcionará para números sin firmar, pero ¿se puede usar para números firmados con alguna lógica/código adicional?

También he mirado el multiplicador complejo dentro de este documento, sin embargo, no estoy totalmente familiarizado con el concepto detrás de él.

¿Cómo usa la gente el hardware multiplicador para multiplicar números con signo?

Es lo mismo que la multiplicación sin signo. Declare la señal como signedy use *. La multiplicación compleja en ese UG muestra cómo usar el sumador previo, el acc y otras cosas en el DSP. si no los codifica, solo hará la multiplicación.

Respuestas (2)

El sintetizador Vivado es inteligente. Tienes que declarar los operandos como signed. Si los operandos no están firmados, escriba explícitamente cast todos ellos signedy luego simplemente multiplíquelos usando *. Debería inferir un multiplicador DSP con signo en la síntesis.

Si no infiere automáticamente (puede deberse a varias razones), es posible que deba usar el USE_DSPatributo para obligar al sintetizador a asignar la lógica de multiplicación al segmento DSP.

Página 61, Guía de síntesis de Vivado

No estoy seguro de si es (incluso cerca) la mejor manera, pero cuando necesitaba hacer esto, verifiqué los signos de los dos números, lo pasé por un XOR y lo escondí en un flop. Luego tomé los valores absolutos de ambos operandos, los multipliqué y luego, si se configuró mi bit guardado del XOR, negué el resultado.