IchigoJamの出力波形から実行速度をみる + ビデオ信号の観察

IchigoJamで以下のプログラムを実行し、OUT1端子の波形をオシロスコープ FNIRSI-1013D で観察してみた。

```
10 OUT1,1:OUT1,0:GOTO10
```

今回は、以下の製品を用いた。

|製品|ファームウェア|
|---|---|
|IchigoJam U|1.0.0|
|IchigoJam S|1.3.1|
|IchigoKamuy|1.4.1|
|IchigoJam R|1.5b|

# ビデオ出力あり

## IchigoJam U

![IchigoJam U ビデオ出力あり](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/ae9fabe8-ab08-9a27-10e1-f4542b7df992.png)

短い周期と長い周期の部分が交互になっている。
18.7ms中、長い周期の部分は13.6msであった。
18.7msで11回実行できているので、1秒あたり約588回実行できていることになる。

## IchigoJam S

![IchigoJam S ビデオ出力あり](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/81887469-8df9-3351-8c4f-e384742b98f8.png)

短い周期と長い周期の部分が交互になっている。
18.6ms中、長い周期の部分は11.4msであった。
18.6msで9回実行できているので、1秒あたり約484回実行できていることになる。

## IchigoKamuy

![IchigoKamuy ビデオ出力あり](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/3d7e481d-9564-d1ce-a026-71f8d5aee00a.png)

短い周期と長い周期の部分が交互になっている。
18.2ms中、長い周期の部分は11.3msであった。
18.2msで9回実行できているので、1秒あたり約495回実行できていることになる。

## IchigoJam R

![IchigoJam R ビデオ出力あり 1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/db8e5f0b-7eb0-4ed2-fe86-3c0368e631c5.png)

他の3機種ほど目立った差ではないものの、短い周期 (比較的濃い表示) と長い周期 (比較的薄い表示) の部分が交互になっている。
16.7ms中、長い周期の部分は12.0msであった。

![IchigoJam R ビデオ出力あり 2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/7a804077-046d-7564-6836-8c3268701ee6.png)

周期が短いとき、420μsで2回実行できているので、1秒あたり約4762回実行できていることになる。

![IchigoJam R ビデオ出力あり 3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/44b84e0a-2291-2a03-8a34-af44965e99a3.png)

周期が長いとき、511μsで2回実行できているので、1秒あたり約3914回実行できていることになる。

長い周期の部分の割合を考えて平均すると、1秒あたり約4153回実行できていることになる。

# ビデオ出力なし

## IchigoJam U

![IchigoJam U ビデオ出力なし 1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/083c3cd2-8c8b-6c43-ac6a-e363bf274a52.png)

周期のムラがみられなくなった。

![IchigoJam U ビデオ出力なし 2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/99ef8dc2-9a21-c8da-8106-a7c9e9b1857e.png)

2.37msで4回実行できているので、1秒あたり約1688回実行できていることになる。

## IchigoJam S

![IchigoJam S ビデオ出力なし 1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/eab79221-9596-bb3e-95cd-e7f401331acf.png)

周期のムラがみられなくなった。

![IchigoJam S ビデオ出力なし 2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/fc6d1028-384c-d25f-3c31-44472d55106f.png)

2.17msで2回実行できているので、1秒あたり約922回実行できていることになる。

また、IchigoJam U ではHIGHの時間：LOWの時間が約1:2であったが、IchigoJam S では約5:6となっている。
IchigoJam U と比べて `GOTO` 命令にかかる時間は約0.7倍になったものの、`OUT` 命令にかかる時間が約2.5倍になっているようである。

## IchigoKamuy

![IchigoKamuy ビデオ出力なし 1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/fdcccc4f-422e-fa11-4267-dd1b5b492d25.png)

周期のムラがみられなくなった。

![IchigoKamuy ビデオ出力なし 2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/0d4ba9fd-c069-9965-61a0-531e70466138.png)

1.33msで1回実行できているので、1秒あたり約752回実行できていることになる。
IchigoJam S よりさらに `OUT` 命令にかかる時間が伸びている。

## IchigoJam R

![IchigoJam R ビデオ出力なし 1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/c5fa957d-10ef-e248-58b7-1e93e9c7bb29.png)

2.13msで10回実行できているので、1秒あたり約4695回実行できていることになる。

![IchigoJam R ビデオ出力なし 2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/8044bbb7-1f94-3e53-27a3-b6c722ba43ae.png)

やはり、`OUT` 命令にかかる時間は `GOTO` 命令にかかる時間に比べてかなり大きいことがわかる。

## ビデオ信号の調査

ビデオ出力ありのとき、IchigoJam R 以外においては実行の周期に大きなムラがみられた。
そこで、ビデオ出力とは具体的にどのような信号なのかを観察してみた。

# オシロスコープでの観察

まずは、IchigoJam R について、VDO1端子をCH1、VDO2端子をCH2として観察を行った。

![ビデオ信号 1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/701dd964-fa4a-d599-7933-eacaa70eb45b.png)

まず、約16.7msごとにVDO1端子に比較的大きい谷がみられた。

![ビデオ信号 2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/2c6265e3-f2ac-36ef-24f7-1d8045f0e8ba.png)

拡大すると、約63.7μsごとにVDO1端子に谷があり、谷と谷の間でVDO2端子が何らかの信号を送っている様子がみられた。

![ビデオ信号 3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/17fce678-1dd0-a103-f5ed-f3085b167e75.png)

さらに拡大すると、VDO2端子の信号の幅は最小で約150nsらしいことがわかった。

## ロジックアナライザでの観察

ビデオ信号がどの程度の速さの信号かがわかったので、
[USBロジックアナライザ - 24 MHz/8チャンネル（Type C コネクタ） — スイッチサイエンス](https://www.switch-science.com/products/7642)
でキャプチャしてみることにした。
CH0をVIDEO1/VID1、CH1をVIDEO2/VID2に接続し、さらにCH2を最初に提示したプログラムを実行中のOUT1に接続した。
24MHzでのキャプチャを行った。

### IchigoJam U

![IchigoJam U ビデオ信号 1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/ae7165f5-0400-fd2f-08ef-608814afd410.png)

VIDEO1では、約61.3μsのLOWの後に約2.3μsのHIGHを出力するパターンを11回 (700.5μs) 繰り返した後、約63.7μsのLOWを出力し、
約4.7μsのLOWの後に約59.0μsのHIGHを出力するパターンをしばらく (15856.5μs) 繰り返す、というパターンがみられた。

![IchigoJam U ビデオ信号 2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/ac393f47-1a62-0dd3-004a-714cda331c3d.png)
![IchigoJam U ビデオ信号 3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/f72c31c4-9ca9-659f-0ac6-60dcb797892c.png)
![IchigoJam U ビデオ信号 4](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/4f911b2d-5b2e-fddc-890b-d6a6990289a5.png)

VIDEO2では、VIDEO1がLOWからHIGHになった後一旦パルスを送り、その後VIDEO1がHIGHの間に何らかの信号を送っている様子がみられた。

また、4457.2μsの間VIDEO2がLOW固定になり、この間OUT1の信号の周期が短くなる様子を観察できた。

### IchigoJam S

![IchigoJam S ビデオ信号 1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/296fbeaa-e146-0df9-63b9-aa60d2a292a4.png)

VIDEO1では、約61.3μsのLOWの後に約2.3μsのHIGHを出力するパターンを12回 (764.8μs) 繰り返した後、約63.7μsのLOWを出力し、
約4.7μsのLOWの後に約59.0μsのHIGHを出力するパターンをしばらく (15793.3μs) 繰り返す、というパターンがみられた。

![IchigoJam S ビデオ信号 2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/8168241d-6178-2ea6-8d57-9e94fcac3322.png)
![IchigoJam S ビデオ信号 3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/ebdd9d59-bffd-1051-363e-bdaf013fe5a4.png)
![IchigoJam S ビデオ信号 4](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/191b4169-dbd0-ebeb-9de1-6446f55b34ae.png)

VIDEO2では、VIDEO1がHIGHの間に何らかの信号を送り、VIDEO1がLOWになる前後ではHIGHになる様子がみられた。

また、4410.0μsの間VIDEO2がHIGH固定になり、この間OUT1の信号の周期が短くなる様子を観察できた。

### IchigoKamuy

![IchigoKamuy ビデオ信号 1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/21383709-628b-8c8c-8bc8-75477e11861b.png)

VIDEO1では、約61.3μsのLOWの後に約2.3μsのHIGHを出力するパターンを11回 (701.0μs) 繰り返した後、約63.7μsのLOWを出力し、
約4.7μsのLOWの後に約58.8μsのHIGHを出力するパターンをしばらく (15856.8μs) 繰り返す、というパターンがみられた。

![IchigoKamuy ビデオ信号 2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/17f9e2d4-0442-f9ec-bfe3-005c104af24b.png)
![IchigoKamuy ビデオ信号 3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/abb0ff96-7458-c076-07c4-a7f321e45b02.png)
![IchigoKamuy ビデオ信号 4](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/8969ebc3-331b-78d0-9a42-eb003424df93.png)

VIDEO2では、VIDEO1がHIGHの間に何らかの信号を送り、VIDv1がLOWになる前後ではHIGHになる様子がみられた。

また、4408.7μsの間VIDEO2がHIGH固定になり、この間OUT1の信号の周期が短くなる様子を観察できた。

### IchigoJam R

![IchigoJam R ビデオ信号 1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/2880f848-3c52-f3fc-7d26-ab3577995a94.png)

VID1では、約59.0μsのLOWの後に約4.6μsのHIGHを出力するパターンを3回 (190.7μs) 繰り返した後、
約4.8μsのLOWの後に約59.0μsのHIGHを出力するパターンをしばらく (16466.3μs) 繰り返す、というパターンがみられた。

![IchigoJam R ビデオ信号 2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/225c8d14-8d92-3703-7ca8-233a1cd3a336.png)
![IchigoJam R ビデオ信号 3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/5bb4aa1a-c1a0-412d-1290-53d8b9321150.png)
![IchigoJam R ビデオ信号 4](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/860d85e3-e34e-955b-83ae-4ada8c1c84d9.png)

VID2では、VID1がHIGHの間に何らかの信号を送っている様子がみられた。
他の機種とは違い、送る信号が無いときにVID2が周期的にHIGHになることはないようである。

Ichigojam R ではOUT1端子の周期の変化が小さく、関係を観察するのは難しそうである。

# まとめ

今回の実験において、各製品ごとの、1秒あたりOUT1端子の信号がHIGHになった回数は、以下のようになった。
「信号周波数比」は、ビデオ出力ありのIchigoKamuyの信号周波数を1としている。

|製品|信号周波数<br>(ビデオ出力あり)|信号周波数<br>(ビデオ出力なし)|信号周波数比<br>(ビデオ出力あり)|信号周波数比<br>(ビデオ出力なし)
|---|--:|--:|--:|--:|
|IchigoJam U|588|1688|1.188|3.410|
|IchigoJam S|484|922|0.978|1.863|
|IchigoKamuy|495|752|1.000|1.519|
|IchigoJam R|4153|4695|8.390|9.485|

IchigoJam U 以外については、
[IchigoJam速度比較 ～IchigoJam Rが10倍速いってマジ？～ - Qiita](https://qiita.com/mikecat_mixc/items/eb1786dc384d579b7705)
での結果とだいたい同じ信号周波数比 (相対速度) となった。
一方、IchigoJam U においては、IchigoJam S や IchigoKamuy より高速という結果が得られた。
これは、最近のバージョンの `OUT` 命令は前のバージョンより多機能であり、その分遅いためであると考えられる。

ビデオ信号の仕様は製品によって変わらないと予想していたが、予想に反して以下のような違いが見られた。

|製品|VIDEO1の<br>長いLOWの回数|VIDEO1の<br>長いLOWの区間の最後|VIDEO1の<br>長いLOW前後のVIDEO2|VIDEO1の<br>短いLOW前後のVIDEO2|
|---|---|---|---|---|
|IchigoJam U|11+1|LOW|LOW|立ち上がり後短いHIGH|
|IchigoJam S|12+1|LOW|HIGH|LOW前後でHIGH|
|IchigoKamuy|11+1|LOW|HIGH|LOW前後でHIGH|
|IchigoJam R|3|HIGH|LOW|LOW|

IchigoJam R 以外においては、VIDEO2が信号を送るとき実行が遅くなる様子が観察できた。
Rを除くIchigoJamシリーズでは48MHzで動作するマイコンが使われており、6MHzで切り替わる信号では1回の切り替えあたり8クロックしかない。
したがって、この切り替えのたびに割り込みをかけるのは難しそうである。
よって、VIDEO2が信号を送っている間は信号を送る処理に集中するためBASICのプログラムは実行されず、BASICのプログラムは信号を送る処理の合間をぬって少しずつ実行されるため、遅くなると考えられる。

一方、IchigoJam R においては、
[IchigoJam R ＆ IchigoSand 発表、HHKB他USBキーボード対応するRISC-V版、Zen言語でかんたんマシン語両対応 zen4ij](https://fukuno.jig.jp/3077)
に

> ビデオ信号の出力が、DMA（Direct Memory Access）によって空いちゃいました。 

という記述があり、VID2が(DMAを用いて)信号を送っている間にも並行でBASICのプログラムを実行していると考えられる。
今回掲載した画像からも、VID2が信号を送っている最中にOUT1が変化している、すなわちBASICのプログラムが実行されていることがわかる。

# おわりに

※IchigoJamはjig.jpの登録商標です。
※IchigoKamuyは株式会社syushuの登録商標です。