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

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

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の電池テスターのアナログメーター - 散歩師・漫画居士のくだらなクラブ日記

ピカちんキットおたから探知機

2017に書き始めたネタですが、今更ですが公開します。

--

ピカちんキット おたから探知機

https://bandai-hobby.net/images/159_2812_s_ug7bliwg4m2ykogvr7zxlgthsdrf.jpg

ピカちんキットS01 おたから探知機|バンダイ ホビーサイト

回路図はこんなカンジ

搭載されてるマイコン
NY8B071AS14 P7351EF

台湾の九齊科技股イ分有限公司(nyquest)製の8bitマイコン

九齊科技股份有限公司 Nyquest Technology Co., Ltd.

NY8Bシリーズ(家電用) 
P/N      OTP    I/O RAM     Clock   LIR ADC     Comparator  OpAmp  WDT LVD
NY8B071A 1Kx14  12  96x8    Dual    v   5-ch    1           -       v   v

 

http://www.nyquest.com.tw/product_list_view.asp?pdt_MainType=11&pdt_SubType=35&BRDarea=4

 

14pinパッケージの

 

 

金属探知機の実装は一般的に、
励起と検出コイル分けたり

Eco Friendly Metal Detector - Arduino : 8 Steps (with Pictures) - Instructables

 

アナログ発振器つかったり

Build Your Own Metal Detector with an Arduino - Projects

 


でも

Simple Arduino Metal Detector : 8 Steps (with Pictures) - Instructables

Arduino Metal Detector Project with Code and Circuit Diagram

 

ただ、ピカちんキットはさらに異なる回路になってる。

発見時に音がなるのも、スレッシュコントロールが素晴らしいってことだし。

発振が正弦波っぽくキレイな理由もよくわからない。

CANDOの電池テスターのアナログメーター

 今作ってるAN式誘装置は可聴域の可聴速度の音を使ってます。装置を作るのに、音量を知る必要があるんですが、デジタル表示だと、どうにも変化の具合が分からず。

 

部屋を探したんですがアナログメータが見つからず、CANDOで買ってきました。電池テスターですね。

 円高前までは、どこの100円ショップでも100円で扱ってたと思うんですが、今は扱ってるのはCANDOだけで、しかも300円商品に。

 

 素性を測ってみると、どうやら2mA品ですね。2mAなら、FPGAの1ポートでなんとか扱えます。(小さくはないですが。)内部抵抗は230ohmほどで、合計1500ohmほどに調整すると、3.15Vでフルレンジに触れます。

 

 ただ、時定数が小さく、UVメータやテスターのようになめらかには振れません。振動も拾いやすく、思ったような使い方ができるかは微妙です。

 目盛り書かなきゃ…

 

ステルス機を無効化する 航空機搭載型の合成開口レーダー

技術に明るい人なら、タイトルだけで「もう米軍で試作してるんじゃん?」と言いそうですが。

一昨日アキバで思いついたので、健忘にメモメモ

1) 合成開口レーダーを使えば、レーダの感度、分解能、速度を上げることができる。

2) 感度に全振りすれば、ステルス機のステルス機能を無効化することもできそう。

3) 航空機3機以上に受信アンテナをつけて、合成開口化すれば

   地上で3機よりも、開口面積/分解能を上げやすい

4) 2017年からTIで販売してる、自動車用ミリ波レーダーICの

   FMCWレーダシステムは、IF直後にADCし、そこから先はデジタル処理。

5) これを真似すれば、飛行機搭載受信アンテナで受信したIF信号は、デジタル信号なので、基地にある巨大処理機で計算できる。飛行機搭載部分はリーズナブルに小さくできる。

 

6)問題は、飛行機の受信機と、送信機の間で、かなり高精度のPLL ロックが必要なこと。

7) 2018年?のトラ技の記事にもありましたが、最近のデジタルPLLは超強力で、GPSクロックに対して、1Hz/100MHz??精度が可能なので、今なら、全部の時計を合わせるのも、不可能では無いでしょう。

8) もう一つの問題として、送受信レーダーの相対位置を厳密に知る必要があります。

9) これも、ビーコンの位置を同時に測れば、補正も可能でしょう。なんなら、レーダーで測ってもいい。レーダーの1波/ADC1サンプルに比べて、飛行機の相対位置の変化は、小さなものなので、基地機の計算機で予測/補正も可能なはずでうs。

 

wikipediaのFMCWの記事は日本語よりも英語よりも、なぜかドイツ語が充実しているので、翻訳ポチって読んでくだされ。

 

;-P enjoy!

明けましておめでとう2023

昨年中はイロイロありがとうございました
今年も仲良くしてください。
良い年でありますように。
東京池勝漫画居士

HappyNewYear2023

 

兎児爺ってオモチャのイラストです。

まあ、中秋の名月のオモチャなんですけどね。

 

 

 

XMAS用にシュトーレン買った

 

今月12月25日(一部では来年1月1日)は『地上に慈悲と安寧を得ることを思う日』だそうだ。

ドイツではその日にこのケーキを食べるらしい。

シュトーレンという。(ギャラクシーエンジェルの彼女の元ネタだね)

アメリカではフルーツケーキらしいけど、中身は一緒なんで、ドイツ由来なのかもわからんね。

 

去年は買えなかったので、今年は早めに。

 

< 地上に愛と平和を。

VerilogHDLのマクロのヤバイとこ発見

// VerilogHDLでは、Cと同様にマクロが使えます
// Cの乱暴は変換に対して、VerilogHDLではマクロ変換に「'」をつけることで、
// 暴発変換防止が効いてます。
// = たとえば、
--
`define slice(xx,n,W)  xx[(n)*(W)+:(W)]

wire [15:0]  Datss ;
wire [3:0] Dats_s [0:3] ;
assign Dats_s[0] = `slice(Datss,0,4);
assign Dats_s[1] = `slice(Datss,1,4);
assign Dats_s[2] = `slice(Datss,2,4);
assign Dats_s[3] = `slice(Datss,3,4);
--
//の様にすれば、1次元<->2次元bit列の変換が簡単になります。
//Vanilla VerilogHDLでは、入出力ポートに2次元以上のbit列を使えませんが、
//矩形でよければ、これで問題を感じなくなりました。

--さらに
`define gen generate
`define gv genvar
`define fori(i,N) for(i=0;i<N;i=i+1)
`define egen endgenerate
`define eegen `e `egen
`b begin
`e end
`gen`gv gi ; `fori(gi,4) `b:g `a Dats_s[gi] = `slice(DATss,gi,4); `eegen 
--
--さらに
`define ga_arr(A,B,N,W) `gen`gv gi; `fori(N) `b:g `w[(N)-1:0] A[0:(W)-1];`w[(N)*(W)-1:0]B;`a A[gi]=`slice(B,gi,N); `eegen 
`ga_arr(Dsts_s,DATss,4,4)
--
//まで簡略化できますね。
//マクロのセットは ”`define.vh”におさめ、`inlude"./define.vh"して使ってます。


// = しかし、以下の様な表記では、大問題が発生します。
--
`define b begin
`define e end
`define COPY(x,y) `b y<=x; `e
`define exch(a,b) `COPY(b,a) `COPY(a,b) `e

always@(posedge CK)
    `exch(AA,BB)
--
//これは
--//目論見
    begin a<=b;b<=a; end
--
--//実際
  begin a<=begin;begin<=a; end
--
変換しないはずのbを`bと見誤って beginに変換してしまいます。

// = 回避は
 --
`define exch(a,B) `b a<=B;B<=a; `e
--
// しか思いついてないです。
// Quartus( Intel/Altera のFPGAコンパイラ)でも
// modelsim_alteraでも起きるので、
// VerilogHDLの言語仕様かなぁ?と


--2022-12-06tu 色々コードにミスがあったので修正

ぺんてるサインペンを万年筆に改造

前々から思ってたんですが、ぺんてるのサインペン(商標)ってカッチョイイですよね。

あれがそのまま万年筆だったらいいなと、すっと思ってました。

 

改造も考えてたんですが、太さ的にはいらないので、諦めてました。

 

先日、出張でぺんてる・サインペンを使う機会があり、やっぱりサインペンの万年筆がほしくなり、ドナー万年筆を探してはじめました。

なんとなくダイソーで文房具を眺めたら、

サインペンとプラチナ製Riviere万年筆が並んでて、

それが細くて入れられそうだったので、早速買ってみました。

 

 

 

切って、ちょこっとカッターでなめたら、首軸のネジはスンナリ入ったんですが、

カートリッジがはいらず、一旦断念しました。

 

でも、いいサイズの甲丸ダイヤモンドヤスリ(このサイズは最近100円ショップで見なくなりましたが)があったので、

延々2時間以上やすりつづけて、入れられるようになりました。

サインペンの胴の材質、クリップが割れた覚えがあるので、昔はABSだった気がするんですが、今のはポリっぽい粘りがありますね。再生材の量が増えて対策なのか?

何にしても、加工中割れなそうなので、ありがたいですが。

 

カートリッジの径は7.5mm

サインペンの胴軸の外形は、最細で10mmくらいなので、

厚さ余裕もありそうです。

 

弱冠、カートリッジが噛んで、サインペンの胴軸に残ることもありますが、

引っ張ればなんとか抜けます。

 

お誂え向きというか、首軸おねじで、胴軸の内側にめねじが切れて、締まった感じになり、心配してた首軸と胴軸の嵌合緩みもなく使えてます。

 

こんな万年筆使ってる人は、私だけな気がします。

カッチョイイ。気に入りました。

 





 

FPGAで1pinでNTSCを出力する+5x7pix font OSD

力尽きたので、githubのリンクだけ。

 

github.com

 

 

ドット周波数はD1の13.5MHz(720x480)でも、D2の4fsc(768x480)でもなく

メガドラ/PCエンジンの12.27272MHz(640x480)の正方です。

正方系はあんまないよね。と。

FPGA 1pinでNTSCを出力 + 5x7px FONT OSD

 

#Забастовка 日本政府はロシアでのストライキを支援せよ!

#Забастовка 日本政府はロシアでのストライキを支援せよ!

この2週間位、どうやったらロシア・ウクライナ戦争を終結させられるか考えていたが、やはり最も効果的なのは、ロシア人によるゼネストだろうと思い至った。

クレムリンは核攻撃でも攻略できない。200万人の地上部隊でも攻略できるだろうか?

だが、ゼネストが屁でもない為政者はいない。本気で戦うなら、むしろゼネストのほうが効果的だろう。

 

 しかしながら、当然ゼネストを続けるのには支援が必要だ。

日本政府はロシアでストライキを行う人達を支援すると発表せよ。

連合軍に自衛隊を送って、日本人を殺人者にしない、殺されない、最もお安い対策なので、まず実施してほしい。

 

 

 

あけましておめでとうございます2022

今年もよろしくです。

f:id:mangakoji:20220102195807j:plain

年賀状2022

朝鮮民画にいい虎があったので、写生。

萇山虎(ちゃんさんぼん)って言うトラの妖怪らしい。です。

妖怪マニアなら知ってるのかな?
慶尚北道の小白山脈に住んでて、朝鮮のトラはタバコを吸うんだそうだ。
もっと成長すると、毛が白くなって、角が生えて、二本足出歩くらしい。
 
今年もよろしくー

 

 

 

 

ワクチン接種が進んだのはIOCゲームズのせい。だがこっから先は地獄だよ。

 このコロナの国難の最中にIOCゲームズをやるのは言語道断だと思うが、ここまでワクチン接種が進んだのは、IOCゲームズがあったからだと思う。

 もし、今年IOCゲームズがなかったら、自民党ファイザーのワクチンを手に入れる交渉ができたはずがない。

 

 そして、ファイザーには「IOCゲームズのため」だと交渉してるはずなので、今後ファイザーはほとんど入ってこない筈。今日本で作ってるモデルナが手に入らないのも、何らかのバーターがあるせいだろう。先日チャンポン打ちが認可された遠因でもあろう。

 

  貧富の差の拡大と日系日本人の削減が党是の自民党は、IOCゲームズの後はコロナ対策を放棄するだろう。実際撃つ手ないし。

 ワクチンはIOCゲームズ祝の紅白饅頭扱いでしょう。なぜ終わった後に打つ必要があるの?位で来ますよ。

 

 日本の最大の敗因は、出口戦略にmRNAワクチンという方法がある。という情報を、我々が知る程度まで流布するのが遅かった事。つまり1年前には後塵を拝することが決まってたとも言える。

 

 何かにブコメしとこうかとも思ったけど、なかなか近いメンションがないので、blogに。