2012-09-12 61 views
-2

我想知道是否有人可以對如何在Verilog中編寫fsm模式進行編碼,從而生成8個LED上的4種不同模式,並且LED改變每個節拍脈衝。 我知道我應該使用狀態寄存器和組合下一個狀態邏輯,但是我不知道如何去編寫它。有限狀態機verilog

我希望有人能提供一個例子。

+0

4種模式,以及LED如何改變?你是說有4個靜態模式,你只是每個時鐘脈衝順序顯示它們,還是4個動態移動模式,其中的FSM變化是由一個按鈕或某物觸發的? –

+0

是的,有4個按鈕可以觸發4種不同的模式,每種模式都會觸發8個LED以圖案移動,即從左到右,從右到左。 – intensified

回答

3

在不知道每個細節的情況下很難提供示例......但最簡單的情況可能看起來像是具有四種狀態和異步復位的狀態機。時間的每個上升沿都會改變狀態。對於每一個國家,數據的7位是「驅動」的LED(你可以把它擴展到8個LED沒有問題,只是更打字):

module fsm_example(clk, reset_n, data); 

    input wire clk;  // Clock input 
    input wire reset_n; // Asynchronous reset (active low) 
    output reg [6:0] data; // Data driven to seven-segment display... 

    // Constant state enumeration 
    localparam STATE_0 = 2'd0; 
    localparam STATE_1 = 2'd1; 
    localparam STATE_2 = 2'd2; 
    localparam STATE_3 = 2'd3; 

    // Current FSM state (up to 2 bits, enough to hold values from 0 to 3) 
    reg [1:0] state; 

    // Clock-driven state machine. Changes state on every 
    // raising edge of the clock. 
    always @ (posedge clk or negedge reset_n) begin 
     if (!reset_n) begin 
     state <= STATE_0; 
     end else begin 
     case (state) 
      STATE_0: state <= STATE_1; 
      STATE_1: state <= STATE_2; 
      STATE_2: state <= STATE_3; 
      STATE_3: state <= STATE_0; 
     endcase 
     end 
    end 

    // State to output data mapping. 
    always @ (state) begin 
     case (state) 
     STATE_0: data = 7'b0111111; // 0x0 
     STATE_1: data = 7'b0000110; // 0x1 
     STATE_2: data = 7'b1011011; // 0x2 
     STATE_3: data = 7'b1001111; // 0x3 
     endcase 
    end 

endmodule 

的代碼是相當直線前進,如果你知道一點的Verilog。希望能幫助到你。