2016-10-02 3 views
0

Je souhaite créer un diviseur de fréquence avec compteur et MUX.Erreur (10219): Erreur d'affectation continue Verilog HDL sur Mux.v (19): l'objet "muxout" sur le côté gauche de l'affectation doit avoir un type net

Je fais 3 modules pour le projet

// 4 bits contre

module Counter (input clk, input reset, output reg[3:0] out); 

    [email protected](posedge clk or posedge reset) 
    begin 
     if(reset) 
     out = 4'b0000; 
     else 
     begin 
     if(clk) 
      if(out < 4'b1111) 
      out = out + 4'b0001; 
      else 
      out = 4'b0000; 
     end 
    end 


endmodule 

// Module 4by1 Mux

module Mux (input [3:0] muxin , input [1:0] sel, output reg muxout); 


    function _4by1mux; 

     input [3:0] muxin; 
     input [1:0] sel; 

     case (sel) 
     2'b00 : _4by1mux = muxin[0]; 
     2'b01 : _4by1mux = muxin[1]; 
     2'b10 : _4by1mux = muxin[2]; 
     2'b11 : _4by1mux = muxin[3]; 
     endcase 
    endfunction 

    assign muxout = _4by1mux(muxin, sel); 


endmodule 

// Module freqDivider

module freqDivider(input clk, input reset, input [1:0] sel, output reg muxout); 

    wire [3:0]counterbus; 

    Counter ct1 (clk, reset, counterbus); 
    Mux mux1 (counterbus, sel, muxout); 

endmodule 
freqDivider module

est top, et je le module d'appel contre et Mux

mais le module MUX a un problème avec

Error (10219): Verilog HDL Continuous Assignment error at Mux.v(19): 
object "muxout" on left-hand side of assignment must have a net type 

cette erreur

ps. sel d'entrée sera modifiée par le temps

+0

s'il vous plaît formater votre code en utilisant Cntrl + K. Aussi s'il vous plaît expliquer votre problème en détail et aussi où vous avez besoin d'aide pour la résolution de votre problème – mhasan

+0

désolé c'est mon premier codage et je pense que la sortie 'muxout' ne peut pas être assigné .... mais pourquoi? – KorHotGuy

+0

FYI: pas lié à votre énoncé de problème, mais vous devez supprimer la ligne 'if (clk)'. Les simulations fonctionneront correctement, mais la plupart des synthétiseurs considéreront tous les signaux utilisés dans un bloc procédural (alias 'always @ (posedge/negedge ...)') et seront utilisés dans le corps comme des entrées asynchrones. Sans la ligne 'if (clk)' votre module 'Counter' simulera la même chose et synthétisera correctement – Greg

Répondre

1

L'erreur est un résultat du type de sortie ayant muxoutreg lieu du type wire. Dans verilog, les lignes peuvent avoir deux types généraux, soit des filets (type wire), soit des variables (comme reg types). Pour affecter des valeurs/logique aux types de réseau, vous devez utiliser des instructions assign et non des blocs always. Pour affecter des valeurs/logique à des types de variables, vous ne pouvez utiliser que des blocs always et non des instructions assign. Ainsi, vous pouvez soit faire votre assign dans le module Mux un bloc always ou, pour une solution plus facile, ne faites pas la sortie muxout un reg, laissez simplement le mot-clé reg et ce sera un wire.

+0

merci, je change mon code et ça marche! mais encore confondre sur le type net ... de toute façon merci beaucoup !! – KorHotGuy

+0

@KorHotGuy Il est un peu étrange et j'ai écrit cette réponse sur un train sur mon téléphone, donc je ne suis pas allé tout sur l'explication.Cependant, la nouvelle version de Verilog (ou, plus exactement, SystemVerilog) a essayé de supprimer ce problème en faisant tout ce que vous utilisiez normalement de type 'logic' – Unn

0

L'erreur est que vous avez déclaré mux_out comme type de reg, au lieu du type de fil. Le type par défaut de n'importe quel port est le fil. Vous effectuez une affectation continue sur ce réseau via le mot clé assign. Et sur les réseaux de type reg, l'affectation ne peut être effectuée qu'à l'intérieur du bloc procédural (initial, toujours).

Remplacez mux_out par output reg uniquement par output.