Divisor de frecuencia de número impar

5

Nota importante: no me estás ayudando a hacer mi tarea. Esto es para una competencia para estudiantes de ingeniería, que lo alienta a "usar su red";)

Tengo este patrón para un divisor de frecuencia que divide el reloj entre 5. Se supone que tiene un problema importante, pero parece que no puedo averiguar exactamente qué es.

Lasopcionesquetengoparasolucionaresteproblemason:

  • X==(000|001|100),Y==(001)
  • X==(000|001|010|011),Y==(010|011)
  • X==(001|010|011),Y==(000)
  • ¡Tantoa)comoc)soncorrectos!

Metoméeltiempoparatrazarlasseñaleseneldiseñooriginalyenlaopciónnúmero3,yaquepenséqueesaeralarespuesta.

He cambiado el reloj un ciclo de medio reloj, gritos. Sin embargo, no debería cambiar nada. El resto se hace a mano.

¿Alguien aquí tiene alguna buena sugerencia?

    
pregunta LasseValentini

3 respuestas

6
  

Se supone que tiene un problema importante

El único problema posible que me llama la atención es la prevención de fallos. Su salida es una señal de reloj, por lo que sería muy sensible a los bordes adicionales. Pero es un resultado combinado, por lo que puede ser propenso a problemas técnicos.

A modo de ejemplo, supongamos que tuvo esta implementación ingenua de un generador de acarreo completo (al menos 2 entradas de 3 son verdaderas), es decir,

Y = ABC + AB(!C) + A(!B)C + (!A)BC

Si sus señales ABC cambian de 111 a 011, existe una posibilidad, dependiendo de los retrasos de propagación, de que la salida Y, que debería ser un 1 todo el tiempo, le dé un pequeño error de 0. Lo que básicamente sucede es que que la veracidad de la salida tiene que cambiar de un término a otro: ABC - > (! A) BC en este caso. Si el término (! A) BC tiene un retardo de propagación más largo que el término ABC para 1 - > La transición 0 en A, luego los dos términos ABC y (! A) BC pueden ser 0 durante un corto período de tiempo, y se obtiene un 0 como salida.

Una implementación adecuada es aquella en la que un solo cambio de bit de entrada no produce fallas en la salida: el nivel de la salida se comparte con dos términos a medida que realiza la transición. En el caso de un generador de acarreo completo, esto funciona:

Y = AB + BC + CA

En su caso, hay dos posibles causas de problemas técnicos.

Una es que X y Z cambian casi al mismo tiempo, pero en su caso, de acuerdo con sus diagramas de tiempo, esto no debería suceder.

La otra es que la lógica combinacional que produce X es propensa a los problemas técnicos. No sabemos cómo se implementa, por lo que es difícil de decir.

La solución más simple en cualquier caso es pegar un flip-flop en la salida, con la misma entrada de reloj que los otros flip-flops. Los flip-flops modernos tienen especificaciones de muestra / retención de modo que cualquier retraso de propagación > = 0 y < (período de reloj - tiempo de configuración) producirá salidas estables y sin problemas, por lo que, a menos que su período de reloj sea realmente rápido, cualquier fallo en la entrada del flip-flop se resolverá al comienzo de su ventana de tiempo de configuración en el próximo reloj borde.

Si no puede tolerar el retraso de poner un flip-flop en la salida, debe garantizar que toda la lógica combinacional que produce directamente la salida está libre de fallas.

    
respondido por el Jason S
0

Yo sugeriría comenzar con un contador de división por cinco, uno de cuyos bits es alto para dos conteos y bajo para tres. Por ejemplo:

Q0 := !Q1 & !Q2;
Q1 := Q0;
Q2 := Q1;

Este contador pasará por la secuencia: 000 001 011 110 100 (un valor de 101 alcanzará un estado válido después de dos relojes; 010 o 111 alcanzarán un estado válido después de un reloj). Cualquier parte de ella se puede utilizar como una salida de dos puntos calientes.

Tome la salida de este contador e introdúzcalo en un pestillo que se activa con el borde opuesto del reloj. El "OR" de esta salida de contador con el primero produciría la forma de onda deseada.

    
respondido por el supercat
0

No hay necesidad de hacerlo tan complejo. He hecho para dividir entre 3, puede generalizarlo o codificarlo para dividir entre 5 simplemente cambiando el valor de c1 y elementos de sensibilidad A continuación se muestra el código:

module clk ();
reg clk,clkout;
initial clk =0;
initial clkout = 0;
int c1,c2,c3;
always #5 clk = ~clk;
always@(posedge clk or negedge clk)
begin
c1 <= c1 +1;

if (c1 == 5)
begin
c1 <= 0;
end

//
end

always@(posedge clk or negedge clk)
begin
if(c1==0 || c1 == 3)
begin
clkout = ~clkout;
end
end


endmodule
    
respondido por el DHANESH TANEJA

Lea otras preguntas en las etiquetas