CORDIC lleva las matemáticas a los diseños de FPGA

Siempre estamos felices cuando vemos [Hamster] publicar un proyecto FPGA porque normalmente es algo bueno. Su último artículo no defrauda y muestra cómo utiliza el algoritmo CORDIC para generar ondas de seno y coseno de alta precisión en VHDL. CORDIC (Coordinate Rotation Digital Computer; a veces conocido como algoritmo de Volder) es una forma estándar de calcular funciones hiperbólicas y trigonométricas. Lo bueno es que el algoritmo solo requiere suma, resta, cambios de bits y una tabla de búsqueda con entrada para cada precisión que desee. Por supuesto, si tiene números adicionales y negativos, ya tiene una resta. Esto es perfecto para CPU y FPGA simples.

[Hamster] no solo tiene el código VHDL, sino que también proporciona una versión C si lo encuentra más fácil de leer. De cualquier manera, el ángulo se escala para que 360 ​​grados sea una palabra completa de 24 bits para permitir la máxima precisión. Aunque es común calcular el resultado en un bucle, usando la FPGA, puede hacer todas las matemáticas en paralelo y generar una nueva muestra en cada ciclo de reloj.

De hecho, impresiona lo corto que es el código VHDL. VHDL también es bastante prolijo, por lo que imaginamos que una traducción de Verilog sería muy inteligente. Curiosamente, aunque OpenCores tiene algunos proyectos CORDIC, no vimos ninguno escrito en Verilog. Sin embargo, encontramos algunos en GitHub, incluido uno bastante complejo de [ZipCPU].

La historia de CORDIC también es interesante. [Jack Volder] trabajaba para un contratista de defensa y tenía la tarea de reemplazar el solucionador analógico en la computadora de navegación de un bombardero B-58 con algo más preciso y real. Inventó CORDIC en 1956 basándose en fórmulas que se encuentran en el Manual CRC, pero dejó la empresa antes de que construyeran dispositivos que los usaban. En 1965, [Volder] construyó Athena, una calculadora de escritorio con CORDIC, pero Hewlett-Packard no la mordió, aunque afectó a las primeras máquinas HP.

  • Arduino Enigma dice:

    Las funciones trascendentales de la calculadora científica Sinclair también utilizan CORDIC. Así, un chip destinado a una calculadora simple de 4 funciones adquirió la capacidad de realizar trigonometría.

    • Daren Schwenke dice:

      Su comentario genera un “clic en el nombre”, pero no está implementado. Hazlo … 🙂

      • Arduino Enigma dice:

        pulgar mientras escribe un comentario. Publicación presionada antes de que todos escribieran la URL …

    • AMA dice:

      No me gusta ser el tipo requerido, pero ¿tienes alguna referencia a eso? Pensé que Sinclair Scientific usaba aproximaciones mucho más sucias, algunas de ellas solo precisas con unos pocos decimales.

      • Paul Baker dice:

        Esa es la belleza de CORDIC en el sentido de que genera una respuesta por bucle, por lo que puede ser “sucio” o preciso según la cantidad de repeticiones que se realicen.

  • Im-pro.at dice:

    Esto es muy útil para muchas cosas.
    También lo usé en mi propio proyecto:

    https://la-tecnologia.com/2018/06/11/fpga-persistently-rick-rolls-you/

  • Frankbus dice:

    Una vez también usé CORDIC para este proyecto:
    http://www.frank-buss.de/SignalGenerator/index.html
    Aquí está el código fuente:
    http://www.frank-buss.de/SignalGenerator/vhdl/cordic.vhd
    A diferencia de la versión Hamster, en mi versión los pasos individuales se realizan cada uno en un ciclo de reloj. Hamster sintetizó todos los pasos en un bucle. Esto podría ser un problema para las altas velocidades de reloj.
    Aquí está el programa en C para generar la matriz y medir el error:
    http://www.frank-buss.de/SignalGenerator/software/table/table.c
    Por cierto, para las FPGA y CPU modernas, no tiene sentido usar CORDIC, ya que tienen una multiplicación fija.

    • Andrej Pavlenko dice:

      CORDIC también se puede compartir. ¿No es bueno para FPGA incluso si tiene un cable duro?

  • DurandA dice:

    Si necesita un seno y un coseno en Verilog, es una implementación agradable y concisa de James Bowman: https://github.com/jamesbowman/sincos Utiliza una aproximación polinomial de Chebyshev en lugar de CORDIC.

  • Gravis dice:

    Parece algo que usarías en un chip especial para hacer 3D con un sistema de juego de 16 bits. Muy genial.

  • huésped dice:

    Jugué con Verilog en ese primer enlace de Github. Funciona muy bien.

  • Daniil Smirnov dice:

    De hecho, IntelFPGA (Altera) tiene su propio núcleo CORDIC IP en Quartus II para diferentes propósitos a partir de la versión 16.0

Eva Jiménez
Eva Jiménez

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *