福野泰介の一日一創 - create every day

DAISOのモバイルバッテリーでどれほど持つか? IchigoJamスピードパックに最適なバッテリーを探すプログラム

2018/11/12
#IchigoJam #maker 

沖縄高専で初活躍、IchigoJamスピードパック
ただ、一部モバイルバッテリーがすぐに切れてしまうトラブル発生。
プログラムが動いている間、保存し続けるIchigoJam BASICのプログラムを使って、バッテリーの持ちを検証した。

15秒で起動完了、IchigoJamスピードパック

10 N=0 20 WAIT60*60 30 N=N+1:?N 40 POKE#FFE,N,N/256 50 SAVE 60 GOTO20 100 N=PEEK(#FFE)+PEEK(#FFF)*256:?N

バッテリーチェックプログラム
10-40行 1分ごとにプログラム領域の最後(#FFEと#FFF)に動いていた分数を書き込む
50-60行 そのプログラムを保存することで止まるまでの時間を記録し、くりかえし
100行 電源が切れたあと、電源を入れ直しLOADして、GOTO100でチェックできる

40行の /256 は >>8 、100行の *256 は <<8 へと置き換え可能。
BASICの場合、ビット演算を使っても使わなくても速度に大差ないけど、使えるとかっこいい。

DAISOの500円3,000mAhモバイルバッテリーを8つチェックした結果
130分前後3つ、90分前後3つ、154分持つもの、47分しかもたないものとばらつきがあり。
90分もってくれれば、45分授業2コマで使える計算。・・・でも、もうちょっと余裕がほしいところ。

祝!新世代ベーマガ単独復活! IchigoJam BASICとArmマシン語で電子工作するフルカラーバーサライタ実装例「ねこPOV」

2018/11/08
#IchigoJam #KidsIT #maker 

書いてあることはよくわからないけど、打ち込めば手元で動く数々のゲームに熱中した30年前。
打ち込んで、Syntax error や、謎のフリーズと戦っている内に自然と身についたプログラミング。
ラ製ことラジオの製作から65年、あのベーマガがついに単独復活!?という大ニュース!

ハードもソフトも扱うのが新世代ベーマガ(電子工作マガジン)の特徴です。
記念にIoTスティックを振って浮かびあがる、人気のかわくだりゲームの主人公「ねこ」製作。

人の目の残像現象を利用したバーサライタ(またはPOV)という技術。動画でどうぞ!

浮かぶ「ネコPOV」の作り方
1. WS2812BでIoTスティックをつくる
2. プログラムする

10 POKE#700,240,181,68,24,90,32,12,73,114,182,128,37,35,120,1,52,255,34,74,96,3,39,10,38,43,66,1,208,10,39,3,38,1,63,253,209,0,34,74,96,1,62,253,209,109,8,239,209,1,56,234,209,98,182,240,189,0,0,1,80 15 POKE#704,16*3:V=120 20 LET[0],236,249,250,249,250,237,240,241,235:M=0:C=[M] 25 R=RND(V):G=RND(V):B=RND(V) 30 CLS 40 FORJ=0TO7:FORK=0TO7:IF PEEK(C*8+K)>>(7-J)&1 POKE#900+16*3*J+(15-K)*3,G,R,B 50 NEXT:NEXT 60 N=0 70 U=USR(#700,#900+N):N=N+48:IF N<768 CONT 80 IF !BTN() GOTO 60 90 M=M+1:C=[M]:IF C=0 M=0:C=[M] 100 GOTO 25

10行 WS2812B用ドライバ、Armマシン語
15行 書き込むLED数設定
20行 ボタンを押すごとに変わるキャラクター(左右対称のものを選択)
25行 色をランダムに
30行 VRAMクリア
40-50行 浮かび上がらせる文字を発光用のデータに変換
60-70行 WS2812Bドライバに送るデータを順に切り替えることでバーサライタ表示
80-100行 ボタンが押されていたらキャラクター切り替え

3. 振る!ボタンを押すごとに色とキャラクターが変わります

ねこPOV on MeganeJamIchigoJamの鯖江ご当地互換機!

4. あとは自由に改造ください!
7色に輝かせる?自分のオリジナルキャラクターを表示する?
バーサライタのみであれば、スティック先端に8コWS2812Bを貼り付けて、オフセットをなくす改造がオススメ!


日本で唯一のこどもむけ電子工作専門季刊雑誌「電子工作マガジン」次号はなんと別冊化!楽しみですねっ
エレクトロニクス業界の灯台 電波新聞社
今投稿すれば別冊初号への掲載、間に合うかも!?

2015年、12年ぶりにコーナーとして復活してから、3年!新世代ベーマガ世代を産んでいます!
「ベーマガ」復活!? 「電子工作マガジン」の1コーナーに - ITmedia NEWS

2020年、小学校でのプログラミング必修化をきっかけに増える新世代クリエイター!
小学校プログラミング授業の通奏低音 ー 全部IchigoJam !!!! | Peatix
今月末、東京都小金井市の前原小学校で、小学校で使われるIchigoJamの公開授業&講演会開催です!

links
- MeganeJamづくりTIPSとちょっと改造法 at 鯖江Hana道場
- マシン語でLEDを光らせよう! - IchigoJamではじめるArmマシン語その4

さばえ博・SDGs・ネクタイ - さばえものづくり博覧会2018

2018/10/26
#IchigoJam #maker #js #kosen 

もの博、さばえものづくり博覧会2018


鯖江のものづくり技術で活躍する、福井高専生の後輩!


0.5mの格子状に切断した銅板を使った、LED CUBE by 鯖江工業所
ぜひキット化してもらいたいっ


キビキビといい動きのロボが支えるモノの生産現場!


近畿経済産業局の局長、森さんご来鯖記念に、主催商工会議所との意見交換会がありました。
近畿経済産業局長森清様との意見交換会、 | 『さばえ.jp』百さんのブログです


近畿経済産業局長を囲む会!


眼鏡産業、ウェアラブル手がけるボストンクラブ!


漆器産業、間伐材でSDGs!ものづくりのまち、端材の有効利用もおもしろいテーマ!


漆器産業で活躍、3Dプリンター。試作から商品化された事例展示!


繊維産業、Hana道場は、国登録文化財、旧鯖江地方織物検査所の2Fです


食も楽しい鯖江、日本酒の梵ブース、GOLDのストラップは珍しい!


中学校の見学デー、鯖江にはおもしろいもの多いんです!
いいものを活かした次の研究にも熱心な鯖江。


電通大、ARドッジボール、参加者募集!


電通大のニョロニョロしたアクチュエーター。熱で伸縮する形状記憶合金を利用。大きいものとかあれば、触覚にしっぽに楽しそう。 光るだけじゃなく動くネクタイに!


時計の進む速さを操って、人を操る研究!
時計好きにはうれしい出会い!
時間を止められる時計」「ログ表記時計」「zoomclk


福井工大の反応速度調べ。じゃんけんに負けてという指示で0.5秒切れるか!?
IchigoJamで実装するのも楽しそうっ


福井大学、自動演奏ロボ「MUSICROBOT


駆動に使われている強力そうなソレノイド!


光るネクタイをきっかけに、持続可能なものづくり社会、SDGsカラーに輝くIoTieの商品化プロジェクト始動!


SDGsカラー、データ化&アプリ化しました「goals17 with sq-game.js

1 貧困をなくそう E5243B 2 飢餓をゼロに DDA63A 3 すべての人に健康と福祉を 4C9F38 4 質の高い教育をみんなに C5192D 5 ジェンダー平等を実現しよう FF3A21 6 安全な水とトイレを世界中に 26BDE2 7 エネルギーをみんなに そしてクリーンに FCC30B 8 働きがいも 経済成長も A21942 9 産業と技術革新の基盤をつくろう FD6925 10 人や国の不平等をなくそう DD1367 11 住み続けられるまちづくりを FD9D24 12 つくる責任 つかう責任 BF8B2E 13 気候変動に具体的な対策を 3F7E44 14 海の豊かさを守ろう 0A97D9 15 陸の豊かさも守ろう 56C02B 16 平和と公正をすべての人に 00689D 17 パートナーシップで目標を達成しよう 19486A


単4電池x3を電源に、3.3VレギュレーターでCPUは駆動するよう改造。

5 POKE#700,240,181,68,24,90,32,12,73,114,182,128,37,35,120,1,52,255,34,74,96,3,39,10,38,43,66,1,208,10,39,3,38,1,63,253,209,0,34,74,96,1,62,253,209,109,8,239,209,1,56,234,209,98,182,240,189,0,0,1,80 10 S="E5243BDDA63A4C9F38C5192DFF3A2126BDE2FCC30BA21942FD6925DD1367FD9D24BF8B2E3F7E440A97D956C02B00689D19486A" 20 FOR I=0 TO 16 25 FOR J=0 TO 2 26 A=S+I*6+J*2 30 C=ASC(A):GSB@HEX:N=C<<4 31 C=ASC(A+1):GSB@HEX:N=N+C 32 POKE#800+I*3+J,N 35 NEXT 40 NEXT 999 END 1000 @HEX:C=C-48-(C>64)*7:RTN 100 V=0:Y=1 110 FOR I=0 TO 16 115 A=#800+I*3 120 R=PEEK(A):G=PEEK(A+1):B=PEEK(A+2) 130 R=R*V/50:G=G*V/50:B=B*V/50 '135 ?HEX$(R),HEX$(G),HEX$(B) '140 POKE#800+52+I*3,G,R,B 140 POKE#800+52+20*3-I*3,G,R,B 150 NEXT 160 U=USR(#700,#800+52) 170 V=V+Y:Y=Y-2*Y*(V%16=0) 180 GOTO 110

前半、SDGsの色を16進数からデータ化する部分。あらかじめデータにしておけば、短縮可。
140行、表示する向きを変更可能

links
- IoTネクタイの作り方

光るネクタイ IoTie 小型化 ver1.1

2018/10/25
#IchigoJam #maker 

キラキラとさり気なく光るネクタイは、イチゴ帽子と比べて汎用性が高い。
1日着けて歩いて見ると、やはりケーブルで外部につながっていると邪魔で、断線リスクあり。


ということで、一体化させてバージョンアップ、名付けて「IoTie(アイオータイ)」ver1.1


お手軽に小型化として、IchigoJamのマイコン、LPC1114FN28をそのまま使いました。
お好みで、IchigoDakeや、IchigoJam ZeroでもOK!


2本だけジャンパー、自動起動のためのGND-BTN間は、緑
VCCを左右接続するためには、白がちょうどよい感じ。
ブレッドボード・ジャンパーワイヤ 14種類×10本ブレッドボード・ジャンパーワイヤ 14種類×5本 @秋月)


あとはマイコンへ書き込み。
USBシリアルで書き込む他、IchigoJam UやTでICソケットを使うのもOK!

ひとまずIoT分を一旦消して、光らせないオフセット(O)を0にしてプログラム。BTNによる輝度操作もなし。

10 POKE#700,240,181,68,24,90,32,12,73,114,182,128,37,35,120,1,52,255,34,74,96,3,39,10,38,43,66,1,208,10,39,3,38,1,63,253,209,0,34,74,96,1,62,253,209,109,8,239,209,1,56,234,209,98,182,240,189,0,0,1,80 11 CLV:L=30:O=0 12 POKE#704,L*3 14 Y=5 15 H=180:S=100:W=0 16 T=60 17 A=12 18 FOR I=1 TO L 20 W=W+Y:IFW%100=0Y=-Y 21 V=W*T/100 30 GSB@HSV2RGB 50 Z=#840+O*3:POKEZ,G,R,B:COPYZ+L*3-1,Z+L*3-4,-L*3+3 60 U=USR(#700,Z-O*3) 70 WAIT 5 80 NEXT 85 H=(H+A)%360 90 GOTO17 'use H,S,V,R,G,B,C,D,E,F 100 @HSV2RGB:R=V:G=V:B=V:IF S=0 RTN 110 D=H/60%6:C=V-(59-H%60)*V/60*S/100:E=V-H%60*V/60*S/100:F=V*(100-S)/100 120 IF!DG=C:B=F 130 IFD=1R=E:B=F 140 IFD=2R=F:B=C 150 IFD=3R=F:G=E 160 IFD=4R=C:G=F 170 IFD=5G=F:B=E 180 RTN

着けてみると割といい感じだけど、単3電池ボックスはちょっと重かった・・・。
単4電池ボックススイッチ付きがオススメです。

IoTネクタイの作り方

2018/10/24
#IchigoJam #maker #IoT 

IoTを着る時代。
ネクタイをネットにつないで、自由自在なカラーコーディネートを楽しみましょう。

材料は、IchigoSodaとフルカラーテープLED「WS2812B」と線材少々、軽めのモバイルバッテリー。

まずは光るネクタイプログラム、じんわり光らせるようチューニング

10 POKE#700,240,181,68,24,90,32,12,73,114,182,128,37,35,120,1,52,255,34,74,96,3,39,10,38,43,66,1,208,10,39,3,38,1,63,253,209,0,34,74,96,1,62,253,209,109,8,239,209,1,56,234,209,98,182,240,189,0,0,1,80 11 CLV:L=30:O=8 12 POKE#704,L*3 14 Y=5 15 H=180:S=100:W=0 16 T=20 17 A=10 18 FOR I=1 TO L 19 IF BTN() ?T:WAIT20:T=T+20:IFT>80T=20 20 W=W+Y:IFW%100=0Y=-Y 21 V=W*T/100 30 GSB@HSV2RGB 50 Z=#840+O*3:POKEZ,G,R,B:COPYZ+L*3-1,Z+L*3-4,-L*3+3 60 U=USR(#700,Z-O*3) 70 WAIT 5 80 NEXT 85 H=(H+A)%360 90 GOTO17 'use H,S,V,R,G,B,C,D,E,F 100 @HSV2RGB:R=V:G=V:B=V:IF S=0 RTN 110 D=H/60%6:C=V-(59-H%60)*V/60*S/100:E=V-H%60*V/60*S/100:F=V*(100-S)/100 120 IF!DG=C:B=F 130 IFD=1R=E:B=F 140 IFD=2R=F:B=C 150 IFD=3R=F:G=E 160 IFD=4R=C:G=F 170 IFD=5G=F:B=E 180 RTN

IoTを1行、加えます。受け取った値で色相(H)をチェンジしてできあがり!

25 X=IOT.IN():IF X H=X*60

光源を裏に、間接照明っぽくするのがポイントです。

NASAの雷オープンデータなど、何かをきっかけ自動で変更するようにするのもオシャレですね!
NASA Space Apps Challenge 2018 東京会場、宇宙ハッカソンで活躍する小学生、NRTでお天気ネクタイを作りたい

エレベーターでおなじみ7セグLED、WS2812B x IchigoJamで実現!

2018/10/10
#IchigoJam #maker 

いつものテープ状フルカラーLED WS2812Bを30コ、330円分を使って、大きなフルカラー7セグLEDを作って、役に立ちそうにない時計プログラムとして動かしてみます。


カットして配線するときれいですが、横着して折り曲げ加工。


ちょうどいい空き箱発見、和紙をカッターでハコ形に切り出します。

この当たりでひとまずランダムに30コ全部を使って光らせるプログラム作成。(解説

10 POKE#700,240,181,68,24,90,32,12,73,114,182,128,37,35,120,1,52,255,34,74,96,3,39,10,38,43,66,1,208,10,39,3,38,1,63,253,209,0,34,74,96,1,62,253,209,109,8,239,209,1,56,234,209,98,182,240,189,0,0,1,80 20 C=RND(1000):GSB100:WAIT60:CONT 100 FORI=0TO29:POKE#800+I*3,C/10%10*3,C/100*3,C%10*3:NEXT 110 U=USR(#700,#800):RTN

7セグLEDの扱い方は、とても良い解説記事がこちらにあります。
IchigoJamの7セグLEDタイマーで16進数を学ぼう! – しずかなかずし

折り曲げたテープ状フルカラーLED、上下が5つ、その他が4つでセグメントを表しています。
7セグLEDの表示パターンをそのまま使うことにしたので、対応表を配列にいれて、変換するプログラムがこちら。

10 POKE#700,240,181,68,24,90,32,12,73,114,182,128,37,35,120,1,52,255,34,74,96,3,39,10,38,43,66,1,208,10,39,3,38,1,63,253,209,0,34,74,96,1,62,253,209,109,8,239,209,1,56,234,209,98,182,240,189,0,0,1,80 20 FORK=0TO9:C=RND(1000):N=K:GSB100:WAIT60:NEXT:CONT 100 LET[0],#7B,#30,#67,#76,#3C,#5E,#5F,#78,#7F,#7C:N=[N] 110 LET[0],400,504,426,422,409,413,517 115 FORI=10TO44:[I]=0:NEXT 120 FORI=0TO7:IF N>>I&1 M=[I]:FORJ=0TOM/100-1:POKE#814+(J+M%100)*3,C/10%10*3,C/100*3,C%10*3:NEXT 130 NEXT:U=USR(#700,#814):RTN

10行は上記と一緒、WS2812Bドライバ、マシン語プログラム。
100行で7セグのパターンを設定。(7セグLEDの解説通り)
110行ではそのセグメントが30コのフルカラーLEDの何個に対応するかと、その位置を設定しています。
VRAMやPCG領域も空いているのでそちらを使ってもOKですが、今回は配列領域を使っています。


ひとまず電池駆動で詰め込んでみます。


立てて置くイメージ、なかなかいい感じ!


こんな風に、0から9までを1秒おきにランダムな色で表示します。

秒針1桁だけ表示する時計のできあがり!
オシャレ温湿度計や、オシャレサイコロなど、いろんなイルミネーションに応用ください。

黒電話をIchigoJamで鳴らす方法

2018/10/06
#IchigoJam #maker 

もし身の回りのものがIoTだったら!?
以前、中古屋さんで見つけてきた懐かしの黒電話、鳴りました!


ん、何か弱々しい!?その理由は・・・


黒電話の裏面、ネジ2つを開けると大きなベル2つ!


なんと丁寧に回路図が付属しています!
B = ベル (コイルが電磁石となって、ベル2つの間の金属が動き、鳴る仕組み)


コイルに両端につながった B1 - B2(L2) をプラスマイナス相互に電圧をかけて、コイルを動かします。
モーターボード「MapleSyrup」と12V ACアダプターを使って、簡単な実験。
本来のジリジリ音は、60Vとか48Vという高電圧を16Hzでかけた時にでるらしいです。(黒電話 - Wikipedia
弱々しさの理由は、電圧が低いため16Hz(WAIT2とか)では駆動できず、3.7Hz(WAIT8)で、やっと鳴っているためでした。
(モータードライバIC「SN754410NE」は36Vまで)


電話線、2本は受話器を取ると抵抗値が変わるので、3.3Vをかけてアナログ値を見るとその様子が分かります。
電話線だけであれこれつなげると楽しそうですが、思わぬ高電圧、ばらして改造した方がいいかもです。

中に「IchigoSoda」いれたIioT黒電話を、いろんなところに置いてマトリックスごっことか!?

Macで開発、FPGAで作る4bit学習用CPU「GMC-4」 - Parallels x Ubuntu x Quartus x Verilog

2018/09/26
#FPGA #maker #Verilog 

Intel/ALTERAのFPGA開発環境「Quartus」は、Windows/Linux対応、Mac非対応。
でも、仮想環境 Parallels Desktop を使えば、Mac上でLinuxが動かし、開発できます。
以前はIchigoJamで作った学習用4bitCPU「GMC-4」を、今度はハードウェアで実現!

50MHzで動作する4bitマイコン「GMC-4 - Vol.24 4ビットマイコン | 大人の科学マガジン | 大人の科学.net
音やウェイトは未実装。次は、回路シミュレーターで遊んでみる予定。

MacでFPGA開発する手順 (GMC-4)
1. Parallels Desktop を Mac にインストール(Windowsを使わなければ無料版のLiteでOK)
2. Parallelsのインストールアシスタントで、Ubuntu Linuxを選ぶだけで簡単インストール
3. MacのファイルシステムをUbuntuと共有設定する
4. 仮想環境で使うメモリを1GBから4GBに変更する(Quratusのインストールで落ちた)
5. Quartus Prime Lite をUbuntuでセットアップする(要、ユーザー登録)
6. 書き込み器「USB Blaster」が使えるように設定して、Ubuntuを再起動(末尾に設定方法)
7. VerilogでGMC-4を作り、ピン設定する
8. コンパイル(MacBook Pro 2.3GHz Intel Core i5で、論理合成40秒、Windows環境でもほぼ同じ時間)
9. QuartusのProgrammerで書き込み、動く!


Mac上で動くUbuntu Linux、マウスもキーボードもシームレスに動いてくれるので、普通にアプリケーションを使う感覚で使えて便利! 速度差も思ったほどなく、いつでもどこでもFPGAプログラミングができるようになって嬉しい!


Intel® Programmable Acceleration Card with Stratix® 10 SX FPGAより)
IntelだけどArmも入ってる!(Overview)

FPGAニュース「インテル、「多機能アクセラレータ」のFPGA新モデルを追加 - ZDNet Japan
本気で使うFPGA、サーバーマシンに接続し、ソフトウェアでは到達不可能な処理速度を実現!
なんと、回路規模はトランジスタ換算で6600万コ!(2755k LE x 12ゲート/LE x 2トランジスタ/ゲート)
25Gbpsの通信路に、2.4GbpsでアクセスできるRAM、ArmのプロセッサCortex-A53も入っている豪華仕様。
お値段、約100万円。
解説書付きで5,000円書き込み器内蔵のものも3,000円などの手頃なFPGAと比較し、回路規模だけで340倍違うので、なかなかいい値段。

サーバー処理のボトルネックをハードウェア化する時代、到来!

(おまけ)
4bitCPU「GMC-4」をVerilogで書いたプログラム。
gmc4_top.v

module gmc4_top( input clk, output [3:0] outport); reg n_reset; poweronreset por(clk, n_reset); wire cpuclk; clockdivider clkdiv(clk, n_reset, 4, cpuclk); reg [3:0] key; wire [7:0] ledbin; wire [3:0] lednum; gmc4 cpu(cpuclk, n_reset, key, ledbin, lednum); assign outport = ~lednum; endmodule

gmc4.v

module gmc4( input clk, input n_reset, input [3:0] key, output reg [7:0] ledbin, output reg [3:0] lednum); reg [3:0] mem[0:8'h5f]; reg [7:0] pc; reg [3:0] rega, regb, regy, regz, rega2, regb2, regy2, regz2; reg flg; wire [3:0] op1, op2, op3; assign op1 = mem[pc]; assign op2 = mem[pc + 1]; assign op3 = mem[pc + 2]; always @(posedge clk, negedge n_reset) begin if (!n_reset) begin // rom_blink; rom_count; pc <= 0; flg <= 0; lednum <= 0; ledbin <= 0; end else begin case (op1) 4'h0: begin rega <= key; flg <= key != 0; end 4'h1: begin lednum <= rega; flg <= 1; end 4'h2: begin rega <= regb; regb <= rega; regy <= regz; regz <= regy; flg <= 1; end 4'h3: begin rega <= regy; regy <= rega; flg <= 1; end 4'h4: begin mem[regy] <= rega; flg <= 1; end 4'h5: begin rega <= mem[regy]; flg <= 1; end 4'h6: { flg, mem[regy] } <= mem[regy] + rega; 4'h7: begin mem[regy] <= mem[regy] < rega ? 0 : mem[regy] - rega; flg <= mem[regy] < rega; end 4'h8: begin rega <= op2; flg <= 1; end 4'h9: { flg, rega } <= rega + op2; 4'hA: begin regy <= op2; flg <= 1; end 4'hB: { flg, regy } <= regy + op2; 4'hC: flg <= rega != op2; 4'hD: flg <= regy != op2; 4'hE: begin case (op2) 4'h0: lednum <= 0; 4'h1: ledbin[regy] <= 1; 4'h2: ledbin[regy] <= 0; 4'h3: ; // none 4'h4: rega <= ~rega; 4'h5: begin rega <= rega2; rega2 <= rega; regb <= regb2; regb2 <= regb; regy <= regy2; regy2 <= regy; regz <= regz2; regz2 <= regz; end 4'h6: begin rega <= rega >> 1; flg <= ~rega[1]; end 4'h7: ; // sound end 4'h8: ; // sound err 4'h9: ; // sound pi 4'hA: ; // sound piii 4'hB: ; // sound rega 4'hC: ; // wait (rega + 1) * 0.1sec 4'hD: begin ledbin[3:0] <= mem[8'h5e]; ledbin[7:4] <= mem[8'h5f]; end 4'hE: mem[regy] <= mem[regy] - rega; 4'hF: { mem[regy - 1], mem[regy] } <= { mem[regy - 1], mem[regy] } + rega; endcase if (op2 != 4'h6) flg <= 1; end 4'hF: begin pc <= flg ? { op2, op3 } : pc + 3; flg <= 1; end endcase if (op1 < 4'h8) pc <= pc + 1; else if (op1 < 4'hF) pc <= pc + 2; end end task rom_blink; mem[0] <= 4'h8; mem[1] <= 4'h1; mem[2] <= 4'h1; mem[3] <= 4'h8; mem[4] <= 4'h0; mem[5] <= 4'h1; mem[6] <= 4'hF; mem[7] <= 4'h0; mem[8] <= 4'h0; endtask task rom_count; mem[0] <= 4'h8; mem[1] <= 4'h0; mem[2] <= 4'h9; mem[3] <= 4'h1; mem[4] <= 4'h1; mem[5] <= 4'hF; mem[6] <= 4'h0; mem[7] <= 4'h2; endtask endmodule

poweronreset.v

module poweronreset( input clk, output n_reset); reg [7:0] counter; always @(posedge clk) begin if (counter != 8'b11111111) counter <= counter + 8'b1; end assign n_reset = counter == 8'b11111111; endmodule

clockdivider.v

`define LEN_CLOCK 50_000_000 module clockdivider( input clk, input n_reset, input [3:0] div, output reg outclk); reg [31:0] counter; always @(posedge clk, negedge n_reset) begin if (!n_reset) begin outclk <= 0; counter <= 0; end else if (counter == (`LEN_CLOCK >> div) - 1) begin counter <= 0; outclk <= ~outclk; end else counter <= counter + 1'b1; end endmodule

USB Blaster設定 for Ubuntu Linux

su cat > /etc/udev/rules.d/51-usbblaster.rules # Intel/Altera USB-Blaster SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="0666", SYMLINK+="usbblaster/%k" SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6002", MODE="0666", SYMLINK+="usbblaster/%k" SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6003", MODE="0666", SYMLINK+="usbblaster/%k" # Intel/Altera USB-Blaster II SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6010", MODE="0666", SYMLINK+="usbblaster2/%k" SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6810", MODE="0666", SYMLINK+="usbblaster2/%k"

links
- プログラムたった64行、FPGAで創るオレオレ32bitCPU「TF32CPU r1」90Mhz x 2コア動作 on MAX10
- 最大動作周波数468MHz!? 書籍の付録とUSB BlasterではじめるFPGA「MAX10-FB」の組み立て方

プログラムたった64行、FPGAで創るオレオレ32bitCPU「TF32CPU r1」90Mhz x 2コア動作 on MAX10

2018/09/23
#FPGA #Verilog #maker #kosen 

半導体チップを作り放題な夢のデバイス「FPGA」で動かしてみた4bitCPU TD4
せっかくなので手で配線するのは大変な32bitCPUのツインコアに挑戦!
シンプル設計なオレオレCPUを創って、MAX10評価ボード上で、2コア動作させてみました。


90MHzで動作している32bit CPU 2コアの様子。
単にエルチカしているだけですが、毎秒1.8億回計算しています。

オレオレCPUづくりの手順
1. 32bit CPUをつくろう(汎用レジスタが32bit)
2. マシン語は32bit固定長にしよう
3. 命令は、ロード、ストア、代入、加算、減算、or、and、xor、左シフト、右シフト、掛け算の11種類
4. 命令に4bit、レジスタ指定に4bit x 2、16bitを値に使おう
5. レジスタは4bitなので16コ、最後レジスタをArmっぽくプログラムカウンタにしよう
6. 条件判定用のフラグはゼロフラグだけ
7. 残り4bit、Arm32っぽいフラグによるスキップ、フラグ更新するか否か、16bitの値の符号としよう
8. 出力はメモリにマッピングしておこう(RAMは32bit x 32word、最後の31番目を出力に接続)

9. Verilogを勉強する

初めて使うハードウェア記述言語、なんとなくサンプルいじっていてもよくわからないので書籍を購入。
わかるVerilog HDL入門―文法の基礎から論理回路設計、論理合成、実装まで (トランジスタ技術SPECIAL)
購入の決め手は、著書の木村真也さんが群馬高専の先生なこと。
しかも、函館高専の出身でした!

Verilogのコツは、組み合わせ回路と順序回路、シミュレーション用と論理合成用をきちんと区別すること。

組み合わせ回路:wireでassignしたりfunctionでつなぐ(フリップフロップなど、フィードバックなしの回路)
順序回路:alwaysでclk立ち上がりとn_reset立ち下がりでのregの変化をtaskなどで記述

シミュレーション用記述:#10などの遅延、initialはシミュレーション用(initialでも合成されてたけど??)

10. Verilogで実装する(名付けて、TF32CPU r1 - Taisuke Fukuno's 32 bit CPU release 1)

module tf32cpu_r1( input clk, input n_reset, output [3:0] outport); reg [31:0] r[0:15]; // register reg [31:0] mem[0:31]; // 32 word reg zeroflg; wire [31:0] code; wire skipflgnz; wire skipflgz; wire flgchg; wire minusim; wire [3:0] op; // operation code wire [3:0] rega; wire [3:0] regb; wire [31:0] opland; wire [15:0] im; // immediate data assign code = mem[r[15]]; assign skipflgnz = code[31]; assign skipflgz = code[30]; assign flgchg = code[29]; assign minusim = code[28]; assign op = code[27:24]; assign rega = code[23:20]; assign regb = code[19:16]; assign im = code[15:0]; assign opland = r[regb] + (minusim ? -im : im); always @(posedge clk, negedge n_reset) begin if (!n_reset) begin // program init_blink; init_reg; end else begin if (skipflgnz && !zeroflg || skipflgz && zeroflg) r[15] <= r[15] + 1; else begin case (op) 4'h0: r[rega] <= mem[opland]; 4'h1: mem[opland] <= r[rega]; 4'h2: r[rega] <= opland; 4'h3: r[rega] <= r[rega] + opland; 4'h4: r[rega] <= r[rega] - opland; 4'h5: r[rega] <= r[rega] | opland; 4'h6: r[rega] <= r[rega] & opland; 4'h7: r[rega] <= r[rega] ^ opland; 4'h8: r[rega] <= r[rega] << opland; 4'h9: r[rega] <= r[rega] >> opland; 4'hA: r[rega] <= r[rega] * opland; endcase if (flgchg) zeroflg <= r[rega] == 0; if (rega != 15) r[15] <= r[15] + 1; end end end assign outport = mem[31][3:0]; endmodule

- Verilogの特徴
短く書ける!(32bit CPUが、64行)
moduleが回路のかたまりを表す。(inputやoutputでインターフェイスを定義)
ブロックの表記方法は、begin / end({ }はbitの括りを表すのに使っちゃっている)
a[3:0]で、aのbit3からbit0までの4bitを表す。(何もつけないと1bit)
bitの長さを意識することは大事だけど、割といい感じにキャストされる
posedgeが立ち上がった時、negedgeが立ち下がった時
<= が、順序回路で次のタイミングへの切り替えを表す(同じタイミングで同じregに入れるとエラー)

11. レジスタの初期化とプログラムを task でメモリにセットするコードを追記

task init_blink; // for slowclock begin mem[ 0] <= 32'h0_2_3_0_0001; // R3=1 mem[ 1] <= 32'h0_1_3_0_001F; // [31]=R3 mem[ 2] <= 32'h0_2_3_0_0002; // R3=2 mem[ 3] <= 32'h0_1_3_0_001F; // [31]=R3 mem[ 4] <= 32'h0_2_F_0_0000; // PC=0 mem[31] <= 32'h00000000; // outport end endtask task init_reg; begin r[ 0] <= 32'h0; r[ 1] <= 32'h0; r[ 2] <= 32'h0; r[ 3] <= 32'h0; r[ 4] <= 32'h0; r[ 5] <= 32'h0; r[ 6] <= 32'h0; r[ 6] <= 32'h0; r[ 7] <= 32'h0; r[ 8] <= 32'h0; r[ 9] <= 32'h0; r[10] <= 32'h0; r[11] <= 32'h0; r[12] <= 32'h0; r[13] <= 32'h0; r[14] <= 32'h0; r[15] <= 32'h0; zeroflg <= 1'b0; end endtask

12. クロックやリセットとつないでオレオレCPUが動いた!
(MAX10評価ボードの場合、クロック clk=27、LED outport=132,134,135,140,141)

module tf32cpu( input clk, output [4:0] outport); wire cpuclk; assign cpuclk = clk; wire n_reset; poweronreset por(cpuclk, n_reset); reg [3:0] exout; tf32cpu_r1 cpu1(cpuclk, n_reset, exout); assign outport = { cpuclk, ~exout }; endmodule

poweonreset.v (起動後に少し待って n_reset を0にする回路)

module poweronreset( input clk, output n_reset); reg [7:0] counter; always @(posedge clk) begin if (counter != 8'b11111111) counter <= counter + 8'b1; end assign n_reset = counter == 8'b11111111; endmodule

13. ALTPLL(50MHzを9逓倍5分周)でクロックアップ!(90MHzが限界でした、それ以上だと沈黙)

module tf32cpu( input clk, output [4:0] outport); wire cpuclk; pll pll1(clk, cpuclk); // 略 endmodule

14. CPUのインスタンスを足して、ゆっくりCPUとの2コア(ツインCPU!)構成にしてみる

module tf32cpu( input clk, output [4:0] outport); wire cpuclk; pll pll1(clk, cpuclk); wire n_reset; poweronreset por(cpuclk, n_reset); reg [3:0] exout; tf32cpu_r1 cpu1(cpuclk, n_reset, exout); reg [3:0] exout2; wire slowclk; clockdivider cdiv2(cpuclk, n_reset, 2, slowclk); tf32cpu_r1 cpu2(slowclk, n_reset, exout2); assign outport = { slowclk, ~(exout | (exout2[1:0] << 2)) }; endmodule

クロックを遅くする clockdivider.v

`define LEN_CLOCK 50_000_000 module clockdivider( input clk, input n_reset, input [3:0] div, output reg outclk); reg [31:0] counter; always @(posedge clk, negedge n_reset) begin if (!n_reset) begin outclk <= 0; counter <= 0; end else if (counter == (`LEN_CLOCK >> div) - 1) begin counter <= 0; outclk <= ~outclk; end else counter <= counter + 1'b1; end endmodule

15. ツインCPUで動いた!
論理合成に2分半かかり、MAX10-08のLE使用率87%なのでトリプルにするにはきっとROM/RAMの切り離しが必要。(1コアだと合成1分14秒、46%)
* ツインCPUという懐かしい変な言葉。CPUという部品はなく、あるコンピューターの中心的役割を果たすコンピューターをCPU(中央処理装置 / Central Processing Unit)と呼ぶ。なので、正しくはツインコアのCPU。

16. マシン語プログラムを書き換える

mem[ 0] <= 32'h0_2_1_0_2FAF; // R1=#2FAF (50M=2FAF080) mem[ 1] <= 32'h0_8_1_0_0009; // R1=R1<<9 // mem[ 0] <= 32'h0_2_1_0_0003; // R1=3 for slowclock // mem[ 1] <= 32'h0_2_1_0_0003; // R1=3 mem[ 2] <= 32'h0_3_3_0_0001; // R3=R3+1 mem[ 3] <= 32'h0_1_3_0_001F; // [31]=R3 // LED1 mem[ 4] <= 32'h0_2_2_1_0000; // R2=R1 mem[ 5] <= 32'h2_4_2_0_0001; // R2=R2-1 flg mem[ 6] <= 32'h4_4_F_0_0001; // if !Z PC=PC-1 mem[ 7] <= 32'h0_1_4_0_001F; // [31]=R0 // LED0 mem[ 8] <= 32'h0_2_2_1_0000; // R2=R1 mem[ 9] <= 32'h2_4_2_0_0001; // R2=R2-1 flg mem[10] <= 32'h4_4_F_0_0001; // if !Z PC=PC-1 mem[11] <= 32'h0_2_F_0_0002; // PC=2

4つのLEDを2進数でカウントアップするデモプログラム(マシン語 for TF32CPU r1)

links
- 憧れのCPUづくりが超簡単!あの4bitコンピューターTD4マシン語プログラム on FPGA MAX10
- FPGAはじめのいっぽ、MAX10 FPGA 評価キットでエルチカ成功!
- 最大動作周波数468MHz!? 書籍の付録とUSB BlasterではじめるFPGA「MAX10-FB」の組み立て方

最大動作周波数468MHz!? 書籍の付録とUSB BlasterではじめるFPGA「MAX10-FB」の組み立て方

2018/09/19
#FPGA #Verilog #maker 

FPGAの評価ボードに替えて、雑誌付録のMAX10基板でフルカラーエルチカできました!

書き込み器「USB Blaster」は、なんと687円!?


FPGA MAX10搭載基板が付録の「FPGA電子工作スーパーキット」+1,000円ちょっとで揃います!
著書は、LPC1114との出会いの書「2枚入り!組み合わせ自在!超小型ARMマイコン基板」と同じ、圓山宗智さん。


付録のFPGAチップ搭載の基板!
クリスタルオシレーター(48MHz)とピンヘッダーで、USB Blaster仕様の最小仕上げをします。
※写真は家にあった12MHzのクリスタルオシレーター


USB BlasterのJTAGケーブルを接続するCN7端子を、ピンヘッダー5ピンx2にして、はんだづけ。
(JTAGケーブルを挿してはんだづけするとゆがみにくい!)


裏面、はんだジャンパーを12箇所、はんだづけします。


CN3のVCC33とGNDで電源を供給できるようにピンソケットをはんだづけ。


Flashに書き込めば、電源つないだら数msecで即動作!
MeganeJamは5Vから3.3Vを生成するためにのみ使用、単3を2本の電池ボックスなどでもOK)

無償で使える開発環境 Quartus Prime Light edition、IPカタログからALTPLLを選択して、クリスタルオシレーターと入力周波数を合わせ(12MHzや、48MHzなど)、倍率を設定することで任意の周波数で動かせます。

クリスタルオシレーター12MHzを39倍にした468MHzまでは動作しました!(40倍の480MHzでは沈黙)
* スペックとしては450MHzでした (2018.9.23 追記)

自由自在に超高速エルチカできる環境が手に入ったわけです!

下記、動作確認で使ったエルチカプログラム Verilog for MAX10-FB書籍付属基板
ピン配置(外部クロック 27、LED_R/G/B 120/121/122、タクトスイッチ 123)

`define PER_CLOCK 48_000_000 / 10 module max10cq(input clk, output [2:0] leds, input sw1); wire clk2; wire locked; wire clk48; wire red; wire green; assign leds[0] = sw1 == 0 ? 1 : red; assign leds[1] = sw1 == 0 ? 1 : green; clkdivider clkdiv(clk48, clk2); ledsign led1(clk2, red, green, leds[2]); pll pll1(1'b0, clk, clk48, locked); endmodule module clkdivider (input inclk, output reg outclk); reg [31:0] cnt; initial begin cnt <= 32'b0; outclk = 1'b0; end always @(posedge inclk) begin if (cnt == `PER_CLOCK / 2 - 1) begin cnt <= 0; outclk <= ~outclk; end else cnt <= cnt + 32'b1; end endmodule module ledsign (input clk, output reg a, output reg b, output reg c); reg [2:0] memcnt; reg [2:0] mem [3:0]; initial begin { a, b, c } <= 3'b111; memcnt <= 0; mem[0] <= 3'b110; mem[1] <= 3'b101; mem[2] <= 3'b011; mem[3] <= 3'b101; end always @(posedge clk) begin { a, b, c } <= mem[memcnt]; memcnt <= memcnt + 3'b1; end endmodule

links
- (1)MAX10(2)ライタ(3)DVD付き! FPGA電子工作スーパーキット (トライアルシリーズ) | 圓山 宗智 |本 | 通販 | Amazon
- 憧れのCPUづくりが超簡単!あの4bitコンピューターTD4マシン語プログラム on FPGA MAX10
- FPGAはじめのいっぽ、MAX10 FPGA 評価キットでエルチカ成功!

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像