Code Verilog pour le diviseur de fréquence
On février 17, 2021 by adminPouvez-vous maider sil vous plaît sur la façon de créer un code Verilog pour le circuit diviseur de fréquence qui peut générer 50Hz signal dhorloge sur 50MHz signal utilisant 16 bits compteur synchrone. Jai essayé de le faire, mais cela na pas fonctionné!
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];
Commentaires
- Utilisation 16 bits de quoi?
- Et quavez-vous essayé? Pourriez-vous publier votre code?
- Compteur synchrone 16 bits
- Pouvez-vous en utiliser deux?
- Bien. Ensuite, divisez dabord par 1 000, puis par 1 000 supplémentaires.
Réponse
Malheureusement, 16 bits ne suffisent pas pour convertir un signal de 50 MHz en un signal de 50 Hz. Cest parce que vous devez diviser lhorloge par 1 million. $$ 2 ^ {16} = 65536 $$ Par conséquent, ce nest pas assez. A un compteur dau moins 20 bits serait suffisant car: $$ 2 ^ {20} = 1048576 $$
Pour convertir le signal, il suffit de compter 1 million de cycles dhorloge, puis de changer létat du signal de sortie .
exemple:
always @(posedge clk_in) begin count_20 <= count_20 + 1; if(count_20 == 1000000) begin count<=0; clk_out <= !clk_out; end end
Edit: Il savère que ^^ résulterait en un signal à 25 Hz, il vous suffit donc de compter jusquà 500 000, ce qui nécessite 19 bits. La question est alors de savoir où ce 20e bit vient du fait que vous devez diviser par 1 million. Eh bien, le bit clk_out sert de ce 20e bit.
Commentaires
- une autre solution est dutiliser plusieurs de ces compteurs 16 bits. vous auriez besoin dau moins 16 dentre eux (16 * 65536 = 2 ² ⁰ = 1048576)
- Jai peut-être fait une erreur, je pense que ma solution en résulterait en 25Hz?
- vous nen auriez besoin que de deux, cela vous donnerait 32 bits
- @Makoto oui, vous devez compter jusquà 500_000, et deuxièmement – il y aura probablement un avertissement concernant en utilisant un type daffectation différent pour toujours construire, je pense que vous vouliez dire
clk_out <= !clk_out
; - oui le changera
Laisser un commentaire