código Verilog para el divisor de frecuencia

0

¿Puede ayudarme, por favor, a crear un código Verilog para el circuito divisor de frecuencia que pueda generar una señal de reloj 50Hz fuera de la señal 50MHz utilizando 16 bits contador síncrono. He intentado hacerlo, ¡pero no funcionó!

module divier_16 (clk_in, clk_out);

input clk_in;
wire w;
wire [0:15]temp;
output clk_out;
count_16 c1 (clk_in, w);
count_16 c2 (w, temp);

assign clk_out= temp[6];
    
pregunta fa6ma

1 respuesta

3

Desafortunadamente, 16 bits no son suficientes para convertir una señal de 50MHz en una señal de 50Hz. Esto es porque necesitas dividir el reloj por 1 millón. $$ 2 ^ {16} = 65536 $$ Por lo tanto, no es suficiente. Un contador con al menos 20 bits sería suficiente porque: $$ 2 ^ {20} = 1048576 $$

Para convertir la señal, simplemente cuenta hasta 1 millón de ciclos de reloj y luego cambia el estado de la señal de salida.

ejemplo:

always @(posedge clk_in) begin
   count_20 <= count_20 + 1;
   if(count_20 == 1000000)
   begin
      count<=0;
      clk_out <= !clk_out;
   end
end

Editar: Resulta que ^^ daría como resultado una señal de 25Hz, por lo que solo necesitas contar hasta 500000, que necesita 19 bits. La pregunta entonces es de dónde viene ese bit 20, ya que necesita dividirse por 1 millón. Bueno, el bit clk_out sirve como ese bit 20.

    
respondido por el Makoto

Lea otras preguntas en las etiquetas