Código Verilog para o divisor de frequência
On Fevereiro 17, 2021 by adminVocê pode me ajudar a criar um código Verilog para o circuito divisor de frequência que pode gerar 50 Hz sinal de relógio fora de 50 MHz sinal usando 16 bits contador síncrono. Tentei fazer isso, mas não funcionou!
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];
Comentários
- Usando 16 bits de quê?
- E o que você tentou? Você poderia postar seu código?
- Contador síncrono de 16 bits
- Você pode usar dois destes?
- Bom. Em seguida, divida primeiro por 1000 e, em seguida, divida por outros 1000.
Resposta
Infelizmente, 16 bits não são suficientes para converter um sinal de 50 MHz em um sinal de 50 Hz. Isso ocorre porque você precisa dividir o clock por 1 milhão. $$ 2 ^ {16} = 65536 $$ Portanto, não é o suficiente. A contador com pelo menos 20 bits seria suficiente porque: $$ 2 ^ {20} = 1048576 $$
Para converter o sinal, basta contar até 1 milhão de ciclos de clock e, em seguida, alterar o estado do sinal de saída .
exemplo:
always @(posedge clk_in) begin count_20 <= count_20 + 1; if(count_20 == 1000000) begin count<=0; clk_out <= !clk_out; end end
Editar: Acontece que ^^ resultaria em um sinal de 25 Hz, então você só precisa conte até 500000, que precisa de 19 bits. A questão então é onde esse 20º bit vem de ver que você precisa dividir por 1 milhão. Bem, o bit clk_out serve como o vigésimo bit.
Comentários
- outra solução é usar vários desses contadores de 16 bits. você precisaria de pelo menos 16 deles (16 * 65536 = 2 ² ⁰ = 1048576)
- Posso ter cometido um erro, acho que minha solução resultaria em 25 Hz?
- você só precisaria de dois, isso lhe daria 32 bits
- @Makoto sim, você precisa contar até 500_000, e segundo – provavelmente haverá um aviso sobre usando diferentes tipos de atribuição na construção always, acho que você quis dizer
clk_out <= !clk_out
; - sim vai mudar isso
Deixe uma resposta