Quantcast
Channel: CPU実験室
Viewing all 226 articles
Browse latest View live

実数計算テスト

$
0
0
このボードにはFPU:MC68881が載っているのでビルドスクリプトに「-m68881」を追加して
FPU用の演算ライブラリを利用できるようにします。

includeファイルのmath.hを覗いてみるといろいろな組込み関数が用意されていますが
おそらく一生使わないであろうベッセル関数やガンマ関数といった特殊関数も入っていて
せっかくなので動作だけ見てみました。

ガンマ関数は階乗の定義域を複素数に拡張した関数で自然数nにおいては
  Γ(n+1)=n!
が成立します。
ただガンマ関数は引数によって値が爆発的に増大するので標準Cライブラリにおける実装は
それの自然対数をとった log|Γ(x)| になっているようです。


イメージ 1


なのでこのように書いてΓ(1)~Γ(13)で求めると、(14を超えるとlongに収まらないので)


イメージ 2

ちゃんと階乗の値になっています・・・実数計算なので一部誤差ありますが。
もっとも階乗なら教科書的には整数で再帰的に計算するのが普通ですけど。

ガンマ関数の引数はもちろん実数も可能で、面白い性質として
   Γ(1/2)=√π
になるとされています。

やってみたら・・・なりました。(いつものように小数表現ができないので1,000,000倍しています)

イメージ 3




アセンブルエラー

$
0
0
1文字入出力の変更やメモリマップの違いは置いておいて、まずはそのままのコードで
ターゲットをTLCS-90指定でアセンブルできるかを確かめておきます

D:\USR\ASM\tlcs>asw -L monitor.asm
macro assembler 1.42 Beta [Bld 97]
(i386-unknown-win32)
(C) 1992,2014 Alfred Arnold
Motorola MPC821 Additions (C) 2012 Marcin Cieslak
68RS08-Generator (C) 2006 Andreas Bolsch
Mitsubishi M16C-Generator also (C) 1999 RMS
XILINX KCPSM(Picoblaze)-Generator (C) 2003 Andreas Wassatsch
TMS320C2x-Generator (C) 1994/96 Thomas Sailer
TMS320C5x-Generator (C) 1995/96 Thomas Sailer

assembling monitor.asm
PASS 1
TLCS-90-Adre疆efinitionen
(C) 1993 Alfred Arnold
stddef90.inc(130)
monitor.asm(1633)
PASS 2
stddef90.inc(130)
monitor.asm(1633)
0.34 seconds assembly time
   1633 lines source file
      1 pass
    138 errors
     32 warnings

約1600行のソースは瞬時にアセンブルできますが鬼のようにエラーが発生しています。
ただエラーの内容を見ると大したものはなく単純に削除、差し替えで対応できそうです
パタンも大体決まっています

(1)error: unknown opcode 
Z80固有のアーキテクチャによる命令でこれは使わないようにするしかありません
    RETN   ・・・NMIハンドラからのリタン RETIで置き換え
    IM 2    ・・・インタラプトモード指定 割込みベクタは固定されているし不要
    RST 18H ・・・1バイトのリスタート命令は便利だったんですがCALL xxxxに置き換え

(2) error: unknown opcode
今更気づきますがTLCS-90でのI/OはメモリマップドI/OなのでもとよりI/O入出力命令はありません。
内蔵レジスタもメモリアドレスの後半に割り付けられています。
    OUT (C),A
    IN A,(C)
    OTIR
これらは該当するメモリアドレスへのアクセス、ブロック転送命令に置き換えます

(3) error: invalid operand size
I,RレジスタはZ80固有のレジスタですからガン無視。削除します
   
LD I,A
    LD R,A

(4) error: wrong number of operands
TLCS-90アーキテクチャでは直交性が高くなり演算対象がアキュームレータでなくても良くなりました。
Z80では演算対象が暗黙的にアキュームレータだったので以下のような
ディストネーションを省略したニーモニックでしたがTLCS-90では明示しなくてはいけないようです
    OR L   ・・・ OR A,L で置き換え
    AND A  ・・・ AND A,A
 で置き換え
    XOR A  ・・・ XOR A,A で置き換え
    CP nn ・・・ CP A,nn で置き換え

 (5)warning: short addressing possible
Z80でもシフト・ローテーション命令はアキュームレータ以外も対象にできましたが
TLCS-90ではアキュームレータ専用のニーモニックが用意され、それを使えば命令長が減るよ。
と教えてくれるワーニングです
   
SLA A  ・・・ SLAA で置き換え
    SRL A  ・・・ SRLA 
で置き換え


いまどき誰得?なZ80→TLCS90移植tipsでした

シリアル入出力

$
0
0
コードの書き換えでエラーは完全になくなりましたが、これからが移植の本番です
先ずはシリアル通信ができないとデバッグが全く進みません
これも今になって気付いたのですが内蔵シリアルコントローラにはステータスレジスタが無く
割込み駆動で使うようです。

割込み機構はCPUによってまちまちで仕組みも複雑だったりするので、初めて使うCPUでは
最初は避けて通りたいところですが仕方ありません。

まず受信と送信の割込みベクタから割込みハンドラ本体にジャンプさせます

イメージ 1

ここはインターバルが8バイトしかないので基本的にJMP命令しか置けません。
うっかりここにハンドラ本体を書いて、次のベクタにオーバーラップしてしまったのですが
アセンブラがエラーを出さなかったのでかなり悩みました

次に割込みハンドラ本体です
割込みの中で受信レディ、送信バッファエンプティのフラグをセットすることで外部からステータスの変化が見えるように
なります
ただし受信時は受信バッファを読まないと次の割込みが受けられないようです

イメージ 2

これであたかもステータスフラグをポーリングするように制御できます。
1文字出力のPUTCHAR、1文字入力のGETCHARルーチンの記述です。

イメージ 3

このサブルーチンを呼ぶことでシリアルの連続出力ができるようになりました。
通信速度は内蔵のボーレートジェネレータで原振の1/512が得られ、メーカ指定の9.8304MHz水晶を
使うと19200bpsとなりますが、ここでは10MHzちょうどの水晶を付けたので19531bpsとなります。
これは+1.7%で±5%の許容誤差以内なので19200bps設定のターミナルで受けられるはずです


イメージ 4

SRAM追加

$
0
0
シリアルの入出力に問題がないので内蔵レジスタの初期化、スタックポインタを修正してアセンブル。
ROMに焼き付けたところ無事にモニタが起動しました。

内容はほとんど確認せず丸々移植ですが、各コマンド正常に動作しているようです。

イメージ 3

CPU内蔵のSRAM領域は$FEC0~$FFBFのわずか256バイトしかなく、モニタが使用する領域を
差し引くと128バイト、しかもSRAMの底からスタックが迫ってくるので簡単なプログラムしかロードできません。
256kbitのSRAMを追加しました。


イメージ 1

・・でモニタでメモリ領域をR/Wチェックすると全くアクセスできません。
配線チェックしてみたら・・・・またやらかしてました

アドレスバスA15を反転してSRAMのチップセレクト信号を生成するワンゲートロジック(TC7S00)の
電源がまるで逆。基板表面からの透視図でパタン設計していたのでうっかりしました。
瞬時に昇天したようなので貼り換えて電源のジャンパを飛ばしたところです

イメージ 2

7セグLEDテスト

$
0
0
モニタも稼働してSRAM増設してメモリも潤沢に使えるようになるとハードデバッグが一気に加速します
MAX7219の制御ルーチンを作って7セグの点灯テストをしています。

電源ONのデフォルト状態ではシャットダウンモードになっていることに気付かず、ちっとも点かないので
最初は焦りましたが、できてしまえば簡単。
一度セットしてしまえばCPUの介在無しに表示し続けてくれるので楽です。


イメージ 1

OPMドライバ

$
0
0
FM音源IC(YM2151)の動作確認をしています。
すでにYM2203のドライバを作っているので元にするものはありますがレジスタ配置がかなり違うので
ほとんど作り直しです。

ネット上で4オペレータ系FM音源の音色パラメータを探すと大体こんな形で並んでします

イメージ 3

この形で構造体timtblに流し込んでおき、これを編集してOPMのレジスタにセットする関数を用意しました。
8チャンネルの音源それぞれに音色、パンを指定できます

イメージ 4

各パラメータをセットした後、音程とキーONをセットすれば発音されます。
スピーカで聞く限りノイズも少なくいい感じですが、オシロで見ると無声期間もデジタル系のノイズで
輝線がひどく太くなっています。
ただ可聴周波数をはるかに超えているので問題にはなりません

イメージ 1


フルート系の音色で発音中の波形はこんな状態になってます

イメージ 2

音が出たところでほぼ満足してしまってますが、このあとMIDIメッセージ/ファイルの解釈ルーチンや
各ボイスチャンネルへのアサイナを用意しなければなりません




MML処理追加

$
0
0
FM音源ICに対して音程を指定して発音させるドライバはできましたが既存の楽譜データから鳴らすのは
結構大変です。
MIDIメッセージで直接制御したりスタンダードMIDIファイルが読み込めるのが目標ですが、
その前段階としてMML(ミュージックマクロランゲージ)で演奏してみます
昔、8ビットパソコンのBASICにもMUSIC文とかPLAY文として実装されていて処理は容易そうです。

ただここは楽して
http://www.cubeatsystems.com/firmware/tinymml/ で公開されているタイニーMMLパーサ(解析ルーチン)
を使わさせてもらいました。ソースコードは全く修正なしでLSIC-86でコンパイルできました。
MMLの文字列を先頭から解釈していきコールバック関数を呼び出すというインターフェースで
コールバック関数の中でイベントごとに分岐し、それぞれに相当する音源制御をしてやれば良いことになります

例えば「L8O3CDEFGAB>C」という文字列を渡すと以下のようにイベントに分解されます

イメージ 1

NOTEイベントが来たら、渡されたNOTEナンバーの音程でTicks期間だけOPMを鳴らせばOKです

テンポ設定

$
0
0
FM音源の発音時間は自分自身に内蔵されたタイマ割込みを使って制御するようにします

まずMMLの時間分解能は4/4拍子の4分音符の長さ(1拍)を480(Ticks/beat)としています。
つまり480回タイマ割込みが入る長さを4分音符とします
イメージ 1・・・(1)

この楽譜データをX(bpm)の速度で演奏するためには毎分480X回(毎秒8X回)の割込みが必要
イメージ 2・・・(2)

YM2151の内蔵タイマAは10ビット長のアップカウンタで原振Φm=4MHzのとき
タイムアウトの繰返し周波数foutは
イメージ 3・・・(3)
                                 (Nはタイマ設定値)
(2)と(3)は等しいのでそこからNについて解くと
イメージ 4・・・(4)

となりました。

イメージ 5

BPM(X)とカウント設定値(N)の関係をグラフにしてみると、実用的なテンポ(50~300bpm)の範囲で
十分カバーしており、カウンタ長、プリスケーラ値は綿密に設計されたもののようです


モータドライバ

$
0
0
残っていたステッピングモータドライバまわりの部品を挿入して基板としては完成です
ドライバの周りに電流検出用の酸化金属皮膜抵抗が見えます

イメージ 1



ドライバはサンケンのSLA7026が2チャンネルついています。TLCS90にはステッピングモータのコントローラが
内蔵されていますのでそれで直接制御します


イメージ 2

モータテスト

$
0
0
ステッピングモータのテストを始めました

TLCS90内蔵のステッピングモータコントローラの実体は、内部タイマで生成されるクロックで駆動される
単なるシフトレジスタになっています。

イメージ 5

最初に初期値としてこのレジスタにA相だけをONにした励磁パタンをロードしておかないと全然パルスが
出力されません。これでまず嵌りました

気付けば当たり前なのですが、そこを直して4相クロックが出てきました(A相1チャンネルのみの波形)

イメージ 4

この状態でモータを接続したのですが、今度はゴリゴリ振動するばかりで全く回転しません
結線を確認したら、あ~またやらかしてました。

励磁はA→B→/A→/B相の順で行わなければなりませんが、CPUとモータドライバの間で
B相と/A相が入れ違っていました。
これはモータドライバが単なるトランジスタアレイであればモータ側ハーネスのピンアサインを変えてしまえば
よいのですが、SLA7026ではA相と/A相、B相と/B相が同時ONしないようにロジックが仕込まれていて
電流センス抵抗も共用しているので入れ替えがききません

イメージ 2

泣く泣くパタンカット、ジャンパで修正。

これでようやくモータが回り始めました

イメージ 1

ただ適当なスルーアップカーブで立ち上げてもクロックが150Hz以上で脱調してしまいます。

A相クロックが150Hzということは4相クロックでモータに与えているのは600pps。
使っているモータは1.8deg/パルス、200パルスで1回転なのでちょうど毎秒3回転ですが
もっと高速で回せるはずです

以下は電流センス抵抗0.68Ωの両端の電圧です

イメージ 3

励磁中はチョッパによって定電流モードで駆動されているのがわかります。
コイル相電流は450mAと算出されます。
今は無負荷なので回っていますが、カタログ上のtyp値は1.2Aなのでもっと流さないと追従できないようです

励磁シーケンス

$
0
0
TLCS90のステッピングモータコントローラはシフトレジスタのステージ間接続の切り替えと
初期データによって各種励磁シーケンスを作り出せます。
4相クロックの出力をロジアナで見てみました

(1) 1相励磁
  常に励磁されているのは1相だけなので消費電力が少なくて済みますが
  メカ的な安定度に若干欠け、振動が大きいのが難点です

イメージ 1


(2) 2相励磁
   励磁ONのタイミングを1/2づつオーバーラップしてドライブします
   消費電流は増えますがトルクが大きくなります 

イメージ 2


(3) 1-2相励磁
   励磁ONのタイミングを1/3づつオーバーラップしてドライブします
   A相とB相の中間のポジションを作り出せるので回転が滑らかになります。ただし同クロックレートでの
   回転数は半分になります 

イメージ 3

2CH接続

$
0
0
もう片側のチャンネルのドライバも作成し2個同時にモータを回しています
現状でA相のクロックは実測で300Hz。モータへのステップレートは4倍の1200Hzですが
無負荷では脱調ギリギリ。
回転数は毎秒6回転で振動もなくきれいに回っています

8桁のLEDは結構明るく、輝度調整はMAX7219へのプログラムでもできるのですが
緑色の塩ビフィルタを重ねてみました
写真ではわかりにくいですが発光色がもともと緑色蛍光表示管に近く落ち着いた感じになります

イメージ 1

FM音源差し替え

$
0
0
FM音源IC、YM2151/DAコンバータYM3012が海外のサイトでえらく安く売られていたので
試しに買ってみました。

数週間後、無事に届きましたが開けて出てきたのが右側のセット。
(左側のセットは手持ちしていたおそらく本物)
YM3012はいいとしてもYM2151はマーキングやモールド封止も違うし、どうも胡散臭い。
これは偽物つかまされたか?

イメージ 1


ともかくV50基板に現状のものと差し替え、自動演奏プログラムを走らせてみると、難なく音が出ます。
オペレータや内部タイマもフル稼働していますが聴いた感じ違いも判らないし、良しとしましょう。

レーザ刻印されたYM2151は中国製のニセモノだというネットの書き込みもありましたが
まさか適当な24ピンDIPにリマークしたのであればすぐにバレるわけでどうなんでしょう

TMS99XXシリーズ

$
0
0
テキサス社の初期の16ビットCPU、TMS9995を入手しました
もう30年以上前の製品です。

これのベースになったTMS9900はテキサス社製のミニコンをLSI化したもののようでレジスタやスタックの
扱いが現在主流の方式とかなり違っています。
アーキテクチャはそのままですが、バス幅を8ビット幅にしてパッケージを小さくするとともに電源やクロック
を簡素化して組込みに使えるようにしたのがこのTMS9995です。

イメージ 1


周辺も一通りそろいました

 TMS9901:パラレル入出力、タイマ、割込みコントローラを集積した周辺IF
 TMS9902:非同期シリアル入出力
 TMS9918:VDPコントローラ。いまどきコンポジットビデオでもありませんがせっかなので
 動かしたいと思います

イメージ 2

回路図入力

$
0
0
さっそく回路を検討しますが、今回はKI-CADを初めて使ってみました。

回路図エディタ、基板エディタ。コンポーネントエディタと機能が独立していて
それぞれのやり取りをファイルで行うので、Eagleのように常に図面間の同期を気にしなくて済み
使い勝手は良さそうです。
ただ自分が使うような部品は当然ライブラリにはなく、コンポーネントの作成から始めることになります

ようやくいくつかの部品を並べただけの状態です

イメージ 1


CPUまわり

$
0
0
CPU周りの入力完了

TMS9995とフラッシュROM29F010(128kBのうち32kBのみ使用)、256kbitSRAMを接続しました。
このCPUはバスのビット並びが一般とは逆でD0,A0がMSB、D7,A15がLSBになっています。
SRAMへの接続はどうでもいいのですが、ROMへの結線は注意が必要です。

イメージ 1

先ず図面1枚にCPU周りを記述しましたが、KICADはFree版のEagleでできなかった複数枚にわたって
図面が書けるのが助かります。

ただ複数枚といっても階層構造でしか管理できないのがちょっと残念。
たしかに大規模な回路では階層管理が重要ですが、ただ単に部品数が多いだけの回路だと
同じ階層の複数ページ管理のほうが楽なんですが。

それを考えずに1枚しか置けないトップ階層にいきなり回路図入力を始めてしまったので
以降の図面が「中身が空の機能モジュール」へのリンクとして表現されてしまっています。

イメージ 2

しかも、入力の時、デフォルト値のままOKしてしまったので訳の分からない図面名称、ファイル名に・・・
これはちょっと修正できそうにありません

VDPまわり

$
0
0
TMS9918をつかったディスプレイ制御周りの回路を入力。

ここは完全にメーカ推奨回路そのものでいまどき16KbitのDRAM8個でVRAMを構成しています


イメージ 1


初期のDRAM4116はなんと+5/+12/-5Vの3電源が必要です
メモリセルの駆動が12V、外部とのI/Fが+5Vがメインで-5Vはバイアス電圧であまり電流は必要としないはずです
基板上にDCDCを乗せて外部+5V単一動作としたいところですがDCDCが載るスペースが取れそうもありません

エラーチェック

$
0
0
周辺ロジックや電源周りも大体入力完了。
回路図上でERCをかけてみました。

最初は100以上のエラー箇所の指摘が出ましたがほとんどがページ間に渡る信号名を
グローバルラベルで名前を付けていたのに、信号源を定義し忘れ未解決エラーとなったもの。
回路が完成に近づくとこれらはあっという間にかたづいて、残ったものはこんなところ。


イメージ 1

「ピンが接続されていません」
というのはデバイスの未使用ピンやNCピンでオープンのままにしておくものも未接続を明示するために
「×」シンボルを貼っておかなければならないようです

いっぽう「駆動するピンがありません」
は接続されたピン属性が互いに入力だとこうなるのですが1つは自分のミスで自作コンポーネントの
入出力指定が間違っていたのでそれを修正。

電源に関するエラーは電源ラインに電源であることを明示するための「PWR_FLAG」という仮想部品を接続すると
OKのようです


イメージ 2


部品配置

$
0
0
スケマチック図面上でアノテーションをかけてコンポーネントに部品番号付与、
CvPCBツールでコンポーネントとフットプリントの関係性付けしてNETファイル出力
そのNETファイルをPCBnewツールに読み込んでボードレイアウトに展開・・・

とやっていくとボード上に部品を配置するところまで来ました。
NETファイルはスケマチック図面からボード図面の一方通行なので,Eagleのようにいつの間にか
スケマチックとボードの同期が壊れるという心配がありません

基板外形を描いておいて自動配置を実行すると、とりあえず基板上に部品をばらまいてくれます。
位置関係や向きはむちゃくちゃですけど

イメージ 1

これを信号の流れや機能の塊を考慮して部品をコツコツと手動で動かしたのが下の状態です
チップ部品等はんだ面に実装するものはこの時点でフリップしておきます

イメージ 2

なんとか150×100mmの基板に全部品が収まりました

部品作成

$
0
0

以前ダウンロードした初期のKICADは部品ライブラリが貧弱で、対して膨大なライブラリが付属していた
Eagleに比べて見劣りがしましたが、今回落としたKICADVer4.0.3ではライブラリをGithubから参照できるし
ネット上にもあちこちにデータがあるのでそれをローカルに取り込めば大体の用は足ります

ただやはり機構部品などはメーカによって作りがバラバラなので入手しやすいものに合わせて
データを手作りしなければなりません
ここではこんなRCAピンジャックを用意してみます

イメージ 4

まずコンポーネントエディタで回路図中の図記号を作成。

イメージ 1


次にフットプリントエディタで図面を見ながらフットプリントを入力


イメージ 2

このフットプリントに立体モデルを関連付けると基板の完成イメージを3Dで見ることができます
ネット上でピン配置は違いますがRCAジャックの3Dシェープデータがあったので、これをフットプリントの上に
乗せて完成です

イメージ 3



Viewing all 226 articles
Browse latest View live