👏

HW高位合成ツールを使ってnand2tetrisのCPUを動かしてみる 6

に公開

の続き

UART入出力を備えた全体のアーキテクチャ

試行錯誤の結果[1]、 UART入出力を備えた全体のアーキテクチャは以下のようにする。

  • Hack CPU UART
    UART I/F付きのCPU。各サブモジュールはtaskと名前がついているように、Vitis HLS のhls::taskライブラリを使用して実装し、並列に動作するようにする。各サブモジュール間はAXISで接続する。
    • CPU task
      nand2tetrisで設計するCPUコア部分。Claudeで出力させたソースを元に、プログラムロード、Runおよび停止などのコマンドを受け付けられるようにしている。
    • UART I/F
      FPGAではXilinx社提供のIP UART liteとAXIで接続し、USB-Serialを介してホストとUART通信を実施する。C-Simulator時には、C言語でOS上の仮想端末と通信する。
    • UART in task
      UART I/Fからキャラクタを受け取り、コマンドの字句を解析しCPU taskにコマンドを投げる。また、キーボード入力を示すキャラクタが入ってきた場合には、キーコードを抽出してPeripheral taskに投げる。
    • Peripheral task
      キーボード入力をCPU taskに渡す。またCPU taskから来たDisplay出力をUART out taskに渡す。
    • UART out task
      Peripheral taskを経由してDisplayへの出力を受け取り、UART I/Fに流す。逐一真面目に流すとものすごい通信量となるので、アドレスがインクリメントされた場合、データが前のアドレスと同じ場合の時などは差分のみ送るようなフォーマットを考え、ここで変換している。

アーキテクチャを設計したというよりは、今できるスキルでビルドアップして行ってなんとかこの形にたどり着いたという感じ。最適な形ではないだろうが、HW設計1年生だし追々ブラッシュアップして行きたい。
hls::taskを使うことで、C-simulation上でも各taskをマルチスレッドでHW likeに同時並行的に動かすことが簡単に出来た。でもFPGAへの合成時に色々と制約が多そうで、本当は避けた方がいい設計なのかもしれない。

C言語で設計することの隠れたメリット

HW設計にC言語を使うことで、OS上の機能と簡単に連帯ができるところが隠れたメリットではないかと感じた。今回の場合、C-Simulationコードの一部として仮想端末とやりとりするコードを書いて[2]、シームレスに動かすことができた。C言語お得意のifdefを使って、FPGA向けの合成時にはそのコードの代わりにUART lite IPにアクセスするコードを使えば良い。Ethernetを使用した設計などにも応用ができそうである。[3]

次回へ続く

脚注
  1. スクラップ&ビルドを繰り返し半年以上かかってしまった。 ↩︎

  2. 書いたというのは語弊がありました。Claudeに書かせたです。 ↩︎

  3. 私が知らないだけで、vivadoなどでHDL設計を用いても同じようなことはできるのかもしれないが。 ↩︎

Discussion