我如何从寄存器中获取一个位?

时间:2015-03-14 04:33:25

标签: verilog system-verilog

在代码中,您可以看到有状态寄存器(reg [N-1] State)。我想在10个不同的信号或寄存器中访问10位状态,或者我们可以说有线。这怎么可能。 ?? 我使用了assign语句,但我想制作一个时钟逻辑。 这给出了错误

第33行:“< =”

附近的语法错误
module Genes_Network #( 
                    N =10     // 
                            )  
                    ( input Clock ,
                      input Reset ,
            //                input reg [N-1:0] Satein,
                      output reg [N-1 : 0] State_Gene                                  
);
 reg    [N-1:0] State ; 
 reg    Fgf8,Emx2, Pax6,Coup_tfi,Sp8;  // Genes 
 reg    F,E,P,C,S ;                    // Proteins
 // 
  Fgf8    <= State[9] ;
  F       <= State[N-2] ;
  E       <= State[N-4] ;
  Pax6    <= State[N-5] ;
  Emx2    <= State[N-3] ;
  P       <= State[N-6] ;
  Coup_tfi<= State[N-7] ;
  C       <= State[N-8] ;
  Sp8     <= State[N-8] ;
  S       <= State[N-9] ;    
 always @(posedge Clock )

 //Network LOgic 
  Fgf8    <=  F & (~E) & S; 
 endmodule

2 个答案:

答案 0 :(得分:0)

当您设计组合逻辑时,您应该使用assign并阻止分配(=),即:

assign Fgf8 = State[9]; 

非阻塞分配(<=)只能在时钟always块中使用,即:

always @(posedge Clock)
  Fgf8 <=  F & (~E) & S; 

另外一件事,请记住,你不能在两个不同的地方驱动相同的信号(在这种情况下为Fgf8)。

答案 1 :(得分:0)

语法错误是您只能将网络或变量分配为并发赋值语句(assign)或过程语句(alwaysinitial等)的一部分。简单地说

var <= value;

单独出现语法错误。对于您的示例,最佳解决方案可能是将reg声明更改为wire,然后执行

assign Fgf8    = State[9] ;
assign F       = State[N-2] ;
// etc.

您也可以按照

的方式做点什么
always @(State)
begin
    Fgf8    = State[9] ;
    F       = State[N-2] ;
    // etc.
end

但是我似乎记得灵敏度列表(@(State))可能比使用矢量更棘手(就像它可能需要分解为@( State[9] or @State[8] or @State[7] or ...)才能正常工作)。我已经使用SystemVerilog多年了,所以我不记得那些细节。这是SystemVerilog可以提供帮助的另一个领域 - 人们可以使用SV always_comb代替always进行组合逻辑,并完全跳过显式敏感列表。

在您的简单情况下,您可以放弃非阻止分配(<=)而不会造成任何伤害,但不建议这样做。 @ Qiu的所有其他评论也适用,你也应该注意它们。