Verilog-kode til frekvensdeler
On februar 17, 2021 by adminKan du venligst hjælpe mig med, hvordan jeg opretter en Verilog-kode til frekvensdelerkredsløb, der kan generere 50Hz ursignal ud af 50MHz signal ved hjælp af 16 bit synkron tæller. Jeg har forsøgt at gøre det, men det fungerede ikke!
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];
Kommentarer
- Brug 16 bits af hvad?
- Og hvad har du prøvet? Kan du sende din kode?
- 16 bit synkron tæller
- Kan du bruge to af disse?
- Godt. Derefter divideres først med 1000 og derefter divideres med yderligere 1000 ..
Svar
Desværre er 16 bit ikke nok til at konvertere et 50MHz signal til et 50Hz signal. Dette er fordi du skal dele uret med 1 million. $$ 2 ^ {16} = 65536 $$ Derfor er det ikke nær nok. A tæller med mindst 20 bit ville være nok, fordi: $$ 2 ^ {20} = 1048576 $$
For at konvertere signalet tæller du simpelthen til 1 million urcykler og ændrer derefter udgangssignalets tilstand .
eksempel:
always @(posedge clk_in) begin count_20 <= count_20 + 1; if(count_20 == 1000000) begin count<=0; clk_out <= !clk_out; end end
Edit: Det viser sig, at at ^^ ville resultere i et 25Hz signal, så du behøver kun tæl til 500000, hvilket har brug for 19 bit. Spørgsmålet er så, hvor gør det den 20. bit kommer fra at se, at du har brug for at dele med 1 million. Nå, clk_out-biten fungerer som den 20. bit.
Kommentarer
- en anden løsning er at bruge flere af disse 16 bits tællere. du har brug for mindst 16 af disse (16 * 65536 = 2 ² ⁰ = 1048576)
- Jeg har muligvis lavet en fejl, jeg tror, min løsning ville resultere i 25Hz?
- behøver du kun to, det vil give dig 32 bits
- @Makoto ja, du skal tælle til 500_000, og andet – sandsynligvis vil der blive advaret om ved hjælp af en anden tildelingstype i altid at konstruere, tror jeg du mente
clk_out <= !clk_out
; - yep vil ændre det
Skriv et svar