¿Existen bibliotecas de código abierto para VHDL como lo hacen para C++ o Python?

Cuando me acerco a un problema en C++ o Python, existen muchas bibliotecas que hacen el trabajo pesado de mi código. Estoy pensando en GNU GSL , BOOST o FFTW para C++ y NumPy o SciPy para python. En muchos sentidos, el hecho de que estos recursos existan hace que la codificación en estos lenguajes respectivos valga la pena, ya que las bibliotecas evitan que tengas que reescribir todas las cosas de bajo nivel desde cero.

Las bibliotecas estándar IEEE parecen cubrir solo los conceptos básicos, como los tipos de datos (algo así como las bibliotecas estándar C).

Parece que en VHDL, puede comprar/encontrar algunos "núcleos IP" que resolverán un problema, en lugar de usar una biblioteca de código abierto. En python, si quiero hablar con un dispositivo en serie, solo import serialy básicamente he terminado. En VHDL, me quedaría atrapado escribiendo un protocolo en serie desde cero, o tendría que buscar en Google en los distintos repositorios hasta encontrar a alguien que hubiera producido algo que funcionara. Entonces estaría parcheando fragmentos de código en mi proyecto, en lugar de simplemente incluir algo y llamarlo así. De manera similar, si quiero realizar una FFT, puedo encontrar ejemplos de FFT en VHDL a través de Google, pero no hay algo simple como FFTW que pueda encontrar.

¿Existen bibliotecas completas de código abierto disponibles que pueda importar a mis proyectos? ¿Por qué todos parecen crear su propio código para tantas cosas iguales?

¿Has buscado en opencores.org?
Para ver las bibliotecas de verificación de VHDL, consulte osvvm.org
Opencores, también puede comprar bibliotecas de varias fuentes. Pasará algún tiempo con la mayoría de los núcleos de los núcleos abiertos, ya que la mayoría no están bien documentados.

Respuestas (5)

Soy desarrollador y mantenedor en ' The PoC Library '. Intentamos proporcionar una biblioteca de este tipo compuesta por paquetes (colección de nuevos tipos y funciones) y módulos. Viene con fifos comunes, aritmética, componentes de reloj cruzado, componentes de E/S de baja velocidad y una pila Ethernet/IP/UDP (próxima versión).

Como describió @crgrace, es bastante complicado diseñar módulos, que:

  • trabajar en muchas plataformas
  • admite la mayoría de las cadenas de herramientas de proveedores
  • agregar sin/menos gastos generales

Nuestra biblioteca tiene un mecanismo de configuración interno (PoC.config) para distinguir proveedores, dispositivos e incluso subfamilias de dispositivos para elegir el código correcto o una implementación optimizada. También distingue entre código de síntesis y de simulación en algunos puntos.

Por ejemplo PoC.fifo_cc_got, es un FIFO con una interfaz de 'reloj común' (cc) y señales put/got para controlar el FIFO. El fifo es configurable en anchos, profundidades, bits de estado de relleno y tipo de implementación. Es posible elegir un tipo de implementación RAM basada en LUT o On-Chip-RAM (ocram). Si este fifo se sintetiza con la opción ocram para Altera, usa altsyncram; si se elige Xilinx, utiliza una descripción genérica de BlockRAM e implementa la aritmética de punteros mediante instanciación explícita de cadena de transporte (Xilinx XST no encuentra la solución óptima, por lo que se realiza manualmente).

Hay otros 2 tipos de fifo con 'reloj dependiente' (dc) e interfaz de reloj independiente (ic). Entonces, si es necesario cambiar de un fifo normal a un fifo de reloj cruzado (PoC.fifo_ic_got), cambie el nombre de la entidad y agregue un reloj y reinicie para el segundo dominio de reloj, eso es todo.

Creo que esto demuestra que es posible escribir módulos comunes, que funcionan en múltiples plataformas y se compilan en diferentes herramientas (Spartan->Virtex, Cyclone -> Stratix; ISE, Vivado, Quartus).

Además de PoC, existen otras bibliotecas de código abierto:


Los proyectos "Discover Free and Open Source Silicon" ( FOSSi ) en GitHub ofrecen una base de datos navegable de todos los proyectos de GitHub que utilizan principalmente , , o cualquier otro lenguaje de descripción de hardware importante ( ).

Ver también:

Las bibliotecas de código abierto como usted describe no serían tan útiles para VHDL o Verilog como lo son para un lenguaje de programación de propósito general. Esto se debe a que CÓMO implementa una función determinada puede depender mucho de lo que intente hacer. El código que es bueno para y FPGA probablemente no sea tan bueno para un ASIC y viceversa.

Además, dado que estamos describiendo hardware, una función que hace una FFT requeriría detalles específicos como el ancho de palabra y el reloj y la estrategia de reinicio que le atarían las manos y limitarían todo su diseño. Si hiciera la función muy flexible, tendría una sobrecarga enorme.

Por último, mire el tamaño de su ejecutable cuando incluya muchas bibliotecas en C, por ejemplo. Hay una tonelada de hinchazón allí. Eso no importa para el desarrollo de software (la mayoría de las veces), pero importa mucho para el desarrollo de FPGA y especialmente ASIC. No tiene sentido sintetizar un montón de gastos generales que no necesita.

Entonces, la conclusión es que no existen tales bibliotecas, y su enfoque actual es sólido.

Los generadores centrales alternativos (IP) también brindan los riesgos de Scylla y Chabydris del bloqueo del proveedor y la sobrecarga resultante. Las capacidades de FPGA y ASIC han crecido lo suficiente como para admitir la expansión, el problema es entonces el costo y las pruebas, con la ayuda de la estandarización de la expansión (por ejemplo, AMBA AXI4). La compensación entre el tiempo de comercialización y los "gastos generales que no necesita" ya lo han hecho industrias enteras. Diseño del sistema utilizando bloques de construcción en lugar de diseño de hardware, este último el bailiazgo de VHDL.
Su tercer párrafo es bastante ignorante de cómo funcionan los compiladores y las herramientas de síntesis: las herramientas deberían descartar las cosas que no se necesitan y los resultados que no se usan, probablemente incluso más en una configuración de lógica digital que en una biblioteca de lenguaje de alto nivel, donde puede haber algo local variables y asignaciones de memoria que son una sobrecarga de la abstracción de la biblioteca, especialmente si está vinculada dinámicamente.

VHDL y Verilog son lenguajes descriptivos y describen bloques de hardware. Un controlador serial en C++ podría traducirse en una IP serial en VHDL/Verilog.

opencores.org es la mayor base de datos de código abierto hasta la fecha.

Para facilitar el proceso de búsqueda, descarga y exploración de código (a través de Github) puede utilizar esta moderna interfaz:

http://freerangefactory.org/cores.html

Si, por ejemplo, busca serial, puede terminar aquí:

http://freerangefactory.org/cores/communication_controller/serial_uart_2/index.html

y salta directamente al código en GitHub. Allí verá que puede crear fácilmente una instancia del módulo serial y conectarle su propio circuito y comenzar a enviar y recibir datos. Esto es tan simple como las librerías seriales en C++.

Espero que esto ayude.

El primer sitio al que voy para este tipo de cosas (como mencionó @MarkU) es opencores.org.

Por ejemplo, existe un motor FFT parametrizado , escrito en VHDL, publicado bajo la licencia BSD. El estado es "beta".

eso no es lo que pregunta el OP. Él o ella saben cómo mirar opencores.org. Un motor FFT parametrizado está muy lejos de importar una biblioteca matemática estándar en Python y usarla. No existe el "middleware" en el hardware debido a la sobrecarga.

Para la verificación, existe una metodología de verificación VHDL de código abierto (OSVVM).
OSVVM es una metodología de verificación de VHDL completa y avanzada que simplifica la implementación de la cobertura funcional, aleatoria restringida y aleatorización de cobertura inteligente (una metodología de banco de pruebas inteligente). También facilita la implementación de archivos de transcripción compartidos, informes de errores, registros (impresión condicional) y modelado de memoria.

El sitio web y el blog de OSVVM están en http://osvvm.org . Los paquetes también están disponibles en github en: https://github.com/JimLewis/OSVVM