Verilog-kod för frekvensdelare
On februari 17, 2021 by adminKan du snälla hjälpa mig att skapa en Verilog-kod för frekvensdelarkrets som kan generera 50Hz klocksignal från 50MHz -signal med 16 bitars synkron räknare. Jag har försökt göra det, men det fungerade inte!
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
- Använda 16 bitar av vad?
- Och vad har du provat? Kan du lägga upp din kod?
- 16-bitars synkron räknare
- Kan du använda två av dessa?
- Bra. Dela sedan först med 1000 och dela sedan med ytterligare 1000 ..
Svar
Tyvärr räcker det inte med 16 bitar för att konvertera en 50MHz-signal till en 50Hz-signal. Det beror på att du måste dela klockan med 1 miljon. $$ 2 ^ {16} = 65536 $$ Därför är det inte tillräckligt. A räknare med minst 20 bitar räcker för: $$ 2 ^ {20} = 1048576 $$
För att konvertera signalen räknar du helt enkelt till 1 miljon klockcykler och ändrar sedan utsignalens tillstånd .
exempel:
always @(posedge clk_in) begin count_20 <= count_20 + 1; if(count_20 == 1000000) begin count<=0; clk_out <= !clk_out; end end
Redigera: Det visar sig att ^^ skulle resultera i en 25Hz signal, så du behöver bara räkna till 500000 som behöver 19 bitar. Frågan är då var gör det den 20: e biten kommer från att se att du behöver dela med 1 miljon. Tja, clk_out-biten fungerar som den 20: e biten.
Kommentarer
- en annan lösning är att använda flera av dessa 16 bitars räknare. du behöver minst 16 av dessa (16 * 65536 = 2 ² ⁰ = 1048576)
- Jag kanske har gjort ett misstag, jag tror att min lösning skulle resultera i 25Hz?
- du behöver bara två, det skulle ge dig 32 bitar
- @Makoto ja, du måste räkna till 500_000, och andra – troligen kommer det att finnas en varning om använder olika uppdragstyp i alltid konstruktion, jag tror att du menade
clk_out <= !clk_out
; - yep kommer att ändra det
Lämna ett svar