Confusión sobre los relojes en FPGAs / Verilog

Acabo de comprar un FPGA y estoy aprendiendo Verilog, pero me he encontrado con algunas confusiones, la mayoría relacionadas con el reloj.

Mi primera pregunta es, ¿cómo funciona la lógica secuencial? ¿Se realizan las asignaciones, una por ciclo de reloj, o la secuencia se propaga de alguna manera a la velocidad máxima, determinada por los retrasos de la puerta?

Mi segunda pregunta es, ¿cómo funcionan los multiplicadores de frecuencia? Vi un artículo que usaba uno para obtener una señal de 250 MHz en un chip con una velocidad de reloj de solo 50 MHz. ¿Cómo es eso posible? Si el chip es capaz de operar a frecuencias tan altas (supongo que limitado solo por los retrasos de la puerta), entonces, ¿por qué el chip no está sincronizado a una frecuencia más alta para empezar?

¿Cómo funciona la lógica combinacional en un alwaysbloque? Pensé que los bloques siempre se ejecutaban en eventos, como flancos de señal positivos o negativos, y se ejecutaban secuencialmente, por lo que estoy bastante confundido en este punto, ya que he visto asignaciones de bloqueo dentro de bloques siempre.

siempre tenga en cuenta que cuando trabaja con verilog o vhdl, está proporcionando una descripción del hardware en lo que parece ser un código, no en realidad una codificación. todo sucede al mismo tiempo a menos que hagas un esfuerzo para que las cosas sean secuenciales. En cuanto a la multiplicación de relojes, será esclarecedora una búsqueda en bucles de enganche de fase (PLL).
Creo que el problema es que tengo demasiado en cuenta la naturaleza de los lenguajes de descripción de hardware. Esperaba que todo estuviera construyendo módulos a partir de la lógica combinacional y trabajando desde allí (o de arriba hacia abajo, pero finalmente hasta el nivel lógico). Me sorprendió mucho ver que había elementos secuenciales en Verilog, así que todavía estoy tratando de entender eso y descifrar cómo sintetiza esta lógica secuencial. Y sí, esa búsqueda fue muy esclarecedora.
Debe tener más cuidado con su lenguaje en la pregunta. Las declaraciones de Verilog pueden evaluarse (no ejecutarse) secuencialmente pero sintetizarse en lógica combinacional. El término sequential logices muy confuso, y es mejor hablar de lógica combinacional (AND, OR, NOT) o lógica síncrona (flip-flops y latches).

Respuestas (2)

En primer lugar, desecha este concepto de 'instrucciones'. No existen en Verilog. No se ejecuta nada. Verilog, VHDL, SystemVerilog, etc. son los llamados lenguajes de descripción de hardware. No se ejecutan. No se interpretan. Definen componentes de hardware (puertas lógicas, flip flops, registros, etc.) y sus interconexiones. (Supongo que no es del todo exacto, pero el único verilog que puede poner en un FPGA, verilog sintetizable, no se ejecutará ni interpretará. Los bancos de prueba son un animal diferente).

Los relojes se utilizan para controlar flip-flops y registros. Los datos se pueden cambiar a flip flops y registros en los bordes del reloj. Por lo tanto, dentro de un bloque siempre @ (posge clk), todas las declaraciones se 'ejecutarán' simultáneamente y los resultados se bloquearán en los registros en el borde del reloj, de acuerdo con las reglas de interpretación de las declaraciones HDL. Sin embargo, tenga mucho cuidado donde está usando = y <=. El significado de estas dos operaciones de asignación es muy diferente dentro de un bloque siempre. La idea básica es que todas las operaciones = se tratan primero en orden de aparición. Esto sucede a la velocidad de propagación de las puertas. Luego, todos los <= se tratan al mismo tiempo, almacenando el argumento en un registro. Lo único que afecta el reloj en este caso es precisamente cuando se actualizan los registros.

Se pueden generar relojes más rápidos utilizando un dispositivo llamado bucle de bloqueo de fase (PLL). Los PLL no se pueden sintetizar en verilog, pero generalmente hay una forma de instanciar un componente PLL dedicado en el FPGA que está utilizando. En realidad, lo retiro, sin duda puede hacer un PLL digital en verilog, pero solo puede usarlo para generar señales más bajas que la frecuencia del reloj. Un PLL contiene un oscilador controlado por voltaje, uno o más divisores de frecuencia, un comparador de fase y algunos circuitos de control. La salida del VCO se divide y se compara en fase con la frecuencia de entrada. El voltaje de control de VCO se ajusta hasta que la salida de VCO dividida coincida con precisión con la frecuencia y la fase de la señal de referencia. Si establece el divisor en 5 y utiliza 50 MHz para la frecuencia de referencia, el PLL generará una señal de 250 MHz que está precisamente bloqueada en fase a la referencia de 50 MHz. Hay varias razones para hacer esto. El uso de un PLL permite la generación de múltiples relojes para que se pueda ejecutar una lógica diferente a diferentes velocidades, por ejemplo, para interfaces periféricas específicas o para una lógica combinatoria compleja y lenta. También puede permitir que el dispositivo controle su propia frecuencia de reloj para ahorrar energía.

Bloquear sentencias dentro de bloques always generará lógica combinatoria. Nuevamente, esta lógica generalmente siempre se 'ejecutará' independientemente del reloj porque define puertas lógicas reales. Puede ser beneficioso usar algunas variables temporales, pero se debe tener cuidado para garantizar que no haya tanta lógica adicional que no se cumplan los requisitos de tiempo.

Una última aclaración. ¿Tiene algún uso usar un bloque siempre para bloquear asignaciones si no hay condicional dentro de siempre? ¿No se podrían lograr los mismos fines utilizando la asignación, ya que las asignaciones serían siempre las mismas?
Hará lo mismo. Sin embargo, ponerlo en el mismo bloque hace que el código sea más fácil de leer. No necesita ir a buscar la declaración de asignación para ver cuál es la lógica.
  1. Ambos son posibles y generalmente se denominan lógica asíncrona versus lógica síncrona. Es posible que desee profundizar un poco más en esto, especialmente porque al menos puede describir varios esquemas sincrónicos (por ejemplo, disparo en nivel o borde). La máxima confiabilidad a menudo se logra con disparo de borde, debido a las condiciones de carrera con disparo de nivel. Por lo tanto, FPGAa tens to bw optimizado para eso.

  2. Usando un PLL. La mayoría de los diseños usan múltiples relojes, y el límite viene del tipo de circuito que sintetizas. Para diseños síncronos activados por flanco adecuados, es posible que el sintetizador ya lo calcule por usted (y para todo lo demás, es posible que deba aprender a suprimir manualmente las advertencias o errores sobre su incapacidad para hacerlo).

  3. Ver esta pregunta .

Esto no responde a mi primera pregunta a mi satisfacción. Todavía no tengo claro si las instrucciones secuenciales se ejecutan una por ciclo de reloj o no.
Es posible que haya malinterpretado su pregunta sobre la lógica secuencial. ¿Quiso decir asignaciones consecutivas? Y, para evitar los conceptos erróneos de mis propios principiantes, ¿estás usando <= o =?
No tenía claro el comportamiento de ambos, pero la respuesta anterior hace un buen trabajo al explicarlo.