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 always
bloque? 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.
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.
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.
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).
Ver esta pregunta .
solojeff
Estrella del Vacío
joe hass
sequential logic
es muy confuso, y es mejor hablar de lógica combinacional (AND, OR, NOT) o lógica síncrona (flip-flops y latches).