Implementando un reloj derivado en un FPGA

0

Preparando un ejercicio de laboratorio, donde tenemos la tarea de generar un reloj de 1 Hz fuera del reloj del sistema de 50 Mhz de un FPGA. Esto se debe lograr sin usar ninguna biblioteca además de ieee.std_logic_1164 y ieee.numeric_std.

La posibilidad obvia sería, para ejecutar un contador. Cuando golpea 25 * 10 ^ 6 tics, se puede transmitir un borde (alternando entre subir y bajar). Luego reinicie el temporizador. Esto requeriría un temporizador de 25 bits y una comparación de 25 bits. Como nuestro ejercicio general no es tan complejo, no deberíamos encontrarnos con las limitaciones de los recursos FPGA. Sin embargo, me preguntaba cómo se podría implementar esto de manera más eficiente. P.ej. uno podría comparar solo el primer par de bits, perdiendo así la precisión de la frecuencia de reloj.

La documentación del ejercicio indica que, por lo general, estos temporizadores solo se bloquean en un bit dentro del contador. Entonces, una posibilidad sería contar más rápido, de modo que después de medio segundo se intercambiaría un bit específico. Esto se puede hacer contando hasta 2 ^ n y aumentando los pasos del contador. Sin embargo, esto crearía un error debido al resto truncado en el tamaño del paso. P.ej. contar a 2 ^ 30 con un tamaño de paso de 43 resultaría en un error de 0.1%, mientras que contar a 2 ^ 27 tiene un error de 6.9% con un tamaño de paso de 5.

¿Hay más recursos de conceptos eficientes para generar tal reloj? Preferiblemente usar un contador y bloquear en un solo bit para la generación de reloj.

    
pregunta Grebu

2 respuestas

1

No harías algo así en un diseño real. Consulte this para ver una regla de diseño de ejemplo que violaría. A veces, no puede evitar esto, pero solo debe violar la regla de diseño, si sabe lo que está haciendo. En su lugar, debe usar una señal de habilitación para habilitar la lógica de 1 Hz para 1 ciclo de reloj cada segundo. Toda la lógica todavía se ejecuta a 50 MHz.

Ahora que está fuera del camino, hay muchas maneras de implementar lo que ha especificado. No puede evitar el comparador realmente, porque incluso si está haciendo una cuenta regresiva, todavía necesita reiniciar el contador. El comparador no usará mucha lógica de todos modos. Es solo una gran puerta AND

Podría tener problemas al usar relojes rápidos, lo que resultaría en largas cadenas de contadores. La forma de evitar esto es utilizar registros de desplazamiento de retroalimentación lineal (LFSR). La forma en que funcionan es como un registro de turnos, pero con puertas XOR insertadas entre algunos DFF. AlelegirdóndecolocarlascompuertasXOR,puedecontrolarlacantidaddeciclosquetomaelLFSRparavolverasuestadooriginal.ElLFSRescomouncontador,perocuentaenordenaleatorio.Comonoleimportaelpedido,funcionaráensuaplicación.LaventajadelLFSResqueelsiguienteestadodeunDFFdependesolodelanteriorDFF.Nohayacarreoparapropagarse.

LaotraventajaesqueestáutilizandolacadenadetransporteenunFPGA. TodaslasLUTtienenunaconexiónrápidaalasiguienteLUTllamadacadenadetransporte.ElLFSRutilizalacadenadetransporteparaconectarsealasiguienteLUTenlugardeusarlosmultiplexoresdeenrutamiento.Estoesloquetambiénutilizasucontadorestándar,peroeltransportenecesitapropagarseatravésdetodalacadena.

ElproblemaconlosLFSResquenecesitasaberdóndecolocarlascompuertasXOR,esdecir,quépolinomiocaracterísticousar.Estopuedeserdifícildeencontrar.Sinembargo,hayotrascosasquepuedeshacer.Cuandoimplementasuncontadordeformaingenua,\$A=A+1\$,elsintetizadorloimplementarácomounsumadorderizo.Hayotrastopologíasdesumadorquepuedesusar.ElsumadordeKogge-Stone,porejemplo,sevuelvemásrápidoamedidaqueelanchoaumenta.MispropiosexperimentosenelCiclónIVsugierenqueestosucedaalrededordelos16.Sinembargo,sacrificaeláreaporque,adiferenciadelosLFSR,necesitamáslógicaparaimplementarla.Tampocoutilizalacadenadetransporte,loquelahacemáslentaparaanchosbajos.

Sirealmentenecesitaunreloj,vea esto como ejemplo, o consulte las instrucciones de su fabricante. Observe la presencia de un borde descendente DFF. Esto es para evitar fallos en la línea del reloj de las condiciones de carrera en la puerta lógica.

    
respondido por el user110971
3

Si sus contadores tienen una función de carga, cargue el contador a (escala completa - período deseado - 1) y use el acarreo de ondulación para realizar una carga. Esto tiene la ventaja de que no hay una penalización de tiempo adicional para un comparador.

    
respondido por el WhatRoughBeast

Lea otras preguntas en las etiquetas