2016-11-08 1 views
-1

J'ai eu le problème avec l'utilisation de la valeur d'entrée dans Verilog. J'écris:Comment utiliser les valeurs d'entrée dans la définition "toujours" dans Verilog

module reg_vector (INPUT, ICLK, IENBL, NR, OUT); 
parameter k = 6; 
parameter n = 3; 
input [(8*k)-1:0] INPUT; 
input ICLK; 
input IENBL; 
input [n-1:0] NR; 

reg [n-1:0] temp; 
output reg [7:0] OUT; 

[email protected] (temp, posedge ICLK) 
begin 
    if (IENBL) 
     begin 
      OUT = INPUT[temp*8 : temp*8+8]; 
     end 
end 

endmodule 

mais nous avons eu l'erreur:

Error (10734): Verilog HDL error at reg_vector.v(25): temp is not a constant

Comment dois-je résoudre ce problème? Merci)

+0

Vous déclarez 'temp', mais vous ne lui attribuez une valeur. De plus, je ne pense pas que vous le vouliez dans la liste de '' sensibilité '' toujours avec 'posedge ICLK' – toolic

Répondre

0

INPUT[temp*8 : temp*8+8] ne fonctionne pas car la syntaxe de la plage : nécessite que les deux côtés soient constants.
Ce que vous voulez est d'utiliser la matrice +: tranchage: INPUT[temp*8 +: 8] Le côté gauche de +: permet variables et représente l'index de départ. Le côté droit est la largeur et doit être une constante. Pour en savoir plus sur +: voir Indexing vectors and arrays with +:

Autres questions:

  1. Supprimer temp dans la liste de sensibilité.
  2. temp doit être affecté à quelque chose
  3. OUT doit être affecté à la non-blocage (<=) ne bloque pas (=) car il est logique séquentielle.

always @(posedge ICLK) // no temp in sensitivity list 
begin 
    if (IENBL) 
    begin 
    OUT <= INPUT[temp*8 +: 8]; // non-blocking and +: 
    end 
end 
0

Même si votre vecteur a toujours une largeur de 1 octet, l'outil le comprend comme une taille variable et ne sait pas comment l'utiliser. (Vous aussi inversé les indices temp*8 et temp*8+8 dans la sélection de vecteur)

Une autre façon de le faire est d'utiliser l'opérateur de décalage

OUT = INPUT >> (temp*8); 

Cela devrait fonctionner comme OUT prendra les 8bits inférieurs du déplacement par 8*temp de INPUT

+0

Eh bien, l'erreur a disparu, mais je ne suis pas sûr que l'opérateur de décalage est la solution. Je dois connecter les pieds d'entrée à la sortie, dépend de l'entrée NR. Je veux dire si NR = 0 OUT = IN [7: 0] Et si NR = 1 OUT = IN [15: 8] –