66
1 電卓の設計 東京大学VDEC 小林和淑

小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

1

電卓の設計

東京大学VDEC

小林和淑

Page 2: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

2

Synplify ProとMAXPLUS2によるFPGA設計

SynplifyPro

circuit.edf EDIFネットリスト

MAXPLUS2

circuit.sof, ttf, pof SRAMオブジェクトファイル

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

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

出力ファイル

出力ファイル

RTL記述

デバイスへ

の書込

circuit.acf FPGAの種類の定義

Page 3: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

3

どうして電卓なの?

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

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

簡単なようで奥が深い。

Page 4: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

4

BCDと2進数計算機は2進数だが、人間は10進数– BCD: 10進数を2進数であらわす

94 = 101_1100 2進数の場合      1001(9)_0100(4) BCDの場合

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

Page 5: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

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: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

6

BCD2桁入力2進記憶回路

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

Page 7: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

7

BCD2桁入力2進記憶回路プッシュスイッチから与えられたBCDを2進数に変換して保存する

module名 binshiftreg

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

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

CE 入力をクリア

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

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

Page 8: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

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: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

9

処理の流れ

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

2. 2進数をレジスタに入力。前の入力に10をかけて現在の入力を入れる。

   入力 2,1 → 表示 21alwaysブロック

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

Page 10: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

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: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

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: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

12

alwaysによるレジスタ記述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)beginREGA<=0;count<=0; ←初期化

endelse 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)beginREGA<=0;count<=0; ←CEですべてのレジスタをクリア

end

定義

初期化

動作

Page 13: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

13

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

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

beginREGA<=0;count<=0;

end

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

非同期リセットは電源投入時、誤動作時の初期化にのみ用いる。(PCのリセットボタン)状態の初期化は同期的に行う。(Ctrl-Alt-Del)

Page 14: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

14

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)中略

assign out=REGA;

Page 15: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

15

同期化回路

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

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

例: INが1になったらカウントアップalways @(posedge CLK)

if(IN==0)

0である.

else if(IN==1)

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

カウントアップ

always @(posedge CLK)

if(IN==1)

カウントアップ

同期化回路あり同期化回路なし

Page 16: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

16

同期化回路

DFF DFF DFFin out

RST

CLK

in

CLK

q0 q1 q2

q0

q1

q2

out

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

Page 17: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

17

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

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

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

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

Page 18: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

18

binshifttopの設計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

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

インスタンス名

Page 19: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

19

階層記述

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

binshiftreg: 使用する回路のmodule名

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

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

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

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

Page 20: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

20

階層記述の概念図

decimal

上位module (binshifttop)

I0

binshiftreg

CLKRST

CEout

pushout

CLKRST

CEoutout

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

インスタンス名

syncro

下位module

I2

outCLKRST

Page 21: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

21

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

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

書式:parameter 名前=初期値;

Page 22: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

22

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

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

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

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 #(param1, param2)

Page 23: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

23

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

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

WEBよりダウンロードverilogに必要なファイルをすべて引数で与える

GUI上のLED出力により確認

gtksim.sh binshiftsimgtk.v binshifttop.v binshiftreg.v other.v

Page 24: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

24

GUIの操作法各ボタンはボード上のボタンに対応– ただし、Qをのぞくシミュレーションの終了はQRSTはボードのRSTボタンに対応

左上のLEDは、電卓のオーバーフロー表示用

Page 25: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

25

演算回路の実現

加算機能を付加します。

Page 26: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

26

演算回路の実現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 27: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

27

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 28: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

28

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

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

input [9:0] decimal;

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

中略

endmodule

Page 29: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

29

+キーに対する動作追加reg [6:0] REGA,REGB;←レジスタの定義always @(posedge CLK or negedge RST)

beginif(!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

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

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

Page 30: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

30

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

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

always @(posedge CLK or negedge RST)begin

if(!RST)中略else if(equal) //← =キーが押されたら

begincount<=0;REGB<=REGA+REGB;//←REGA+REGBをREGBに格納

end

Page 31: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

31

出力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 32: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

32

出力outの論理reg equal_reg; 定義

always @(posedge CLK or negedge RST)中略

if(!RST)begin

REGA<=0;REGB<=0;count<=0;equal_reg<=0;←初期化

endelse if(equal)

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

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

Page 33: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

33

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

Page 34: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

34

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

シミュレーション法

gtksim.sh enzansimgtk.v enzantop.v enzan.v other.v

Page 35: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

35

電卓の設計

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

Page 36: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

36

電卓の動作

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

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

入力 表示12 12

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

= 37

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

5 5

= 25

Page 37: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

37

電卓の設計

-99から99までの値を取り扱う。加算と減算が可能である。演算は+,ー,=キーを押した時点で行い,10キーから次に入力があるまで,現在の入力もしくは演算結果をLEDに表示する。加減算の結果が-99より小さいか,99を超える場合,オーバーフローLEDを点灯させて,動作を停止する。

累算ができる。

Page 38: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

38

電卓の動作

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 39: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

39

電卓の動作

10キーからの入力をREGA に格納する. REGA をLEDに出力+, -キーが来たら, 前回入力された+, -キーにしたがって, REGA , REGB の演算を実行して, REGB に格納する. REGB をLEDに出力する.10キーからの入力があった時点で, LEDへの出力をREGA にする.+, -, =キーで, REGA とREGB の演算を実行して, REGB に格納する.

Page 40: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

40

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 41: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

41

設計手順

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

– 状態遷移をリセットの次に記述各状態での動作を記述する。

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

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

Page 42: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

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: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

43

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

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

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

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

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

停止HALT

数値入力DECIMAL

演算OPE

状態遷移図

Page 44: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

44

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

begin …. endelse begin

case(state)`DECIMAL:

……..`OPE:

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

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

Page 45: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

45

各状態での動作の決定

停止HALT

数値入力DECIMAL

演算OPE

停止HALT

数値入力DECIMAL

演算OPE

オーバーフロー

演算実行

10キー

REGA<=d;count<=1;

REGB<=REGB*REGA;+: 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

REGB<-99 orREGB>99

状態遷移時の動作

等を記入していく

Page 46: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

46

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

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

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

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

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

Page 47: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

47

リソースシェアリング(2)加減算器の3つの書き方

if(add_or_sub==0)

REGB<=REGB+REGA;

else if(add_or_sub==1)

REGB<=REGB-REGA;

REGB<=(add_or_sub==0)?

REGB+REGA:REGB-REGA;

(i)(ii)

REGB<=

REGB+((add_or_sub?)?REGA:(~REGA+1)(iii)

Page 48: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

48

リソースシェアリング(3)記述・ツールによって生成される回路はまちまち

Synopsys社のDesign Compilerだと(I), (ii), (iii)ともに(b)となる。Synplify_proだと、(i), (ii)のみ、(b)になる。REGA REGB REGA REGB

(a)(b)

selector add_or_sub

add_or_sub

減算の時は2の補数に

Page 49: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

49

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

負の数は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 50: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

50

Verilogにおける負の数の取り扱いVerilogでは、reg型で明示的に負の数が扱えなかった– したがって、教科書の記述のように、面倒なことをしないといけない

それを解消するために、Verilog 2001が制定– signedによる負の数の取り扱い– 多次元配列– その他– 詳しくは、“VERILOG 2001” by Stuart Sutherland, Kluwer

Academic Publishers

Page 51: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

51

signedによる負の数の取り扱いreg型、wire型は、そのままでは負の数の評価ができない。

signedをつけると負の数で評価可能

reg signed [4:0] A;

reg [4:0] B;

if(A<-10) ○評価可能

If(B<-10) ×評価不可能

Page 52: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

52

signed拡張ありの負の数の取り扱いmodule inverse;

reg signed [4:0] A,B,C;initial

beginA=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, %b",C,C);endmodule

Page 53: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

53

signedのシミュレーション結果A= 3,00011,B=-2,11110 // 2の補数で格納

0: C= 3, 00011 // 8-5100: C=-3, 11101 // 5-8200: C=14, 01110 // -10-8 オーバーフロー300: C=-12, 10100 //10+10 オーバーフロー// オーバーフローしなければ正しく表示される

Page 54: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

54

signed拡張なしの負の数の取り扱いmodule inverse;

reg [4:0] A,B,C;//←5ビットのレジスタ –16から15まで表現できるinitial

beginA=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 55: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

55

シミュレーション結果

A= 3,00011,B=30,11110 // 2の補数で格納0: C= 3,-29,00011 // 8-5

100: C=29, - 3,11101 // 5-8200: C=14,-18,01110 //-10-8; 300: C=20,-12,10100 //10+10;

正しく表示させる記述

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

Page 56: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

56

負の数

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

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

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

Page 57: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

57

signedを使う上での注意点現在は,ツールが移行期にあたる– Verilogは、LDV32(version 2.7.5)以降で利用可能– Synopsysの合成系で利用できるのは、2000.11バージョン以降

SynplifyProも最新の7.1よりVerilog2001をサポート!

Page 58: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

58

負の数による条件判断(signed)Verilogは型に対して、制限がゆるい。– 違う型への代入がそのままできる。              例: reg型<=integer型

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

– integer型をreg型に代入すると2の補数に変換される。– reg signed型により、regでも負の数による条件判断が可能に

Page 59: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

59

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

reg signed [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 60: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

60

負の数による条件判断(signed 3)REGB(9ビット)のオーバーフロー判定– -99より小さいか、99より大きい– if((REGB<-99)||(REGB>99))– Signedにより非常に簡単に– 出力(out)の2の補数化– LEDへの出力は2の補数にする。– 条件判断は if(REGB>0)でOK。

Page 61: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

61

最後に

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

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

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

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

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

Page 62: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

62

演習を会社や大学で行うには?本演習は, WindowsのPCが1台あれば, 評価用のライセンスを入手して, 実際の設計までの流れを実習して頂くことが可能である

詳しくは配布資料参照

http://www-lab13.kuee.kyoto-u.ac.jp/~kobayasi/refresh

Page 63: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

63

負の数による条件判断

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

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

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

Page 64: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

64

負の数による条件判断(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 65: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

65

負の数による条件判断(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 66: 小林和淑 - 京都工芸繊維大学 › ~kobayasi › refresh › 0212 › slides › calc.pdf7 BCD2桁入力2進記憶回路 プッシュスイッチから与えられたBCDを2進数に変

66

合成時の変更

シミュレーションはreg signedを用いてよい。function文の入力にも、input signedが使用できる。

合成時には、signedを用いない記述に変更する。– ×if((REGB<-99)||(REGB>99)– ○if((REGB[8]&&(REGB<413))|| (REGB[8]==0)&&(REGB>99))– ×if(REGB>0)– ○if(REGB[8]==0)