2012-04-02 2147 views

回答

3

always @*always块的一种类型。它用于推断组合逻辑。

always @(posedge clock)用于推断时序逻辑。

有关更多详细信息,请参阅IEEE标准(例如1800-2009)。

0

他们不一样!我曾经认为他们是一样的。但事实并非如此。

总是@(*)意味着任何东西,编译器会自动填充它。如果是组合逻辑,请使用它!所以你不会忘记任何东西,并使功能失效。

总是意味着这句话总是会被执行!如果没有延迟,系统暂停并且当你模拟时没有结果!很烦人。

例如,在FSM的下一个状态逻辑部分中:如果始终使用而不是总是@(*),则不起作用。

以下是我写的一个简单的序列检测器,其中这两个不同。如果需要,你可以编写一个tb来运行它。

`时间刻度为1ns/10马力

模块seq_detect3(//检测序列10110 中,//序列输入 CLK,时钟//正边沿触发 RST,//复位,高电平有效的同步 匹配//匹配,匹配的“1” );

input in, clk, rst; 
output match; 
wire in, clk, rst; 
reg match; 
reg [5:0] state, next_state; 
parameter IDLE = 6'b000001;  //no bit matched 
parameter STATE1 = 6'b000010; //first 1 bit matched 
parameter STATE2 = 6'b000100; //first 2 bits matched 
parameter STATE3 = 6'b001000; //first 3 bits matched 
parameter STATE4 = 6'b010000; //first 4 bits matched 
parameter STATE5 = 6'b100000; //all 5 bits matched 

//-----------S.M. & O.F.L.----------- 
always @ (posedge clk) begin 
    if(rst) begin 
     state <= IDLE; 
     match <= #1 0; 
    end 
    else begin 
     state <= next_state; 
     if(state == STATE5) begin 
     match <= #1 1; 
     end 
     else begin 
      match <= #1 0; 
     end 
    end 
end 

//-----------next state logic----------- 
always @(*) begin //Can not replaced by always here!! 
    case(state) 
     IDLE: if(in) next_state = STATE1; //0 keep, 1 next 
         else next_state = IDLE; 
     STATE1: if(in) next_state = STATE1; //0 next, 1 keep 
         else next_state = STATE2; 
     STATE2: if(in) next_state = STATE3; //0 idle, 1 next 
         else next_state = IDLE; 
     STATE3: if(in) next_state = STATE4; //0 s2, 1 next 
         else next_state = STATE2; 
     STATE4: if(in) next_state = STATE1; //0 next, 1 s1 
         else next_state = STATE5; 
     STATE5: if(in) next_state = STATE3; //0 idle, 1 s3 
         else next_state = IDLE; 
     default: next_state = IDLE; 
    endcase 
end 

endmodule