2017-02-21 40 views
0

我對verilog有點新。所以這個問題可能很簡單。 我試圖模擬一個使用verilog的有限狀態機。 簡要說明: 有三種狀態:0,1 & 2.默認情況下,狀態爲0。 狀態變爲1僅當輸入爲01 的狀態更改爲2僅當輸入是10 狀態只有當輸入爲00時才變回0。 代碼已成功模擬,但Im沒有輸出。請幫我解決這個問題。沒有得到模擬輸出的錯誤免費verilog代碼

代碼:(State.v)

module State(
    input clk, 
    input reset, 
    input [3:0] in, 
    output [3:0] out, 
    output [3:0] state 
    ); 

    wire clk,reset; 
    wire [3:0] in; 
    reg [3:0] out; 
    reg [3:0] state; 

    always @(posedge clk or posedge reset) 
     begin 
     if (reset == 1) 
     begin 
      state = 0; 
     end 
     else 
     begin 
      case (state) 
       0: if(in == 2'b01) 
         state = 1; 
         else 
         state = 0; 
       1: if(in == 2'b10) 
         state = 2; 
         else 
         state = 1; 
       2: if(in == 2'b00) 
         state = 0; 
         else 
         state = 2; 
       default: state = 0;  
      endcase 
     end 
    end  

    always @(*) 
     begin 
      case (state) 
       0: out = 2'b00; 
       1: out = 2'b01; 
       2: out = 2'b10; 
       default: out = 2'b00; 
      endcase  
     end  

endmodule 

測試平臺:(StateTestBench.v)

module StateTestBench; 

    // Inputs 
    reg clk; 
    reg reset; 
    reg [3:0] in; 

    // Outputs 
    reg [3:0] out; 
    reg [3:0] state; 

    always 
     begin 
      #1 clk = !clk; 
     end 

    // Instantiate the Unit Under Test (UUT) 
    State uut (
     .clk(clk), 
     .reset(reset), 
     .in(in), 
     .out(out), 
     .state(state) 
    ); 

    initial begin 
     // Initialize Inputs 
     clk = 0; 
     reset = 0; 

     #1 reset = 1; 
     #10 reset = 0; 
     #5 in = 2'b00; 
     #10 in = 2'b01; 
     #10 in = 2'b10; 



    end 

endmodule 
+0

應該有一個編譯器警告,因爲您正在混合ANSI和非ANSI標題樣式。使用ANSI風格,您不應該重新聲明與端口名稱相同的網絡和變量。將'output [3:0]'更改爲'output reg [3:0]'並移除'State'中的'wire'和'reg'聲明以符合ANSI標題樣式。 'state'也應該被分配非阻塞賦值('<='),而不是阻塞賦值('=')。 – Greg

回答

0

我猜你模擬state.v代替StateTestBench.v。因爲你的測試平臺有一個bug!輸出和狀態必須是導線。

+0

非常感謝!這解決了我的問題。 –

相關問題