忍者ブログ

NOROMA CLUB -日記-

2024年01月03日  Redmi Note 10 Pro バッテリー交換

2ヵ月ほど前にバッテリー膨張のため機種変更した「Redmi Note 10 Pro」。
バッテリーだけ注文して交換してみました。

Amazonだと互換品しか売っていなかった気がするので、
ヤフオクで純正バッテリー+工具セットを\2580で注文。


まずは接着された裏蓋を外すわけですが、
バッテリー膨張の力で、実はすでに半分ぐらい外れかけ(笑)
残り部分にピックを全面回しこんで簡単に開封です。



この状態でもバッテリーは見えているのに、
もう一段階分解しないとコネクタが外せないみたい。

見えているネジ(ちなみに17本もあった)を全部外して、
ピックを使って外枠を外したら、ようやくコネクタにアクセスできました。



新旧バッテリーを並べてみると、けっこうデザイン違いますね。
型番とかは同じようなので、単なるデザイン変更かな・・・。
互換品or偽物だったら、もっと全然違うか、もっとがっつり似せてくるでしょうし、
純正品だと信じましょう(笑)


あとは逆の工程で戻していって、無事復活しました。


とはいえ、サブ機としてなにか使い道があるかというと、微妙なんですが。

拍手[0回]

PR

2022年05月21日  Pythonで高位合成

PythonのプログラムからVerilogのRTLに変換できる高位合成環境が
あるようなので試しに使ってみました。

以下は、いろいろメモです。

polyphonyをインストールする。
% pip3 install polyphony

高位合成実行。
% polyphony -vm -vd fact.py
で、Verilogファイルが生成できました。

結果的にはすごく簡単なのですが、参考にしたWebページのとおりにやっても
うまく動かなかったりで、途中過程は意外と苦労しました。。。

ちなみに、変換前後のコードは最後の方に貼り付けておきます。
可読性はあまり良くないですが、一応それらしい回路が出力されているようです。


あと、「Icarus Verilog」という、OSSのVerilogシミュレータも入れてみました。

Icarus Verilogをインストールする。
sudo apt install iverilog
sudo apt install gtkwave

SIM実行
iverilog -o sim -s test test.v polyphony_out.v
./sim

波形確認
gtkwave test.vcd  &
でGUIが立ち上がるので、適当に操作して波形表示

ちなみに、今回はUbuntu(Jetson Nano)で試していますが、
Windows版もこちらにあるようです(試していませんが)。

ひとまず簡単なプログラムであれば、Verilogに変換できることはわかったのですが、
深堀できていないので、使い物になるのかどうかはまだよくわかりません。

とりあえずNumPy とかの便利なライブラリは使えないようです(コンパイルでエラーになるので)。
あとは、ネットで検索しても、polyphonyについて詳しく説明しているページがあまりなさそうで、
polyphony公式のGitHubのサンプルプログラムを見ながら試していくしかなさそうな感じですかね。


以下、階乗計算プログラムの変換前後のコード例です。


Pythonプログラム
from polyphony import testbench
def fact(x):
    y = 1
    for i in range(1, x+1):
        y = y * i
    return y
@testbench
def test():
    for i in range(0,10):
        fact(i)
test()

Verilog RTL(本体)
module fact
  (
    input wire clk,
    input wire rst,
    input wire fact_ready,
    input wire fact_accept,
    output reg fact_valid,
    input wire signed [31:0] fact_in_x,
    output reg signed [31:0] fact_out_0
  );
  //localparams
  localparam fact_b1_INIT = 0;
  localparam fact_b1_S0 = 1;
  localparam fact_b1_S1 = 2;
  localparam fact_forelse5_FINISH = 3;
  localparam fact_L1_fortest2_S0 = 4;
  localparam fact_L1_forbody3_S0 = 5;
  localparam fact_L1_forbody3_S1 = 6;
  
  //signals: 
  wire c71;
  reg        [2:0] fact_state;
  wire signed [31:0] i3;
  wire signed [31:0] t65;
  wire signed [31:0] y3;
  reg signed [31:0] i2;
  reg signed [31:0] x;
  reg signed [31:0] y2;
  //combinations: 
  assign c71 = (i2 < t65);
  assign i3 = (i2 + 1);
  assign t65 = (x + 1);
  assign y3 = (y2 * i2);
  
  always @(posedge clk) begin
    if (rst) begin
      fact_out_0 <= 0;
      i2 <= 0;
      x <= 0;
      y2 <= 0;
      fact_state <= fact_b1_INIT;
    end else begin //if (rst)
      case(fact_state)
      fact_b1_INIT: begin
        fact_valid <= 0;
        if (fact_ready == 1) begin
          x <= fact_in_x;
          i2 <= 1;
          y2 <= 1;
          fact_state <= fact_b1_S1;
        end
      end
      fact_b1_S1: begin
        /* t65 <= (x + 1); */
        fact_state <= fact_L1_fortest2_S0;
      end
      fact_L1_fortest2_S0: begin
        /* c71 <= (i2 < t65); */
        if (c71) begin
          /* y3 <= (y2 * i2); */
          /* i3 <= (i2 + 1); */
          i2 <= i3;
          y2 <= y3;
          fact_state <= fact_L1_fortest2_S0;
        end else begin
          fact_valid <= 1;
          if (fact_accept == 1) begin
            fact_state <= fact_b1_INIT;
          end
          fact_out_0 <= y2;
        end
      end
      endcase
    end
  end
  
endmodule

Verilog RTL(テストベンチ)
module test
  (
    
  );
  //localparams
  localparam CLK_PERIOD = 10;
  localparam CLK_HALF_PERIOD = 5;
  localparam INITIAL_RESET_SPAN = 100;
  localparam test_b1_INIT = 0;
  localparam test_b1_S1 = 1;
  localparam test_forelse5_S0 = 2;
  localparam test_forelse5_FINISH = 3;
  localparam test_L1_fortest2_S0 = 4;
  localparam test_L1_forbody3_S0 = 5;
  localparam test_L1_forbody3_S1 = 6;
  localparam test_L1_forbody3_S2 = 7;
  localparam test_L1_forbody3_S3 = 8;
  localparam test_L1_forbody3_S4 = 9;
  localparam test_L1_forbody3_S5 = 10;
  localparam test_L1_forbody3_S6 = 11;
  localparam test_L1_forbody3_S7 = 12;
  
  //signals: 
  wire c69;
  wire fact_0_valid;
  reg clk;
  reg fact_0_accept;
  reg fact_0_ready;
  reg rst;
  reg        [3:0] test_state;
  reg signed [31:0] i2;
  reg signed [31:0] i3;
  //signals: in_x
  reg        [31:0] fact_0_in_x;
  //signals: out_0
  wire        [31:0] fact_0_out_0;
  //combinations: 
  assign c69 = (i2 < 10);
  //sub modules
  //fact_0 instance
  fact fact_0(
    .clk(clk),
    .rst(rst),
    .fact_ready(fact_0_ready),
    .fact_accept(fact_0_accept),
    .fact_valid(fact_0_valid),
    .fact_in_x(fact_0_in_x),
    .fact_out_0(fact_0_out_0)
  );
  
  
  initial begin
    $monitor("%5t:fact_0_in_x=%4d, fact_0_out_0=%4d", $time, fact_0_in_x, fact_0_out_0);
    $dumpfile("test.vcd");
    $dumpvars(0, test);
  end
  initial begin
    clk = 0;
    #CLK_HALF_PERIOD
    forever #CLK_HALF_PERIOD clk = ~clk;
  end
  initial begin
    rst <= 1;
    #INITIAL_RESET_SPAN
    rst <= 0;
  end
  
  always @(posedge clk) begin
    if (rst) begin
      fact_0_accept <= 0;
      fact_0_ready <= 0;
      i2 <= 0;
      i3 <= 0;
      test_state <= test_b1_INIT;
    end else begin //if (rst)
      case(test_state)
      test_b1_INIT: begin
        i2 <= 0;
        test_state <= test_L1_fortest2_S0;
      end
      test_forelse5_FINISH: begin
        $display("%5t:finish", $time);
        $finish();
      end
      test_L1_fortest2_S0: begin
        /* c69 <= (i2 < 10); */
        if (c69) begin
          fact_0_ready <= 1;
          fact_0_in_x <= i2;
          test_state <= test_L1_forbody3_S1;
        end else begin
          test_state <= test_forelse5_FINISH;
        end
      end
      test_L1_forbody3_S1: begin
        fact_0_ready <= 0;
        test_state <= test_L1_forbody3_S2;
      end
      test_L1_forbody3_S2: begin
        if (fact_0_valid == 1) begin
          fact_0_accept <= 1;
          test_state <= test_L1_forbody3_S4;
        end
      end
      test_L1_forbody3_S4: begin
        fact_0_accept <= 0;
        test_state <= test_L1_forbody3_S5;
      end
      test_L1_forbody3_S5: begin
        i3 <= (i2 + 1);
        test_state <= test_L1_forbody3_S6;
      end
      test_L1_forbody3_S6: begin
        i2 <= i3;
        test_state <= test_L1_fortest2_S0;
      end
      endcase
    end
  end
  
endmodule

拍手[0回]


2022年04月29日  AstroAI DM6000AR

Amazonでデジタルマルチメーターを買ってみました。
「AstroAI DM6000AR」です。
某ストリートジャンカー協会の影響もありつつ、前々から気にはなっていましたが、
Amazonのセールで安くなっていたので(\3800ぐらいが、\2800ぐらいでした)、
なんとなく発注してみました。

数日前には届いていたのですが、急ぎで必要なものでもなかったのでようやく開封です。
大型のディスプレイが見やすくていい感じです。
モード選択以外にもボタンがいろいろあるので、いろいろ設定を変えれるようです。
なにに使えるのか、まだ全然使いこなせていませんが・・・(笑)
あと、設定を変えるたびにビープ音が鳴るみたいです。
消音モードがあればいいのですが、どうもそういう設定もないみたい。

ちなみに手持ちのデジタルマルチメーター3台です。
左側が、今回買ってみた「AstroAI DM6000AR」。

真ん中が、1年ぐらい前にシリコンハウスで\500だったので買ってみた「CUSTOM C-05」。
定価は¥12,800らしいですが、なんか作りが安っぽいのと、
ケーブルを挿すところがすぐに割れてしまい、ときどき接触不良にになるという、
テスターなのに信用できないという致命的な状態(笑)

右側は、10年ぐらい前に買った気がする「kaise DMM KU-11」。
ホームセンターで\2000~3000ぐらいだった気がしますが、
実際はこれでもなにも不自由はなかったんですが・・・。

拍手[0回]


2021年06月26日  シリコンハウスで買い物いろいろ

デジットはシリコンハウスの3Fに移転したそうなので、日本橋に行ってみました。
シリコンハウスと共通の商品は置く必要がなくなって、
3Fのデジットフロアは、よりジャンク感が濃厚になった雰囲気です(笑)

デジットでは今日は特にピンとくる物がなかったですが、
代わりにシリコンハウスでいろいろ買い物してきました。

まずはインターフェース8月号とラズパイPico本体。
ラズパイPicoって何ができるのかよく知りませんが、\550だったのでとりあえず買ってみました。
またそのうち気が向いたら遊んでみようかと。

続いて、\500で売っていたクランプメータ。
クランプメータを使うことがあるかどうかは微妙なのですが、\500という値段に負けてつい購入です(笑)
というか、もともと安物なのかと思ったのですが、
よく見るとハードケースが付いていたり、熱電対が付いていたりで、案外まともそうだったので。
あとで調べて気付きましたが、CUSTOM C-05という型番で、
すでに型落ちっぽいですが、当初の定価は¥12,800だとか。

最後は、ネジザウルス。
これもちょっと安くなっていたようなので買ってみました。
ネジザウルスって種類がいろいろあって違いがわからないのですが、
これは「PZ-32L ネジザウルスJS2」だそうです。
どうやらミリタリースペックモデルのようなので、実は通常モデルの方が普通に安かったのかもしれない・・・。
まあいいけど。

拍手[0回]


2020年08月10日  トラ技でROS

今月のトランジスタ技術はROS特集のようなので買ってみました。

暇つぶしに基本からやってみようかと。
JetsonNanoも余ってるし(笑)
とりあえずGazeboとかを使ってみたい。

拍手[0回]


2020年06月20日  自作扇風機

自作扇風機、というか単なるPCファンですが(笑)


材料は、要らなくなったATX電源から部品取りした12cmファンです。
2線ファンなのでケースファンに転用するのも微妙で余っていた物。

本来はLEDが4箇所光るはずなのですが、1箇所だけ光っています。
LEDの両端電圧を測るとなぜか12Vが来ていたので、
制御回路が死んでいてLEDも死んだ模様(笑)


12Vに昇圧するためのDC-DCモジュールをフリスクケースに収納。
DC-DCモジュールは、たしかAmazonで10個セットで\1000ぐらいだった気がします。
入力側は、不要なUSBケーブルを切断して5V入力です。
USB供給なので、モバイルバッテリーでも動きます。

ファンの定格電圧は12Vだと思いますが、実際のところは12Vまで昇圧すると、
電流と騒音がけっこうアレなので、今のところ10Vぐらいにしています。

在りものの部品で作ってみましたが、扇風機としては微妙な感じです。
どちらかといえば、PCの排熱を逃がすためのファンかな。。。

拍手[0回]


2020年06月08日  マルチテスターLCR-TC1

少し前にYouTubeを見てきて気になったマルチテスター(?)です。
AmazonでLCR-TC1という機種を買ってみました。


コネクタのところに電子部品を繋げると、値を表示してくれます。
部品の種類とか、足を刺す位置とか、気にせずに自動判別してくれるのが便利です。

手持ち部品で適当に測定してみました。

まずは、おまけで付いていた10uFのコンデンサ。(ほぼ正しい)


これも、おまけで付いていたLED。(ON電圧は1.83らしいです)


2.2KΩの抵抗。(ほぼ正しい)


NPNトランジスタ。
たぶん"2SC2872"で、正確なスペックはわかりませんが、
hFE=288ぐらいであればだいたい合っているようです。
Vbe=0.6Vもだいたい合ってそうですが、Ic=6.2mAってなんでしょうか。
カタログスペックだと700mAぐらい流れそうなのですが、
この装置で700mAも測定できる気がしないので、測定限界が6.2mAぐらいなのでしょうか。

よくわからないコイル。
カタログスペックは不明ですが、一応0.1mHのコイルとしては認識してくれています。

赤外線リモコンも読み取れるようです。
でも、赤外線リモコンのフォーマットにもいろいろあるようで、
リモコンによっては読み取れないものもありました。
ついでに、以前マイコンで自作した読み取り器の結果とは値が違っていましたが、
これは自作の方が怪しいですが。
(フォーマットに関係なく識別できるように作ったので、コード妥当性は適当)

なお、値段はAmazonで\2800ぐらいです。
なんかおもしろそう、というだけで買うには微妙な値段な気もしましたが。

ちなみに、機能的にほとんど同じもの(中身が同じ)もいろいろ売っているようで、
ケース無しの中身+LCDもモノクロであれば、\1000でも買えるようです。
少し悩みましたが、さすがに剥き出しで使うのは抵抗があったので、
素直にまともなケース付きにしましたが。

Amazonのリンクです。

拍手[0回]


2020年05月06日  Xilinx ISEインストール

久しぶりにRTLで遊んでみようと思ったのですが、
XilinxのISEは、そのままではWindows10で動かないみたいです。
Windows10に置き換えてから1年以上使ってなかったので、全然気付いていませんでした。

以下、覚書的なメモです。

一番新しそうな「Windows 10 用 ISE Design Suite - 14.7」というバージョンを
インストールしてみましたが、うちのPCではうまく起動しませんでした。 
このバージョンの詳細説明を見つけることができなかったのですが、
「Win10 VM」という表記があったので、仮想マシンで動く環境ということでしょうか。
一応、VMWareとかVirtualBoxは入っているのですが、それでも動きませんでしたが……。

普通の「ISE Design Suite - 14.7  Full Product Installation」をインストールして、
libPortability.dll というファイルを置き換えたり細工するのが正解なようです。
詳しくは、このあたりを参照。
FPGAに転送して動かすところは試していませんが、
とりあえずシミュレーションとコンパイルが動くところまでは確認できました。

ついでにVivadoも入れてみました。
使い方よくわかっていないのですが(笑)

ちなみに、ISEとVivadoをインストールしたら、それだけで50GB弱もありました。
さすがに240GBのSSD領域に入れるのは無謀なので、HDD領域に入れましたが。

拍手[0回]


2020年05月06日  トラ技 4bitCPUをRTLでお試し

GW中ずっと暇だったので、
トラ技5月号の4bitCPUをRTLで実装してみようか、とふと思ってみました。
と思ったら、付録DVDの中にVerilogのコードも入っていたので、
そのまま読み込んでシミュレーション動かしてみただけですが。

特に需要はないと思いますがエビデンス(笑)

赤枠のところが2×6の演算過程です。

回路図はこんな雰囲気。
フルディスクリートで実装するのはたいへんですが、
RTLで実装するには、すごくシンプルで分かりやすいサンプルです。

4bitCPUだと、アドレス空間が16しかなかったり、命令コードも16個しかなくて
かなり制限厳しいですが、8bitに拡張改造するだけでも、そこそこ遊べるかも。

拍手[0回]


2020年04月10日  トラ技 フルディスクリートCPU

トランジスタ技術を買ってみました。


フルディスクリートCPU特集で、基板も付いていたので、
これでCPUが作れるのかと思ったら・・・。


1マスが、3入力NANDとか、EXORとか論理ゲート1個分にしかならないみたい。
24マスしかないので、CPUには程遠いですね・・・。

ちなみに、1738トランジスタの4bitCPUを作るには、部品代だけで5万円みたいです(笑)

拍手[0回]