Cuando me estoy acercando 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 existan estos recursos hace que la codificación en estos idiomas respectivos valga la pena, ya que las bibliotecas evitan que tenga que reescribir todas las cosas de bajo nivel desde cero.
Las bibliotecas estándar de IEEE parecen cubrir solo los conceptos básicos, como los tipos de datos (algo parecido a las bibliotecas estándar de C).
Parece que en VHDL, puede comprar / encontrar algunos "núcleos IP" que resolverán un problema, en lugar de utilizar una biblioteca de código abierto. En Python, si quiero hablar con un dispositivo en serie, simplemente, import serial
y básicamente he terminado. En VHDL, estaría atascado escribiendo un protocolo en serie desde cero, o tendría que buscar en Google en los diversos repositorios hasta que encuentre a alguien que haya producido algo que funcione. Entonces estaría parcheando fragmentos de código en mi proyecto, en lugar de simplemente incluir algo y llamarlo. 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.
¿Hay alguna biblioteca completa de código abierto disponible que pueda importar en mis proyectos? ¿Por qué todos parecen lanzar su propio código para tantas de las mismas cosas?
Respuestas:
Soy desarrollador y mantenedor en ' The PoC Library '. Intentamos proporcionar dicha biblioteca compuesta de paquetes (colección de nuevos tipos y funciones) y módulos. Viene con componentes 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:
Nuestra biblioteca tiene un mecanismo de configuración interna (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 síntesis y código 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 una RAM basada en LUT o un tipo de implementación 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 del puntero mediante una instanciación explícita de la cadena de transporte (Xilinx XST no encuentra la solución óptima, por lo que se hace manualmente).Hay otros 2 tipos de fifo con interfaz de 'reloj dependiente' (dc) e 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 compilan en diferentes herramientas (Spartan-> Virtex, Cyclone -> Stratix; ISE, Vivado, Quartus).
Además de PoC, hay otras bibliotecas de código abierto:
Los "Descubrir código abierto y libre de silicona" ( FOSSI proyectos) en GitHub ofrece una base de datos navegable de todos los proyectos de GitHub que utilizan principalmente VHDL , Verilog , SystemVerilog , o cualquier otro lenguaje de descripción de hardware importantes ( HDL ).
Ver también:
fuente
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 la forma en que implementa una función determinada puede variar mucho según lo que intente hacer. El código que es bueno y FPGA probablemente no sea tan bueno para un ASIC y viceversa.
Además, dado que estamos describiendo el hardware, una función que realiza una FFT requeriría detalles tales como ancho de palabra y reloj y una estrategia de reinicio que ataría sus manos y restringiría todo su diseño. Si hiciera la función muy flexible, tendría una sobrecarga enorme.
Por último, observe el tamaño de su archivo ejecutable cuando incluye muchas bibliotecas en C, por ejemplo. Hay un montón de hinchazón allí. Eso no importa para el desarrollo de software (la mayoría de las veces), pero es muy importante para FPGA y especialmente para el desarrollo de 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.
fuente
VHDL y Verilog son lenguajes descriptivos y describen bloques de hardware. Un controlador en serie en C ++ podría traducirse en una IP en serie 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 usar esta interfaz moderna:
http://freerangefactory.org/cores.html
Si, por ejemplo, busca una serie, puede terminar aquí:
http://freerangefactory.org/cores/communication_controller/serial_uart_2/index.html
y directamente salta al código en GitHub. Allí verá que puede crear instancias del módulo serie con bastante facilidad y conectar su propio circuito y comenzar a enviar y recibir datos. Esto es tan simple como las bibliotecas en serie en C ++.
Espero que esto ayude.
fuente
El primer sitio al que voy para este tipo de cosas (como mencionó @MarkU) es opencores.org.
Por ejemplo, hay un motor FFT parametrizado , escrito en VHDL, publicado bajo la licencia BSD. El estado es "beta".
fuente
Para la verificación, hay una metodología de verificación de código abierto VHDL (OSVVM).
OSVVM es una metodología de verificación VHDL completa y avanzada que simplifica la implementación de cobertura funcional, aleatorización restringida y aleatorización inteligente de cobertura (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
fuente