54
1 電卓の設計

電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

Embed Size (px)

Citation preview

Page 1: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

1

電卓の設計

Page 2: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

2

FPGA ExpressとMAXPLUS2によるFPGA設計

FPGA EXPRESS

circuit.edf ネットリストcircuit.acf デバイス、ピン配置等

MAXPLUS2

circuit.acf 上書きするcircuit.sof, ttf, pof SRAMオブジェクトファイル

RTL記述から回路への論理合成

FPGA上の配置配線をおこなう

出力ファイル

出力ファイル

RTL記述

デバイスへ

の書込

Page 3: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

3

どうして電卓なの?

◆ その場で10キーを使って動かせる。◆ プロセッサだと、プログラムを考えたり、メモリとのインタフェースが必要

◆ ただし、入力が非同期に入るので、同期変換しないといけない。

◆ 簡単なようで奥が深い。

Page 4: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

4

BCDと2進数◆ 計算機は2進数だが、人間は10進数

– BCD: 10進数を2進数であらわす94 = 101_1100 2進数の場合

      1001(9)_0100(4) BCDの場合

! BCDで計算することも可能だが、面倒!入力でBCDを2進数に変換し、出力を再び2進数に変換する。2進数で計算できる。

Page 5: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

5

FPGA回路(ボード)の仕様

FPGAプッシュスイッチ(押すと0に, 離すと1)

7セグメントLED

クロックオシレータ

CLK

LEDランプ

7セグメントLEDは2個または3個LEDは, 7セグメントLEDが2個の時は2つ, 3個の場合は1つ必要

プッシュスイッチは15個必要。10キー配列になっていることが望ましい。

RSTリセットスイッチ

Page 6: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

6

BCD2桁入力2進記憶回路

10キーを2回押して、2桁の10進数を入力する回路を設計

Page 7: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

7

プッシュスイッチから与えられたBCDを2進数に変換して保存する

BCD2桁入力2進記憶回路

module名 binshiftreg

入力ピン decimal[9:0] 10キーからの入力 decimal[0]が 0キー,

decimal[9]が 9 キーに対応.

CE 入力をクリア

CLK, RST クロックとリセット

出力ピン out[6:0] 格納した数の 2進数出力. binledへ渡す.

Page 8: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

8

BCD2桁入力2進記憶回路

dectobinREGA

*10

+

syncro

CE

binshiftreg

syncro

binshifttop

7ビット

out[6:0]

入力格納

d[3:0]

in outpush[9:0]

CE

decimal[9:0]

binled

ledh[6:0] ledl[6:0]

count[1:0]always @(posedge CLK or negedge RST)

2進BCD変換+LED出力

同期化回路

プッシュスイッチからの入力

(離すと1、押すと0)

assign文

function文

CLK

RST

CLK

RST

10ビット構成

1ビット構成

pushout[9:0]

CEout

押されると1クロックの間1に

組み合わせ組み合わせ組み合わせ組み合わせ論理回路部論理回路部論理回路部論理回路部

alwaysブロックブロックブロックブロック

assign文文文文

3つの要素からなるつの要素からなるつの要素からなるつの要素からなる

Page 9: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

9

処理の流れ

1. 10キーの入力を2進数に変換(dectobin)" function文で実現

2. 2進数をレジスタに入力。" 前の入力に10をかけて現在の入力を入れる。   入力 2,1 → 表示 21" alwaysブロック

3. 10進数に変換して出力" assign文+外付け回路(binled)

Page 10: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

10

入出力ポートの定義

module binshiftreg(out,decimal,CLK,RST,CE);

// 出力ポート、入力ポートの順に書くほうがよい

output [6:0] out;

input [9:0] decimal

input CLK,RST,CE;

// ↑ input, outputの定義はビット幅毎に

endmodule

Page 11: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

11

functionとassignによる組み合わせ論理回路module binshiftreg(out,decimal,CLK,RST,CE);output [6:0] out;input [9:0] decimal;input CLK,RST,CE;wire [3:0] d; // ←ビット幅が1以上の信号はwireで定義しておく.assign d=dectobin(decimal); // ← function dectobinの出力をdに入力function [3:0] dectobin; // ← [3:0]は出力のビット幅を定義input [9:0] in; // ← function文の引数を定義

if(in[9]) //← functionの中には自由にif, caseが書けるdectobin = 9;

else if(in[8])dectobin = 8;

else if(in[7])dectobin = 7;

中略else if(in[0])

dectobin = 0; // 最後のelseがなくても組み合わせ回路になるendfunctionendmodule

dectobind[3:0]decimal[9:0]

function文

"9を押すとdecimal[9]が1に

"decimal[x]をxに変換する

Page 12: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

12

alwaysによるレジスタ記述assignによる出力ポート接続

reg [1:0] count; ←入力された10キーの数を格納するレジスタreg [6:0] REGA; ← BCDを2進化した数を格納するレジスタassign d=dectobin(decimal);

function [3:0] dectobin;中略

endfunctionalways @(posedge CLK or negedge RST)

if(!RST)begin

REGA<=0;count<=0; ←初期化end

else if((decimal != 0) && (count < 2))begin ↑ decimalが0でなく(入力がある), countが2未満なら

REGA<=(REGA*10)+d; ← REGAを10倍してdを足し, REGAに格納count<=count+1; ← countを1あげる.

endelse if(CE)begin

REGA<=0;count<=0; ←CEですべてのレジスタをクリアend

定義

初期化

動作

Page 13: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

13

非同期リセットと同期リセットの混在

◆ 非同期リセットと同期リセットの混在は合成不可– 現実のFFでは不可能だから

◆ 非同期リセットは電源投入時、誤動作時の初期化にのみ用いる。

◆ 状態の初期化は同期的に行う。

always @(posedge CLK or negedge RST)begin  if(!RST || CE) ←やってはいけない.

beginREGA<=0;count<=0;

end

Page 14: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

14

同期化回路

◆ 非同期入力をそのまま同期回路に入れると、誤動作を起こす。

◆ 入力は1クロックのみアクティブなほうが回路が書きやすい。

例: INが1になったらカウントアップ

always @(posedge CLK)

if(IN==0)

0であるであるであるである.

else if(IN==1)

if(その前がその前がその前がその前が0だったらだったらだったらだったら)

カウントアップカウントアップカウントアップカウントアップ

同期化回路なし同期化回路なし同期化回路なし同期化回路なし

always @(posedge CLK)

if(IN==1)

カウントアップカウントアップカウントアップカウントアップ

同期化回路あり同期化回路あり同期化回路あり同期化回路あり

Page 15: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

15

同期化回路

DFF DFF DFFin out

RST

CLK

in

CLK

q0 q1 q2

q0

q1

q2

out

ここで次段の入力となる。 時間

Page 16: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

16

binshiftop(最上位回路)の設計◆ 構成要素

– 同期化回路– binshiftreg– 出力変換回路(binled)

» 2進出力を10進に変換し、さらにLEDへの出力に変換

◆ 構成要素をインスタンスとして階層的に記述する。– インスタンス: 回路の中のサブ回路– 適切な階層分割が回路の可読性を高める。

Page 17: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

17

binshifttopの設計

syncro

CE

binshiftreg

syncro

binshifttop

out[6:0]

in outpush[9:0]

CE

decimal[9:0]

binled

ledh[6:0] ledl[6:0]

CLK

RSTCLK

RST

pushout[9:0]

CEout

I0I1

I2

I3

インスタンス名

module binshifttop (push,ledl,ledh,CLK,CE,RST);input [9:0] push;// 10キー.input CLK,RST,CE;output [6:0] ledl, ledh;wire [6:0] out;wire [9:0] pushout; //←内部バスの信号定義

syncro #(1) I3(.in(CE),.out(CEout),.CLK(CLK),.RST(RST));

// CEoutは, 1ビットのwireなので宣言しなくても良いsyncro #(10) I2(.in(push),.out(pushout),.binled I1(.in(out),.ledl(ledl),.ledh(ledh));binshiftreg I0(.decimal(pushout),.CLK(CLK),

.RST(RST),.CE(CEout),.out(out));// ↑binshiftregのdecimal入力に, syncroのout出力を// pushoutを介して接続している.

endmodule

Page 18: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

18

階層記述

binshiftreg I0(.decimal(pushout),.CLK(CLK),.RST(RST),.CE(CEout),.out(out));

! binshiftreg: 使用する回路のmodule名

! I0: インスタンス名上位回路中で一意

!.decimal: 下位回路のピンの名前

!(pushout): 上位回路のネットの名前

LowerModule InstName(.LowerModulePin(UpperModuleNet),..);

書式

Page 19: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

19

階層記述の概念図

decimal

上位module (binshifttop)

I0

binshiftreg

CLKRST

CEout

pushout

CLKRST

CEoutout

syncro #(10) I2(.in(push),.out(pushout),.CLK(CLK),.RST(RST); binshiftreg I0(.decimal(decimal),.CLK(CLK), .RST(RST),.CE(CEout),.out(out));

インスタンス名

syncro

下位module

I2

outCLKRST

Page 20: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

20

シミュレーションによる動作確認

◆ あらかじめ、テストフィクスチャを用意

◆ WEBよりダウンロード◆ verilogに必要なファイルをすべて引数で与える◆ Verilog.logおよびvcdファイルで確認

verilog binshiftsim.v binshifttop.v binshiftreg.v other.v

Page 21: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

21

演算回路の実現

加算機能を付加します。

Page 22: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

22

演算回路の実現◆ 10+25=が実現できるようにする◆ REGAのほかにもうひとつREGBを用意◆ 手順

REGA REGB

10キーからの入力 1,5

15+キーの入力

REGA REGB

000 15

REGA REGB

10キーからの入力 2,4

24 1515REGA REGB

=キーの入力

2424 3924+15

Page 23: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

23

dectobinpushout[9:0]

*10

+

syncro

CE

enzan

syncro

syncro

syncro

enzantop

selector

out[6:0]

d[3:0]

CEout

plusout

equalout

in outpush[9:0]

CE

plus

equal

plus

equal

decimal[9:0]

binled

10ビット構成

1ビット構成

ledh[6:0] ledl[6:0]

count[1:0]

equal_reg

always @(posedge CLK or negedge RST)

assign文

REGA REGB7ビット 7ビット

演算回路ブロック図

キーの追加

REGB,加算器の追加

制御レジスタの追加

Page 24: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

24

演算回路のVerilog-HDL記述◆ 先ほどのbinshiftregを改造する。

module enzan(decimal,plus,equal,CLK,RST,CE,out);

input [9:0] decimal;

input CLK,CE,RST,plus,equal; ←ピンの追加

中略

endmodule

Page 25: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

25

+キーに対する動作追加reg [6:0] REGA,REGB;←レジスタの定義

always @(posedge CLK or negedge RST)begin

if(!RST)beginREGA<=0;REGB<=0; ← REGBの初期化の追加count<=0;

endelse if((decimal!=0) && (count < 2))

beginREGA<=REGA*10+d;count<=count+1;

endelse if(plus) ← +キーが押されたら

begincount<=0;REGA<=0;REGB<=REGA;←REGAをREGBに移す

end

REGBはそのままなので何も書かない

+が押されるとREGAの内容をREGBに移す。

Page 26: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

26

=キーに対する動作の追加

always @(posedge CLK or negedge RST)beginif(!RST)中略else if(equal) //← =キーが押されたらbegincount<=0;REGB<=REGA+REGB;//←REGA+REGBをREGBに格納end

=が押されると、加算を行う。

Page 27: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

27

出力outの論理◆ =が入力されたら、REGBで、それまではREGAをoutに出力する。

◆ =が入力されたことを覚えておくレジスタが必要equal_reg

REGA REGB

10キーからの入力 1,5

15+キーの入力

REGA REGB

000 15

REGA REGB

10キーからの入力 2,4

24 1515REGA REGB

=キーの入力

2424 3924+15

青字: 表示する側

Page 28: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

28

出力outの論理reg equal_reg; 定義always @(posedge CLK or negedge RST)中略if(!RST)beginREGA<=0;REGB<=0;count<=0;equal_reg<=0;←初期化end

else if(equal)begincount<=0;REGB<=REGA+REGB;equal_reg<=1; ← =が押されたら1にする.

endassign out=(equal_reg==0)?REGA:REGB;↑ equal_reg==1ならREGBを出力(selector)

Page 29: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

29

enzantopの設計◆ binshifttop.vを改造する。◆ RSTを押さなくても、演算が再びはじめられるように改造しても面白い。

Page 30: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

30

演算回路のシミュレーション

◆ シミュレーションはインタラクティブに– テストフィクスチャでは動作がわかりにくい

◆ シミュレーション法

  キーを押してリターン

perl enzansim enzansim.v enzantop.v enzan.v other.v

c CEr RSTf, q シミュレーションの終了

0-9 0-9の数字+,= +,=キー

Page 31: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

31

電卓の設計

演算回路を電卓にします。

Page 32: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

32

減算および負の数の取り扱い

◆ 負の数は2の補数で取り扱う◆ 2の補数=ビット反転+1

– 正の数を表すのに必要なビット数+1で表す。– C言語では

» char 符号付8ビット –128~127まで» unsigned char 符号なし8ビット  0~255まで

◆ 最上位ビットは符号ビット

例題 8ビットで表現するときの-25

25=0001_1001 →ひっくり返して1110_0110

→ 1を足して 1110_0111

Page 33: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

33

負の数の取り扱いmodule inverse;reg [4:0] A,B,C;//←5ビットのレジスタ –16から15まで表現できるinitialbeginA=3;B=-2;$display("A=%d,%b, B=%d,%b",A,A,B,B);C=8-5; //←結果は3#100C=5-8; //←結果は-3#100C=-10-8; //←結果は-18(オーバーフロー)#100C=10+10; //←結果は20(オーバーフロー)

endinitial$monitor("%d: ",$time,"C=%d, -%d, %b",C,~C+4'b00001,C);↑~C+1では, 結果が32ビットになってしまうので注意する.

endmodule

Page 34: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

34

負の数の取り扱い

A= 3,00011,B=30,11110 // 2の補数で格納

0: C= 3,-29,00011 // 8-5

100: C=29,- 3,11101 // 5-8

200: C=14,-18,01110

//-10-8; 一見正しいように見えるが5ビット目が反対

300: C=20,-12,10100 //10+10;

Page 35: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

35

負の数

◆ 負の数を正しく表示するには最上位ビットの値で判断する。

◆ ただし、オーバーフローしたら駄目

◆ オーバーフローしないようにビット幅を決める。

$monitor("C=%s%d",(C[4])?“-":"",(C[4])?(~C+4'b00001):C);

正しく表示させる記述

正負

Page 36: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

36

dectobinpushout[9:0]

REGA REGB

*10

+

count[1:0]

syncro

CE

calc

syncro

syncro

syncro

calctop

7ビット 9ビット

syncro

selector2の補数

REGB[8]

add_or_sub

加算か減算か?

状態遷移機械

HALT

OPE

DECIMAL

overflow

out[6:0]

入力格納 結果格納

d[3:0]

CEout

plusout

minusout

equalout

in outpush[9:0]

CE

plus

minus

equal

plus

minus

equal

decimal[9:0]

binled

sign

10ビット構成

1ビット構成

LEDへ

符号表示

sign ledh[6:0] ledl[6:0]

overflow

電卓のブロック図

Page 37: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

37

電卓の動作

◆ 演算回路では、加算は=を押した時点しか行っていない。

◆ 電卓では次の値を入力するまで、前の値を表示する。

入力 表示12 12

+ 12 +を押してもそのまま20 20 次の数字を押せば変化+ 32 2回目の+でその前の加算を実行5 5

= 37

20 20 新しく演算を始める+ 20

5 5

= 25

Page 38: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

38

電卓の設計

◆ -99から99までの値を取り扱う。◆ 加算と減算が可能である。演算は+,ー,=キーを押した時点で行い,10キーから次に入力があるまで,現在の入力もしくは演算結果をLEDに表示する。

◆ 加減算の結果が-99より小さいか,99を超える場合,オーバーフローLEDを点灯させて,動作を停止する。

◆ 累算ができる。

Page 39: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

39

電卓の動作

◆ REGAとREGBをうまく制御する。

REGA REGB

1 0

+ 1 演算実行

演算

+

入力値 演算結果

1

15

+

+5

1

- 5 6 +

-9 69

-9 -3=

LEDに表示する側

REGB<=REGB+REGA;

演算実行 REGB<=REGB+REGA;

演算実行 REGB<=REGB-REGA;

キーの入力順

Page 40: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

40

◆ 10キーからの入力をREGA に格納する. REGA をLEDに出力

◆ +, -キーが来たら, 前回入力された+, -キーにしたがって, REGA , REGB の演算を実行して, REGB に格納する. REGB をLEDに出力する.

◆ 10キーからの入力があった時点で, LEDへの出力をREGA にする.

◆ +, -, =キーで, REGA とREGB の演算を実行して, REGB に格納する.

電卓の動作

Page 41: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

41

設計手順

◆ module 部の記述を行う。◆ 状態遷移機械を記述する。

– 状態遷移をリセットの次に記述

◆ 各状態での動作を記述する。

– 状態と入力によるレジスタの動作、その後の状態遷移

◆ 出力の部分の論理を記述する。

Page 42: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

42

module 部の設計◆ 必要なレジスタの決定

– REGA: 入力用 0~99まで 7ビット

– REGB: 計算結果格納演算結果は-99-99=-198, 99+99=198まで 9ビット

– add_or_sub: 演算が加算か減算か覚えておく 1ビット

REGA REGB

1 0

+ 1

演算

+

入力値 演算結果

1

15

+

+5

1

- 5 6 +

-9 69

-9 -3=

LEDに表示する側

キーの入力順

Page 43: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

43

状態を作る(状態遷移機械)

◆ 表示する値にあわせて、状態を作成する。

動作 LEDへの出力 状態10キー入力時 10キーからの入力値 (REGA) DECIMAL

+,−, =入力時 演算結果 (REGB) OPE

オーバーフロー時 オーバフロー (overflow)を示す LEDを点灯 HALT

停止HALT

数値入力DECIMAL

演算OPE

状態遷移図

Page 44: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

44

状態の記述

◆ `define文を使って、状態を名前で定義する。

!状態遷移による条件分岐をリセットの次に高い条件とする。

`define DECIMAL 0`define OPE 1`define HALT 2……..reg [1:0] state; ←2ビットで定義する。if(!RST)

begin …. endelse begincase(state)

`DECIMAL:……..

`OPE:

Page 45: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

45

各状態での動作の決定

停止HALT

数値入力DECIMAL

演算OPE

停止HALT

数値入力DECIMAL

演算OPE

オーバーフロー

演算実行

10キー

REGA<=dREGB<=REGAcount<=1

REGA<=alu_out+: add_or_sub<=0-: add_or_sub<=1

REGA<=REGA*10+dcount<=count+1

REGA<-0REGB<=0count<=0add_or_sub<=0

10キー

+,-,=

+,-,=

REGA<=0count<=0

CE

CE

演算結果

CE

REGA<-99 orREGA>99

状態遷移時の動作

等を記入していく

Page 46: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

46

リソースシェアリング(資源の共有)

◆ 同時に使用しない演算器を共有する。

◆ 記述の仕方によって、共有されたりされなかったりする。

例 REGB<=(add_or_sub==0)?REGB+REGA:REGB-REGA;

#add_or_subの値で、減算か加算か切り替える#加減算は同時に行わないので、加算器ひとつで実行できる

Page 47: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

47

リソースシェアリング

REGB<=(add_or_sub==0)?

REGB+REGA:REGB-REGA;

if(add_or_sub==0)

REGB<=REGB+REGA;

else if(add_or_sub==1)

REGB<=REGB-REGA;

REGA REGB REGA REGB

(a)(b)

selector add_or_sub

add_or_sub

減算の時は2の補数に

リソースシェアリングされない

Page 48: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

48

負の数による条件判断

◆ Verilogは型に対して、制限がゆるい。– 違う型への代入がそのままできる。              例: reg型<=integer型

– integer型は負の数をーで表現し、reg型は2の補数で表現する。

– integer型をreg型に代入すると2の補数に変換される。– reg型に対して、-による条件判断はできない。2の補数表現に直した正の数で判断する。

Page 49: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

49

負の数による条件判断(2)module test;

reg [7:0] a;integer b;initial

begina<=5;b=5;if(a>-11)

$display("a>-11");else

$display(“a<=-11”);←こちらが有効にif(b>-11)

$display("b>-11"); ←こちらが有効にelse

$display("b<=-11");end

endmodule

Page 50: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

50

負の数による条件判断(3)◆ REGB(9ビット)のオーバーフロー判定

– -99より小さいか、99より大きい

$-99より小さい × if(REGB < -99)

 -99=1_1001_1101=413, -100=412

条件は、REGB[8]=1でREGB<413

  ○ if(REGB[8]&&(REGB<413))

$99より大きい

  ○ if((REGB[8]==0)&&(REGB>99))

Page 51: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

51

最後に

◆ 動作をよく考えて、電卓を作ってみよう。

◆ 市販の電卓とまったく同じ動作のものを作るのは結構大変

◆ がんばって回路を小さくしてみる。

◆ 掛け算を加えるとか、自分なりに改造する。

◆ ただし、除算は組み合わせ回路で実現することが難しいために、合成できない。

Page 52: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

52

演習を会社や大学で行うには?

◆ 本演習は, WindowsのPCが1台あれば, 評価用のライセンスを入手して, 実際の設計までの流れを実習して頂くことが可能である.

1. 評価用のVerilogシミュレータとしては, SilosIIIが有名である. http://www.simucad.com/Demo/

2. FPGA EXPRESSの情報は, http://www.synopsys.com/まで. 3. MAX+PLUSIIの情報は, http://www.altera.com/まで. 4. Verilog-XL, FPGA EXPRESSは, 大学の場合, VDECから提供してもらえる.

5. MAX+PLUSIIは AlteraのUniversityプログラムにより, 無償提供して頂ける. 詳しくは, http://www.altera.com/japan/html/univ/まで.

Page 53: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

53

Parameterによる可変長回路

◆ 同じ記述で、ビット幅が異なる回路を実現可能

◆ 書式:parameter 名前=初期値;

module syncro(out,in,CLK,RST);parameter WIDTH = 1;//パラメータと初期を定義input [WIDTH-1:0] in;// 入力ピンをパラメータ化output [WIDTH-1:0] out;input CLK,RST;reg [ WIDTH-1:0] q0,q1,q2;

…..endmodule

Page 54: 電卓の設計 - KobayashiLab - Kobayashi Laboratory …kobayasi/refresh/0012/calc.pdf2 FPGA ExpressとMAXPLUS2に よるFPGA設計 FPGA EXPRESS circuit.edf ネットリスト circuit.acf

54

上位回路でのパラメータの指定◆ Verilogでは, 上位moduleから下位moduleのparameterを与える方法が2種類存在する.– defparam文を使用する– #(param1, param2, ...)で指定する。パラメータは, module内で

parameter文で宣言した順番となる

module binshifttop (push,ledl,ledh,CLK,CE,RST);defparam binshifttop.I2.WIDTH=10;defparam binshifttop.I3.WIDTH=1;

syncro I3(.in(CE), .out(CEout),.CLK(CLK),.RST(RST));

syncro I2(.in(push),.out(pushout),.endmodule

defparam

module binshifttop (push,ledl,ledh,CLK,CE,RST);

syncro #(1) I3(.in(CE), .out(CEout),.CLK(CLK),.RST(RST));

syncro #(10) I2(.in(push),.out(pushout),.endmodule

#(param1, param2)