散歩師・漫画居士のくだらなクラブ日記

ども、散歩師・漫画居士っす。散歩したり実働模型作ったりが趣味なんで、その時に思いついたこととか書くッス

AN式ローレンツビーム誘導装置(ずるいぞ!まっすぐ走るんじゃー2号)その4

動く模型愛好会のミーティングには、参加しませんでしたが、終わってからもう2ヶ月経ちますね。顛末だけ書いときます。

 

結局、まっすぐ走るんじゃー2号は完成しませんでした。

調整前のコントローラRX側のコーディングは終わりました。足回りは電磁誘導車の流用で、実験はできる状態になったんですが、結局火入れはしませんでした。

どうしても解決できそうにない根本的な問題に気づいてしまって。

 

AN式ローレンツビーム誘導装置は、右左誘導装置を焦点にした、アポロニウス円の上を進む様に誘導する装置です。でも、実際には私の地上走行機だとある幅の上をランダムに進むことになります。大きくハズレた時に初めて「あ、左にずれてた!」と気づくわけです。

問題は、飛行機なら太陽なり地磁気で、外れたことに気づいた時にどちらにずれたか大体わかりますが、私のロボットでは頭の方向がわからないため、どちらの方向にずれたかわからないトコにあります。第2の方位計測装置が必要なのですが、それがあるなら、ハナからローレンツビームもいらないわけです。

 

そこにつまって先にすすめなくなり、未完成品、というレベルまでも行かなかった次第です。

 

うまくゆくと思ったんだけどなぁ。ざーんねん。

2024-03日記

2024-03

O3Ou

O3Ns

O3Mf

O3Lr

O3Kw

O3Jt

O3Im 光る君へ、先週山場を越えてしまったのでテンション上がらん。

 

O3Hu 新宿ハンズ、ヨドにもエアエンジンカーがないのを確認。なんか体力続かない。日々是鳥山先生でイラスト物色。

O3Gs 神保町坊主。きょうのアンナ・コムネナ上巻中国生活図譜購入どちらも店売りの少ない本。千石にもエアエンジンカーない。

O3Ff エレキットのエアエンジンカー が販売終了になってるのを知る。多分とはおもってたけど…諦めきれないので川崎ヨドと渋谷ハンズを探す。アキヨド、アキバマルツ、にないのは、すでに確認。ああ、欲しくなってきた。ハンズでラジカセの修理実演。懐かしい。ウッドパズル桜さく駅 の新作サンシャインタウン が出てた。ほ、欲しい。

O3Er 4日もすぎてから、母の誕生日に気づいたので、外国お菓子を買うなど。なんでも新しいことが苦手なところがある人だが、お菓子は大丈夫なので助かる。

O3Dw 原発地震の日を過ぎてることに今日気づいた。能登地震もあったし、原発地震も過去のことなのかな。

O3Ct 55周年記念ウルトラセブン 思いのほか面白かった。昔のままのダンとアンヌ、今も残る東京のレトロフューチャー。そしてオブザーバーとしての子供。よくやってくれた感。

O3Bm 行き帰り共中央線東海道線両方で座れることが確認できた。差は3分くらいか▼光る君へ山場が終わってしまった。この先どうするつもりなんだろうか?▼もらったセリアのインク。薄くて使いづらいのだが、閃いて万年皿で火にかけて蒸発させるといい感じに濃くなる。万年筆にOK。何年かぶりにエゴサーチしたら、くだらなクラブ(R)DISCXXが1枚3万円超えでオクに出てて驚いた。そうか30年以上前のモンだもんな。何もかも みな懐かしい。

 

O3Au 高円寺坊主。中野オタク要塞でおてんばベッキー同人入手。3巻裏表紙のモアがかあいかったので戦国ケロロ3巻揃い入手。ダイソーで母と駄々っ子バトルしてる幼女が可愛かった。

O39s 神保町坊主。アキバで桜田レポ2購入▼何か絵を書きたいと思うんだが、モチーフを決めるどころか、ネタ集めが終わらないうちにタイムアップか、モチベが尽きる。

O38f 朝の雪、多摩川の河原の雪を楽しみにしてたが、会社に到着前に融けてしまった。電車はだいぶ遅れたにも関わらず、いつもと同じ電車でいつもと同じ時刻に到着。▼帰りに新宿西口に寄る。BOOKOFFに「リーダブル・コード」あったが1900円。某所のx2倍以上する。4月末まで待ちかな?▼1月に詰め直した歯が痛くなってる。どうするかなぁ。

O37r 中央線で東京まで出て東海道線で川崎までゆくルートは座れる可能性があることに気づいた。▼風邪で細モモが細くなってたが、プロテインがやっと効いてきた。プロテイン便利▼迷ってたが、しばらく寝床ノートPC生活を続ける。時間もったいない。▼

であるりんおもしろい。日本の歴史動画で一番好き。

O36w どっか寄って帰るつもりが、高円寺についた。業務スーパーのお菓子売り場をじっくりグリグル。外国お菓子おもしろい。そろそろ温かくなってもいいと思うが。

O35t 川崎ブックオフ楽しい工作 ミステリー走行ロボの箱なしルーズが550円。

O34m 風邪は治ったことにして、出社。が定時で上がる。光る君へ鑑賞。本当に面白いな。キャッキャウフフ シーンの唐果物らしき菓子がステキ。▼先輩のススメで老眼対策にブルーベリー黒酢的なものを買ったが、あまり効かない、ってそりゃ一日じゃね。

 

O33u だいぶ回復、床上げでシュクメルリを食べて、入浴。

O32s やはり抜けない。一日中寝てた。

O31f 風邪ひいて会社を休む、夜38.2℃、解熱剤を飲む。この夜峠をこえた。

 

簡単な一行日記をどこかにupしておきたくなった。

陰気な男でいいですか?の影響。

たとえ自民党に投票したとしても、投票率が上がったら自民党は政策を変更するしかない。という話

自民党公明党以外に投票してください。」ではなく

自民党でいいから投票してください。」と言っても、日本人全体の得になります。

仮に自民・公明に投票したとしても、投票率が上がると、我々全体にとって少しでも得になります。


それは

1.「あらゆる政体は、政体の存続させる盟友のためにしか働かない」が、
2.「盟友が増えると、社会全体に利益が及ぶ政策しかとれなくなる」からです。

 

こちらに詳しいです。


www.youtube.com

時間がなかったら、結論 28:30から御覧ください。

 

男はフンドシ、女はコシマキ

男はフンドシ、女はコシマキ

日本は昔(多分明治期まで)は、下半身下着は、男はフンドシ、女はコシマキが、一般的なはずです。

袴を履く時や海女や、大家の女性のがメンスの時、あるいは皇族の女性はフンドシをすることがあるみたいですが、あまり一般的なことではないでしょう、という立場です。

 

傍証

女性は腰巻きが普通なことには、こんな傍証が。


1. 白木屋事件

昭和7年白木屋デパートの火事の際、女性は和装の情勢は腰巻きだけだったので、陰部が見えるため、逃げ遅れた。という言説があります。

(3ページ目)日本初の高層ビル火災 一流デパート・白木屋の大火は「女性の下着史」を変えたのか | 文春オンライン

(この記事は、この事件が女性の洋装のきっかけではない。という文章ですが、コレより前、女性は腰巻きだけだった。という傍証にはなるでしょう)

2. 褌祝

民俗学探辞典の「褌祝」の項目では、女はコシマキをもらう。とあります。

 

3. コシマキの海女

例えば、北斎の書いた海女も腰巻きをしてますね。

海女はまるで人魚のようだった。北斎や歌麿の手で描かれた、江戸時代の女性たち(画像集) | ハフポスト LIFE

4.女将のフンドシに驚く

ある文章だったか、ドラマで、田舎者の娘が、奉公先の女将がメンスでフンドシをするのを知って「女もフンドシをつけるんだ!」と驚くシーンがあったのを覚えてます。

 

まとめ

もっと言えば、多分江戸の中期の中農が農地経営ができる時代までは、
貧農(被官百姓)あたりは、女はコシマキもしてなかったのでは?

なにか、wikipediaのふんどしの項目の書き方で、誤解が起きてるようにも思います。(分かる人が読めば間違いが書いてあるわけではないのですが)

(私も「『いただきます』という掛け声は戦中、節米の影響で流行った」というのを去年末しりました。映画のセリフを使って検証しているtwがあります)
(それすらも浄土真宗(浄土宗)では昔から。という言説も聞いてるので、民俗はまさにヴァナキュラー(土着)であり、融通無碍で捉えきれません。)

また、皇室の女性がふんどし なのは、上代の上流階級は女性がフンドシで、その習慣がのこっている。という可能性もありますね。

 

そろそろ、ほとぼりが覚めたと思うので投稿。

 

子供の科学 よく飛ぶ紙飛行機の二宮康明先生の訃報

二宮先生なくなったそうです。

2023/11/15 訃報 二宮康明氏ご逝去|詳細ページ

'16年に子供の科学の連載を終了してから、今年か来年か?と覚悟をしてたんですが、

やっぱり、ボーっとしてしまいますね。

 

この号の記事が子供の科学サイトに公開されてます

紙飛行機の二宮康明先生ご逝去【最終回記事特別公開】│コカネット

 

 

二宮先生には一度だけ、原っぱ公園でskycubIIIを調整してもらったことがあります。

あまりにも調整がすばらしかったので、その日の内に視界没しました

もう、一生の思い出ですよ。宝物ですね。

*視界没:飛んだまま追いかけても見失うこと。

 

 

二宮先生は「最近飛ばす場所がなくて」という問題に対して、`14年に旋回用機という回答を出してます。飛ばしてみたいんですが、老眼でもう飛行調整できない...

神保町ブックフェアで、切り抜き用にもう一冊買ったハズなんですが、見つからない...

 

こちらは"The great international paper airplane book"1967 に掲載された、

二宮先生の伝説の優勝機。

折り紙機どころかマッチ棒ロケットなども競技に出場してた様です。

レギュレーションらしいレギュレーションのないおおらかな時代なので、 真面目に設計した二宮先生の機体なら優勝もさもありなん。ですね。

しかしアメリカに郵便で送って、代理人が飛ばしたというのも時代ですね。

 

NHK やってみようなんでも実験★作って操れ紙の飛行機98

二宮先生が登場する回。当時見た覚えが。

www.youtube.com

 

■日本通:アンドリュー・デュアさん

カナダに生まれ、幼少期に二宮先生の飛行機に出会い、独自の紙のピーナッツ機(って言うのかな)を作った方。一年前の二宮先生が登場します。日本在住。この方の紙飛行機の本も持ってるハズなんですが、不如意。

www3.nhk.or.jp

こんなタイプも作ってました。

 

一言で言うなら、楽しい時間をありがとうございました。ですね。

あの世では、紙飛行機じゃなくて、実機の設計をするんですかね?

 

AN式ローレンツビーム誘導装置(ずるいぞ!まっすぐ走るんじゃー2号)その4

 

TX: スピーカーのセパレーションが悪い。悪すぎる。前回はアンプも分けて、発振器のチェックだけしたのを忘れてた。

Tx:モールスの送信速度調整ができない問題。

    QuartusのRTL Viewerのload値がMSB/lsbが反転してて、それに気づくのが難しく、結局simまで立ち戻った。セレクト値が1bit幅になってたのでそこを直した。

Tx:セパレーションをなんとかする方法が思いつかない。結局モノアンプ+スピーカーでも正弦波には聞こえない問題は残ってる(というか潰してなかった。

Tx: セパレーションがNG問題、RとLのGNDが共通では、今回の完全分離音声を再現できない。と判断。幸い使ってるCANDOスピーカーのアンプは、オペアンプ反転式のため、差動で入力することに。FPGAに逆相出力を追加する。

以下の様に改造。DS-,DS+が、FPGAの差動出力。回路図は1ch分。

- 回路図はこちらからお借りしました。

ダイソー300円USBミニスピーカーで遊ぶ - HMcircuit

 

2chボリュームがGNDコモンのため、使用できず、完全に取り外し、FPGA出力のスイングを絞ることに。とりあえず設計の最小値x1/64に絞ってもでかすぎるので、後でもっと絞れるように設計し直さなきゃ。

 

RX:受信、なにやら感度あり。

メータ、マイクの電源設定NG。RTLにて修正。

発生音をレベルメーターに捉えられたのですが、ち、小さい。

スピーカーとマイク間1cmでもフルレンジの10%も振れてないかも?

レベル設計がNGなのか、はたまた本当にこんなに狭いので、ゲイン設計を直す必要があるのか。

調べなきゃですな。

ちなみに、CANDOの電池チェッカーのメータを使いました。

 

 

3連休はこれにて。

NT東京とかにも行ったしなー

NT東京2023 1日目 X(旧Twitter)まとめ - Togetter

 

= 工数

11/05su:32.5H+アンプ改造1H+TX実験1H+RX実験1H+dairy0.5H=36.0H

11/04sa:30.5H+アンプチェック1H(NG)+再改造法考察/買い物1H=32.5H

11/03fr:28.5H+アンプ改造2H=30.5H

11/02th:24.5H+実機チェック1.5H+dbg2H+diary:0.5H=28.5H

11/01we: 22.5H+chart:1H+coding1H=24.5H

 

 

= 関連

AN式ローレンツビーム誘導装置(ずるいぞ!まっすぐ走るんじゃー2号)その3 - 散歩師・漫画居士のくだらなクラブ日記

AN式ローレンツビーム誘導装置(ずるいぞ!まっすぐ走るんじゃー2号)その2 - 散歩師・漫画居士のくだらなクラブ日記

AN式ローレンツビーム誘導装置(ずるいぞ!まっすぐ走るんじゃー2号) - 散歩師・漫画居士のくだらなクラブ日記

CANDOの電池テスターのアナログメーター - 散歩師・漫画居士のくだらなクラブ日記

github.com

G/I/L/N/R/U/V/W/Zコンとは?

 1983年ファミコンよりも前の時代は、リモコンオモチャが花形で、さまざまな◯◯コンと呼ばれるリモコンがありました。模型とラジオ誌子供の科学誌や、オモチャの販促用語などで、使われてた言葉ですが、ネットで探しても出てこないモノもあり、記憶を元に書いてみます。何しろ大昔の子供の時分のことなので、妄想と見分けがついてないところもあるかもしれません。

 

= Gコン

    天秤棒の片方に動力飛行機(ヘリコプタ)、もう片方に分銅をつけた状態で、天秤棒の支点を、模型の塔の上に乗せたもの。塔と天秤棒支点にはスリップリングがついてて、そこを介して、動力飛行機のモータに電力を供給、推力を制御。

さらに、レバーで迎え角を調整できるものもあった様な。

 

= Iコン

    フリーフライト(無制御)のこと。行ったきりなので洒落てIコンと呼んでた。ノーコンになった場合も、「Iコンになった」と言ってた様な。

 

= Lコン

    押すと前進、離すと(あるいはバックボタンを押すと)後退しながら左(あるいは右)に曲がるリモコン。一軸モータで面移動が可能なのが売り。多分任天堂のラジコン「レフティRX」からの連想で名付けられたものと思われる。バトルスキッパーもLコンに入るのかな?

 

= Nコン

   ノー・コン。コントロールできない。コントロールできなくなる。の意味。

    「朝からの不調、小機めでたくNコンとあいなりました。何処の空へ旅立ったことやら。」の様に使われてたと。

 

= Rコン

   ラジコン(RC)

 

= Uコン

    動力飛行機で、左の翼端から2本の紐が出ており、前を引っ張ると上げ舵、後ろを引っ張ると下げ舵が切られるもの。紐の長さの孤を描いて飛ぶ。

 

= Vコン

     何だったか?思い出せない。

 

= Wコン

   ワイヤーコントロール。Uコンが代表だが、ステアリングの回転をワイヤーのロールテンションで伝えて、操舵できるリモコンもWコン(ワイヤーコントロール)と呼ばれてたと思った。

 

= Zコン

   天井から吊り下げられる、動力飛行機。吊り下げの紐は重心より若干後ろに取り付けられるため、大きな円を描いて飛ぶ。吊り下げ紐を介して動力モータへの電圧を制御したり、後年はIRで制御するものもあったが、フリーフライトもZコンと呼んでたよ思った。(GコンとZコンは逆だった気も)

 

= ???コン

  テザー車(動力自動車の重心付近の側面にケーブル(テザー)をつなぎ。もう片方を地面に固定して、円を描いて走らせるモノ)も???コンと呼んでた気がするんですが、思い出せない...

他にも??コンがありましたら、ぜひ教えて下さいね。コメント欄とか。

A/B/C/D/E/F/G/H/J/S級アンプとは?

メモメモ

 

=A級アンプ

    バイアスを入力振幅よりも深くとって、出力の歪を小さくしたアンプ。

    バイアス分だけ消費電力が増え、また出力電力も大きくできない。

 

=B級アンプ

   半波分だけバイアスしたアンプ

    =B級プッシュプル

        ハイサイドに半波分、ローサイドに半波分バイアスを履いたプッシュプル

    =AB級アンプ

       色々定義がある様ですが、B級プッシュプルを、ゼロクロス歪が無くなる程度にバイアスを深くしたもの、あるいは、2段構成で初段A級で、後段をB級プッシュプルでさらにB級ドライブの動作点を調整したもの。くらいの意味の様です。

 

= C級アンプ

    無バイアス、もしくは逆バイアスのアンプ、入力の尖塔部分しか出力されません。

    ある意味コンパレータと読んでもいいのかな?

    = BC級アンプ   

       ローサイドのみB級、ハイサイド

       LM358 オペアンプの出力段ですね。

 

=D級アンプ

    コンパレータ。多分上下両持ちのものを言う。(NchのみはC級って言いそう

    ダブルプッシュプル(Hブリッジ/BTL)しか見たこと無いが単プッシュプルでもD級って言うんだろうか?

 

=E級アンプ

     負荷側の特性をうまく設計することで、電流が流れる時にトランジスタをOffするアンプ。効率が上がる。基本周波数が一定であることが前提になるだろう。

E級アンプの実験

 

=F級アンプ

    負荷の特性をうまく設計することで効率を改善したアンプ。偶数時高調波はショート、奇数次高調波はオープンモードの負荷をドライブするアンプです。正直どういうことなのかよくわかりません。

     こちらも基本周波数が決まってる信号向けですね。

https://www.rs.noda.tus.ac.jp/umedalab/doc/Gpaper2016/koike.pdf

 

=G級(G/H)級アンプ

   振幅により、電源電圧を切り替えるアンプ。電圧?電流(つまり使用トランジスタ数を変える)じゃなくて?

業界初の車載オーディオG級アンプIC、STMicroが発売 | 日経クロステック(xTECH)

アンプの動作方式 D級とA/B級、そして G/H級 - ハーレーカスタムガイド

 

= H級アンプ

     出力電力に十分なだけ、電源電圧を供給するアンプ。G級は電源電圧n段階、H級は無段階でしょうか?よくわかりません。入力信号の予測回路と高度な制御回路が必要で、設計が難しい。

Class H | アナログ・デバイセズ

 

=J級アンプ

  高周波用途であること以外は、よくわかりません。E級で負荷側の設計を高度化したかんじか?

https://apmc-mwe.org/mwe2018/pdf/tut17/FR1A-1.pdf

 

=S級アンプ

  高周波用途の様です。存在はするようですが、詳細はみつかりませんでした。(3枚目)

https://www.jarl.org/Japanese/2_Joho/News2013/20130923micro/Ishikawa_Assistant_Professor.pdf

 

この他にも?級アンプをご存知でしたら、ぜひ教えてくださいね。コメントなど。

 

来年2024年は1996年のカレンダーも使えますよ!

持ってたらリユースしてくださいねー。

来年は閏年なので、あんまり使えるカレンダーがありませんが。

こんなカンジで調べました。

codepad.org

# for python ver2.xx
# codepad have
# 2.5.1 (r251:54863, May  4 2007, 16:52:23) 
# [GCC 4.1.2]
# you can use 1996 calendar as 2024.
import datetime
weekday20240101=datetime.datetime(2024,1,1).isocalendar()
weekday20240301=datetime.datetime(2024,3,1).isocalendar()
# weekdays in 2024-01-01 and 2024-03-01
print("mtwrfsu"[weekday20240101[2]])
print("mtwrfsu"[weekday20240301[2]])
years=map(
        lambda year:
            datetime.datetime(year,1,1).isocalendar()
            ,range(2023,1969,-1)
    )
years =filter(
    lambda weekday :
        weekday[2]==weekday20240101[2]
        ,years
)
# years are matched weekday at 01/01
years = map(lambda year:year[0],years)
print( years )
years=map(lambda year:datetime.datetime(year,3,1).isocalendar(),years)
years=filter(lambda weekday:weekday[2]==weekday20240301[2],years)
years=map(lambda year:year[0],years)
# year is mached weekday at 01/01 and 03/01
print( years )
結果
t
s
[2018, 2007, 2001, 1996, 1990, 1979, 1973]
[1996]

AN式ローレンツビーム誘導装置(ずるいぞ!まっすぐ走るんじゃー2号)その3

- sim追加最大値

よく考えるとmax値は、最大振幅正弦波ではなく、矩形波なのに気がついて、simを追加。値が小さくなる。

本当に矩形波が最大なのか?も含めてよく分からず、延々考えたが、

クリップがいたずらして、おかしな値にナリきれてなかったことに気づく。

各パスを追うと、bit幅が足りないことがやっとわかった。

各バスの幅をあわせて、矩形波入力時12'hA2Fで、0x1000 x 2/piと、理論値と一致。

これでメインブロックは済とする。

 

- 明日はtopを作って火入れを

明日は、トップをでっちあげて、マイクとアナログメータを繋いで、TXをrom化してスピーカーをつなぐ。までやる予定、は未定。

 

= ソース/プロジェクト

ソースはこちら

github.com

 

+sim1.5H+dairy0.5H=22.5Hr

 

= 次記事 顛末

 

 

= 過去記事

mangakoji.hatenablog.com

 

mangakoji.hatenablog.com

 

AN式ローレンツビーム誘導装置(ずるいぞ!まっすぐ走るんじゃー2号)その2

+sim:2H+dairy:0.5H=20.5Hr

結構sim抜けが多く、3箇所修正して、フルレンジで計算通り12'h7FFが出るようになった。

0,90,180度で12'h7FF,45度振幅√1/2で12'h5A8。これで、ゲインは正しいものとする。

バンド幅をどうするか決めかねてる。

現在fc=440Hzで1/√2に落ちる周波数が341Hzと539Hz。ほとんどバンドパスが効いてない。

どんな音でも聞こえる状態。

やる気を出すために日報。

 

過去記事

mangakoji.hatenablog.com

 

ヘッドホーンで周りが見える!超音波FMCWレーダ

今、抱えてるMakerプロジェクトが3種類。

OP16CPU、AN式誘導装置(まっすぐ走るんじゃー2)、そしてこの超音波FMCWレーダーです。

 

= FMCW

FMCWレーダはドイツ語のwikipediaが一番まとまってるみたいです。(翻訳をポチっとして読んでください)

 

で、読んでてピンときたんですが、IFの周波数をうまくチョイスすれば、電波じゃなくて、超音波でもできるんじゃないの?と。

調べると、超音波FMCWで血流を測定する装置はあるみたいです。

日本超音波医学会会員専用サイト

 

 

= 基本アイディア

で、ここでビート周波数を可聴域に持ってゆけば、聞こえる。且つ、マイクを2個使えば、左右の耳で物体の位置がわかるんじゃないか?しかもパルス式よりも解像度高く。

と考えたわけですよ。

 

で、2020年に作ってみました。

- しかしダメでした。

結論から言えば、なにかイメージが聞こえるのはわかるんですが、チャープ1回1回の切り替わり部分がうるさすぎて、聞いてられませんでした。

 

対策として、普通にFFTして、合成音をヘッドフォンに発音。って方法もあるんですが、それじゃあんまり意味ないので、ペンディングしてました。

 

 

= 新しいアイデア

で、8月/Bに降って来たんですよアイディアが。

チャープが1本だから、切り替えがうるさいんですよ。だったら、チャープをn本同時にTX。且つはじめと終わりの振幅を減らして、全体の音量を平準化するんですよ。

無限音階、シェパードトーンですね。

www.allisone.co.jp

チャープの周波数間隔を揃えれば、反射波の検波周波数は同じになるので、変な和音にはなりますが、多分、音状空間を再生してくれるはずです。

 

これができれば、盲人の保護や、暗闇での行動補助ができそうで、楽しみなんですが、ほかのプロジェクトが終わらないので、まだしばらくペンディングですね。

 

各周波数での感度の平準化が必要なので、測定系もなんとかしないと。

 

あと、これ、逆に当然電波でも使えて、感度か位相解像度を数倍にできる可能性があるし、動的に切り替えられますね。

というわけで無限音階(シェパードトーン)をチャープに使うSFCWレーダのアイディアは2023年8月にはあるよ。という特許潰しの公知例にお使いください。どうぞ。

 

 

 

1bit CPU BPU ふつーのVerilogで書くと

昨日の1bit CPU BPU(Bit Processor Unit) ですが

ふつーのVerilogで書くとこんなカンジです。

もっとも、BPUのROM内容次第で変わるんで、サンプルコードを移植するとこんなカンジと言う事で。

 

Verilogの方が、ずっと読みやすく、FPGA実装すると、BPUのROM分割化のメリットはあまり出ませんね。

ROM分割のメリットは、core部が切り離せるのでインクリメンタル開発が楽。

動作を動的に変更したい時、ROMデータをEEPROMに書いといて、都度読み替える構成が考えられる。くらいでしょうか?

//BPU(Bit Processor Unit)
// form 復刻版 ディジタル回路設計ノウハウ【オンデマンド版】CQ出版
// https://shop.cqpub.co.jp/hanbai/books/52/52181.html
//write VerilogHDL 2023-10-28sa
//普通Verilogだったらどう書くかのサンプル

`default_nettype none
module BPU_VERILOG
(    input wire         CLK_H_i
    ,input wire         INIT_L_i
    ,input wire [31:0]  GPIs_i 
    ,output wire[31:0]  GPOs_o
) ;
    reg[31:0]GPOs ;
    reg[ 7:0]MAs ;
    always@(posedge CLK_H_i or negedge INIT_L_i)
        if( ~ INIT_L_i )
        begin
            MAs <= 0 ;
            GPOs <= 0 ;
        end else
        begin
            MAs <= MAs+1 ;
            case( MAs ) 
                7'h00: DATs  = GPOs[ 0] <= 1'b1 ;
                7'h01: DATs  = GPOs[ 1] <= 1'b1 ;
                7'h02: DATs  = GPOs[ 2] <= 1'b1 ;
                7'h03: DATs  = GPOs[ 3] <= 1'b1 ;
                7'h04: DATs  = GPOs[ 4] <= 1'b1 ;
                7'h05: DATs  = GPOs[ 5] <= 1'b1 ;
                7'h06: DATs  = GPOs[ 6] <= 1'b1 ;
                7'h07: DATs  = GPOs[ 7] <= 1'b1 ;
                7'h08: DATs  = GPOs[ 8] <= 1'b1 ;
                7'h09: DATs  = GPOs[ 9] <= 1'b1 ;
                7'h0A: DATs  = GPOs[10] <= 1'b1 ;
                7'h0B: DATs  = GPOs[11] <= 1'b1 ;
                7'h0C: DATs  = GPOs[12] <= 1'b1 ;
                7'h0D: DATs  = GPOs[13] <= 1'b1 ;
                7'h0E: DATs  = GPOs[14] <= 1'b1 ;
                7'h0F: DATs  = GPOs[15] <= 1'b1 ;
                7'h10: DATs  = GPOs[ 0] <= 1'b0 ;
                7'h11: DATs  = GPOs[ 1] <= 1'b0 ;
                7'h12: DATs  = GPOs[ 2] <= 1'b0 ;
                7'h13: DATs  = GPOs[ 3] <= 1'b0 ;
                7'h14: DATs  = GPOs[ 4] <= 1'b0 ;
                7'h15: DATs  = GPOs[ 5] <= 1'b0 ;
                7'h16: DATs  = GPOs[ 6] <= 1'b0 ;
                7'h17: DATs  = GPOs[ 7] <= 1'b0 ;
                7'h18: DATs  = GPOs[ 8] <= 1'b0 ;
                7'h19: DATs  = GPOs[ 9] <= 1'b0 ;
                7'h1A: DATs  = GPOs[10] <= 1'b0 ;
                7'h1B: DATs  = GPOs[11] <= 1'b0 ;
                7'h1C: DATs  = GPOs[12] <= 1'b0 ;
                7'h1D: DATs  = GPOs[13] <= 1'b0 ;
                7'h1E: DATs  = GPOs[14] <= 1'b0 ;
                7'h1F: DATs  = GPOs[15] <= 1'b0 ;
                7'h20: if(GPI[0]==1'b1) MAs<=7'h22 ;
                7'h21: MAs <= 7'h20 ;
                7'h22: MAs <= 7'h00 ;
            endcase
        end
    assign GPOs_o = GPOs ;
endmodule

1bit CPU BPU(Bit Processor Unit) 1984年エレクトロニクス実務シリーズ復刻版より

先日、アキバの書泉ブックタワーで見かけた復刻版です。中が見えなかったんですが、誘われてる気がしたので衝動買しました。結果的には当たりでしたね。

shop.cqpub.co.jp

 

本書には、「ビット処理システム」(BPU)言うなれば、1bit CPUとも言うべきシーケンサ、コントローラが載ってます。

曰く「小規模なディジタル・システムを設計するとき,データの流れや演算,メモリといった部分は比較的すんなり行っても,全体のコントロール・タイミングを作るのには苦労します.一様な動きならまだしも、複雑に条件がからむ動作は、特に一筋縄ではいきません。ゲートとFFをあちこちに繋いで何度も更新しても、ちゃんと動いてくれないという経験は筆者だけではないと思います。

 ランダム・ゲートとFFで順序回路を組んでいたら大変だということで、PLAが出現しました。しかし、市場に出回っているPLAは入出力が少なく、小さなシステムでも数個使用したり、外部にデコーダ、カウンタ、ラッチなどを必要とし、容量を超えたら、お手上げ、というわけで、2~30bitの入力と出力をbit単位で制御出来る、統一手法はないものかと長年考えていました。その結果がここに紹介するビット処理システムです。」

ということで、最小構成と、何種類かの拡張システムが紹介されいます。

 

基本システムで8bit x 128wordのプログラムROMにつながる7bitカウンタと

フラグと呼ばれるAND項を持ったアキュムレータ、最大64bit入力セレクタ、最大64bitのセレクトラッチを持つシステムで、

オペコードはたったの3種類、入力/出力/ジャンプだけです。

 

実際の構成をVerilogHDLで書き起こすとこんなカンジ。

//BPU(Bit Processor Unit)
// form 復刻版 ディジタル回路設計ノウハウ【オンデマンド版】CQ出版
// https://shop.cqpub.co.jp/hanbai/books/52/52181.html
//write VerilogHDL 2023-10-28sa
//
`default_nettype none
module BPU
(    input wire         CLK_H_i
    ,input wire         INIT_L_i
    ,input wire [31:0]  GPIs_i 
    ,output wire[31:0]  GPOs_o
) ;
    wire[ 4:0]  PAs ;
    wire IND_H = GPIs_i[ PAs ] ;
    wire[ 7:0]  MDs ;
    wire[ 6:0]  MAs ;
    wire        OUTD_H ;
    wire        STB_L ;
    BPU_CORE
        BPU_CORE
        (    .CLK_H_i                   ( CLK_H_i   )
            ,.INIT_L_i                  ( INIT_L_i  )
            ,.IND_H_i                   ( IND_H     )
            ,.MDs_i                     ( MDs       )
            ,.MAs_o                     ( MAs       )
            ,.PAs_o                     ( PAs       )
            ,.OUTD_H_o                  ( OUTD_H    )
            ,.STB_L_o                   ( STB_L     )
        ) 
    ;
    reg[31:0]GPOs ;
    always@(posedge CLK_H_i or negedge INIT_L_i)
        if( ~ INIT_L_i )    GPOs <= 0 ;
        else
            if( ~ STB_L )   GPOs[ PAs ] <= OUTD_H ;
    assign GPOs_o = GPOs ;
    BPU_PGMEM
        BPU_PGMEM
        (    .ADRs_i                    ( MAs       )
            ,.DATs_o                    ( MDs       )
        )
    ;
endmodule

module BPU_CORE
(    input wire         CLK_H_i
    ,input wire         INIT_L_i
    ,input wire         IND_H_i
    ,input wire [ 7:0]  MDs_i
    ,output wire[ 6:0]  MAs_o
    ,output wire[ 4:0]  PAs_o
    ,output wire        OUTD_H_o
    ,output wire        STB_L_o
) ;
    reg[ 6:0]   MAs_a   ;
    reg[ 6:0]   MAs     ;
    reg         FLG_a   ;
    reg         FLG     ;
    wire PP = MDs_i[5]  ;
    assign OUTD_H_o = PP;
    reg         STB_L ;
    assign STB_L_o = STB_L ;
    always@(MAs,MDs_i,FLG,PP,IND_H_i)
    begin
                                MAs_a = MAs + 1 ;
                                FLG_a = FLG;
                                STB_L = 1'b1 ;
        casex( MDs_i[7:6] )
            2'b00:  //out cmd
                    if( ~ FLG )   STB_L = 1'b0 ;
            2'b01:  //in cmd
                    if(PP!=IND_H_i) FLG_a = 1'b1 ;
            2'b1x:  //jp cmd
                begin
                                FLG_a = 1'b0 ;
                    if(~ FLG)   MAs_a = MDs_i[ 6:0] ;
                end
        endcase
    end
    always@(posedge CLK_H_i or negedge INIT_L_i)
    if( ~ INIT_L_i)
    begin   FLG <= 1'b0 ;
            MAs <= 0 ;
    end else
    begin
            FLG <= FLG_a ;
            MAs <= MAs_a ;
    end
    assign MAs_o = MAs ;
    assign PAs_o = MDs_i[ 4:0];
endmodule


module BPU_PGMEM            //8bit x 128 word (1024bit)
(    input wire [ 6:0] ADRs_i
    ,output wire[ 7:0] DATs_o
) ;
    reg[ 7:0]DATs ;
    always@( ADRs_i )
        case( ADRs_i )
            7'h00: DATs  = 8'b00_10_0000 ;
            7'h01: DATs  = 8'b00_10_0001 ;
            7'h02: DATs  = 8'b00_10_0010 ;
            7'h03: DATs  = 8'b00_10_0011 ;
            7'h04: DATs  = 8'b00_10_0100 ;
            7'h05: DATs  = 8'b00_10_0101 ;
            7'h06: DATs  = 8'b00_10_0110 ;
            7'h07: DATs  = 8'b00_10_0111 ;
            7'h08: DATs  = 8'b00_10_1000 ;
            7'h09: DATs  = 8'b00_10_1001 ;
            7'h0A: DATs  = 8'b00_10_1010 ;
            7'h0B: DATs  = 8'b00_10_1011 ;
            7'h0C: DATs  = 8'b00_10_1100 ;
            7'h0D: DATs  = 8'b00_10_1101 ;
            7'h0E: DATs  = 8'b00_10_1110 ;
            7'h0F: DATs  = 8'b00_10_1111 ;
            7'h10: DATs  = 8'b00_00_0000 ;
            7'h11: DATs  = 8'b00_00_0001 ;
            7'h12: DATs  = 8'b00_00_0010 ;
            7'h13: DATs  = 8'b00_00_0011 ;
            7'h14: DATs  = 8'b00_00_0100 ;
            7'h15: DATs  = 8'b00_00_0101 ;
            7'h16: DATs  = 8'b00_00_0110 ;
            7'h17: DATs  = 8'b00_00_0111 ;
            7'h18: DATs  = 8'b00_00_1000 ;
            7'h19: DATs  = 8'b00_00_1001 ;
            7'h1A: DATs  = 8'b00_00_1010 ;
            7'h1B: DATs  = 8'b00_00_1011 ;
            7'h1C: DATs  = 8'b00_00_1100 ;
            7'h1D: DATs  = 8'b00_00_1101 ;
            7'h1E: DATs  = 8'b00_00_1110 ;
            7'h1F: DATs  = 8'b00_00_1111 ;
            7'h20: DATs  = 8'b01_00_0000 ;//GPI[0]!=0->F<=1
            7'h21: DATs  = 8'b10_10_0000 ;//~F?jump $20
            7'h22: DATs  = 8'b10_00_0000 ;//jp 0
            default: DATs  = 8'b10_00_0000 ;
        endcase
    assign DATs_o = DATs ;
endmodule