27
1 1 Verilog-HDL講習会 追加資料(7) 順序回路記述(2) ~状態遷移図に基づく設計~ 20, July, 2012

Verilog-HDL講習会 追加資料(7) 順序回路記述(2) ~状態遷移図に ... · 2012-07-24 · 1 Verilog-HDL講習会 追加資料(7) 順序回路記述(2) ~状態遷移図に基づく設計~

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

11

Verilog-HDL講習会追加資料(7)

順序回路記述(2)~状態遷移図に基づく設計~

20, July, 2012

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

33

今回作成するプロジェクト

プロジェクト名: first_state_machine

各自のボードに合わせて適切なFPGAを選択

シミュレータはISimを指定

44

Verilog-HDLの追加

右クリック

Verilog Moduleを選択

topmodule_first_state_machine

残りはデフォルトのまま

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

1212

記述するVerilog-HDLコード

1313

テストベンチの追加

右クリック-> New Source

論理合成(XST)を行う

シミュレーションモードに切替え

Verilog Test Fixtureを選択

testbench_first_state_machine

残りはデフォルトのまま

1414

テストベンチの記述

リセット信号の記述

イネーブル信号(カウントを行う信号)をオン

クロック信号を記述#1 で 1nsec なので,50MHz のクロック

1515

動作の確認テストベンチをクリックしてから

ISimを起動

3進カウンタを確認する

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」

1818

今回作成するプロジェクト

プロジェクト名: encryption_machine

各自のボードに合わせて適切なFPGAを選択

シミュレータはISimを指定

1919

Verilog-HDLファイルの追加

右クリック

Verilog Moduleを選択topmodule_encryption_machine

残りはデフォルトのまま

2020

入力するVerilog-HDL

2121

ucfファイルの追加

右クリック

ImplementationConstraints Fileを選択

encription_machine(プロジェクト名と同じ)

残りはデフォルトのまま

2222

ucfファイルのオープン

UCF(*.ucf)を選択

encription_machine.ucfを選択

2323

ucfファイルの記述(Spartan 3Eボード)

C9

V16

N17 H18 L14 L13

F11 E11 E12 F12

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言語で記述したビヘイビアから記述(プロはこの方法を使います)

2727

課題• 例題1の2進カウンタにスイッチを1つ追加し

– ONのときはアップ・カウンタ(00→01→10→00)– OFFのときはダウン・カウンタ(10→01→00→10)となる回路を設計し, シミュレーションで動作を確認せよ(余裕のある人はFPGA上で動作させる. ただし, そのままではクロックが早すぎてカウントが見えないから一工夫必要)

• 例題2の暗号鍵マシーンに各鍵を入力する前に全てのスイッチをOFFにしなければ動作しないように修正し, FPGA上で正しく動作することを確認せよ