Confusión sobre relojes en FPGAs / Verilog

2

Acabo de comprar un FPGA y estoy aprendiendo Verilog, pero me he topado con algunas confusiones, la mayoría de ellas con respecto al reloj.

Mi primera pregunta es, ¿cómo funciona la lógica secuencial? ¿Se hacen 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 250MHz en un chip con una velocidad de reloj de solo 50MHz. ¿Cómo es eso posible? Si el chip es capaz de operar a frecuencias tan altas (limitadas solo por los retrasos de la puerta, supongo), entonces, ¿por qué no se acaba de sincronizar el chip con una frecuencia más alta para comenzar?

¿Cómo funciona la lógica combinacional en un bloque always ? Pensé que siempre se ejecutaban bloques en eventos, como bordes de señal positivos o negativos, y se ejecutaban de forma secuencial, por lo que estoy bastante confundido en este punto, ya que he visto tareas de bloqueo dentro de bloques siempre.

    
pregunta Void Star

2 respuestas

8

En primer lugar, deseche este concepto de 'instrucciones'. No existen en Verilog. Nada se ejecuta. Verilog, VHDL, SystemVerilog, etc. son lo que se llaman lenguajes de descripción de hardware. No son ejecutados. 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 no se ejecutará ni interpretará el único verilog que se puede poner en un FPGA (verilog sintetizable). Los bancos de pruebas son un animal diferente.)

Los relojes se utilizan para controlar chanclas y registros. Los datos se pueden cambiar a flip flops y registros en los bordes del reloj. Por lo tanto, dentro de un bloque always @ (posedge clk), todas las declaraciones se 'ejecutarán' simultáneamente y los resultados se guardarán en los registros en el borde del reloj, de acuerdo con las reglas de cómo se interpretan las declaraciones HDL. Sin embargo, tenga mucho cuidado con el uso de = 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, todas las < = 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. Si está ejecutando una simulación, no importará cuántas operaciones deban ocurrir entre registros, pero en un FPGA el reloj tendrá que ser lo suficientemente lento para asegurarse de que cualquier cambio haya podido propagarse a través de la lógica.

Se pueden generar relojes más rápidos utilizando un dispositivo llamado bucle de bloqueo en fase (PLL). Los PLL no se pueden sintetizar en verilog, pero generalmente hay una manera de crear una instancia de un componente PLL dedicado en el FPGA que está utilizando. En realidad, lo retiro, ciertamente puede hacer un PLL digital en verilog, pero solo puede usarlo para generar señales más bajas que la frecuencia de 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. La tensión de control VCO se ajusta hasta que la salida VCO dividida a la baja coincide exactamente con la frecuencia y la fase de la señal de referencia. Si configura el divisor en 5 y usa 50 MHz para la frecuencia de referencia, el PLL generará una señal de 250 MHz que está precisamente sincronizada con 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 lógica combinatoria lenta y compleja. También puede permitir que el dispositivo controle su propia frecuencia de reloj para ahorrar energía.

Las instrucciones de bloqueo dentro de bloques siempre generarán lógica combinatoria. De nuevo, esta lógica generalmente siempre será 'ejecutada' independientemente del reloj porque define las puertas lógicas reales. Puede ser beneficioso utilizar algunas variables temporales, pero se debe tener cuidado para asegurarse de que no haya tanta lógica adicional que no se cumplan los requisitos de tiempo.

    
respondido por el alex.forencich
1
  1. Ambos son posibles, y generalmente se llaman asíncronos en lugar de 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, un disparo en el nivel o en el borde). La máxima fiabilidad se logra a menudo con Disparo de borde, debido a las condiciones de la carrera con nivel de disparo. Por lo tanto, FPGAa decenas a peso optimizado para eso.

  2. Usando un PLL. La mayoría de los diseños utilizan múltiples relojes, y el límite viene de qué tipo de circuito sintetiza. Para los diseños sincrónicos desencadenados por el borde, el sintetizador ya puede calcularlo por usted (y para todo lo demás, es posible que tenga que aprender a eliminar las advertencias o los errores sobre su incapacidad para hacerlo).

  3. Consulte esta pregunta .

respondido por el pyramids

Lea otras preguntas en las etiquetas