attribute black_box : string;
attribute black_box of beh : architecture is "yes";
FSM コ ンポーネ ン ト
コ ー ド 例は、 次のサ イ ト か ら ダ ウ ン ロ ー ド で き ます。
http://japan.xilinx.com/txpatches/pub/documentation/misc/vivado_synthesis_ug_examples.zip
Vivado 合成の機能
• 同期有限ス テー ト マシ ン (FSM) コ ンポーネ ン ト に特定の推論機能
• 最適化の目標に対応 し た ビル ト イ ン FSM エン コー ド ス ト ラ テジ
• FSM 抽出はデフ ォ ル ト で イ ネーブル
• FSM 抽出をデ ィ ス エーブルにす る には -fsm_extraction off を使用
FSM 記述
Vivado 合成では、 ムーア型 と ミ ー リ ー型の両方の有限ス テー ト マシ ン (FSM) がサポー ト さ れます。
FSM には、 次が含まれます。
• ス テー ト レ ジ ス タ
• 次ス テー ト 関数
• 出力関数
FSM の図
次に、 ミ ー リ ー型マシ ン と ムーア型マシ ン を組み込んだ FSM の図を示 し ます。
X-Ref Target - Figure C-2
図 C-2 : ミ ー リ ー型マシ ン と ムーア型マシ ン を組み込んだ FSM
次に、3 つのプ ロ セ ス を使用 し た FSM の図を示 し ます。
ス テー ト レ ジ ス タ
• リ セ ッ ト ま たは電源投入ス テー ト を指定 し て、 有限ス テー ト マシ ン (FSM) を認識 さ せます。
• ス テー ト レ ジ ス タ は、 特定の ス テー ト に対 し て非同期ま たは同期に リ セ ッ ト で き ます。
• FSM には、 非同期 リ セ ッ ト ロ ジ ッ ク よ り も 同期 リ セ ッ ト ロ ジ ッ ク をお勧め し ます。
自動ス テー ト エ ン コ ー ド
Vivado 合成では、 各 FSM に最適なエン コ ー ド 方法が自動的に選択 さ れます。
ワ ン ホ ッ ト ス テー ト エ ン コ ー ド
ワ ン ホ ッ ト ス テー ト エン コ ー ド には、 次の よ う な特徴があ り ます。
• 32 ス テー ト ま での ス テー ト マシ ンのデフ ォ ル ト エン コ ー ド 方法です。
• 速度を最適化 し た り 、 消費電力を削減する 場合に適 し てい ます。
• 各 FSM ス テー ト に コ ー ド の各ビ ッ ト が割 り 当て ら れます。
• 各ス テー ト に 1 つの フ リ ッ プ フ ロ ッ プを使用 し た ス テー ト レ ジ ス タ を イ ンプ リ メ ン ト し ます。
• 1 つの ク ロ ッ ク サ イ ク ルで 1 つの ス テー ト レ ジ ス タ のみがアサー ト さ れます。
• 2 つの ス テー ト 間を遷移する 際、2 つのビ ッ ト のみが ト グル し ます。
グ レ ー ス テー ト エ ン コ ー ド
グ レース テー ト エン コ ー ド には、 次の よ う な特徴があ り ます。
• 連続 し た 2 つの ス テー ト 間では、1 ビ ッ ト し か切 り 替わ り ません。
• 分岐のない長いパ ス を持つコ ン ト ロ ー ラ に適 し てい ます。
• ハザー ド やグ リ ッ チを最小限に抑え ます。
• 消費電力を最小限に抑え る ために使用で き ます。
ジ ョ ン ソ ン ス テー ト エ ン コ ー ド
ジ ョ ン ソ ンス テー ト エン コー ド は、 グ レース テー ト エン コ ー ド と 同様、分岐のない長いパ ス を含むス テー ト マシ ン に適 し てい ます。
X-Ref Target - Figure C-3
図 C-3 : 3 つのプ ロ セス を使用 し た FSM
RAM の HDL コ ーデ ィ ング手法
シーケ ン シ ャ ル ス テー ト エ ン コ ー ド
シーケ ン シ ャ ル ス テー ト エン コ ー ド には、 次の よ う な特徴があ り ます。
• 長いパ ス を識別 し ます。
• こ れ ら のパ ス の ス テー ト に連続する 基数コ ー ド を 2 つ適用 し ます。
• 次ス テー ト の論理式を最小限に抑え ます。
FSM の Verilog 例
// State Machine with single sequential block module fsm_test(clk,reset,flag,sm_out);
input clk,reset,flag;
output reg sm_out;
parameter s1 = 2'b00;
parameter s2 = 2'b01;
parameter s3 = 2'b10;
parameter s4 = 2'b11;
reg [1:0] state;
always@(posedge clk) begin
if(reset) begin
state <= s1;
sm_out <= 1'b1;
end else begin
case(state) s1: if(flag)
begin
state <= s2;
sm_out <= 1'b1;
end
else begin
state <= s3;
sm_out <= 1'b0;
end
s2: begin state <= s4; sm_out <= 1'b0; end s3: begin state <= s4; sm_out <= 1'b0; end s4: begin state <= s1; sm_out <= 1'b1; end endcase
end end endmodule