Verilog-koodi taajuusjakajalle
On helmikuu 17, 2021 by adminVoitteko auttaa minua luomaan Verilog-koodi taajuusjakajan piirille, joka voi tuottaa 50Hz kellosignaali 50MHz -signaalista 16-bittinen synkroninen laskuri. Olen yrittänyt tehdä sen, mutta se ei toiminut!
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];
Kommentit
- Käyttämällä Mistä 16 bittiä?
- Ja mitä olet kokeillut? Voisitko lähettää koodisi?
- 16-bittinen synkroninen laskuri
- Voitko käyttää kahta näistä?
- Hyvä. Sitten ensin jaetaan 1000: lla, sitten jaetaan toisella 1000: lla.
Vastaa
Valitettavasti 16 bittiä ei riitä 50 MHz: n signaalin muuntamiseksi 50 Hz: n signaaliksi. Tämä johtuu siitä, että kello on jaettava miljoonalla. $$ 2 ^ {16} = 65536 $$ Siksi se ei ole läheskään tarpeeksi. Vähintään 20-bittinen laskuri riittää, koska: $$ 2 ^ {20} = 1048576 $$
Signaalin muuntamiseksi lasketaan yksinkertaisesti miljoonaan kellojaksoon ja muutetaan sitten lähtösignaalin tilaa .
esimerkki:
always @(posedge clk_in) begin count_20 <= count_20 + 1; if(count_20 == 1000000) begin count<=0; clk_out <= !clk_out; end end
Muokkaa: On käynyt ilmi, että ^ ^ johtaisi 25 Hz: n signaaliin, joten sinun tarvitsee vain laskea 500000, joka tarvitsee 19 bittiä. Kysymys on sitten missä että 20. bitti tulee siitä, että sinun on jaettava miljoonalla. No, clk_out-bitti toimii kyseisenä 20-bittisenä.
Kommentit
- toinen ratkaisu on käyttää useita näistä 16-bittisistä laskureista. tarvitset vähintään 16 näistä (16 * 65536 = 2 ² ⁰ = 1048576)
- Olen saattanut tehdä virheen, mielestäni ratkaisuni johtaisi 25 Hz: ssä?
- tarvitset vain kaksi, mikä antaisi sinulle 32 bittiä
- @Makoto kyllä, sinun täytyy laskea 500_000: een ja toiseksi – todennäköisesti tulee olemaan varoitus Jos käytät aina eri määritystyyppiä aina rakenteessa, mielestäni tarkoitit
clk_out <= !clk_out
; - joo muuttaa sitä
Vastaa