Kod Verilog dla dzielnika częstotliwości
On 17 lutego, 2021 by adminCzy możesz mi pomóc, jak utworzyć kod Verilog dla obwodu dzielnika częstotliwości, który może generować 50 Hz sygnał zegara z 50 MHz przy użyciu 16-bitowy licznik synchroniczny. Próbowałem to zrobić, ale nie zadziałało!
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];
Komentarze
- Używanie Czego 16 bitów?
- A co próbowałeś? Czy mógłbyś wysłać swój kod?
- 16-bitowy licznik synchroniczny
- Czy możesz użyć dwóch z nich?
- Dobrze. Następnie najpierw podziel przez 1000, a następnie przez kolejne 1000 ..
Odpowiedź
Niestety, 16 bitów nie wystarcza, aby przekształcić sygnał 50 MHz w sygnał 50 Hz. Dzieje się tak, ponieważ musisz podzielić zegar przez 1 milion. $$ 2 ^ {16} = 65536 $$ Dlatego to za mało. A licznik z co najmniej 20 bitami wystarczyłby, ponieważ: $$ 2 ^ {20} = 1048576 $$
Aby przekonwertować sygnał, wystarczy policzyć do 1 miliona cykli zegara, a następnie zmienić stan sygnału wyjściowego .
przykład:
always @(posedge clk_in) begin count_20 <= count_20 + 1; if(count_20 == 1000000) begin count<=0; clk_out <= !clk_out; end end
Edycja: Okazuje się, że ^^ dałoby sygnał 25 Hz, więc wystarczy policz do 500000, co wymaga 19 bitów. Pytanie brzmi, gdzie to zrobić ten dwudziesty bit pochodzi z widzenia, ponieważ musisz podzielić przez 1 milion. Cóż, bit clk_out służy jako dwudziesty bit.
Komentarze
- innym rozwiązaniem jest użycie kilku z tych 16-bitowych liczników. potrzebujesz co najmniej 16 z nich (16 * 65536 = 2 ² ⁰ = 1048576)
- Mogłem popełnić błąd, myślę, że wynikałoby z tego w 25Hz?
- potrzebowałbyś tylko dwóch, co dałoby 32 bity
- @Makoto tak, musisz liczyć do 500_000, a po drugie – najprawdopodobniej będzie ostrzeżenie o używając innego typu przypisania w konstrukcji zawsze, myślę, że miałeś na myśli
clk_out <= !clk_out
; - tak, zmieni to
Dodaj komentarz