パスワードを忘れた? アカウント作成
14252613 journal
日記

kitune-sanの日記: 8253をSystemVerilogで書いてみた

日記 by kitune-san

前回の続き
スター投げてくれた方、ありがとうございます。

今度はインターバルタイマ。
古くはDMAと組み合わせてPCのDRAMリフレッシュや、ブザーを鳴らすのに使われていたIC。
レートジェネレータ2つとRS-FFを組み合わせてPWM波形を作ったりもできるはず。

正直手を出すのが早すぎたかな。と思った。
恥ずかしいけど上げちゃう。
https://github.com/kitune-san/KF8253

まずはじめに問題になったのは、各カウンタのクロックをどうするかということだった。
各カウンタそれぞれが非同期で入力されることを想定するかどうかで方法が変わってしまう。
結局非同期クロックの回路間のデータ転送でしくじりそうだったので、共通の"メイン"クロックの立ち下がり毎に"各カウンタ"のクロック入力を監視する構成とした。
この結果、入力できるクロックの周期は 1 / (メインクロック周波数) x 2 + 回路遅延 よりも大きくしなければならないという制約がつくことになった。
(ただしメインクロックから分周したクロックに限り 1 / (メインクロック周波数) の周期も可能だと思う)
非同期のクロックを入力する場合は、2段のF/Fを挿入するなどのメタステーブルの対策を必要とし、この場合には実際のクロックエッジからカウントまでの遅延時間がF/F分大きくなるが、
今回はこれで問題ないことにした。一番手っ取り早いのは、メインのクロックを上げてしまうことである。え、組み合わせ回路の遅延が大きくてそんなにはやくできない?ごめんよ。。。

次にカウンタのデクリメントの回路をどうしようかということだった。
8253のカウントではモードによっては-2や-3の減算を行う必要があった。またバイナリ(2進)の減算だけでなくBCDの表現で減算する必要もある。
BCDカウンタを書き込んだ時点で2進数の表現に変換しようかとも考えたが、これらの変換処理で何クロックかかかるため断念した。
次に減算を-1に固定して波形出力が変化する条件などの回路側を変更することを考えたが、カウントの読み出し結果などがオリジナルから変わりすぎるのでボツにした。
結局-1の減算回路を2つ直列につないだような回路となった。これが各カウンタで3つあるため、LEの消費が大きくなっていると思う。もう少し効率的にできないか考えたい。

正直、データシートの内容だけでは情報が不足しているように思う…。ちゃんと読んでいないだけってのもあるけど…。
いくつかの動作はオリジナルがどうなっているかわからなかったため異なった動作になっていると思う。
現物にトグルスイッチとオシロつなげて確認しようかと思ったが…地獄でしかないので途中で諦めた。
あとで気づいたけど8254のほうが細かく説明があるように思うので参考に見てみたい。

リセット入力はこのまえいろいろアドバイス頂いたので、考え中…。とりあえず前回の8255を同じにした。

あと想定より、信号がどんどん増えてしまったので、名前が雑…。そのうち直したい。

8255の動作確認も含めて現物にコンフィギュレーションして確認したいけどどのようにする検討中。
上記のようにトグルスイッチでやる方法はきついので他の方法を。内部にロジアナを埋め込む機能と簡単なステートマシンでできそう。

シュミレーションだけだけど、想定したようにデータが移動していくのをみるのは楽しいね。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

日本発のオープンソースソフトウェアは42件 -- ある官僚

読み込み中...