-2

Verilog でパターン fsm をコーディングして、8 つの LED で 4 つの異なるパターンを生成し、LED がティック パルスごとに変化する方法について、誰かが光を当てることができるかどうか疑問に思っていました。ステート レジスタと次のステート ロジックの組み合わせを使用する必要があることはわかっていますが、どのように記述すればよいかわかりません。

誰かが例を提供してくれることを願っています。

4

1 に答える 1

3

すべての詳細を知らずに例を提供することは困難です... しかし、最も単純なケースは、4 つの状態と非同期リセットを備えたステート マシンのようなものです。クロックの立ち上がりエッジごとに状態が変化します。すべての状態で、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 の知識があれば、コードは非常に簡単です。それが役に立てば幸い。

于 2012-09-12T17:25:21.413 に答える