まごころせいじつ堂

浜町庄金 研究開発  マイコンで遊んでばっかりで

SBCV20 16MHz動作への道

 V20/V30には16MHzで動作する高速バージョンのV20HL/V30HLというのがある。これをSBCV20で動かせないかやってみた。

 クロックジェネレータuPD71011Cは接続した水晶振動子の周波数をOSC(pin12)、1/2の周波数をCLK(pin8)、1/4の周波数をPRCLK(pin2)に出力する。uPD71011C-8は16MHz、uPD71011C-10は20MHzまでOKなので、16MHzの水晶振動子を使いOSC出力をCPUのクロックとして使い、1/2のCLK出力を周辺用のクロックにする。USARTは8MHz以上で動作するuPD71051C-10にし、ボーレートのクロックは以前SBCV20とクロックジェネレータでやったPIC12F1822により独立して供給し、システムのクロックに依存しないようにする。

 改造はパターンカットと配線2本。
(1) IC5: uPD71011Cのpin8(CLK)近傍とIC4: uPD70108のpin19(CLK)をカット。
(2) IC5: uPD71011Cのpin12(OSC)とIC4: uPD70108のpin19(CLK)を接続。
(3) IC5: uPD71011Cのpin8(CLK)とIC8: uPD71051Cのpin20(CLK)を接続。

※IC9: HC4040は外してPCI12F1822基板に差し替えているので(3)はショートしない。
※クロックの配線を両端でカットするのはアンテナになるのを防ぐため。

2021-02-17 02.15.17

 16MHz動作のメモリリードは2サイクル分で125nsなのでこれより速いROM/RAMを使用する。ROMはSTMicro M27C512-10F1、RAMはFUJITSU MB84256C-70Lに交換した。

 あと、あまり関係ないがSBCV20においてIC6はHC257の代わりにHC157が使える。

 さて、16MHzの水晶振動子を挿して実験。8080モードでのBASICは起動するがオーバーフローエラーが出てASCIIART.BASが止まる。起動時のメモリ表示も"031171 Bytes free"と先頭に0がついていておかしい。
スクリーンショット 2021-02-17 020808

 手持ちの14.31818MHzに落として実行。今度はうまくいった。ASCIIART.BASの実行に1分44秒。
だがこれはたまたま動いたことが後に判明する。
スクリーンショット 2021-02-17 021422

 さて、V20HLは16MHzまでOKなのに動かないのはおかしい。何が間に合ってないのか。このV20HL uPD70108HCZ-16は5個1000円くらいで購入したもの。外し品らしくピンには半田の跡。どうもあやしい。
 skyriver(@wcinp)さんの記事、レトロマイコン86ボードの構想(その22) 16MHz動作実験2 [8086] によるとリマーク品の疑いが。そこで残りの4個で動作確認してみると16MHzではBASICも起動しないもの、14MHzでオーバーフローエラーが出るものとおかしいものばかり。最初に引いたのがたまたま良品だったらしいのだが、これも再度14MHzで動作させると表示途中でオーバーフローエラーとなった。
 挙動を比較するため手持ちのuPD70108C-10、これはFM-11の改造用に新品を秋葉原で購入したものだが14MHzで動作させると他のものと同様のオーバーフローエラーが出た。ここから推測すると手持ち5個のV20HLはuPD70108C-10のリマーク品である可能性が高い。
 確認のためにV20HLを10MHzでASCIIART.BASを二時間連続で走らせると5個ともPASSした。
追記:12MHzでもPASSした。V20HLの12MHz品の可能性がある(はせりんさんより)

 LSIの動作周波数の上限を決めるものとしてクリティカルパスというのがある。内部の論理でいちばんタイミング的に厳しい部分が足を引っ張ってしまう。SBCV20のBASICは8080エミュレーションモードで動作していることを考えると、ノーマルV20の8080エミュレーションモードのどこかにクリティカルパスがありそうな気がする。
 また、V20は8088と差し替えクロックジェネレータも交換して12MHz動作でPCXT互換機を売っていた頃があるので実力でそのくらいで動きそうではあるが、残念ながら12MHzの発振子を持っていない。

 ということでこれ以上はV20HLの良品がないと確認できないのでどなたか挑戦してみてください。いちおう別のところからオーダーしてみましたが本物が来るかどうか……


skyriverさんのコメントを受けて写真追記:

uPD70108C-10 本物
IMGP3701
IMGP3702

uPD70108HCZ-16 ? (白字は私が書き込んだもの) ebay経由adeleparts2010より5個セット
IMGP3703
IMGP3704

uPD70108HCZ-16 16MHzでは動作せず12MHz OKebay経由CHIPS GATEより
IMGP3705
IMGP3706







豊四季タイニーBASICをMS-DOS上で動かす

 豊四季タイニーBASICのソースをコンパイルしてMS-DOS上で動かしてみる。

 きっかけは生の8086上で色々動かせるための環境をどうしようかと考えていてそういえば学生の頃からよく使ったLSI-C86試食版があったな、と。Windows10やWindows7では16bit版のバイナリは実行できないのでこれはMS-DOS Player for Win32-x64を使い、確認のため豊四季タイニーBASICをコンパイルして実行してみた。

以上でだいたいわかった方はこちらをどうぞ↓


(1)LSI-C86試食版のインストール
エル・エス・アイ ジャパン株式会社のフリーソフトウェア集のページからlsic330c.lzhをダウンロードし、.LZH形式が展開できるツールでC:\LSIC86以下に展開。
C:\BIN以下にある_LCCの内容を修正。昔はPC-98だったのでA:ドライブだったよな〜等

# LSI C-86 compiler's configuration file

-DLSI_C
-XC:\LSIC86\BIN -LC:\LSIC86\LIB -IC:\LSIC86\INCLUDE -T -O
-acdos.obj $LSICOPTS
&               #Command line argument will be inserted here
-lknjlib -ldoslib -v
C:\LSIC86\BINにパスを通す。[システムのプロパティ]→[環境変数(N)…]からシステム環境変数のPathにC:\LSIC86\BINを追加。

(2)MS-DOS Playerの導入
 MS-DOS Player for Win32-x64からダウンロード。MS-DOSを実行するプロセッサが8086/80286/80386/80486から、コマンド自体が動作する環境が32bit/64bitから選べる。LSI-C86は8086以降から動くのでどれを選んでも問題ない。動作環境はWindows10だと64bit版。これに対応したMSDOS.EXEをC:\LSIC86\BIN以下にコピーする。
 ここまでで適当にhello.cなど書いて動作確認。16bitバイナリの実行には頭にMSDOSを付けて実行。

C:\LSIC86> MSDOS LCC HELLO.C

私の環境では普段使っているデスクトップのWindows10機ではウイルススキャンの対象になっているのかうまく動かなかった。WindowsXP→Windows7→Windows10と継ぎ足しで使ってて切り分けも面倒なので別のパソコンで動かしている。

(3)豊四季タイニーBASICの修正
 豊四季タイニーBASICArduino版をベースにコンパイルできるよう修正する。
変更点:
(1) ソースの文字コードをSJISに変換
(2) コメント//を/* */の形式に変換
(3) #define STR_EDITIONを"MSDOS"に
(4) Terminal controlの部分をputch(c) getch() kbhit() に
(5) (uintptr_t)を削除。これArduino Dueで豊四季タイニーBASICを動かそうとした時に追加して反映してもらったパッチなのですが外すことに。
(6) getrnd()再実装。これはarduinoのrandom(MAX,MIN)とrand()の仕様が違うため。
(7) BYE命令追加。一度basicを起動するとMS-DOSに戻る手段がなかったのでNEWとかRUNといった命令を参考に呼んだらexit()を実行するようにした。
(8) 末尾にbasic()を呼び出すmain()関数追加。

配列の上限やらそのあたりはいじっていません。


 さて今後ですが、具体的にはV20SBC開発環境として使えないかどうか探っていきます。LSI-C86製品版なら組み込み向けのリンクもできるらしいし、BANDAIの携帯ゲーム機WonderSwanの開発環境WonderWitchにはカスタマイズしたLSI-C86が付属していたのですがどこにしまったかな?

案1:通常のMSDOS向けにリンクしてある.objについて、適切にハードウェアの初期化を行った.objファイルを生成しリンク
案2:豊四季タイニーBASICからMS-DOSやその他ライブラリに依存した部分(入出力とrand()、exit() )を修正してアセンブラ1本にし、他の8086ターゲットアセンブラに持っていく
案3:組み込み向けの使用例があるTurbo-Cあたり 海外の事例探し

 といった感じで。




SBCV20とクロックジェネレータ

 電脳伝説さんのSBCV20キットが発売になりました。

SBCV20専用プリント基板(オレンジピコショップ)

 技術資料とデータパックはそれぞれの商品説明のページにリンクされている。これによるとV20の代わりに8080を動かすためにはクロックジェネレータをuPD71011Cから8284Aに交換し、クロックを分周してUSARTの通信用クロックを作っている74HC4040のタップを切り替える。これは8088がデューティ比1:2のクロックを必要とするのでi8284Aが大元のクロックを÷3するため。V20は1:1のクロック入力でuPD71011Cは÷2。昔8086搭載パソコンにV30を差し替えるのが流行ったけどクロックジェネレータまでは交換してなかったのでタイミング的には実力で動いていた模様。

 さて8088は昨年秋葉原でなぜか新品と思われるものが店に並び、とある方から地方在住の私宛に送っていただいたので動かそうと思ったのだけど上記の変更に加え水晶振動子を14.7456MHzに交換しなければならない。これは準備していなかったのだがUSARTの通信クロックを独立させればと以前やった『SBC8080SUBボードのクロックをPICで』と同じ手を使った。

2021-01-24 17.57.02

 74HC4040の代わりに小基板をつけて、osc1536.hexをPIC12F1822に書き込み搭載。osc1536.hexについては『モトローラ6800伝説』とSBC6800ルーズキットを参照のこと。

 配線はこちら。
2021-01-24 19.38.25

 PIC12F1822をICソケット経由で実装するとすぐ下になる抵抗とダイオードに干渉するけどちょっと浮くだけだしまあいいか。
2021-01-24 17.58.04


 さて、これでよかろうと動作確認してみたら文字化け。
2020-12-30 12.19.48


 クロックは周波数カウンタで確認してちゃんと出てるけどなんでだろうか?


 これはクロックジェネレータがバイポーラかCMOSかの違いで水晶振動子の両端を抵抗でGNDに落とすか10pFのコンデンサで落とすか処理が異なっていたのが原因。これは知らなかった。

 データシートを見るとバイポーラの8284Aだと510Ωの抵抗で水晶振動子の両端をGNDに落としている。
スクリーンショット 2021-01-24 18.55.54

 このあたり気になったのでFM-11の8088カードで確認したら同様だった。ただしVccにつなぐ30pFのコンデンサはなかった。

 SBCV20基板の10pFコンデンサの足をカットし、裏面に抵抗(680Ω)を付けて動作OK。
2021-01-24 17.57.17

2020-12-30 22.07.36



UPD71011データシート(renesas)を見るとコンデンサで処理してある。8284Aと動作が同じuPD71084を使う場合はCMOSなのでuPD71011Cと同様にしなければならない。

参考:V20/V30の周辺デバイス(Electrelic)









低温はんだとMZ-80CのICソケットはずし

 鉛フリー低温やに入りはんだエコソルダーNEOを入手した。定価は約4000円だがモノタロウでクーポンが使える日に購入すると2割引ぐらいになる。今まで基板からDIP部品を外すのにサンハヤトの表面実装部品取り外しキットを使っていたがそろそろ付属のハンダが切れるしもうすこし安くできんかなと思って。これは融点が200℃。
2020-12-16 18.28.14

 見づらいけどカプトンテープで取り外すICソケットのピン周辺を保護。
IMGP3690

 MZ-80CのICソケットは最近の細い桟が付いたものと違って樹脂の部分が多く解体しづらい。通常なら中央部分にある桟をニッパーで切ってしまえばピンの列を片方づつ外せるのだが、このように端が脆く砕けるだけ。はんだ面に低温はんだを付けて通常のハンダゴテ(350℃)で充分に温めソケットの左右からペンチでテコの原理で持ち上げてはずす。
IMGP3691

 以前紹介したようにこの基板は水没品なのでICソケットを外したあとがこうなっている。あとで洗浄。
IMGP3692

 24ピンのICソケットは全部外したが残りの40Pソケットx2は猫が邪魔しにきたので中断。使っている小さなペンチは百円ショップで買ったものだが妙に使い勝手が良い。
IMGP3693


 続きはぼちぼちやります。

SBCF8の組み立て

 aitendoにスポット入荷したFairchild F8。私は二巡目で入手した。このままではただのコレクションになってたところを電脳伝説さんのSBCF8を組み立てる機会に恵まれたのでやってみた。

 SBCF8はSBC8080と同様にSBC8080SUBボード上のメモリとUARTを使用する。また、今回からはバス上で使用したかったためSBC-BUS Rev.02とそれにコネクタをあわせたSBC8080SUBボードを先に作った。
 SBCF8はSBC8080と同等の5V→12V昇圧回路があるが部品を探し出すのが面倒だったため秋月電子から購入したDCDCコンバータを使用した。これは±12V出力のものだが手持ちでこれしかなかったため。ちょっと割高。
ほぼ部品は手持ちでOKだったが2MHzの水晶振動子は別に入手。4MHz以下くらいの水晶振動子は入手しずらくなっている感じ。
2020-11-28 04.08.17

 さて動作確認をしたのだが動かず。2つの問題点があって、ひとつはSBC-BUSに1つずれて挿入していたこと。これでも電源ははいってしまうので気付くのが遅れた。もうひとつはDCDCコンバータの配線が切れてしまっていたことでVGG(+12V)が供給されていなかった。ここではついでにDCDCコンバータ前後のコンデンサを余裕がなかったかな?程度の考えで3.3uF→33uFに交換している。
2020-12-07 00.58.47

TINY BASICが動きました。
2020-12-07 00.59.48

USB電源アダプタを使用して、消費電力は5.14V/0.25Aで約1.3W。
IMGP3683

 ついでにVGG/VCC確認用のLEDを追加。
IMGP3689

 これで12Vを確認。
IMGP3686

 電脳伝説さんありがとうございました。



F8関連で探した資料は以下:

http://aitendo3.sakura.ne.jp/aitendo_data/product_img/ic/MOSTEK/MOSTEK_Microcomputer_Data_Book.pdf

http://datasheets.chipdb.org/Fairchild/F8/fairchild-3850.pdf

www.bitsavers.org/components/fairchild/f8/F8_prelimUM_Jan75.pdf

https://www.chessprogramming.org/Fairchild_F8

https://orphanedgames.com/videobrain/f8_programming/f8_programming.htm

KiCad:FusionPCBでのV-CUT指示

 KiCadでFusionPCB向けのV-CUT指示はEco2.Userレイヤー(.gml)で行い、基板全体の外形をEdge.cuts(.gko)で指示する。

 秋月電子のD基板サイズ(47mmx36mm)で二種設計した。これらを個別に発注せず100mm x 100mm以内にまとめて製造依頼するために面付けというのをやってみた。4枚分の面積は秋月電子のB基板サイズ(95x72mm)で、基板を4枚に分割するためのV-CUTを指示するとその部分に溝を掘ってくれる。ここから折ると目的の基板が得られる。
 その指示だがなにか間違えたらしく外形とV-CUT指示がわからないよという通知があったので色々参考にして再提出した。

面付け後の基板はこのようなかんじ。
スクリーンショット 2020-12-04 145328

・面付けした基板の外形をEdge.cutsレイヤーで描き、ガーバー出力後に.gkoにリネームする。
スクリーンショット 2020-12-04 145624

・Eco2.Userレイヤーで外形とV-CUT指示の直線を描く。
スクリーンショット 2020-12-04 145543

 Edge.Cutsレイヤーは文字が描けないらしい。ECO2.Userは描けるけど今回は直線と曲線で描画してみた。これで再提出後OKとなり製造工程にはいった。

 2種面付けで注文した基板はこのようなかんじ。
2020-12-04 15.48.06

 PCBGoGoだとECO2.Userに外形とV-CUT指示をまとめてしまっても問題なかったのでこの辺を間違ったのかもしれない。なおPCBGoGoはガーバーのリネームも不要でそのままzipでまとめて提出可能。以下はPCBGoGoに出した外形とV-CUT指示を入れたECO2.Userの例。
スクリーンショット 2020-12-04 161348



SBC8080SUBボードのクロックをPICで

 なにやら昔のI/O誌の記事タイトルみたいになってしまったが。

 SBC8080SUBボードはROM/RAM/i8251とそのシリアル通信用のクロックである153.6kHzを生成する74HC4060と19.6608MHzの水晶振動子で構成されている。今回このボードをもう一枚作ろうと思って部品を探したらHC4060と水晶振動子の手持ちがなかったのでSBC6800やSBC6809でACIAのシリアル通信クロックとして使われているPIC12F1822を使ってみた。

 これでもうわかると思いますが整理しておきます。


それぞれの技術資料を参照。PIC12F1822はSBC6800データパック中のosc1536.hexを書き込んでおく。

 HC4060の4,5,6,7,10,11,12,13ピンの箇所に8pinのICソケットを実装。
2020-11-27 16.52.50

 ハンダ面で配線。BAUD RATE選択のパッド1部分はカット。
PIC12F1822(osc1356)のpin1=+5V、pin8=GND、pin5=CLK出力。写真のように配線。
2020-11-27 16.53.10


 SBC-Bus Rev02(レトロな雰囲気)を組み立ててクロックをi8251側のピンで確認。よさげ。
じつはこの写真には大きな間違いがあってコネクタがずれたまま実装されているのです。動かなくて悩んだ。
2020-11-27 23.39.55

 ついでに作ったSBC8085との組み合わせで動作OK。
2020-11-30 17.13.54

 以前はSBC8080/SBC8085といったCPU側のハンダ面に40Pメスコネクタを、SBC8080SUBボードの部品面に40Pオスコネクタを付けてましたがこれ以上拡張のしようがないので改めて作り直したのでした。今回のSBC8080SUBボードはL字の40Pオスコネクタで、以前のCPUボードに挿して動作確認もOK。
 SBC8080+SBC8080SUBボード、SBC6800のPICを使わなかったのは作りやすさの難易度を下げるためだったのかなと想像します。最近だと入手しやすいROMライターのTL866IIPlusでhexファイルをPICに書き込ませることができるのでだいぶ楽です。




Fenestra6502の石数削減の検討

 @hatsugaiさんのFenestra6502。既存の6502にレジスタウィンドウ的なメカニズムを外付けして、関数呼び出しでの引数/結果の受け渡しに関わるコストを劇的に改善している。
 引数の受け渡しおよびローカルな作業エリアはダイレクトページ上に確保し、関数呼び出しとリターンに対応するJSR/RTS命令でこれらの領域がずれて割当てられる。256バイトのダイレクトページは以下の割当て。

%i $00-$3F  呼び出し元からの引数。RTSでもどる前に結果をここに置く。
%l $40-$7F ローカル作業エリア。
%o $80-$BF JSRで呼び出す先の引数を与える。JSR先では%iで参照。
%g $C0-$FF グローバルエリア JSR/RTSで割当ては変化せず。

%i,%l,%o,%gはSPARCアーキテクチャのレジスタウィンドウに合わせた分類で、役割も同様。
JSR前の$80-$BFが飛び先では$00-$3Fに対応する。

他にレジスタウィンドウを持つアーキテクチャはAMD Am29000、Intel i960、Intel Itanium、クヌースのMMIX。HITACHI H16も似たようなメカニズムを持つ。

 Fenestra6502の仕組みについて。128Kバイトのメモリについて、$100C0~$1FFFFを65C02のアドレス空間に割り当てている。65C02の$0000~$00BF(192バイト)については外付けの回路でアドレス変換を行い、$00000~をダイレクトページ領域として割り当てている。
 アドレス変換はJSR命令で+1、RTS命令で-1するアップダウンカウンタを持ち、ダイレクトページをアクセスするアドレス$0000-$00BFとこのカウンタの値(7bitオフセット:x128)を加算し128Kバイトのメモリ$00000~に変換する。
 カウンタは65C02のスタックが256バイトしかないので、0~127の7bitで充分。(JSR命令で2バイトのアドレスをスタックに積むため)


 Fenestra6502のハードウェアはW65C02Sと制御用のATMEGA164P、128Kx8 SRAM 628128。GAL 22V10 x2、LS74、LS191 x2、LS283 x2、LS257 x2。10cm x 10cmの基板に収めるのはちょっときびしい気がする。GALを活用すればさらに石の数を減らせるんじゃないかと検討してみた。

 Fenestra6502の回路図。(2020/10/14 Rev, 1.2)
Fenestra6502


検討1:U6 LS74の削減

 INSTDEC(GAL 22V10)はJSR/RTS命令をデコードして次段のLS191に対しカウントアップ/ダウンの指示をしている。このカウンターへの指示はLS74で1サイクル分保持されている。この程度ならINSTDECに吸収できそうだ。


 FFの初期化のためのRESETを追加。これでU6 LS74をなくすことができる。


検討2:デコーダとカウンタの統合

 カウンターは7bitあればよい。これと命令デコード部分を1つのGALでできないか?
 SYNC信号は命令フェッチのタイミングを示す。この立ち下がりのタイミングでデータバスに乗る命令をデコードし、そのままカウンタのアップ/ダウンを指示すればいけそうな気がする。SYNC信号を反転してその立ち上がりで動かせばよさそう。こういうのは昔の汎用ロジックの使い方っぽい。SYNC信号は!SYNCOUTとして反転出力し、それをGAL 22V10のCLK入力に与える。
 命令デコードは8bitのデータバスを扱うためこれをそのままカウンタ回路につなごうとすると項数オーバーでパンクしてしまう。そこでデコード結果はいったんDU,CTEN出力として割り当て、フィードバックループでぐるっと回して入力信号に与える。
 これで命令デコーダとカウンタはGAL 1個に入った。検討1での代わりに使うとLS74、LS191 x2の計3個を削減できる。そのかわりWR/RDなどの信号が扱えなくなるがこれは後で別のGALに追い出す。



検討3:加算器をインクリメンタに変更

 カウンタの出力7bitはアドレスA[13:7]に対応する。これにゼロページの変換対象となるアドレス$0000~$00BFが加算されるが、この下7bit A[6:0]はそのままスルーでA[7]のみカウンタの値と加算される。これは全加算器ではなく+1インクリメンタで充分。
A[14]はカウンタの値が繰り上がった時に'1'だけど実質常に'0'。A[15]は常に'0'。
SRAMに与えるアドレスYA7はGALのU4 ADDRDECで生成しているRA7と同等のもの。端子が空いていたので配線の都合がよいように定義しただけ。
インクリメンタが出力するアドレスY15~Y8(ついでにY7)はOEでアウトプットイネーブルの制御を行う。これに65C02からのA15~A8を接続したLS245(新規追加)の出力をSEL信号で選択することによりアドレス変換/無変換後のアドレスをSRAMに与えることができ、LS257 x2を削減できる。
 これで従来の加算器とアドレスセレクタはLS283 x2とLS257 x2の4個を削減、GAL +1、LS245+1。



検討4:その他の論理

 検討2ではみ出てしまった RAM OEとRAM WEをGAL ADDRDEC(22V10)に押し込む。


これで最終的にGAL 22V10 x3、LS245 x1になった。あとはレイアウトの都合で端子の配置を手直しすればよさそう。



※これは机上での検討のみで実際には作っていませんのでご注意ください。



 えっamazonにあるの?

GALでFFを使うための調査

 今さらGALを使う準備のつづき。前回でWinCUPLを使って組み合わせ回路をGALに書き込んで使えるようになったが内蔵しているFFも使えるようになったらさらによろしかろうと思いCUPLでの書き方を調査した。WinCUPLによるコンパイルのみで実チップに書き込んでの確認まではやってないので注意。

 現在入手が容易なのは以下の22V10、16V8。22V10は24ピンパッケージで22本の入力ピン、うち10ピンは出力に設定可能。16V8は20ピンパッケージで18本の入力ピン(制限あり)、うち8ピンは出力に設定可能。

GAL22V10(Lattice)
ATF22V10C(Microchip:旧Atmel)
ATF22LV10C(Microchip:旧Atmel) ←これは3.3VもOK

ATF16V8B(Microchip:旧Atmel)

 CUPLについてのドキュメント。その他、WinCUPLをインストールすると一緒にはいっているexamplesのソースが参考になる。CUPL自体はCPLDなどもターゲットにしているのでデバイス固有の機能が使えるような書き方ができるようになっているが、GALではその一部しか使わない。



 題材として8bitのLFSRを作ってみる。このWikipediaに書いてあるフィボナッチLFSRはXORの段数が多くなりコンパイルに不利そうなのでガロアLFSRを採用する。

 WinCUPLでコンパイルしエラーをなくしたソースは以下のGistに置いた。

仕様:
・入力クロックにしたがいQ0~Q7が変化する。
・CTEN入力がdisableの間はQ0~Q7をホールドする。
・OE入力がdisableの間はQ0~Q7をハイインピーダンス状態にする。
・RESET入力で非同期にQ0~Q7を0クリアする(LFSRの性質上ずっと0のままになる)。
・PR入力でS0~S7の値をQ0~Q7にセットする。


GAL22V10での記述説明:
Device  G22V10;
 GAL22V10をターゲットとする場合はDEVICE名にG22V10を指定する。
Pin 1 = CLK;
 G22V10はD-FFを10個持つ。FFを使う場合はPin 1がクロック入力となる。
Pin [16..23] = [Q0..7];
 CUPLによるピン宣言では変数名をピン番号に割り当てるだけで入出力は指定できず、式での記述で推定して決められる。例えばある変数が式の左側にあれば、その変数名に対応するピン番号は出力となる。出力となりうるピンはPin 14 ~ Pin 23の10本。[ ]で変数名+10進数のインデックスを付けてまとめて宣言できる。インデックスは0~31までだがGALでは問題にならない。
[Q0..7].ar = RESET;
 変数名の後に.を付けて拡張子を指定できる。G22V10の場合は出力となる変数名に以下を指定できる。このうち.oeは組み合わせ回路のみの場合でも指定できる。
非同期リセット .ar
同期プリセット .sp
アウトプットイネーブル .oe
D-FF .d
[Q0..7].sp = 'b'0; /" = [S0..S7] & PR;  NG ! "/
 同期プリセットについては当初 S0 & PRのようにプリセットできるような式を書いていたがWinCUPL
で" excessive number of product item"が出てコンパイルエラーとなった。ここはGALの構造上1つの信号しか接続できないので組み合わせ論理をともなう式が書けない。よって無効にした。

Q0.d = !PR & (CTEN & !Q7 # !CTEN & !Q0) # PR & S0;

 シフトレジスタ本体の記述の一部。Q0.dはD-FFの入力。同期プリセットを無効にしたのでここでプリセットできるよう式に記述。あと、CTEN入力でシフト動作とホールド動作の切り替え。

 LFSR8.simファイルでコンパイル結果を確認できる。

 GALで扱う論理くらいではあまり関係ないかもしれないが、WinCUPLにはコンパイルオプションで論理圧縮のアルゴリズムを選ぶことができる。

GAL16V8での記述説明:

 ピン数制限によりプリセット機能はなし。
https://gist.github.com/houmei/08b9eb0da63171cd523eec008b6110d5

16V8でD-FFを使うにはRegistered Modeを指定する。このときPin 1はCLK入力、Pin 11はOutput Enable入力固定となる。
Device  G16V8MS;
 デバイス指定でRegistered Mode を指定する。G16V8記述で自動推定もできるらしい。
/* [Q0..7].oe = OE; */
 拡張子.oeは指定できずPin 11決め打ちとなる。
/* [Q0..7].sp = 'b'0; */
/* [Q0..7].ar = RESET; */
 拡張子.sp、.arは指定できない。パワーオン時のD-FFの初期値はデータシート読んでみたけどわからなかった。
Q0.d = CTEN & !Q7 # !CTEN & !Q0;
 パワーオン時の初期値が'0'と仮定するとLFSRは0のままなのでD-FFの入出力を反転させた。昔どこのPLDか忘れたけど初期値が'1'のデバイスがあって悩んだ覚えが。
 いま気付いたがRESET入力を式に混ぜて初期化するのを忘れた。次の機会に。


 その他、状態遷移を記述するSequenced文を使うとFFの使用が推定される。ただしSequenced文は複数書けないようだ。よく考えたらそりゃそうだなんだけど、4bitCounterを2つ記述しようとして2つめのSequenced文が無視され失敗した。

 あと、WinCUPLがコンパイル後毎回落ちるのもちょっと困る。Windows10を色々アップデートする前は動いていたんだがもともとWindowsXP用のソフトなのでしょうがないか。



宇宙空母ギャラクティカ(劇場版1978年) [Blu-ray]
ローレッタ・スパング
ジェネオン・ユニバーサル
2013-11-27


Z80に68系の周辺LSIをつなぐ(調査)

 調べ物をしていてたまたま見つけたのだが、Z80に68系の周辺LSIを接続している例を見つけた。

スクリーンショット 2020-10-08 1.24.53

 これはAKAIのサンプラーS612の回路図。~IORQの反転がACIA HD6850PのEクロックとして与えられている。~IOREQはZ80のI/O空間へのアクセス時にenableになる信号で定期的に出ているわけではない。
 似たような回路でSHARP X1ではCRTC HD46505のレジスタの読み書き時のみE入力に一発パルスが与えられるようになっている。

 これ規格を満たしていないんじゃ?と思ったけどHD6850PはEクロックのHの幅とLの幅は最小値だけ定義していて最大値はないのでこれでいいらしい。MC6850も同様だった。ACIAは送受信用のクロック、CRTCはビデオタイミング用のクロックを外部から与えるのでCPU側から読み書きするEクロックはこれでもよいみたい。

 Z80のCLKに対して~MREQは2サイクル分、~IORQは3サイクル分enableになるのでZ80-4MHzに対して68系の周辺LSIは1MHz品で良さそう。(I/O空間の場合はZ80-6MHzまで)



記事検索
プロフィール

hardyboy

カテゴリ別アーカイブ
月別アーカイブ
QRコード
QRコード
  • ライブドアブログ