インテル® Quartus® Primeプロ・エディションのユーザーガイド: デザイン上の推奨事項

ID 683082
日付 4/13/2020
Public

このドキュメントの新しいバージョンが利用できます。お客様は次のことを行ってください。 こちらをクリック 最新バージョンに移行する。

ドキュメント目次

1.6.4.2.1. Verilog-2001ステート・マシン・コーディングの例

次のモジュールverilog_fsmは、一般的なVerilog HDLステートマシン実装の例です。 この状態マシンには5つの状態があります。

in_1in_2の合計は、 state_1state_2のステートマシンの出力です。差異( in_1 - in_2 )はstate_1state_2でも使用されます。一時変数tmp_out_0tmp_out_1は、 in_1in_2の合計と差を保存します。ステートマシンのさまざまな状態でこれらの一時変数を使 用すると、相互に排他的な状態間で適切なリソース共有が保証されます。

Verilog-2001 State Machine

module verilog_fsm (clk, reset, in_1, in_2, out);
	input clk, reset;
	input [3:0] in_1, in_2;
	output [4:0] out;
	parameter state_0 = 3'b000;
	parameter state_1 = 3'b001;
	parameter state_2 = 3'b010;
	parameter state_3 = 3'b011;
	parameter state_4 = 3'b100;

	reg [4:0] tmp_out_0, tmp_out_1, tmp_out_2;
	reg [2:0] state, next_state;

	always @ (posedge clk or posedge reset)
	begin
		if (reset)
			state <= state_0;
		else
			state <= next_state;
	end
	always @ (*)
	begin
		tmp_out_0 = in_1 + in_2;
		tmp_out_1 = in_1 - in_2;
		case (state)
			state_0: begin
			   tmp_out_2 = in_1 + 5'b00001;
			   next_state = state_1;
			end
			state_1: begin
				if (in_1 < in_2) begin
					next_state = state_2;
					tmp_out_2 = tmp_out_0;
				end
				else begin
					next_state = state_3;
					tmp_out_2 = tmp_out_1;
				end
			end	
			state_2: begin
				tmp_out_2 = tmp_out_0 - 5'b00001;
				next_state = state_3;
			end
			state_3: begin
				tmp_out_2 = tmp_out_1 + 5'b00001;
				next_state = state_0;
			end
			state_4:begin
				tmp_out_2 = in_2 + 5'b00001;
				next_state = state_0;
			end
			default:begin
				tmp_out_2 = 5'b00000;
				next_state = state_0;
			end
		endcase
	end
	assign out = tmp_out_2;
endmodule
次のように、 parameterデータ型の代わりに'defineを使用することにより、このステートマシンの同等の実装を実現できます。
「define state_0 3'b000」define state_1 3'b001 'define state_2 3'b010' define state_3 3'b011 'define state_4 3'b100
この場合、 state_xの代わりに` state_xstateおよびnext_stateに割り当てます。
 例: 
    
next_state <= 'state_3;
注: Intel 'defineコンストラクトをサポートしても、parameterデータ型を使用します。これは、合成中に状態名を保持するためです。