Cómo pensar mientras se trabaja con VHDL o Verilog

6

Toda mi experiencia pertenece a lenguajes de programación de propósito general, por ejemplo; c / c ++ etc. donde cada instrucción se ejecuta una tras otra pero parece que en VHDL / Verilog, todas las instrucciones se ejecutan a la vez (procesos paralelos)

¿Se pregunta si hay algún recurso para que el programador de lenguajes generales entienda cómo funciona el VHDL?

Referencia: enlace

    
pregunta itsaboutcode

5 respuestas

9

Con los idiomas HDL, debe comprender que está describiendo hardware, no software. Creo que esto es fundamental para "dominarlo". El orden del código en su módulo no importa, todo sucede a la vez.
No es tan malo una vez que empiezas, después de haber diseñado algunos módulos simples (por ejemplo, contador, sumador, mux, etc.), tu mente debería adaptarse naturalmente al proceso.

El mejor libro que he leído para comenzar con HDL es Pong Chu's "Protoyping FPGA por ejemplos de Verilog" (uso Verilog, pero también hay un versión VHDL de este libro) Se enfoca principalmente en las cosas sintetizables, que es lo que quiere saber para los FPGA, aparte de, por ejemplo, Código de testbench que también tiene un capítulo dedicado a él. (Supongo que usted está interesado en utilizar HDL para FPGA / CPLD)

Aparte de eso, un par de buenos recursos netos que he marcado a lo largo del tiempo son:

FPGA4Fun.com

Foro PLD de Edaboard

ASIC World

Con los enlaces anteriores (especialmente el primero) y el libro, debes estar "al día" en poco tiempo.

    
respondido por el Oli Glaser
2

"Todas las instrucciones se ejecutan a la vez" tampoco es exactamente como es ...

Creo que se puede encontrar una muy buena descripción de cómo la programación de "instrucciones" (tal como se ve como "las actualizaciones de valores") se puede encontrar aquí:

enlace

Una vez que haya comprendido cómo funcionan las actualizaciones de señales y variables, puede concentrarse en describir lo que quiere que suceda en trozos más pequeños, con señales que se comunican entre ellos

Asegúrese de sintetizar con frecuencia y simular en esta etapa, ya que los descubrirá qué partes del lenguaje no se pueden colocar en un chip. Además, también descubrirá qué tipo de estilos de codificación producen largas cadenas de lógica que "se interpondrán" en la obtención de un chip de trabajo. A los tipos de hardware les gustará decir cosas como "debe aprender a pensar en términos de hardware". Olvidan lo difícil que es esto a menos que ya pueda hacerlo, pero tomar su código, sintetizarlo y observar los resultados en el visor esquemático es probablemente la forma en que lo aprendimos hace muchos años, y también funcionará para usted.

(Otra cosa que los tipos no electrónicos pasan por alto hasta que los muerde es que, en los pines del dispositivo, debes estar atento a la sincronización de las señales en las partes internas del chip. ¡Hay otras preguntas sobre eso aquí en alguna parte!) / p>     

respondido por el Martin Thompson
1

Encontré que una forma beneficiosa de obtener procedimientos expresados en VHDL era considerar la máquina de estados finitos. Al visualizar su algoritmo como un estado en un FSM, puede comenzar a cambiar la forma de su código a algo que puede ejecutarse todo a la vez, y solo se ejecuta paso a paso en virtud del FSM.

No estoy diciendo que necesites crear un estado para cada línea de código C ++ similar funcional (aunque eso funcionaría teóricamente), pero puedes comenzar a agrupar cosas como asignaciones y cálculos, y entregarlos a un estado para que sea ejecutado simultáneamente cuando el FSM entra en ese estado.

Ahora, su "programa" se convierte en un FSM, que, en VHDL es una gran declaración de tipo de cambio de caso (basada en el estado del FSM), y cierta lógica de cómo se debe actualizar el estado para ir al siguiente estado para su algoritmo.

Espero que esto ayude !!

    
respondido por el bythenumbers
1

En C o C ++, Java, etc. básicamente estás creando una secuencia de eventos que suceden en orden. Comprenda que en un HDL solo está haciendo un programa secuencial en el banco de pruebas, para obtener una secuencia temporizada de valores de señal.

La buena parte de la codificación en HDL es, en realidad, diseñar una lista de circuitos, no un programa. Piense en un caso o bloque de interruptores como un multiplexor. Las entradas son cables, las salidas son cables, en el medio es la lógica combinacional. En el silicio o en una placa de pruebas, un cable no espera su turno para que se le diga qué hacer. A 74xx nand gate no espera a que se le diga qué hacer. Siempre es una puerta nand, y siempre es nanding, siempre que el poder esté encendido. Un multiplexor siempre multiplexa. Un inversor siempre invierte. Luego, los flops siempre flop en cualquier borde del reloj, y un pestillo siempre se engancha en su habilitación. Igual que si dibujaras un esquema. Los módulos y las entidades son lo mismo que un esquema jerárquico. Tenía mucho más sentido para mí cuando dejé de pensar en él como un programa y comencé a ver el circuito en su lugar.

Mi referencia favorita es el diseño de hardware RTL de Chu mediante VHDL. Incluso la gente de Verilog se beneficiaría del concepto, pero es toda la sintaxis VHDL. enlace

    
respondido por el billt
0

VHDL y Verilog se diseñaron originalmente como lenguajes para describir el hardware para la simulación. Más tarde se reutilizaron como lenguajes para describir hardware para síntesis.

Hay dos estrategias para describir hardware, comportamiento y estructural. En la descripción del comportamiento, usamos el código del programa para describir cómo se comporta nuestro hardware. En la descripción estructural describimos nuestra pieza de hardware en términos de piezas más pequeñas de hardware.

La mayoría de los diseños prácticos utilizarán una mezcla de ambos. Por lo tanto, tiene pequeños bloques de comportamiento (siempre bloques en verilog, procesos en VHDL) dentro de un diseño estructural general.

Normalmente tenemos dos tipos principales de bloque de comportamiento. Los bloques "combinatorios" definen una función combinatoria de sus entradas. Lógicamente, se ejecutan cuando cambia alguna entrada y no tienen memoria.

Los bloques secuenciales normalmente se escriben para definir lo que sucede después del borde del reloj en términos de lo que sucedió antes del borde del reloj. Así es como conseguimos mantener un diseño determinista aunque todos los bloques activados por el mismo borde del reloj se ejecutan en un orden no determinista en el simulador y al mismo tiempo en el hardware sintetizado.

Si planeas sintetizar tu código, entonces debes pensar qué significan las cosas estructuralmente, incluso al definirlas de manera conductual, porque lo primero que hará el sintetizador es traducir tu descripción de comportamiento a una estructural. Los bucles se desenrollarán, las declaraciones aritméticas y lógicas se convertirán en bloques de hardware aritméticos y lógicos. Las declaraciones de control de flujo se convertirán en multiplexores (potencialmente muy amplios).

    
respondido por el Peter Green

Lea otras preguntas en las etiquetas