
2026/03/21 4:20
**BIO:** *バオI/Oコプロセッサ*
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
(抜けている詳細を含める)**
Summary
BIO は、Baochip-1x システム・オン・チップにおいて Raspberry Pi スタイルの PIO を置き換える軽量で RISC‑V ベースの入出力共処理装置です。CISC スタイルの PIO が XC7A100 FPGA のロジックセルの 50 % 超を消費し、動作が遅いのに対し、BIO は Artix‑7 上で約 14 k セルのみを使用し、同一プロセスノードで少なくとも 4 倍以上高速に稼働します。
設計は 4 つの同一コア から構成され、それぞれが 4 KiB の命令メモリを備えています。各コアは 16 個の汎用レジスタ (r0–r15) を公開し、r16–r31 は FIFO ヘッド/テイル、量子/割り込み同期、GPIO 制御、およびイベント処理に使用 されます。ブロッキングレジスタ (x16‑x19 が FIFOs、x20 が量子、x30 がイベント) により、コアは条件が満たされるまで停止でき、サイクルカウントなしで決定的なタイミングを実現します。
C ツールチェーン(Zig/Clang)はプログラムを Rust アセンブリマクロにコンパイルし、BIO 上で実行可能にするため、WS2812 LED ドライバや固定小数点演算などの高レベル I/O コードが利用でき、「量子」レジスタを通じて決定的タイミングを保持します。BIO はオープンソースかつ特許フリーで、標準 RISC‑V ツールチェーンを活用し、Arty A7‑100T などの小型 FPGA にも十分に収まります。主 CPU からプロトコルスタック管理をオフロードすることで設計の複雑さが軽減され、従来の PIO ソリューションよりも性能が向上します。
本文
BIO – Baochip‑1x の I/O コプロセッサ
概要
-
何か
PicoRV32(RV32E)コアを4つ搭載した RISC ベースの I/O コプロセッサ。GPIO、FIFO、イベント、および DMA を処理します。 -
なぜ必要か
Raspberry Pi の PIO に比べてロジック面積を小さく抑えつつ、決定的でクロック周期単位の I/O 処理を実現するためです。
主な概念
| 機能 | PIO | BIO |
|---|---|---|
| 命令セット | 9 個の CISC スタイル命令 | RV32E RISC + 独自拡張 |
| コア数 | 4 台が 1 つの 32 エントリプログラム ROM を共有 | 4 台の独立コア、それぞれ 4 KiB の専用コードメモリを持つ |
| FIFO / イベント処理 | 各コアに組み込み型 FIFO(深さ8) | ブロッキングレジスタ経由でアクセスする共有 FIFO(深さ8) |
| クロック周波数 | 1 コアあたり約 100 MHz | Arty A7‑100T 上で最大 700 MHz |
| 面積 | 約 39 k LUT (FPGA) | 約 15 k LUT (FPGA) |
| リアルタイム保証 | クロック周期単位の命令により実現 | ブロッキングレジスタ (, ) による実現 |
レジスタマップ(各コア)
| レジスタ | アクセス | 意味 |
|---|---|---|
| x16–x19 | r/w (ブロッキング) | FIFO ヘッド/テイル – 空/満杯時に読み書きでブロック |
| x20 | -/w | halt to quantum – クロック分周パルスまたは外部イベントまで待機 |
| x21–x26 | GPIO 制御 & マスク | 書き込み: マスク適用 → ピン設定/クリア/方向; 読み取り: 現在のピン状態 |
| x27 | -/w | イベント感度マスク |
| x28 | -/w | 事件ビットをセット(0‑23 のみ有効) |
| x29 | -/w | 事件ビットをクリア |
| x30 | r/- | halt to event – マスクされたイベントが発生するまでブロックし、イベント値を返す |
| x31 | r/- | コア ID (bits 31:30) とリセット以降の CPU クロック周期数 |
例:FIFO を使った DMA
bio_code!(dma_mc_copy_code, DMA_MC_COPY_START, DMA_MC_COPY_END, "20:", "lw a0, 0(x16)", // FIFO0 から読み込み "sw a0, 0(x17)", // FIFO1 に書き込み "j 20b" );
- コア A:
(FIFO0)からソースデータを読み取り、x16
(FIFO1)へ書き込む。x17 - コア B:
にアドレスを生成。x16 - コア C:
への書き込みアドレスを生成。x17
3 コアが並列で動作するため、単一コアより高い DMA 帯域幅を実現します。
例:SPI ビットバンギング
// TX + クロック (コア 1) "82:", "li x1, 0x700", // データピン用マスク "mv x26, x1", // マスクレジスタへ設定 ... "20:", "mv x15, x16", // FIFO から次のバイトをロード ... // シフト&GPIO 切替
// RX (コア 2) "31:", "and x8, x6, x21", "bnez x8, 31b", // CS が低になるまで待機 ...
両コアとも quantum (
x20) を利用して SPI クロックと同期します。
C‑for‑BIO
-
Zig ツールチェーンをインストール
python3 -m pip install ziglang # 0.15 が唯一動作するバージョン -
C プログラムを Rust マクロへビルド
python3 -m ziglang build -Dmodule=<your-program> -
例:WS2812 LED ドライバー
void ws2812c(uint32_t pin, uint32_t *strip, uint32_t len) { if (pin > 31) return; uint32_t mask = 1 << pin, antimask = ~mask; set_gpio_mask(mask); set_output_pins(mask); clear_gpio_pins_n(antimask); wait_quantum(); for (uint32_t i = 0; i < len; i++) { uint32_t led = strip[i]; for (uint32_t bit = 0; bit < 24; bit++) { if ((led & 0x800000) == 0) { /* low pulse */ } else { /* high pulse */ } led <<= 1; } } }
プログラムは quantum を利用して、手動でクロックカウントを行わずに正確なタイミングを実現します。
トレードオフまとめ
| 項目 | PIO | BIO |
|---|---|---|
| 面積 | 大きい(≈39 k LUT) | 小さい(≈15 k LUT) |
| クロック周波数 | 約 100 MHz | 最大 700 MHz |
| 命令 IPC | 1 (CISC, 1 命令/サイクル) | 0.2–0.33 (RISC, 複数命令) |
| リアルタイム決定性 | クロック周期単位の命令で容易 | ブロッキングレジスタにより実現 |
| ツールチェーン | 独自、コンパイラ無し | 標準 RISC‑V + Rust マクロ |
| オープンソース | クローズド / 特許制約あり | 完全オープン、特許フリー |
はじめに
- ハードウェア – Baochip‑1x (Arty A7‑100T) または Dabao 開発ボード。
- ソフトウェア – GitHub リポジトリ
,bio-lib
,rtl/
をクローン。tests/ - 開発手順 – Rust + Zig C ツールチェーンを使用し、コンパイル・ロードして決定的 I/O 動作を確認。
BIO でハッキングを楽しんでください! Happy coding.