Verilog-kode for frekvensdeler
On februar 17, 2021 by adminKan du vennligst hjelpe meg med hvordan du lager en Verilog-kode for frekvensdelerkrets som kan generere 50Hz kloksignal ut av 50MHz signal ved hjelp av 16 bit synkron teller. Jeg har prøvd å gjøre det, men det fungerte 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
- Bruke 16 biter av hva?
- Og hva har du prøvd? Kan du legge ut koden din?
- Synkron teller på 16 bit
- Kan du bruke to av disse?
- Bra. Del deretter først med 1000, og del deretter med ytterligere 1000 ..
Svar
Dessverre er ikke 16 bits nok til å konvertere et 50MHz signal til et 50Hz signal. Dette er fordi du trenger å dele klokken med 1 million. $$ 2 ^ {16} = 65536 $$ Derfor er det ikke nær nok. A teller med minst 20 bits ville være nok fordi: $$ 2 ^ {20} = 1048576 $$
For å konvertere signalet teller du ganske enkelt til 1 million klokkesykluser, og endrer deretter tilstanden til utgangssignalet .
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 seg at at ^^ vil resultere i et 25Hz signal, så du trenger bare å telle til 500000 som trenger 19 biter. Spørsmålet er da hvor gjør den 20. biten kommer fra å se at du trenger å dele med 1 million. Vel, clk_out-biten fungerer som den 20. biten.
Kommentarer
- en annen løsning er å bruke flere av disse 16 bits tellere. du trenger minst 16 av disse (16 * 65536 = 2 ² ⁰ = 1048576)
- Jeg kan ha gjort en feil, jeg tror løsningen min vil føre til på 25Hz?
- trenger du bare to, det vil gi deg 32 biter
- @Makoto ja, du må telle til 500_000, og andre – mest sannsynlig vil det bli advart om bruker en annen oppgavetype i alltid å konstruere, jeg tror du mente
clk_out <= !clk_out
; - yep vil endre det
Legg igjen en kommentar