onbmotorsのメモ

onbmotorsのメモ

電子工作とかマイクロマウス関連のメモ書き。

「CPUの創りかた」を読んでエミュレータを作成してみた(simulink)

以前「CPUの創り方」を読んで実際にハードウェアを作ってみました。

今回はsimulinkの練習をかねてエミュレータで回路を再現してみました。

simulinkの使い方をまとめたようなものではないですが、ただの活動の記録として残します。

作成するエミュレータの概要

エミュレータといっても実現の仕方にいくつか段階があるようです。

下記のURLでは大まかに3種類程度に分類してます。

トランジスタの電圧変動をリアルタイムに忠実に再現する

・クロック毎の論理ゲートのON/OFFを再現

機械語を実行した結果レジスタがどうなるか再現

sikakuisankaku.hatenablog.com

今回は上から2つ目のゲートのon/offレベルでのエミュレータを作っています。(simulinkのブロックに論理ゲートがたくさんあったので試しに。)

完成したたもの

下の図がつくったものです。

f:id:nantakosu5656:20201130200635p:plain

左上に実行中の命令、中央上部にプログラムカウンタ値、右上に出力ポート(LED風、青色がON)を表示しています。

各ブロック(subsystem)はROM,デコーダレジスタ、マルチプレクサ、ALUを表していてブロック間の通信をバスオブジェクトなどでつないでます。バスオブジェクトの中身はROMから読み出した命令や即値、ALU演算結果などです。

各ブロックの中身は基本的には論理ゲートで構成されています。例えば以下はROM用のセレクタ回路です。

f:id:nantakosu5656:20201130201222p:plain

 

上図のようにbit単位で実装しているため 線が増えて出力が見づらくなってしまいます。そのためsubsystemから外に出す際には下記のようにバスにまとめてしまいます。

f:id:nantakosu5656:20201130203309p:plain

 

下図はレジスタの中身です。少しさぼってライブラリのD-FFブロックを使っています。

f:id:nantakosu5656:20201130201545p:plain

作るのが少し難しかったのはタイミングの設計部分です。

実機であれば電圧の立ち上がり時間の遅延を考慮して?実現されている部分は遅延ブロックを使って再現しています。このへんはちょっと胡散臭いですが、この規模の回路であればなんとか動かせるかな。。(あまり知見がなく、うまい実現方法がわかりませんでした)

f:id:nantakosu5656:20201130201909p:plain

終わりに

simulinkはほとんど使ったことなかったですが、会社終わりに作業して大体3週間くらいで実装できました。初めてモデリングする場合は身近なもの??とかよく知ってるものをベースにすると出力結果の妥当性が検証しやすいのでいいかな~思いました。

また、今回はあまり気にしませんでしたがembedded coderでコードを出力する場合などは、subsystemの設定やバスの設定が出力結果に大きな影響を与えるようです。(atomicサブシステムやバーチャルバスの設定によって.cファイルや構造体が生成されたりされなかったり)

ちょっと使ってみたいけど一般向けに販売されてないのが残念。

マウサーだと一年くらいライセンスが提供してもらえるらしいけど、社会人でも可能なんだろうか。