verilog-hdl講習会 追加資料(7) 順序回路記述(2) ~状態遷移図に ... ·...
TRANSCRIPT
22
状態遷移図• 順序回路の「ふるまい」を記述する図
– 円:状態を表す– 枝:遷移先を表す– 枝の値:状態遷移の条件(入力値)と出力値を表す
条件(入力値)出力値
条件と出力値は線で区切る初期状態
(リセット後の初期値)を記入する
例題: 3進カウンタ(En==1でカウント)
Q0 Q1 Q2
En==1Out=2'b01
En==1Out=2'b10
En==1Out=2'b00
En==0Out=2'b00
En==0Out=2'b01
En==0Out=2'b10
ResetOut=2'b00
55
状態遷移図からVerilog-HDL (1)• 状態に2進符号(状態変数)を割当て
00 01 10
En==1Out=2'b01
En==1Out=2'b10
En==1Out=2'b00
En==0Out=2'b00
En==0Out=2'b01
En==0Out=2'b10
ResetOut=2'b00
66
状態遷移図からVerilog-HDL (2)• モジュール宣言を記述
– クロックとリセットも忘れずに!
00 01 10
En==1Out=2'b01
En==1Out=2'b10
En==1Out=2'b00
En==0Out=2'b00
En==0Out=2'b01
En==0Out=2'b10
module threebit_counter(clk, reset, En, out );
endmodule
ResetOut=2'b00
77
状態遷移図からVerilog-HDL (3)• 入出力宣言• 出力値と状態変数をレジスタ宣言
00 01 10
En==1Out=2'b01
En==1Out=2'b10
En==1Out=2'b00
En==0Out=2'b00
En==0Out=2'b01
En==0Out=2'b10
module threebit_counter(clk, reset, En, out );input clk, reset, En;output [1:0]out;reg [1:0]out;reg [1:0]state;
endmodule
「out」は出力でもありレジスタでもある
ResetOut=2'b00
88
状態遷移図からVerilog-HDL (4)• リセット後のレジスタの初期値を記述
00 01 10
En==1Out=2'b01
En==1Out=2'b10
En==1Out=2'b00
En==0Out=2'b00
En==0Out=2'b01
En==0Out=2'b10
ResetOut=2'b00
module threebit_counter(clk, reset, En, out );input clk, reset, En;output [1:0]out;reg [1:0]out;reg [1:0]state;
always@( posedge clk or posedge reset) beginif( reset == 1'b1)beginout <= 2'b00;state <= 2'b00;end else begin
endend
endmodule
99
状態遷移図からVerilog-HDL (5)• case文を使って状態を記述defaultを忘れずに!
00 01 10
En==1Out=2'b01
En==1Out=2'b10
En==1Out=2'b00
En==0Out=2'b00
En==0Out=2'b01
En==0Out=2'b10
module threebit_counter(clk, reset, En, out );input clk, reset, En;output [1:0]out;reg [1:0]out;reg [1:0]state;
always@( posedge clk or posedge reset) beginif( reset == 1'b1)beginout <= 2'b00;state <= 2'b00;end else begincase( state)2'b00: begin
end2'b01: begin
end2'b10: begin
enddefault: begin
endendcaseend
endendmodule
ResetOut=2'b00
1010
状態遷移図からVerilog-HDL (6)• if文を使って状態遷移を記述
00 01 10
En==1Out=2'b01
En==1Out=2'b10
En==1Out=2'b00
En==0Out=2'b00
En==0Out=2'b01
En==0Out=2'b10
module threebit_counter(clk, reset, En, out );input clk, reset, En;output [1:0]out;reg [1:0]out;reg [1:0]state;
always@( posedge clk or posedge reset) beginif( reset == 1'b1)beginout <= 2'b00;state <= 2'b00;end else begincase( state)2'b00: beginif( En == 1'b1)beginstate <= 2'b01;
end else beginstate <= state;
endend
2'b01: beginif( En == 1'b1)beginstate <= 2'b10;
end else beginstate <= state;
endend2'b10: beginif( En == 1'b1)beginstate <= 2'b00;
end else beginstate <= state;
endenddefault: beginstate <= 2'b00;
endendcaseendendendmodule
ResetOut=2'b00
1111
状態遷移図からVerilog-HDL (7)• 状態遷移時の出力を記述
00 01 10
En==1Out=2'b01
En==1Out=2'b10
En==1Out=2'b00
En==0Out=2'b00
En==0Out=2'b01
En==0Out=2'b10
module threebit_counter(clk, reset, En, out );input clk, reset, En;output [1:0]out;reg [1:0]out;reg [1:0]state;
always@( posedge clk or posedge reset) beginif( reset == 1'b1)beginout <= 2'b00;state <= 2'b00;end else begincase( state)2'b00: beginif( En == 1'b1)beginstate <= 2'b01;out <= 2'b01;end else beginstate <= state;out <= 2'b00;end
end
2'b01: beginif( En == 1'b1)beginstate <= 2'b10;out <= 2'b10;end else beginstate <= state;out <= 2'b01;end
end 2'b10: beginif( En == 1'b1)beginstate <= 2'b00;out <= 2'b00;end else beginstate <= state;out <= 2'b10;end
enddefault: beginstate <= 2'b00;out <= 2'b00;endendcaseendendendmodule
ResetOut=2'b00
1313
テストベンチの追加
右クリック-> New Source
論理合成(XST)を行う
シミュレーションモードに切替え
Verilog Test Fixtureを選択
testbench_first_state_machine
残りはデフォルトのまま
1616
例題: 暗号鍵マシーン• 正しい鍵(4ビットのスイッチ)を4回入力で鍵が開く(LEDが点灯する)– 初期状態(リセット後):LED消灯
– 1回目の鍵入力:LEDが1つ点灯
– 2回目の鍵入力:LEDが2つ点灯
– 3回目の鍵入力:LEDが3つ点灯
– 4回目の鍵入力:LEDが全て点灯
状態遷移図を書いてみよう!
0 1 1 1
1 1 0 0
0 0 1 0
1 1 1 0
1717
暗号鍵マシーンの状態遷移図(状態番号も割当て済み)
000 001 010
SW==4'b0111LED=4'b0001
ResetLED=4'b0
011
SW==4'b1100LED=4'b0011
SW==4'b0010LED=4'b0111
SW!=4'b0111LED=4'b0000
SW!=4'b1100LED=4'b0001
SW!=4'b0010LED=4'b0011
SW!=4'b1110LED=4'b0111
100
SW==4'b1110LED=4'b1111
NONELED=4'b1111
不一致(成立しないとき)は「!=」を使う 無条件で遷移するときは
「NONE」
2424
ucfファイルの記述(Spartan 3Aボード)
E12R13
T9 U8 U10 V8
U19 U20 T19 R20E12;R13;
V8; U10;U8; T9; R20;T19; U20; U19;
2525
論理合成と配置配線を行いFPGA上で動作させる
Generate Programming File
Manage ConfigurationProject (iMPACT) を起動
動作しましたか?
2626
まとめ• 今回の学習内容
– 状態遷移図の書き方– 状態遷移図からVerilog-HDLを記述する方法
• 上記以外にVerilog-HDLを記述する方法– 回路図から記述(パイプラインを組むときに使う)
– C言語で記述したビヘイビアから記述(プロはこの方法を使います)