我如何在verilog中使用instentiated模块的输出?

时间:2015-03-27 15:32:15

标签: verilog

这是10位的LSFR。我在verilog中使用了LSFR模块。你可以在下面的给定代码中看到。 LSFR的输出是当前状态。我想访问它的每个位。但是在这里我为Current_State得到0。它没有更新。请任何人都可以帮助我..

module LSFR_counter  #(parameter n=6)( output Reg, input clk, input reset);
        //parameter n=10; // Change more than n to change LFSR length.
        reg [n:1]Reg; //All procedure outputs must be registered
        reg [n:1] counter ;

        initial 
        counter =0 ;

        always @(posedge clk or posedge reset)
            if
            (reset) Reg <=1;
            else
            begin
            counter <= counter+1 ;
            Reg <= {Reg[n-1:2], Reg[n]^Reg[1], Reg[n]};
            end
        endmodule 


 module Main( output Reg  input Clock , input reset 
       );
 reg   Fgf8,Emx2,Pax6,Coup_tfi,Sp8;        // Genes 
 reg   F,E,P,C,S;                          // Proteins

     reg [10:1] Current_State ;
   LSFR_counter  #(.n(10))   lsfr ( .Reg (Current_State), .clk (Clock ), .reset(reset) )  ;

     Fgf8     <= Current_State[N-0]  ;   // Gene
     F        <= Current_State[N-1]  ;   //  Protein 
     Emx2     <= Current_State[N-2]  ;
     E        <= Current_State[N-3]  ;
     Pax6     <= Current_State[N-4]  ;
     P        <= Current_State[N-5]  ;
     Coup_tfi <= Current_State[N-6]  ;
     C        <= Current_State[N-7]  ;
     Sp8      <= Current_State[N-8]  ;
     S        <= Current_State[N-9]  ;
    endmodule ;

2 个答案:

答案 0 :(得分:0)

代码中出现了几个问题:

  1. Main模块的输出名称为Reg,未分配任何信号。因此,如果您希望从中获得任何价值,那么您就不会。
  2. 已分配信号Fgf8, F..和朋友,但未使用。 更新:实际上,分配不正确。如果它们应该被同步分配(在时钟周期上),它应该被包装在always块中。如果您的意思是使用组合电路,则应使用assign语句。
  3. 未定义变量/信号N。 Verilog区分大小写,因此n!= N
  4. LSFR_counter模块中,counter未重置为初始值。
  5. 这些是迄今为止可以看到的问题。

答案 1 :(得分:0)

在LSFR_counter:中,您混合使用ANSI和非ANSI标头样式。这是非法的语法。也许你的模拟器/合成器允许它,但它不受支持并且是一种不好的做法。

您应该使用ANSI:IEEE Std 1800-2012§23.2.2.2 ANSI样式的端口声明列表

module LSFR_counter  #(parameter n=6)( output reg [n:1] Reg, input clk, input reset);
  reg [n:1] counter;
  // ...

或非ANSI:IEEE Std 1800-2012§23.2.2.1非ANSI样式端口声明

module LSFR_counter  #(parameter n=6)( Reg, clk, reset);
  output Reg;
  input clk;
  input reset;
  reg [n:1] Reg;
  reg [n:1] counter;
  // ...

非ANSI适用于IEEE Std 1364-1995,并且与后来的IEEE 1364版本和IEEE 1800的所有版本具有后向可比性。自IEEE Std 1364-2001以来,对ANSI的支持已经存在。


在主要内容:没有任何东西在推动Reg。其他信号(例如:Fgf8FEmx2等)从未被声明并且具有非法分配。 N也从未被定义过。我假设它是一个参数。您可以将它们声明为reg并在组合块中分配:

parameter N=10;
reg Fgf8,F, ... ,Sp8,S;
always @* begin
  Fgf8     = Current_State[N-0]  ;   // Gene
  F        = Current_State[N-1]  ;   //  Protein 
  // ...
  Sp8      = Current_State[N-8]  ;
  S        = Current_State[N-9]  ;
end

或者声明为电线并使用连续分配进行分配:

parameter N=10;
wire Fgf8     = Current_State[N-0]  ;   // Gene
wire F        = Current_State[N-1]  ;   //  Protein 
// ...
wire Sp8      = Current_State[N-8]  ;
wire S        = Current_State[N-9]  ;

两者都合成相同。