【目次に戻る】

2. モジュールkueshiftの設計


まずは,KUE-CHIP2のシフト命令を処理する回路をSFLで記述します.SFLで は,ある機能を持つ1かたまりの回路をモジュールと呼びます.ここでは,シ フト命令を処理する回路をモジュールkueshiftとして設計します.あるモジュー ルは別のモジュールで,サブモジュールとして利用できます.すなわち,階層 化設計を行うことができます.モジュールkueshiftは,後でKUE-CHIP2全体を 設計するときに,サブモジュールshifterとして利用されます.

SFL記述 [TOP]

リスト 2.1 にモジュールkueshiftのSFL記述の一例を示します.

5行目から7行目では,外部端子の定義を行っています.キーワード instrin, input, outputは,それぞれ,制御入力端子,データ入力端子,デー タ出力端子を示します.制御入力端子は,外部からそのモジュールに仕事を依 頼するためのものです.kueshiftは,doという制御入力端子を外部から起動す ることで,シフト処理を行うものとします.データ入力端子としては,シフト の種類を示すmode<3>と,シフトされるデータin<8>と,シフト前 のCFの値ciを持つものとします.ここで,modeは,8種類のシフト命令のうち の1つを指定するものですが, 表1.1 のsssに対応させることにします.データ出力端子としては,シフト結果を表 すout<8>と,シフト後の各フラグを表すco, vo, no, zoを用意します.

13行目から40行目には,制御入力端子doが起動されたときに行う動作が記 述されています.ここで,==は一致判定を,in<7>やin<7:1>など はビット切り出しを,||はビットの連結を,/|は桁方向のorを表しています. KUE-CHIP2のシフト命令は,シフトの量はすべて1ビットです.シフトの際には み出たビットは,一時的にedgebitというデータ内部端子に保持するものとし ます.10行目のselはデータ内部端子を示します.25行目から28行目はright方 向のシフトの動作,29行目から32行目はleft方向のシフトの動作です.34行目 から37行目は,桁あふれフラグVFに関する記述です.SLA命令とRLA命令で,シ フト前とシフト後で最上位ビットが異なるときに,桁あふれとみなされます. 規定課題の資料にあるシフト命令の説明と照らし合わせれば,SFL記述の意味 が良く分かると思います.

以上で,リスト2.1の説明は終わりです.kueshiftのSFL記述は, kueshift.sflというファイルに格納することにします.

[リスト 2.1] SFL記述 (kueshift.sfl) [TOP]
 1: /** kueshift : shifter for KUE-CHIP2 **/
 2: 
 3: module kueshift {
 4:     /** external pins **/
 5:     instrin     do;
 6:     input       mode<3>, in<8>, ci;
 7:     output      out<8>, co, vo, no, zo;
 8: 
 9:     /** contents **/
10:     sel         edgebit;
11: 
12:     /** operations of instrin **/
13:     instruct do par {
14:         any {
15:             mode == 0b000 : edgebit = in<7>;
16:             mode == 0b001 : edgebit = 0b0;
17:             mode == 0b010 : edgebit = 0b0;
18:             mode == 0b011 : edgebit = 0b0;
19:             mode == 0b100 : edgebit = ci;
20:             mode == 0b101 : edgebit = ci;
21:             mode == 0b110 : edgebit = in<0>;
22:             mode == 0b111 : edgebit = in<7>;
23:         }
24:         any {
25:             mode<0> == 0b0 : par { /* right */
26:                 out = edgebit || in<7:1>;
27:                 co = in<0>;
28:             }
29:             mode<0> == 0b1 : par { /* left */
30:                 out = in<6:0> || edgebit;
31:                 co = in<7>;
32:             }
33:         }
34:         any {
35:             mode<1:0> == 0b01 : vo = out<7> @ in<7>;
36:             else : vo = 0b0;
37:         }
38:         no = out<7>;
39:         zo = ^(/| out);
40:     }
41: }

SECONDSを用いてシミュレーション [TOP]

モジュールkueshiftのSFL記述が完成したら,SECONDSを用いてその動作を 確かめてみます.リスト2.2に,そのためのSECONDSのコマンド列を用意しまし たので,これを利用してください.ここでは,setコマンドで制御入力端子do やデータ入力端子mode, in, ciに値を設定しています.

[リスト 2.2] SECONDSへのコマンド列(kueshift.sec)
# simulation data for kueshift

sflread kueshift.sfl
autoinstall kueshift

rpt_add ext \
"do=%B mode=%B in=%B ci=%B    out = %B cvnz = %B%B%B%B\n" \
do mode in ci out co vo no zo

# sleep
report do;
set mode 000; set in 00001111; set ci 1; report do

# execute
set do 1
set mode 000; set in 00001111; set ci 1; report do
set mode 001; set in 00001111; set ci 1; report do
set mode 010; set in 00001111; set ci 1; report do
set mode 011; set in 00001111; set ci 1; report do
set mode 100; set in 00001111; set ci 1; report do
set mode 101; set in 00001111; set ci 1; report do
set mode 110; set in 00001111; set ci 1; report do
set mode 111; set in 00001111; set ci 1; report do

set mode 000; set in 11110000; set ci 1; report do
set mode 001; set in 11110000; set ci 1; report do
set mode 010; set in 11110000; set ci 1; report do
set mode 011; set in 11110000; set ci 1; report do
set mode 100; set in 11110000; set ci 1; report do
set mode 101; set in 11110000; set ci 1; report do
set mode 110; set in 11110000; set ci 1; report do
set mode 111; set in 11110000; set ci 1; report do

リスト 2.2の内容を,kueshift.secというファイルに保存して,コマンド プロンプトで,

% seconds < kueshift.sec
としてみてください.SFL記述が正しければ,リスト2.3のような結果となるは ずです.ここで,何も設定していないときの制御入力端子doの値は,0である ことがわかります.このときまだ,doは起動されていません.従って,いくら データ入力端子に値を設定しても,データ出力端子には結果が出力されません. 一方,setコマンドでdoに1を設定すると,結果がきちんと出力されました.こ れは,doが起動されて,シフト処理を行ったからです.また,制御入力端子の 場合は,値を設定しなければ,その値は0となっていますが,データ入力端子 の場合は,その値がz(不定)となっていることに注意してください.この違 いは,一般に,制御端子とデータ端子にあてはまります.

リスト2.2を適当に変更して,いろいろな値で動作を確認してみてください.

[リスト 2.3] SECONDSの実行結果
do=0 mode=zzz in=zzzzzzzz ci=z    out=zzzzzzzz cvnz=zzzz
do=0 mode=000 in=00001111 ci=1    out=zzzzzzzz cvnz=zzzz
do=1 mode=000 in=00001111 ci=1    out=00000111 cvnz=1000
do=1 mode=001 in=00001111 ci=1    out=00011110 cvnz=0000
do=1 mode=010 in=00001111 ci=1    out=00000111 cvnz=1000
do=1 mode=011 in=00001111 ci=1    out=00011110 cvnz=0000
do=1 mode=100 in=00001111 ci=1    out=10000111 cvnz=1010
do=1 mode=101 in=00001111 ci=1    out=00011111 cvnz=0000
do=1 mode=110 in=00001111 ci=1    out=10000111 cvnz=1010
do=1 mode=111 in=00001111 ci=1    out=00011110 cvnz=0000
do=1 mode=000 in=11110000 ci=1    out=11111000 cvnz=0010
do=1 mode=001 in=11110000 ci=1    out=11100000 cvnz=1010
do=1 mode=010 in=11110000 ci=1    out=01111000 cvnz=0000
do=1 mode=011 in=11110000 ci=1    out=11100000 cvnz=1010
do=1 mode=100 in=11110000 ci=1    out=11111000 cvnz=0010
do=1 mode=101 in=11110000 ci=1    out=11100001 cvnz=1010
do=1 mode=110 in=11110000 ci=1    out=01111000 cvnz=0000
do=1 mode=111 in=11110000 ci=1    out=11100001 cvnz=1010