2017-02-22 2 views

Répondre

3

Vous dites que la simulation sur Modelsim "fonctionne correctement", mais ne spécifiez pas comment vous définissez "correctement". Je l'ai simulé et rien d'intéressant ne se passe du tout: cnt reste au 4'bx car vous n'avez aucun mécanisme pour l'initialiser. J'imagine que vous avez l'intention cnt d'incrémenter sur chaque front montant de sig. Cela se produit si vous n'initialisez cnt (voir l'commenté code):

https://www.edaplayground.com/x/4zXf

Cependant, bien que ce code peut être synthétisé, ce n'est pas une conception synchrone , et il synthétisant à un non-sens (un additionneur et quatre verrous). En supposant que vous ne nécessitent cnt d'incrémenter sur chaque front montant de sig, vous devez augmenter cette conception synchrone:

always @(posedge sig) 
    cnt <= cnt + 1; 

Ce synthétisera à un additionneur et quatre D-bascules de type.

Il est normal de réinitialiser un compteur, car sinon, dans le matériel réel, le compteur aura une valeur inconnue (d'où le 4'bx dans la simulation). Vous pouvez sortir avec initialisant cnt dans un FPGA:

reg [3:0] cnt = 4'b0; 

mais vous voudrez peut-être envisager un signal de réinitialisation à la place:

always @(posedge sig, posedge reset) 
    if(reset) 
    cnt <= 4'b0; // or some other reset value 
    else 
     cnt <= cnt + 1; 

Je suis troublé par votre nomination de sig; la plupart des gens appelleraient cela clk ou clock ou quelque chose de similaire. Ce nom suggère que vous n'êtes peut-être pas familier avec conception synchrone. Si oui, vous devriez en savoir plus à ce sujet et devrait également lire cette réponse here.