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

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

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

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

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

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


それは

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回一回の切り替わり部分がうるさすぎて、聞いてられませんでした。

 

対策として、普通に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

OP16 CPU

もう'17年から、ボーッとopコード4bit固定、16種類のCPUを考えてるですが、

UMA向けの模型、AN式誘導機を優先するため、またもペンディングします。

特に割り込み周りが出来てなです。

いつ再開するかは未定。

 

現在の仕様はこんなカンジ。

--

================
= OP16 マイコン 仕様書
================                                                    NAFuMA

= レジスタ
================
PC/16   Program Counter
    基本的にアドレスが大きい方に1づつ進む
    本機はハーバードアーキテクチャーなので、
    プログラムカウンタが指すのは、プログラムメモリ
    *(書き込みでは特殊な振る舞いをするので、後序する
ACM/16  Accumulator
    データの一時保管レジスタ
    Immidiate値、DataMemoryAddress,ALUIn0,ALUOut0などは
    このレジスタを経由する。
    アドレスを割り付けるかもしれいないが、
    意味のある動作はできないだろう。
DP/16   DataPointer
    データスタックのポインタ。
RP/16   ReturnPointer
    SubRoutineの帰還アドレスや、Nesting変数などを
    格納するReturnStackのポインタ。
    本機では、DataとReturn値のポンタを分ける。
IRQ/15  IRQ vector
    割り込みのベクターを保持するレジスタ
    MSB[15]bitは、IRQ[14:0]のORであり、
    irc OPCodeでは、MSBをチェックしている。
    USRがRTLを作り込んで実現する。
RD/16   ReadData
    read値を一時保管するレジスタ
    アドレスは割り付けるかもしれないが、
    有意味のデータは得られないだろう
OPC/4   OP Code
    OP Codeがラッチされている。
    この値がマイクロプログラムのコードとして解釈される。
    解釈なしに、コードがそのまま入る。
OPR/4   OPeRand
    OPerandがラッチされ、ALUに、モードとして供給される。
    どのタイミングで更新されるかはTBD中。
RED/1   Read Do
    DataMemory Readのセマフォ。どの様に推移させるかはTBD中。
WTD/1   Write Do
    DataMemory Writeのセマフォ。どの様に推移させるかはTBD中。

PRA/16  PGMEM Adress
PRD/16  PGMEM Data

(adressは未決定)

GPIO/???16bit x (256-16)word.
    peripheralの専有アドレスは、TBD
    というか、userがRTLでコードして決めることになるが、
    専有が小さい場合、システム寄りの場合、$0010~$01FFを推奨。
    逆にVRAMやDMAを要するようなbufferの場合、$C000以上の高位が良いだろう。
    インタープリターを実装する場合は、その中間か


- ステータスレジスタ
    本機にステータスレジスタはありません。
    これは割り込み処理の単純化に配慮したものです。
    ステータスレジスタが必要な場合、スタックを消費して実現してください。

= OPecode
================
コード予約語は小文字とする。ユーザ定義は大文字(RTLコードではない。)

 OPCode  別名        意味                    動作
------------------------------------------------------------------------------
. dup   dup  push   push                (A|B C D -- A B|B D)
. drp   drop pop    pop                 (A B|C D -- A|B B D)
. dpi   > DPinc     DataPointer inc1    (A B|C D -- A B D|C) 
. dpd   < DPdec nip DataPointer dec1    (A B|C D -- A |C B D)
. nan   nand        nand                (A B|C D -- A|~(B&C) B D)
. add   +           add                 (A B|C D -- A|(B+C) B D)
. bol   bool        booling             (A B|C D -- A B | ( (C != 0)? -1 :0) B D)
. lda               load Address        (A B|Adr D -- A B|@Adr)
. sta               store Address       (A B Dat|Adr D -- A |B Dat D) @Adr<=Dat
. cal   call        call                (A B|Adr -- A|B)(R: -- PC+1)PC<=Adr
. ret               return              (R:Rt --) PC<=Rt
. irq               Interupt Check      *** TBD ***
. li1   LDI1        load imidiate 1word (A B|C D -- A B C |{12'd0,D0} D)
. li4   LDI4        load imidiate 4word (A B|C D -- A B C |{D0,D1,D2,D3} D)
. al1   ALU21       ALU result store 1  (A B|C D -- A|ALU0 B D)
. al2   ALU22       ALU result store 2  (A B|C D -- A ALU0|ALU1 C D)
------------------------------------------------------------------------------
* OPCodeの値はTBD irqが0だけ決まってる。
* 動作説明の説明

(P3 P2 P1 |ACM P0 -- P3 P2 |P1 P1 P0) 
    (処理前のDataスタック,ACM -- 処理後のDataスタック,ACM)
    |ACM            |の右がACMの値
    P0=@DP          P0はDP(データポインタの示す値)
    P1=@(DP-1)      P1はDP-1の示す値
                        DPは積む(push)で1増える。
    P2=@(DP-2)
    P3=@(DP-3)
    - DPの指すアドレスは、基本的に|ACMの一つ右。(例外もある。)

(R:Adr -- )
    (R:処理前リターンポインタの
    
================
= al1 (ALU21)
================
// and      or      nor     xor     xnor
// inhb     sub 
// bitc     bset    bclr    
// eq       ge      gr
// jadr
       oprand  意味    動作
AND_  : an     and     {YYs0} = DATs1_i & DATs0_i ;
OR_   : orr    or      {YYs0} = DATs1_i | DATs0_i ;
NOR_  : norr   nor     {YYs0} = ~(DATs1_i | DATs0_i) ;
XOR_  : eor    xor     {YYs0} = DATs1_i ^ DATs0_i ;
XNOR_ : enor   xnor    {YYs0} = ~(DATs1_i ^ DATs0_i) ;
INHB_ : inhb   inhbit(禁止)     //(AB --A&(~boolB))
                        {YYs0} = (DATs0_i!=0) 0 : DATs1_i ;
SUB_  : sub     引き算  {YYs0} = DATs1_i - DATs0_i;
BITC_ : btc     bit chek 
                        {YYs0} = 1&(DATs1_i>>DATs0_i[3:0]);
BSET_ : bst     bit set         // DATs1_iの[DATs0_i]のbitを1にsetする。
                        {YYs0} = DATs1_i | (1<<DATs0_i[3:0]);
BCLR_ : bcr     bit clear       //DATs1_iの[BITs0_i]bit を 0にclearする
                        {YYs0} = DATs1_i&(~(1<<DATs0_i[3:0]));
EQ_   : eq      一致            //(DATs0_i==DATs1_i)なら-1。でなければ0を返す
                        {YYs0} = (DATs1_i==DATs0_i)?-1:0;
GR_   : gr      大きい          //(DATs1_i>DATs0_i)なら-1。でなければ0を返す
                        {YYs0} = (DATs1_i>DATs0_i)?-1:0;
GE_   : ge      大きいかか同じ  //(DATs1_i>=DATs0_i)なら-1。でなければ0を返す
                        {YYs0} = (DATs1_i>=DATs0_i)?-1:0;
JADR_ : jad     jdgがFalseなら-1、でなければADRを返す。JPフィルタの補助
                            //(jdg ADR -- ADR/-1)
                        {YYs0} = (DATs1_i!=0)?DATs0_i : -1;

and,orなどは、verlogの予約語なので、oprandには避けている

================
= al2 (ALU22)
================
// ALU22
// sw       neg     neg32
// sub      abs     abs32   sadd    ssub    add12
// swp      mul     sft     ssft    maxmin  smaxmin
// MSB      lsb
// 

// notはdup nan で実現。2wordなので、ALU22を使うメリットがない。

sw SWP_:                   {YYs1,YYs0}=
                                {DATs0_i,DATs1_i};//SW_=5'h10

NEG_:`b               {YYs0} = -(DATs0_i);
                        YYs1=DATs1_i;
`e
NEGS32_:               {YYs1,YYs0} = -{16'h0,DATs0_i} ;
ABS_:`b                 YYs0=(DATs0_i[15])?(-DATs0_i):DATs0 ;
                        YYs1=DATs1_i;
`e
ABS32_:                 {YYs1,YYs0} = 
                            (DATs1_i[15])
                            ?   (-{DATs1_i,DATs0_i}) 
                            :     {DATs1_i,DATs0_i} 
                        ;
SADD_:                  {YYs1,YYs0}=
                              {{16{DATs1_i[15]}},DATs1_i}
                            + {{16{DATs0_i[15]}},DATs0_i} 
                        ;
SSUB_:                  {YYs1,YYs0}=
                              {{16{DATs1_i[15]}},DATs1_i}
                            - {{16{DATs0_i[15]}},DATs0_i} 
                        ;
ADD12_:                 {YYs1,YYs0}=
                             {16'h0,DATs1_i}
                            +{16'h0,DATs0_i} 
                        ;
SUB12_:
                        {YYs1,YYs0}=
                             {16'h0,DATs1_i}
                            -{16'h0,DATs0_i} 
                        ;
MSB_:`b                 YYs0= 1 & (DATs0_i>>15) ;
                        YYs1= DATs1_i;
`e
MUL_:                   {YYs1,YYs0}=
                            {16'h0,DATs0_i} * {16h0,DATs1_i};
SFT_:                   {YYs1,YYs0}=
                            {16'h0,DATs1_i}<<DATs0_i;
SSFT_:                  {YYs1,YYs0}=
                            {{16{DATs1_i[15]}},DATs1_i}<<DATs0_i;
MAXMIN_:                {YYs1,YYs0}=
                            (DATs1_i>=DATs0_i)
                            ?   {DATs1_i,DATs0_i}
                            :   {DATs0_i,DATs1_i}
                        }
SMAXMIN_:                {YYs1,YYs0}=
                            ({~DATs1_i[15],DATs1_i[14:0]}
                                >`{DATs0_i[15],DATs0_i[14:0]})
                            ?   {DATs1_i,DATs0_i}
                            :   {DATs0_i,DATs1_i}
                        ;
MUL_:                   {YYs1,YYs0}=
                            {16'h0,DATs1_i}*{16'h0,DATs0}
                        ;

 

================
= shortened(短縮)subroutine
================
- Shortened(短縮)subroutine は
    li1 <entry> cal の3wordで呼び出せる 16種類のサブルーチン郡。
    - まだ絞りきれてない
    - ソフトウエアのみで変更可能。
//  LDS(pick)STS     SEL     N_GET
//  ROT     RROT    TUCK    RROL
//  OVER    TUKN    ROLL
//  DFOR    DNEXT   RJP     RCAL

//  FLT     ZIP     MAP     REDUCE  LEN
//  JRCL 
//  N_GET   i_GET   n_GET   m_get   j_get


// LDS  (A Ofs -- A Var)//7
{dup,nan,li,DP_,add,lda,ret}
// STS  (A DAT ops -- A)//7
{dup,nan,li,DP_,add,sta.ret} //15
// SEL  (A F Jdg T -- A sel)
{sw,dup        //(A F T J J
,<,sw,>          //(A F J T J
,nan            //(A F J T'
,sw,nip,sw,bst      //(A T' F J
,dup,nan
,nan
,nan,ret}
 
//RJP   (A Ofs -- A)(R:Rt -- Ofs+PC) 
{li,RP_,li,1_,add,lda    //(A ofs Rt
    ,add,li,RP_,li,1_,add,lda,sta,ret}

 

================
= PCの動作
================
- 本機のPCの動作は
- 特殊条件ジャンプ
    PCには16'hFFFFは書き込めず、
    PCはPC+1にincrementされる。
    これによって、jadと組み合わせることで、条件ジャンプを可能にしている。
    <例>  num が <cmp number>なら <ADR>にジャンプ (num -- )
        li4 <cmp number> al1 eq li4 <adr> al1 jad li1 <PC> sta

- 短縮サブルーチン用アドレス変換
    adr $0000-$000Fは、それそれ$0080,$0088,$0090,$0098..$00F8に直接転送される。
    これによって、adr$0000-$000Fはそれぞれ8wordのjump命令などを実装でき、
    短縮サブルーチンエントリーとして使える。
    - 通常のサブルーチンcall
        li4 A3 A2 A1 A0 cal                 //6word必要だが
    - 短縮エントリーcall
        li1 <short subRoutine Entry> cal    //3wordで済む。
    Z80の RST命令に近い。

- マッパー(未実装
    $4000アドレス単位にマッパを持ち、
    RTL実装で、自動ページ切り替えができればと考えてる。
    mappa1->mappa2->mappa14->mappa13の様に任意にマッパが切り替わるが、
    PCから見た見かけのアドレスは、$4000内にとどまる。様なやつ
    - システムの0ページのみは固定。
    - マッパサイズは$4000,$2000にするべきか迷い中。(0ページを実装で変えたいため)
================
= irc
================
- 本機では、1OPCでスタックを扱い切れない。
    スタック処理の途中で割り込みが入ると、
    割り込んだ側がスタックを破壊してしまう。
    このため、毎OPCごとに割り込みを受け付ける処理は行えない
    何か割り込み処理を行うために、ircコードをリザーブしている。
- 今はTBDだが、ircコマンドで、アプリ側がポーリングすることにするか?
    (プリエンプティブは諦める型

================
= Dataメモリアクセス
================
================
= Prgメモリアクセス
================
- 構成
    - その1
        データRAMの上位にPRG メモリを配置する。
            PGMEM_RE (ADR -- dat)
                li 15 al1 bst lda
            PGMEM_WT (dat Adr --)
                li 15 al1 bst sta
        - 問題
            - 32k Wordしかアクセスできない
                - アクセスにマッパを考える?
                - 逆にDataMemが32kWは多分問題ない。
            - マッパが大変になる
    - その2
        PRG mem アクセスレジスタを介してアクセス。
            PGRMEM_RE   (ADR -- dat)
                li1 PGA sta li1 PGD lda
            PGMEM_WT    (DAT ADR --)
                li1 PGA sta li1 PGD sta
        - 問題
            - FFを32bit消費する。
            - HW 的にwaitをどうとるか考える必要がある。
            - ちょっと遅い(そうでもないか?
                - むしろ クロック単位のdlyを吸収しやすいか?
            - 貴重な最初16アドレスを2コマも使う
        
        
- プログラムの転送
- ランダムアクセス

================
= メモリー
================
- DataもProgも16bit wordとする。

= Prog MEM
前詰めに配置する。
- Prgとしてのアクセス
  - PC(Program Counter)による read    opc フェッチ
    PCからのアクセスは、上位14bitで16bitアドレスを選択する。
    下2bitで4bit word select
  - PC write
    PCによるアクセスwriteはない。
    書き込むのには、Dataとしてアクセスする。(staコマンド)
- Data としてのアクセス
    - Read
        16bit アドレスでアクセス
    - write
        16bit アドレスでのアクセス
= Data Mem
0ページ目はレジスタアサインしているので、そこだけは避ける。
プログラムと供給するときは???
- Read
   一般的なアクセス
- Write
    一般的なアクセス
- opcフェッチ
    Data Memのスタートアドレス設定によっては、
    PCでアクセスできない。イメージにするべきかは???

--

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

UMA(動く模型愛好会)の冬のミーティング「動く戦車オフ会」に向けて、

ずるいぞ!まっすぐ走るんじゃーの2号機。AN式ローレンツビーム誘導装置ロボを開発中です。

blogでも書かないと、進み出さないので。

 

= 原理

原理はこちら。

http://www1.odn.ne.jp/yaswara/gyaku.html#gyaku

旧陸軍の電波利用兵器の研究サイトの、解説記事なんですが、9月末からアクセスできなくなってますね。

極簡単に言うと、

o 左から、モールス符号のA(.-)、右からN(-.)を連続送信する。

o AとNは、音がある部分とない部分が反転してる格好。

o AとNのちょうど真ん中では、音が連続して聞こえる。

o Aに聞こえる時は右、Nに聞こえる時は左に舵を切れば真ん中に誘導される。

というものです。

 

すでに8月末には、TX(誘導装置というかビーコンですが)はバラックでは完成。

しかるに、人間の耳では、左右に別れて聞こえるため、イメージをつかめず。

 

受信側も9/11には、検波部(レベル判定部)のコーディングを終えてたんですが、

OP16 CPUの開発にかまけて進んでないです(こちらも中間報告upしないと。完成はかなり先か)

本日 デバグ2H+blog1H

単一の正答のsin波を入れた時に、検出できるっぽいところまで。

 

= 課題

マイクをつなげて、実機テストするまでに、simでやっつけたい課題

(全部は潰さないと思いますが)

o レベルがbit小さい。12bitレンジで$68F (所定は$7FFなのでそれには近い)gainUPするか迷ってる。

o 入力レンジを変えた時レベルがかわるか?

o 位相を変えた時でも出力があるか?

o 周波数を変えた時、どのくらい減衰するか?(フィルタ動作してくれるか?)

o ビーコンの音ががピタリ440Hzかを見極めるためのバンドワイズフィルタ。それを決める部分が、CIC(平均値)フィルタ1波としてるが、どうやって、調整するか(ああ、ここ考えてなかったんだ。)

 

 

RX(送信機/誘導装置/ビーコン)に関してはこちらを。

 

- 関連

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

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

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