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