fc2ブログ

[CentOS]コンソール文字サイズ変更

# Raspberry Pi4 model B, CentOS 7.9.2009

ラズパイ用に小さいモニタを買ったら文字が見えない。
どこまで文字を大きく出来るか調べた。

最初は以下設定になっているようだ。以下はどちらも同じく、defaultのフォント・文字サイズになるようだ。

# setfont -16
# setfont


このOSで利用可能なフォントと文字サイズの組み合わせは以下に存在するファイルのみらしい。

# ls -lst /lib/kbd/consolefonts/*



存在する中で一番大きなサイズは以下だった。

# setfont sun12x22


12x22以上のサイズは見つからなかった。
CentOSのデフォルトではここまでのサイズしかないようだ。

うる覚えだが、上記でログインする度に設定が戻る(?)ようなら以下のように書けばいい。

# vi ~/.bash_profile

if [ $TERM = linux ]
then
setfont sun12x22
fi



しかし結論として、今回買った3.5インチモニタでは文字が小さくてストレスがたまる。
もっと大きなサイズに設定可能なUbuntuへ移行した。

[PC]Amazon定期購読ビデオライブラリ解約方法

1か月無料体験のビデオコンテンツを解約したい。

スマホアプリで探すも、解約は出来ないみたい。
 Amazonアプリ > 右下の横三本アイコン > アカウントサービス > アカウントサービス > アカウント設定のメンバーシップおよび購読
 > ここで購読中のアイテムは見れるが解約メニューが見つからない。

PCウェブブラウザからAmazonアカウントへログイン
 > 普通に探すとメニューが見つからない。
 > ぐぐったら、以下へアクセスしたら見つかった。
https://www.amazon.co.jp/yourmembershipsandsubscriptions
 > お客様のメンバーシップおよび購読ページへ
 > 対象のアイテムの右端にある「定期購入をキャンセルする」
 > これで無料期間後の自動更新が終了できた


後から見たら、ふつーにメニューあった。
 PCブラウザでAmazonへログイン > 右上の「すべて」アイコン > アカウントサービス > 一番左下に「メンバーシップおよび購読」があった。ここから行ける。

[Windows]OBSで画面キャプチャ

Win +GでXbox game Barなるものを起動しても、録画ボタンが押せない。
Win+Rでも録画が開始されない。

あきらめてOBSを使う事にした。
1.OBS 29.0.0 64bitをインストール。
2.OBS起動
3.中央のキャプチャした画面が映るであろう所で右クリック > 追加 > 画面キャプチャ > 新規作成のままOK > マルチモニタなので、キャプチャしたいモニタ型番を選択 > OK
4.右下の録画開始ボタンをクリック
5.終了自は、録画終了ボタンをクリック
6.保存先がデフォルトで、C:\Users\xxx\Videos\Capturesになるのが嫌なら、設定 > 出力 > 録画ファイルのパス、で変更可能。

[vivado]schematicビューワが良い感じ

これまでQuartusの方ばかり使ってたが、Digilent社Arty A7ボードをいじるためにvivadoを使ってる。
回路を追いかけるために以前からRTL回路ビューワが欲しかったが、vivadoのSchematic機能良い感じ。

■Schematic起動方法

Vivado起動
 > Flow Navigator
 > SYNTHESIS > Run Synthesisを実行しておく。
 > SYNTHESIS > Schematicで起動

■UIが良い感じ

ASICツールに慣れてしまった身としては、出来る限り、Verdiと同じような使い勝手が望ましい。

配線へのハイライト機能: 右クリック > Highlight > 非常に良い
Zoom In: マウスドラッグ > 非常に良い
Zoom Out: defaultはCtrl + -(マイナス) > (defaultは×だが、ショートカットキー登録する事で)非常に良い

■Schematic ショートカットキー登録方法
vivado > Tools > Settings > Tool Settings > Shortcuts
 > All Actions > Main Menu > View > Zoom Out : ここでAddすればある程度自由にキー登録可能。例:3
 > All Actions > Schematic > Previous schematic : こちらも同様に好きなキーを登録する。例:4

これである程度回路を追いかける作業が楽になった。
Quartusの回路図ビューワよりも断然良いと感じる。

その他、tcl consoleで使えるpt_shellコマンドも多いように感じるし、どうもXilinxツールの方が魅力的に見えて来た。。

[vivado]TCLコマンド

■背景

オープンソースのCPUコアでLinuxブートのシミュレーションがしたい。
 ↓
RVSOCプロジェクトというものを見つけた。
https://www.arch.cs.titech.ac.jp/wk/rvsoc/doku.php

 ↓
置いてあるsrcデータzipをもってきて、Arty A7 100Tボード向けにvivadoでコンパイルしようとすると、論理合成(synth)は成功するが、実装(impl)では以下エラーが出た。

"[Place 30-370] An unconstrained Phaser instance has been found. Phaser instances and their associated IO logic must be LOC constrained to a legal site locations for placement to succeed. Check to see whether all core constraints were properly used or manually add LOC constraints for the following instance(s).

Unconstrained Phaser instance(s):
Inst 'phaser_out'"


 ↓
MIGで作られているDDR周りのI/O配置?でエラーが出ているように見える。
この対策を探していると、以下記事では、xdcで、INST "xxx" LOC=PHASER_OUT_PHY_X1Y13、
のようにLOC制約で配置先を明示してあげれば良いらしい(?)
https://support.xilinx.com/s/article/46617?language=ja
 ↓
どこで調べたか忘れてしまったが、以下のようにxdcに書くべきらしい。

set_property LOC PHASER_OUT_PHY_X0Y14 [get_cells c/dram_con/phaser_out_i_2 ]


 ↓
そもそもPHASER_OUT_PHY_X1Y2といった物理的な配置名をどうやって調べるのか?
 ↓
get_cellsとか、いろんなコマンドが使えるTCLコマンドを使えば、何か情報あるのでは?
 ↓
以下のpage13の表を見ると、OLOGIC_X1Y27とかの配置場所名はsite(サイト)と呼ぶらしい。
https://docs.xilinx.com/v/u/ja-JP/ug835-vivado-tcl-commands
 ↓
この辺のPDFを読んでると、get_sitesというコマンドがあった。
https://www.xilinx.com/content/dam/xilinx/support/documents/sw_manuals_j/xilinx2019_2/ug912-vivado-properties.pdf


■Vivado TCLコンソールメモ

1.vivado起動

2.画面下のTCL consoleで以下実行。

open_project C:/xxx/arty100t.xpr


これでプロジェクトが開かれた。(既に一度論理合成(synthesis)は成功してる状態)

3.画面下のtcl consoleで以下実行。

open_run -name arty100t synth_1



4.ここまでで回路データベースの探索が可能な状態になった。それでは実際にやってみる。

get_cells * -hier -filter "LOC =~ OLOGIC*"


これは成功して、該当するインスタンスパス名が表示された。

get_cells * -hier -filter "LOC =~ PHASER_OUT_PHY*"


しかし、これは見つからない。何か使い方が違うらしい。

5.この後、以下を実行したら、site名を出力してくれた。

get_sites PHASER_OUT_PHY*


PHASER_OUT_PHY_X0Y14 PHASER_OUT_PHY_X0Y15 PHASER_OUT_PHY_X0Y12 PHASER_OUT_PHY_X0Y13 PHASER_OUT_PHY_X0Y10 PHASER_OUT_PHY_X0Y11 PHASER_OUT_PHY_X1Y10 PHASER_OUT_PHY_X1Y11 PHASER_OUT_PHY_X0Y8 PHASER_OUT_PHY_X0Y9 PHASER_OUT_PHY_X1Y8 PHASER_OUT_PHY_X1Y9 PHASER_OUT_PHY_X0Y6 PHASER_OUT_PHY_X0Y7 PHASER_OUT_PHY_X1Y6 PHASER_OUT_PHY_X1Y7 PHASER_OUT_PHY_X0Y4 PHASER_OUT_PHY_X0Y5 PHASER_OUT_PHY_X1Y4 PHASER_OUT_PHY_X1Y5 PHASER_OUT_PHY_X0Y2 PHASER_OUT_PHY_X0Y3 PHASER_OUT_PHY_X0Y0 PHASER_OUT_PHY_X0Y1


Artix 7 100Tに存在するPHASR_OUT_PHY関連のSITE名リストが上記って事らしい。
ここまでは出来たが、実際当初のエラーを消すために、どこのSITE名をLOC指定するべきなのか、考え方がよくわからない。

6.試しに以下手順でxdcファイルへ追記してみたら、インプリメンテーションが成功した。

(1)get_sites PHY_CONTROL*
 → これでPHY_CONTROL関連のsite名が分かる。PHASER_OUT、PHY_CONTROL、PHASER_RE、PHASER_INでも同じやり方。

(2)get_cells -hier -filter {NAME =~ *phy_control*}
 → これでphy_controlが使用されているインスタンス名リストを確認する。

(3)xdcファイルへ制約を追記。以下は各種エラー対策した全ての追記内容。
上でも書いたけど、数あるsite名の中で、以下siteを指定してLOC制約にした根拠は無し。調べたsite名をてきとーに選んだだけ。

set_property LOC PHASER_OUT_PHY_X0Y14 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/phaser_out_i_2 ]
set_property LOC PHASER_OUT_PHY_X0Y15 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/phaser_out_i_2__2 ]
set_property LOC PHASER_OUT_PHY_X0Y12 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/dqsfind_calib_left.u_ddr_phy_dqs_found_cal_hr/phaser_out_i_3__0 ]
set_property LOC PHASER_OUT_PHY_X0Y13 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/dqsfind_calib_left.u_ddr_phy_dqs_found_cal_hr/phaser_out_i_3__2 ]
set_property LOC PHASER_OUT_PHY_X0Y10 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/dqsfind_calib_left.u_ddr_phy_dqs_found_cal_hr/phaser_out_i_4 ]
set_property LOC PHASER_OUT_PHY_X0Y11 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/mb_wrlvl_inst.u_ddr_phy_wrlvl/phaser_out_i_1 ]
set_property LOC PHASER_OUT_PHY_X1Y10 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/mb_wrlvl_inst.u_ddr_phy_wrlvl/phaser_out_i_1__0 ]
set_property LOC PHASER_OUT_PHY_X1Y11 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/mb_wrlvl_inst.u_ddr_phy_wrlvl/phaser_out_i_1__1 ]
set_property LOC PHASER_OUT_PHY_X0Y8 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/mb_wrlvl_inst.u_ddr_phy_wrlvl/phaser_out_i_1__2 ]
set_property LOC PHASER_OUT_PHY_X0Y9 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/mb_wrlvl_inst.u_ddr_phy_wrlvl/phaser_out_i_2__0 ]
set_property LOC PHASER_OUT_PHY_X1Y8 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/mb_wrlvl_inst.u_ddr_phy_wrlvl/phaser_out_i_2__1 ]
set_property LOC PHASER_OUT_PHY_X1Y9 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/mb_wrlvl_inst.u_ddr_phy_wrlvl/phaser_out_i_3 ]
set_property LOC PHASER_OUT_PHY_X0Y6 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/mb_wrlvl_inst.u_ddr_phy_wrlvl/phaser_out_i_3__1 ]
set_property LOC PHASER_OUT_PHY_X0Y7 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/mb_wrlvl_inst.u_ddr_phy_wrlvl/phaser_out_i_4__0 ]
set_property LOC PHASER_OUT_PHY_X1Y6 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_mc_phy_wrapper/u_ddr_mc_phy/ddr_phy_4lanes_0.u_ddr_phy_4lanes/ddr_byte_lane_A.ddr_byte_lane_A/phaser_out]
set_property LOC PHASER_OUT_PHY_X1Y7 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_mc_phy_wrapper/u_ddr_mc_phy/ddr_phy_4lanes_0.u_ddr_phy_4lanes/ddr_byte_lane_B.ddr_byte_lane_B/phaser_out]
set_property LOC PHASER_OUT_PHY_X0Y4 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_mc_phy_wrapper/u_ddr_mc_phy/ddr_phy_4lanes_0.u_ddr_phy_4lanes/ddr_byte_lane_C.ddr_byte_lane_C/phaser_out]
set_property LOC PHASER_OUT_PHY_X0Y5 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_mc_phy_wrapper/u_ddr_mc_phy/ddr_phy_4lanes_0.u_ddr_phy_4lanes/ddr_byte_lane_D.ddr_byte_lane_D/phaser_out]

set_property LOC PHASER_IN_PHY_X0Y14 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/phaser_in_gen.phaser_in_i_2 ]
set_property LOC PHASER_IN_PHY_X0Y15 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/phaser_in_gen.phaser_in_i_2__0 ]
set_property LOC PHASER_IN_PHY_X0Y12 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_1 ]
set_property LOC PHASER_IN_PHY_X0Y13 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_10 ]
set_property LOC PHASER_IN_PHY_X0Y10 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_10__0 ]
set_property LOC PHASER_IN_PHY_X0Y11 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_11 ]
set_property LOC PHASER_IN_PHY_X1Y10 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_11__0 ]
set_property LOC PHASER_IN_PHY_X1Y11 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_1__0 ]
set_property LOC PHASER_IN_PHY_X0Y8 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_3 ]
set_property LOC PHASER_IN_PHY_X0Y9 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_3__0 ]
set_property LOC PHASER_IN_PHY_X1Y8 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_4 ]
set_property LOC PHASER_IN_PHY_X1Y9 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_4__0 ]
set_property LOC PHASER_IN_PHY_X0Y6 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_6 ]
set_property LOC PHASER_IN_PHY_X0Y7 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_6__0 ]
set_property LOC PHASER_IN_PHY_X1Y6 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_7 ]
set_property LOC PHASER_IN_PHY_X1Y7 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_7__0 ]
set_property LOC PHASER_IN_PHY_X0Y4 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_8 ]
set_property LOC PHASER_IN_PHY_X0Y5 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_8__0 ]
set_property LOC PHASER_IN_PHY_X1Y4 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_9 ]
set_property LOC PHASER_IN_PHY_X1Y5 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_9__0 ]
set_property LOC PHASER_IN_PHY_X0Y2 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/dqsfind_calib_left.u_ddr_phy_dqs_found_cal_hr/phaser_in_gen.phaser_in_i_5 ]
set_property LOC PHASER_IN_PHY_X0Y3 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/dqsfind_calib_left.u_ddr_phy_dqs_found_cal_hr/phaser_in_gen.phaser_in_i_5__0 ]
set_property LOC PHASER_IN_PHY_X0Y0 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_mc_phy_wrapper/u_ddr_mc_phy/ddr_phy_4lanes_0.u_ddr_phy_4lanes/ddr_byte_lane_C.ddr_byte_lane_C/phaser_in_gen.phaser_in]
set_property LOC PHASER_IN_PHY_X0Y1 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_mc_phy_wrapper/u_ddr_mc_phy/ddr_phy_4lanes_0.u_ddr_phy_4lanes/ddr_byte_lane_D.ddr_byte_lane_D/phaser_in_gen.phaser_in]

set_property LOC PHASER_REF_X0Y3 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_ddr3_infrastructure/phaser_ref_i_i_1 ]
set_property LOC PHASER_REF_X0Y2 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_mc_phy_wrapper/u_ddr_mc_phy/ddr_phy_4lanes_0.u_ddr_phy_4lanes/phaser_ref_i]

set_property LOC PHY_CONTROL_X0Y3 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_ddr3_infrastructure/phy_control_i_i_1 ]
set_property LOC PHY_CONTROL_X0Y2 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_mc_phy_wrapper/u_ddr_mc_phy/ddr_phy_4lanes_0.u_ddr_phy_4lanes/phy_control_i]



(4)run implementation実行

[Windows]トラブルシューティング

ping確認

OK : x280(172.x.x.x/24, wired, static IP) --> Rock 5B(172.x.x.x/24, wired, static IP)
OK : x280(172.x.x.x/24, wired, static IP) --> Aterm --> Rock 5B(172.x.x.x/24, wired, static IP)
OK : x280(172.x.x.x/24, wireless, static IP) ==> Aterm --> Rock 5B(172.x.x.x/24, wired, static IP)
OK : x280(172.x.x.x/24, wired, DHCP) --> PLC --> Aterm --> Rock 5B(172.x.x.x/24, wired, static IP)
OK : x280(172.x.x.x/24, wired, static IP) --> PLC --> Aterm --> Rock 5B(172.x.x.x/24, wired, static IP)
この前やった時はping通らなかったんだけど、どれも通るな。なぜ?
一回宛先端末(今回はRock 5B)と直接接続確立しておくのがポイントか??

OK : x280(192.x.x.x/24, wired, static IP) --> MANGO(NAPT) --> PLC --> Aterm(172.x.x.x/24) --> Internet
NG : x280(192.x.x.x/24, wired, static IP) --> MANGO(NAPT) --> PLC --> Aterm(172.x.x.x/24)
NG : x280(192.x.x.x/24, wired, static IP) --> MANGO(NAPT) --> PLC --> Aterm --> Rock 5B(172.x.x.x/24, wired, static IP)
これも不可解。
Atermルータを通るインターネットにはping成功するのに、なぜかAtermにはping通らない。
AtermにLANケーブルで接続されているRock 5Bにもping通らない。

[Windows]メモ

Windows 10 home 22H2
Cドライブ > 右クリック > Microsoft Defenderでスキャン > 全ファイル数459497個。1hくらいかかった?

[GAME]任天堂スイッチ Amazonでオンライン版ソフト購入時のインストール方法

1.Amazonでオンライン版を注文。
2.PCでAmazonにログイン
3.右上の「xxさん、アカウント&リスト」
4.アカウントサービス > ゲーム&PCソフトダウンロードライブラリ
5.購入したアイテムを見ると、ダウンロード番号が表示されてる
6.任天堂スイッチ起動して、ニンテンドーeショップ、へ
7.画面左の「番号の入力」
8.ここで、先ほどのダウンロード番号を入力すれば、ダウンロードやインストールへ進める。

[Windows]共有フォルダ一覧確認方法

一時的にネットワーク共有していたフォルダを忘れてしまった。
そんな時は以下手順で確認出来る。(以下はWin11の場合)

Win + R
 > control admintools、と入力して実行 ※ これでWindowsツール画面が開く
 > コンピュータの管理
 > コンピュータの管理(ローカル)
 > システムツール
 > 共有フォルダー
 > 共有


自分で意図的に共有したフォルダは一旦以下で共有解除。

右クリック > プロパティ > 共有 > 詳細な共有 > このフォルダーを共有する、のチェックを外す > 適用

尚、最初から?共有になっているフォルダは何も除外しないで良いらしい。
そもそも以下フォルダーは右クリックからプロパティも出てこない。

ADMIN$
C$
E$
IPC$
print$

[PC]故障リスト

■SDカード

◆Kingstone microSDXC 128GB: CANVAS Select Plus
 購入日: 2021年11月
 症状: 4Kハンディカメラで使ってたが、ある1つの動画で再生に失敗する。
      なぜかロックされてしまった。

■スマート電源タップ
◆TP-LInk Tapo P110M
 購入日: 2023年10月くらい?
 症状: スマホのTapoアプリから電力モニタは出来てるようだが、電源ON/OFFが効かなくなって、状態表示がONでもOFFでもずっと通電されてしまってる。つまり節電のためにOFFする事が出来ない状態。

Amazon返品手順

1.スマホのAmazonアプリの購入履歴から返品するアイテムを表示して、返品

詳しくは、Amazonアプリから返品手続きを進めていくと、長ったらしい案内文章が表示され、
そこに出てきた、「申し込み(小型商品の返送)」をクリック
 > 郵便局 e発送サービス画面へ
 > 必要事項を入力して「二次元コードを取得する」をクリック
 > これですぐに登録メール充に以下標題2メールが届いた。

2.登録メールに以下が届く

標題1=xxx様がAmazon.co.jpの返品受付IDの印刷依頼をお送りしています
標題2=発送用二次元コード登録完了通知 > ローソンのLoppiでスキャンするQRコードを表示するURLが来る

3.標題1メールを開いて、確認して印刷、をクリック
  > 返品用ラベルと返送手順を表示・印刷
  > 返品用ラベルを印刷して、現品と共に梱包して、ローソンへ持参する。

4.ローソンのLoppi端末で、発送する、を選択
  > 標題2メールで表示した、ローソン用のQRコードをスキャンする
  > シートが印刷されるので、店員レジへもっていく。
  > 3枚くらいの用紙が出てくるので、1枚は客控え、残りのを客が3分割して、受け取った透明ラベルへ入れる。
  > 透明ラベルを品物に貼り付けて、店員へ渡す。

これで完了。

[PC]HDD SMART Shock Sense Countを試す

HDDではメディア(円盤、プラッタ)が回転してる所にヘッドで書き込みする構造上、もし衝撃が受けると、
メディアが傷つくのを防ぐために、Write動作を中断する事になってる。

そのSMART IDが191のShock Sense Countだ。(東芝の場合?)
https://www.global.toshiba/content/dam/toshiba/migration/corp/techReviewAssets/tech/review/2014/07/69_07pdf/a03.pdf

ちょうど東芝HDDが手元にあったので、試してみた。(他社製でも同じSMART項目あると思うが)
手順は以下。

1.Linux PCを用意する。

今回はUbuntuで試したが、使ってるコマンドは一般的なものなので、CentOSでもDebianでも何でも出来るはず。
ちなみに、後々HDDに衝撃(ショック)を与えるために手で揺らすため、PCケースはオープンなベンチ台タイプが良い。
例えば、玄人志向さんが出してる以下のようなやつね。
https://www.amazon.co.jp/%E7%8E%84%E4%BA%BA%E5%BF%97%E5%90%91-%E3%83%90%E3%83%A9%E3%83%83%E3%82%AF%E3%82%B1%E3%83%BC%E3%82%B9%E3%82%AD%E3%83%83%E3%83%88-%E3%82%B9%E3%83%81%E3%83%BC%E3%83%AB%E8%A3%BD-SEIGI-3GOU/dp/B0017ZMCSU

2.対象のHDDを接続した状態でUbuntuを起動

今回は東芝DT01シリーズとMG03シリーズで試した。

3.対象HDDをfdiskでパーティション作成、mkfs.ext4でフォーマット、mountでマウントした。

4.ターミナルを1つ開いて、SMART 191番を1秒間隔で表示させるようなバッチを実行しておく。

これで1秒間隔でSMART 191(Shock Sense Count)の値がターミナルに表示されていく。
ちなみに、クライアントグレードのDT01シリーズでは、そもそもSMART 191をsmartctlコマンドで取得出来なかった。(何か方法あるか?)
なので、エンタープライズグレードのMG03の方で試した。

↓これ、記憶で書いてるから、文法間違ってるかも。


#!/bin/bash

while true; do
sleep 1
smartctl -a /dev/sdb | grep 191
done



5.ターミナルをもう1つ開いて、今度は以下のように書き込みコマンドを走らせる。

dd if=/dev/zero of=/mnt/disk01/test bs=512 count=1000000



6.最後に、ベンチ台でオープンになってるHDDを手で持って、振ってみた。
 (本当はこんな事しちゃダメです。あくまで実験ね。)

7.上記4番で実行してるバッチ画面で、SMART 191番のRAW値が確かにカウントアップされていく。

と共に、HDDから異音がしてきた。。。。
まあ、とにかく、ある一定以上のG値を検出すると、Shock Sense Countがカウントアップされる事が確認出来た。

[PC]Orange Pi 5が惜しい!

Orange Pi 5が先行発売したとの記事が出てる。
探してみると、以下から16GBモデルが買えるみたい。

https://ja.aliexpress.com/item/1005004959012661.html?spm=a2g0o.detail.1000023.14.584e3115lfLJzU&gatewayAdapt=glo2jpn

しかし、以下でスペックの紹介してるが、せっかく存在するM.2スロットが2242なんだよね・・・

https://blog.osakana.net/archives/13174

M.2スロットがPCIe GEN2である事も残念だけど、それ以上にM.2 2242フォームファクターと言われても、
価格.comで探すと、M.2 2242のSATA品しか見つからない。
これじゃSSD増設したくても、M.2 2242 PCIe対応品買うには海外から輸入か?
残念だ。

おかげで買うのを我慢出来た。
もし32GB品が販売された時に、SBCで32GBないと困るようなケースに出会ってたら買うかも。

その点この前買ったRadxa ROCK 5Bは素晴らしいな。
値段は高かったが、メモリ16GBでM.2 2280 SSD搭載出来るし、(たぶん使わないけど)2.5GbEポートだし、PoEも対応してる。

[PC]CHUWI CoreBox 4th

https://www.chuwi.com/jp/product/items/Chuwi-CoreBox-4th.html

CHUWIから新作が出た。
以下のクーポンを打ち込んだら確かに349USDだな。

CX4JP50(11/30まで)


性能、サイズ、価格、イイね。
しかもThunderbolt4 40GB/sだと!? 使ってみたい。
CoreBox Proを持ってなかったら買ってたかも。
うーん、我慢・・・

[GAME]PS4コントローラ PC接続方法

Bluetooth接続(失敗)

コントローラのSHAREボタン + PSボタンを長押し
 > コントローラLEDが点滅すると、PC側でワイヤレスコントローラとして検出
 > PC側で選択するとすぐに接続完了した

これでBluetoothで接続されたようだが、ゲーム画面ではコントローラが効かない


有線(microUSB)接続(成功)

USB接続すると認識されたような音が鳴り、デバイスマネージャでもWireless Controllerとして表示されてる。
しかしゲーム画面でコントローラが効かない。
ドライバが必要?との情報もあり、入れてみる。

https://pso2.ares-ac.com/post-11680/#toc9
https://github.com/Ryochan7/DS4Windows/releases
DS4Windows_3.1.10_x64.zipダウンロード
 > 解凍後、DS4Windows.exe実行
 > 「You must install .NET Desktop Runtime to run this application.」と出る


https://github.com/Ryochan7/DS4Windows/releases
このページに、.NET 6.0.10へのリンクがあったので、それをクリック。
https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-6.0.10-windows-x64-installer
ここからダウンロード。
windowsdesktop-runtime-6.0.10-win-x64.exe
これを実行 > 正常にインストールされたと出た。
再度DS4Windows.exeを実行
 > Installing ViGEm BusDriver
 > 完了
このままゲーム画面にいってもコントローラ効かないので一度シャットダウン。
再度起動しても、ゲーム画面でコントローラ効かない。
DS4Windows.exeを再度起動してみたら、今度はNo Connectedではなく、コントローラが認識されてた。
この状態でゲーム画面にいったら、効いた。

次はUSBハブ経由で接続。動作成功。

最後に、もう1つのUSBコントローラ(Logicool Gamepad F310)もUSBハブ経由で接続してみる。
それでゲーム画面に行ったら、2台ともコントローラが効いた。これで対戦が出来る。

[Quartus]I/Oブロックへのレジスタパッキング

評価キット: Terasic DE2-115
FPGA開発ツール: Quartus Prime 21.1.0

SDR SDRAM関連の信号をFPGAのI/Oブロックに配置したい。
信号間のスキューをそろえるため。必要無いかもしれないけど。

■INTEL(ALTERA)

IOブロックへのレジスタパッキング
http://zakii.la.coocan.jp/hdl/41_ioreg.htm
古い情報かもしれないけど、

どうやるんだっけ?
RTL内でI/Oセルを呼び出して、明示的にやる方法あったような?


■AMD(Xilinx)

Xilinxの場合はDDR2動かすために、ODDR2を使えば良かったと記憶。

Spartan-6のODDRの問題(少し進展)
http://nahitafu.cocolog-nifty.com/nahitafu/2009/09/index.html

[PC]Radxa ROCK 5Bセットアップ

https://gadgetrip.jp/2022/01/radxa_rock_5b/

ここで紹介されているが、ROCK 5BをRedeem Code(5USD)を使って、139USDで購入したのが届いた。
シングルボードコンピュータ(SBC)はラズパイなど持ってるが、スペック見てついRedeem Codeを買ってしまった。
16GBメモリ、M.2スロット(M key、A+E Key)など見て、イイナと。

まずはOSイメージをSDカードへ焼きこむ。
https://wiki.radxa.com/Rock5/downloads
ここからUbuntuイメージをダウンロードして、圧縮ファイルのまま、BalenaEtcherで書き込んだ。

秋月ACアダプタ(5.1V、3.8A)で起動する。
なんだか起動がやたら早い印象。ラズパイ8GBよりも早い印象。
初期はuser/pass=rock/rockでログイン。

その後、以下など設定。

sudo passwd root
vi /etc/ssh/sshd_config
vi /etc/hosts.allow
vi /etc/hosts.deny
dpkg-reconfiguration keyboard-configuration
reboot
apt -y install update
apt -y install upgrade



まあ、ふつーに動いた。しかも起動早いね。

裏面にM.2スロット(M key)があるので、addlink NVMe SSDを装着してみた。
lspciで認識されてる。
2.5G LANポートはPoE対応との事。これもイイ。ラズパイは別途PoE HATを買わないとダメだった。

ARM CPUだからバイナリが対応してるか不明だけど、NVMe over TCPも出来るかも。
為替の影響で高いけど、なかなか遊べそうなSBCだ。

[PC]ベンチマーク(コピー速度、ATTO Disk Benchmark、他)

結論

◆外付ストレージ部門
2022.11.27現在、UGREENの10Gbps対応M.2 to USB変換ケースに決定。
上限10Gbpsなので、安くて1GB以上のR/W性能が出るM.2 NVMe SSDを別途買いましょう。
それで1GB程度の性能が出ます。(後述のベンチマーク画像の通り)

(わざわざPCIe GEN4対応買わなくても、GEN3の安いM.2 NVMe SSDでOK。
 なぜならPCIe GEN3はx1レーンで1GB/sの帯域をもっており、かつ最近のM.2 NVMe SSDなら、
 まず間違いなくx4レーンの製品ばかりです。よって、SSDの電気的接続の帯域は4GB/sあるという事。
 ちなみに、PCIeバスの理論値であって、プロトコルオーバーヘッドを除いた時の有効帯域はもう少し下。

 なので、どうせUSB 10Gbps=1.25GB/sの方がボトルネックになるので、SSDは1.25GB/s以上の速度が出るなら何でも良い。
 最近見ないけど、PCIe GEN2 x4=2GB/s帯域、の製品でも良い。)

https://www.amazon.co.jp/UGREEN-NVME%E4%B8%A1%E5%AF%BE%E5%BF%9C-USB3-1-%E5%A4%96%E4%BB%98%E3%81%91%E3%82%B1%E3%83%BC%E3%82%B92230-C%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E4%BB%98%E3%81%8D/dp/B09C8DPNZJ/ref=asc_df_B09C8DPNZJ/?tag=jpgo-22&linkCode=df0&hvadid=553949965199&hvpos=&hvnetw=g&hvrand=16593654472068825754&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009304&hvtargid=pla-1623744654607&psc=1
この性能でBlack Friday価格2639円ってどういう事だよ。安すぎるだろ。
Thunderbolt3 40Gbpsに期待してSAN ZANG MASTERとかいうメーカーのモノを1万円近くで買ってしまった事を激しく後悔するレベル。


参考ページ
こことかに参考になる情報ありますね。
https://news.mynavi.jp/article/20210104-1622235/


コピー速度: RATOC(HDD) to LOGITEC(SSD)
コピー元: RATOC RS-EC32-U3R + ? HDD 2枚
 ↓
ドッキングステーション: Wavlink
 ↓
ホストPC: x280 右 USB
 ↓
ホストPC: x280 左 USB
 ↓
コピー先: LHR-4BRHEU3 + SUNEAST SSD 4枚

copy_from_ratoc_hdd_to_logitec_ssd_221101.png

夜23時くらいから初めて、夕方16:30くらいまでだから、5TBコピーに17h30mくらいかかった。
だいたい65MB/sくらいの転送速度だった。



ATTO Disk Benchmark: RATOC(HDD)
対象: x280右USB > Wavlinkドッキングステーション > RATOC RS-EC32-U3R + ? HDD 2枚

atto_disk_benchmark_ratoc_hddx2_221101.png



ATTO Disk Benchmark: LOGITEC(SSD RAID0)
対象: x280右USB > Wavlinkドッキングステーション > LHR-4BRHEU3 + SUNEAST SSD 4枚 RAID0

atto_disk_benchmark_logitec_suneast_ssdx4_221101.png

この結果見るとなんか寂しくなるな。
SSD x4台でRAID0組んだLOGITECよりも、HDDx2台でRAID0組んだRATOCの方が性能良いじゃないか。
これじゃSSDにした意味がない・・・
LOGITECのHDDケースの性能が悪いのかな?
これでもLOGITECでHDDx4台だった時よりはだいぶ性能UPしたのだが。
(体感で。以前はファイルコピーしても30MB/sくらいしか出てなかったと記憶)
HDDx4台構成のベンチマーク取っておけば良かった。


ATTO Disk Benchmark: LOGITEC(HDD RAID0)
対象: x280右USB > Wavlinkドッキングステーション > LHR-4BRHEU3 + WD HDD(Green)2TB 4枚 RAID0

上記で換装したSSDが、なぜかアクセスするとフリーズするようになった。
なので、HDDに戻した。

atto_disk_benchmark_x280_logitec_wd_hdd_green_x4_raid0_221215.png

上でやったSSD RAID0 x4本の構成と対して性能変わらないよね。
HDDってだいたいシーケンシャルで200MB/sくらいの性能出るはずだが、RAID0 x4本で構成してもこの性能って事は、ちょっとこのHDDケースのCPU性能が遅いんだと思う。
個人的にはRATOC製品の方が印象が良い。
今の所、今後HDDケース買うならRATOC製品で決まりかな。もっと性能高いやつはあると思うがコスパが抜群と思う。


ATTO Disk Benchmark: KIOXIA EXCERIA PLUS(USB SSD)
対象: x280左USB > KIOXIA EXCERIA PLUS(USB接続SSD)

外観から、おそらくこれすね。
https://www.amazon.co.jp/%E3%82%AD%E3%82%AA%E3%82%AF%E3%82%B7%E3%82%A2-KIOXIA-%E5%9B%BD%E7%94%A33%E6%AC%A1%E5%85%83%E3%83%95%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%83%A1%E3%83%A2%E3%83%AA%E6%90%AD%E8%BC%89-%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E4%BF%9D%E8%AD%B7-SSD-PKP500U3-B/dp/B09MCQRMGK


atto_disk_benchmark_kioxia_exceria_plus_221112

スペックはUSB3.2 Gen2ってなってるから、x280の左側USBポートが5Gまでで、それで性能が律速してるのだろう。


ATTO Disk Benchmark: SAN ZANG MASTER TB3 + M.2 NVMe SSD
対象: x280左Thunderbolt3 > SAN ZANG MASTER NVMe to TB3変換ケース > addlink M.2 NVMe SSD 1TB

まず鉄?のケースを開けて、M.2 SSDをヒートシンクなるプレートをはめた後、スロットへ装着。
さらに、USB Type C to Type Cケーブルを装着。(同ケーブルにはType CからType A変換コネクタも付属)
そしてPCへ接続すると自動的に認識され、以下が表示される。

このアプリがデバイスに変更を加える事を許可しますか?: Thunderbolt(TM) Software(発行元:Key for TBT Legacy Driver)


はい、で進む。
さらに以下メッセージが出た。

次のThunderboltデバイスチェーンが差し込まれ、このシステムに1つまたは複数のデバイスを接続するための許可が必要です。
接続したいデバイスを選択してください:
Intel, USB4.0 SSD > ここで常に接続、を選択


OKで次に進む。
Win +R(ファイル名を指定して実行) > control admintools > コンピュータの管理 > ディスクの管理
 > ディスク2(ベーシック) 953.87GB、として認識されてた。
 > 未割り当て領域で右クリック
 > 新しいシンプルボリューム
 > 次へ次へで進み、exFATを選択して次へ、で完了。
これで使えるようになった。

atto_disk_benchmark_san_zang_tb3_addlink_nvme_221127.png

いつものATTO Benchmarkやってみたが、なんとも不思議なWrite性能になった。
ThunderboltはランダムWriteが弱いって事かな?それともSSDの問題か?
にしても、ファイルサイズが大きくなる後半では、リード性能が1.35GBまで到達。
つまりUSB3.2 GEN2の電気的インターフェース10Gbps(1.25GB)よりも上って事は、Thunderbolt3(40Gbps)で接続されているようだ。
にしても、もっと性能出て欲しかった。
SSDが原因か?とも思ったが、今回使ったSSDは以下でリード3.5GBだそうなのでさすがにSSDのせいではなさそう。
https://www.addlink.com.tw/pcie-s70?lang=ja


ATTO Disk Benchmark: UGREEN USB3.2 GEN2 + M.2 NVMe SSD
対象: x280左Thunderbolt3 > UGREEN NVMe to USB3.2 GEN2変換ケース > addlink M.2 NVMe SSD 1TB

説明書見ればケースの開け方は簡単。
しかし、M.2スロットへSSDを取り付けるのがちょっとややこしかった。
最初にゴムの止め具をケースから外す必要があるが、どうやって外すのか分からない。
SSDを固定する凸部を90度回転させたらなぜか外れた。
また、SSDを装着して、ゴム止め具を再度装着するのもコツが分からない。強引に押し込んだ。
さっきフォーマット済なので、Type CケーブルでTB3ポートに接続したら、すぐにEドライブとして認識された。

atto_disk_benchmark_ugreen_usb3_2_gen2_addlink_nvme_221127.png

USB3.2 GEN2の上限である伝送路10Gbpsで、かつプロトコルオーバーヘッドとか差し引いて、990MB/s付近の性能が出てるので、おおむね満足。
にしても、ソースコードを大量に高速にバックアップするためには、外付けストレージではやはり遅いって事かな?
マザーボード直結のM.2スロットだったら、どうだったかな・・・?


ATTO Disk Benchmark: UGREEN USB3.1 GEN1 + M.2 NVMe SSD
対象: x280左USB > UGREEN NVMe to USB3.2 GEN2変換ケース > addlink M.2 NVMe SSD 1TB

これは上でやったUGREENのケーブルをType C to Type Aに変えて、x280の左側Type Aポートに接続した場合のベンチマーク。

atto_disk_benchmark_x280_ugreen_usb3_1_gen1_addlink_nvme_221127.png

まあ当たり前だが、x280のUSBポートが最大5Gbpsの規格(USB3.1 GEN1)だから、性能もそこで頭打ち、と。


ATTO Disk Benchmark: SDXCカード(型番未確認)
対象: x280 SDカードスロット > SDXCカード128GB(型番未確認)

atto_disk_benchmark_x280_sd_221127.png

やっぱり遅い。
元々このSDXCカードにx280に入ってる作業データ(Excelとか、ソースコードとか)をバックアップする際、あまりに遅いので、ランダム性能とか良い外付ストレージを探してる状況。


ATTO Disk Benchmark: x399マザーボード + M.2 NVMe SSD
対象: x399マザーボードM.2スロット > addlink M.2 NVMe SSD 1TB
https://www.addlink.com.tw/pcie-s70?lang=ja

atto_disk_benchmark_x399_motherboard_addlink_nvme_221127.png

同じSSDで今度はマザーボード直結でやってみた。
結果、addlinkが公表してるくらいの性能が出た、かな?
512Bの時の性能も上がってるし、やっぱりマザーボード直結の方が、そりゃ速いよね。
x280のCPU性能とは全然違う(passmarkスコアで3倍弱のTheadripper 1900X)のを使ってるのも要因かもしれないが。

[PC]LHR-4BRHEU3 HDD/SSD換装

以前買ったLOGITEC ガチャベイLHR-4BシリーズのHDDをSSDに換装してみた。
以下に従って設定する。

2.5.1ボリューム構成を設定する
https://dl.logitec.co.jp/downloadfile/DLfile/LST-M/LHR-4BH_um_v03.pdf


1.PC電源ON
2.ガチャベイ本体電源ON > RAID0がオレンジ点灯、SSD4本青色点灯
3.MODEを3秒以上長押し > RAIDモードのオレンジLEDが点滅
4.MODEを押して希望のRAID設定まで移動 > RAID0を選択
5.背面左のRAIDボタンを電源が切れるまで長押し
6.本体電源ON > ボリューム構築がスタートし、SSD4本のLEDが青と紫で点滅
7.SSD4本のLEDが全て青色点灯になるまで待つ。
8.コントロールパネル > 管理ツール > コンピュータの管理 > ディスクの管理 > ディスクの初期化ウィザードが立ち上がった
9.今回は合計2TB以上のRAID0なので、GPTの方を選択 > OK > 未割り当て状態になった。
10.未割り当て領域 > 右クリック > 新しいシンプルボリューム > exFAT設定で作成
11.これでエクスプローラのPC画面にEドライブとして現れた。後はいつも通り使うだけ。

[PC]Wavlink USB3.0ドッキングステーション

ThinkPad x280で普段の作業してるが、とにかくUSBポート不足が不満。
マウスとかUSB WiFiドングルとか接続したくて、すぐにポートが無くなる。
USB2.0接続でいいからポート数多い事と、価格見て以下の製品が良いかなーと思い、
しかもAmazonタイムセールで20%オフの6224円で売ってたので買ってみた。
https://www.amazon.co.jp/%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E3%83%BB%E3%83%89%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%BB%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB-%E3%83%93%E3%83%87%E3%82%AA%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BB%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4-%E6%9C%80%E9%AB%98%E8%A7%A3%E5%83%8F%E5%BA%A62048x1152%E3%81%AEDVI-USB-%E3%83%9D%E3%83%BC%E3%83%88x4%E3%80%81PSE%E8%AA%8D%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9FAC12V2A/dp/B06XS9H6VH?th=1


結論、イイ!

変更前
右: USB3.0? > 外付USBストレージ
左: USB Type-A > 4ポートUSBハブ > マウス、USB WiFiドングル、USBシリアルケーブル、FPGAボードコンフィグケーブル
左: USB Type-C > USB to HDMIケーブル > ディスプレイ
左: HDMI > ディスプレイ


変更後(Wavlink使用時)
右: USB3.0? > Wavlinkドッキングステーション > 上記接続の全て + LANケーブル
左: USB Type-A > 
左: USB Type-C > 
左: HDMI > 



まだWavlinkのUSB3.0ポートが1つ余ってるので、バックアップ先のUSBストレージ接続出来るな。
今までUSB to HDMI変換ケーブルを複数接続してマルチモニタやってたけど、この製品だけで良いな。
過去のUSB to HDMI変換ケーブルは複数接続し過ぎたり、モノによっては、YouTube動画とかレイテンシがひどくて不満だった。
あと、Win11 22H2のx280に接続したら、ドライバ不要だった事も満足。
細かな点として、以下変換コネクタが付属してたことも好印象。
 ・DVI-D to HDMI変換
 ・DVI-I to D-Sub変換
 ・USB Type-A to Type-C変換

[PC]SATA SSD 2TB(SUNEAST、Amazonタイムセール)

Amazonでタイムセールやってる。
これはめっちゃ安いと思う。
SUNEAST SATA SSD 2TB
https://www.amazon.co.jp/SUNEAST-2-5%E3%82%A4%E3%83%B3%E3%83%81-NAND%E6%8E%A1%E7%94%A8-%E3%82%B5%E3%83%B3%E3%82%A4%E3%83%BC%E3%82%B9%E3%83%88-SE90025ST-02TB/dp/B0B81BXWZP/ref=sr_1_5?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=SUNEAST%2BSSD%2B2TB&qid=1667103187&qu=eyJxc2MiOiIyLjI5IiwicXNhIjoiMS45MCIsInFzcCI6IjAuMDAifQ%3D%3D&sr=8-5&th=1


今までGB単価10円くらい切ればまずまずと思ってたが、2TBでここまで安いのは初めて見たな。。。
2TBを数本RAID0でやれば、必要なデータを全てALL FLASHストレージとして扱えるな・・・
買った事無いメーカーだけど、すごい魅力的。

[Quartus]RTL Viewerズームアウトショートカットキー(失敗)

以前からRTL Viewerなるものに興味があり、コーディングする際は非常に便利。

有償のASIC用ツールだと、Synopsys社Verdi(旧Spring Soft社Debussy)が有名だと思うが、
これが非常に便利だった。
無償のものが無いかと探したが、結局良いものが見つからず、QuartusやVivadoに内蔵の機能を使うのが一番良いかと思う。

QuartusのRTL Viewerだいぶ良いのだが、それにしてもズームアウト(Zoom Out)のショートカットキーが
Ctrl + Shift + Spaceってだいぶ面倒じゃない?

Zoom Inはマウスドラッグで範囲選択。これはベスト。
しかし、Zoom Outのショートカットキーは3キー押しって、センス無さすぎでは?
せめてCtrl + Spaceの2キーとか、ベストはzとかxで1キーにしてほしかった。

という事で、そんな事が出来るフリーソフト無いかと探した所、AutoHotKeyなるものが使えそうと思ったのだが。
 ※ 最終的に成功してません。

このソフトで複数キーを1キーに割り当てるスクリプトを書けば良いらしいのだがうまくいかない。

https://www.naporitansushi.com/autohotkey/#
ここを参考に進めた。

1.インストール
2.任意のフォルダ > 右クリック > 新規作成 > AutoHotKey Script
3.スクリプトファイルへ以下のように記述
LCtrl::Send, {LCtrl}{LShift}{Space}
 → これで上手く行かなかったので、スキャンコードなるものでも書いてみたが失敗。
https://ocamejp.com/autohotkey-scancodes/
4.スクリプトファイル選択 > 右クリック > Run Script
 → これでタスクトレイにHアイコンが表示された
5.RTL Viewer画面でスペースを押すも、Zoom Out動作にならず。



何かやりようがあると思うのだが。

誰か上手くキーをシンプルに割り当て出来た方いたら教えて下さい。

[Quartus]Timing Analyzer Tclコマンド

以前にも書いたような気がするが、再度メモ。
 ※ 箇条書きだけのメモにしようと思ってたけど、需要あるかなーと思って、詳しく書いてみた。

INTEL QuartusのTiming Analyzerタイミング制約ファイルは.sdcは、EDAツール業界No.1の米Synopsys社sdc(Synopsys Design Constraint)フォーマットから来ている。
残念ながらコマンド体系が完全に一致してないので、以前Synopsys社のタイミング解析ツールPrimeTimeを覚えた人としては、
いちいちコマンドやオプションを覚え直さないといけないのが残念だが。
あとは(仕方ないが)完全に同じコマンドが使える訳ではないので、あのコマンドがあれば、ともどかしい気持ちになる。
でもget_pinsとか回路を追っかけるのに便利なコマンドがある程度はそろってる。
コマンドラインで自分が作った回路(ネットリスト)を追っかけていくためのtclコマンドをメモしておく。

■まずはTiming Analyzerをひらく
Quartusでプロジェクトを開いた状態で以下でひらく。
Quartus > Tools > Timing Analyzer


■タイミング解析を始めるための前準備
Timing Analyzerを開くと、下段にtclプロンプト(tcl>)が見えるはず。
マウスポインタでそこをクリックすると入力可能な状態になるはず。
そこでまずは以下コマンドを打とう。

もしプロジェクトを開いてない状態から始める時は以下コマンドも必要だが、既にQuartusで開いている場合は不要らしい。
よって、今回これは省略。

tcl> project_open -force "C:/xxx/DE2_115.qpf" -revision DE2_115

なので以下から実行しよう。

tcl> create_timing_netlist -model slow
  → タイミング解析するには、専用ネットリスト?を作るって事かな。遅延設定はslowにしてる。
     slow(温度高、電圧低、プロセス遅(だよね?))って事はSetup解析に使うべき遅延モデル。
     逆にfast(温度低、電圧高、プロセス早)って事はHold解析に使うべき遅延モデル。

tcl> read_sdc
  → プロジェクトに登録しているsdcファイルを読み込んでくれる。
  → これやらなくても、自分で一個一個制約コマンドを打っていけば良いんだけどね。

tcl> update_timing_netlist
  → 何かタイミング制約を与えた場合は、その後上記コマンドでネットリストをupdateすべきらしい。


■本題のtclコマンドメモ
では、sdcファイルを用意してない事を前提にやってみよう。
こちら使っている評価ボードはTerasic社DE2-115だ。(厳密にはVEEKとかtPADと呼ばれるディスプレイ付のボード)

最初にやるべき制約はクロック制約だ。
DE2-115ボードには50MHzのクロック(クリスタル?)がのっている。
Terasic社が提供しているSystem Builder(だったかな?)を使うとトップのVerilogファイルを自動生成してくれるが、
そのVerilogでは、ポート名がCLOCK_50となってる。
まずはそのポートが存在するか確認しよう。
ポートをゲットするためのコマンドがget_portsだ。

tcl> get_ports CLOCK_50
_col8

Timing Analyzerツールでは、ゲットしたオブジェクトはコレクションという単位で返す。
プログラムでいうArrayというものかな。
これ、CLOCK_50というポートは1個しかないのが分かっているのに、いちいちコレクションで返されてポート名が表示されないのも面倒だが。

コレクションに何が入っているか確認しよう。
この方法探すのにちょっと苦労した。PrimeTimeの時はforeachで回したよなーと思ってぐぐったら見つかった
http://billauer.co.il/blog/2013/11/sdc-tcl-quartus-wildcards/


tcl> foreach_in_collection port [get_ports CLOCK_50] { puts [get_port_info -name $port] }
CLOCK_50
  → 一行に書いてるが、やってる事は[get_ports CLOCK_50]で取得したコレクションを順番にportという変数に入れてforeachで回してるって事。
    foreachで回したオブジェクトを[get_port_info -name $port]で名前(厳密にはフルインスタンス名と呼ぶべきか)を表示してる。
これで無事に目で見える表示に出来た。
クロック制約を与えるべきポート名が分かったので、そこにクロック制約を付けてみよう。
50MHz(=20ns)なので、以下のように書く。

tcl> create_clock -period 20.000ns [get_ports CLOCK_50] -name CLOCK_50
  → 後で扱いやすいようにクロック制約名のラベルをCLOCK_50とつけておいた。

ちゃんとクロック制約CLOCK_50が存在するか確認してみる。

tcl> get_clocks CLOCK_50
_col13

またもコレクションで返るから名前が見えないが、先のコマンド使えば確認できる。ここでは省略。
また、名前はCLOCK_50で同じだが、さっきのはポートオブジェクト、今度はクロックオブジェクトなのでget_clocksを使うべき。

さらに、クリスタルがいかに正確なパルスだとしても、必ず何らかの振れ幅(ジッタ)は存在する。
その制約を実現するには以下コマンドを使う。

tcl> set_clock_uncertainty -from CLOCK_50 -to CLOCK_50 0.3ns
   → ここで書いたCLOCK_50はもちろんクロックオブジェクトの名前。
   → もしクロックの立上りと立下りのジッタがそれぞれ別の場合は、-rise_from/-rise_to、-fall_from/-fall_toオプションを使って、それぞれ別々に制約を付けても良い。
ここまでで作った制約をタイミングネットリストへ反映させてみよう。

tcl> update_timing_netlist

アップデートしたら、最初はFlipFlop間のセットアップタイミングを見てみよう。

tcl> report_timing -setup
Report Timing: Found 1 setup paths (0 violated). Worst case slack is 6.258
Path #1: Setup slack is 6.258
1 6.258

slackとはタイミングの余裕度の事。プラスならタイミングは問題無し(=MET)。
マイナスならタイミング違反だから、回路構成を見直したり、Quartusで(必要に応じてオプションを変えて)Place&Routeをやり直したり、と改善する必要がある。

セットアップタイミングでslackが+6.258って事は、今はクロック周波数が50MHz(20ns)だが、回路の実力的には72.7696MHz=13.742ns(20-6.258)まで周波数を上げられる、という事。

次はホールドタイミングを見てみよう。

tcl> report_timing -hold
Report Timing: Found 1 hold paths (0 violated). Worst case slack is 0.342
Path #1: Hold slack is 0.342
1 0.342

こちらもプラスなので問題無し。ただしホールドタイミング解析で一番悲観的ケース(ワーストケース)は半導体の遅延が速い場合なので、fast設定でやるべきだ。

ここで一つ疑問が沸く。
はたして、自分の回路内の全てのFlipFlopにクロック制約が反映されたのだろうか?
シンプルな回路なら外部クロックポート1個で、そのクロック設定をすれば全てのFlipFlopに制約が付与される、というケースもあるだろうが、えてして、クロックが複数あったり、内部で分周クロックを生成していたり、する。

そんな時に便利なコマンドが以下だ。

tcl> check_timing
Check Timing:
No Clock
:

と出る。
No Clockをクリックすると、ドロップダウン形式でクロック制約が付与されてないFlipFlopのリストが表示される。
これで、まだクロック設定がされてないFlipFlopが確認出来る。
STA(Static Timing Analysis)は、そもそも制約が当たってない回路は何もチェックしてくれないので、
クロック制約が当たってないFlipFlopはタイミングを考慮しないレイアウトになり、実際FPGAを動かすと不具合の原因になる。
論理シミュレーションでは動作するのに、実機動作がおかしい、といった場合はSTAのタイミング制約漏れ、を疑おう。

しかし、自分が設計してないような回路をインプリする場合もあるだろう。
その場合は、自動的にクロック設定をやってくれる便利なコマンドがある。

tcl> derive_clocks -period 20ns
Deriving Clocks
create_clock -period 20.000 -name xxx:xxx1|CLOCK_25 xxx:xxx1|CLOCK_25
create_clock -period 20.000 -name xxx:xxx1|spi:spi|clock_cnt[0] xxx:xxx1|spi:spi|clock_cnt[0]

自分の場合は2カ所クロック設定が自動的にされた。
ただし、全て20ns設定になってるので、違う場合は個別に修正する必要がある。
では、実際全てのFlipFlopにクロック設定が反映されたかどうか、再度確認してみよう。
今度は、no_clockチェックだけを指定してやってみる。

tcl> check_timing -include no_clock
Check Timing:
Summary
no_clock 0

これで制約無しFlipFlopが0個になったので、全てのFlipFlopにクロック設定が反映された。
これで少なくともFlipFlop間(FF -> FF)のタイミングチェックは漏れが無くなった。
尚、異なるクロック間がfalse(タイミング不問)の場合は、set_false_pathコマンドを使おう。

このように、derive_clocksは非常に便利なのだが、注意点がある。
derive_clocksで自動的に設定されたクロック設定は、対象のピン(上記の例だとxxx:xxx1|CLOCK_25とか)に設定されたクロックと外部ポートCLOCK_50に設定したクロック、どちらも「基準時間0ns」からスタートして、それぞれの周波数設定で動作する、という設定になってしまっている。
以下に簡易図を示す。

CLOCK_50 >----+------FF1---(CLOCK_25)----FF2
           +------FF3

上図で、外部ポートのCLOCK_50は基準時間0nsで動いてOK。
問題はCLOCK_25の方。
上図で分かる通り、CLOCK_50ポートのクロックが基準時間0nsとした場合、CLOCK_25クロックは「FF1の遅延時間」の後にパルスが出る。
以下のようなデータ転送があった場合、FF1遅延時間が考慮されず、正しいタイミング解析になってない。
CLOCK_50で動作するFF ---> CLOCK_25で動作するFF

このような問題を解決するためには、create_generated_clockコマンドを使おう。
このコマンドを使えば、ソースクロック(上図の例ではCLOCK_50)の遅延関係を考慮して、CLOCK_25を設定してくれる。

Usage: create_generated_clock [-h] [-help] [-long_help] [-add] [-divide_by ] [-duty_cycle ] [-edge_shift ] [-edges ] [-invert] [-master_clock ] [-multiply_by ] [-name ] [-offset


だんだん疲れて来たので、本日はこの辺で。
もっと知りたい人がいたらもっと書こうかな。

(追記)使えそうなコマンド

■foreachで1行づつ表示

http://billauer.co.il/blog/2013/11/sdc-tcl-quartus-wildcards/

階層になってるピンを全て取得して、それをquery_collectionで目に見える表示にして、さらにforeachで1行づつ表示させる。
tcl> foreach i [ query_collection -all [ get_pins -hierarchical * ] ] { puts "Pin: $i" }

■no_clock原因調査

次に、no_clock箇所の解析。
tcl> check_timing -include no_clock
こうやるとクロック制約が伝搬してないレジスタが表示される。
表示されたうちの1つのレジスタの存在を確認してみる。

tcl> query_collection -all [get_registers cq_vga2:cq_vga2_vga|valr4[10] ]
cq_vga2:cq_vga2_vga|valr4[10]

確かにレジスタは存在する。
このレジスタのピンを確認する。

tcl> foreach i [query_collection -all [get_pins cq_vga2:cq_vga2_vga|valr4[10]|*] ] { puts $i}
cq_vga2_vga|valr4[10]|ena
cq_vga2_vga|valr4[10]|asdata
cq_vga2_vga|valr4[10]|clrn
cq_vga2_vga|valr4[10]|clk
cq_vga2_vga|valr4[10]|q

query_collectionで表示させても良いが見難いので、さらにforeachで1行づつ表示させてる。

■Quartusで使えるコマンド調査

ここでfanin関連コマンドが存在すればclkピンへ伝搬する元を追えるはずだが。
quartus_staで使えるコマンドを調べる。
https://cdrdv2-public.intel.com/666794/ug-qpp-scripting-j-683432-666794.pdf
ここを見ると、以下コマンドで使用可能なtclコマンドが調べられるとの事。

tcl> help
これでQuartusのTclパッケージ一覧を調べる。

----------------------------------
Available Quartus Prime Tcl Packages:
----------------------------------

Loaded Not Loaded
------------------ ----------------------------------
::quartus::device ::quartus::design
::quartus::flow ::quartus::report
::quartus::misc ::quartus::names
::quartus::project ::quartus::incremental_compilation
::quartus::sdc
::quartus::sdc_ext
::quartus::sta
::quartus::tdc



tcl> help -pkg ::quartus::sdc
次にこのコマンドでsdcパッケージに入ってるコマンドリストを取得。

-------------
Tcl Commands:
-------------

all_clocks
all_inputs
all_outputs
all_registers
create_clock
create_generated_clock
derive_clocks
get_cells
get_clocks
get_nets
get_pins
get_ports
remove_clock_groups
remove_clock_latency
remove_clock_uncertainty
remove_disable_timing
remove_input_delay
remove_output_delay
reset_design
set_clock_groups
set_clock_latency
set_clock_uncertainty
set_disable_timing
set_false_path
set_input_delay
set_input_transition
set_max_delay
set_min_delay
set_multicycle_path
set_output_delay



tcl> help -pkg ::quartus::sdc_ext
さらにsdc_extも調べる。

-------------
Tcl Commands:
-------------

derive_clock_uncertainty
derive_pll_clocks
get_active_clocks
get_assignment_groups
get_fanins
get_fanouts
get_keepers
get_nodes
get_partitions
get_registers
remove_annotated_delay
remove_clock
reset_timing_derate
set_active_clocks
set_annotated_delay
set_max_skew
set_net_delay
set_scc_mode
set_time_format
set_timing_derate


なんか目的のコマンドあるっぽい。

実はfaninコマンドが無いと思っていて、先に以下コマンドでクロック設定すべき箇所の正解を調べてしまっていたので、自動的にcreate_clockされた状態。
tcl> derive_clocks -period 40ns
Info (332105): Deriving Clocks
Info (332105): create_clock -period 40.000 -name CLOCK_25 CLOCK_25

一旦クロックを削除してやり直してみる。
tcl> remove_clock CLOCK_25

tcl> check_timing -include no_clock
ここで表示されたクロック制約がまだ伝搬してない以下を使ってfaninコマンドやってみる。
cq_vga2:cq_vga2_vga|valr3[14]

■get_faninsコマンド使い方

tcl> query_collection -all [get_fanins [get_pins cq_vga2:cq_vga2_vga|valr3[14]|clk]]
CLOCK_25

これでderive_clocksでやった時と同じ、CLOCK_25がクロック設定すべき根本だと分かった。

ここで出来ればCLOCK_25が何者か(pin、cell、net、register、port)わかるようにコレクションタイプを表示させるコマンドを探したが見つからず。
自分で設計してるからCLOCK_25が何者か分かるが、他人の膨大なRTLを解析する場合は、コレクションタイプも調べられた方が良いかと。
仕方ないので総当たりで調べてみる。

tcl> query_collection -all [get_cells CLOCK_25]
CLOCK_25

tcl> query_collection -all [get_pins CLOCK_25]
Warning (332173): Ignored filter: CLOCK_25 could not be matched with a pin

tcl> query_collection -all [get_nets CLOCK_25]
CLOCK_25

tcl> query_collection -all [get_registers CLOCK_25]
CLOCK_25

tcl> query_collection -all [get_ports CLOCK_25]
Warning (332173): Ignored filter: CLOCK_25 could not be matched with a port

つまり、CLOCK_25というcell、net、registerオブジェクトは存在するが、pinとportは存在しない、と。

■レジスタにcreate_generated_clockを設定

CLOCK_25がregisterオブジェクトである事が分かったので、以下コマンドでpinを調べる。既に知ってるのだが一応。
tcl> query_collection -all [get_pins CLOCK_25|*]
CLOCK_25|d CLOCK_25|clrn CLOCK_25|clk CLOCK_25|q

これでCLOCK_25は、clkピンに元のクロックがやってきて、分周か何かがされてqピンから出力される回路と予想が付く。

CLOCK_25レジスタにクロックを供給している元を調べる。
tcl> query_collection -all [get_fanins [get_pins CLOCK_25|clk]]
CLOCK_50

CLOCK_50である事が分かった。(RTL設計者なので、これがportであり、clockオブジェクトである事は知ってる)

-sourceオプションにclockを設定したらエラー出たので、portにした。
tcl> create_generated_clock -divide_by 2 -source [get_ports CLOCK_50] -name CLOCK_25 [get_pins CLOCK_25|q]

設定したクロックが存在するか確認すると、以下の通り設定効いてるようだ。
tcl> report_clocks
Info (332111): Found 4 clocks
Info (332111): Clock Name Period Rise Time Fall Time Clock Type Targets
Info (332111): ============== ======== ========= ========= ============ =============
Info (332111): CLOCK2_50 20.000 0.000 10.000 Base CLOCK2_50
Info (332111): CLOCK3_50 20.000 0.000 10.000 Base CLOCK3_50
Info (332111): CLOCK_25 40.000 0.000 20.000 Generated CLOCK_25|q
Info (332111): CLOCK_50 20.000 0.000 10.000 Base CLOCK_50
Info (332111): Generated Clock Source Node Master Clock Waveform Attributes
Info (332111): ================ ============= ============ ==========================
Info (332111): CLOCK_25 CLOCK_50 CLOCK_50 divide by( 2 )


あらためてno_clockを調べてみると0になってるので、これで全てのregisterにクロック伝搬がされた。
tcl> check_timing -include no_clock
Info (332106): Check Timing:
Info (332106): Summary
Info (332106): no_clock 0


■set_clock_uncertaintyでばらつきを制約を設定

実は前のcheck_timingでuncertainty制約無いぞ!と指摘を受けていたので設定してみる。
tcl> set_clock_uncertainty -from [get_clocks CLOCK_50] -to [get_clocks CLOCK_50] 0.3ns
確認コマンドは・・・調査中。

[PC]Rock5 Model Bプリオーダー

だいぶ忘れてたが、前に先行予約?なるものをしたSBCの通知が来た。

https://gadgetrip.jp/2022/01/radxa_rock_5b/

これがようやく出荷可能(買えるよう)になったらしい。
確かもっと早く販売してたみたいだが、前回のオーダーには乗り遅れたためかSOLD OUTになってたと記憶。

RSコンポーネンツに注文していたラズベリーパイ16GBも注文キャンセルになってしまったし、こちらを買ってみるか。

今年のCQ1頃に先行バウチャー(?)なるものを5ドルで買ったんだった。
そのため、通常189ドルの所、50ドル引きの139ドルで購入できる、と。
送料は安いエコノミーを選んで合計157ドルくらいで買えた。
それにしても円安が痛い・・・
最大20日ほど待つと到着するらしい。

[Windows]Microsoft Wireless Display Adapter

以前から紹介している通り、筆者はマルチディスプレイにハマっている。
今回はMicrosoft Wireless Display Adapterを紹介したい。

■結論
 ・ケース1 PC本体画面があって、そこにもう1画面追加したい方
  PC本体画面に加えて、もう1枚画面を拡張したい方にはおすすめの商品。
  価格は6000円台後半で売ってるが、やや高いと思いながらも、接続の手軽さや、レスポンスの速さ、
  などから個人的には満足。

 ・ケース2 本製品Wireless Displayで接続した画面をメインにしたい方
  これは出来ないはず。
  Windowsにログインしてからでないと、Win + Kキーで接続出来なかった。(何か方法あるのかな?)
  よって、この製品は「Windowsを起動してから」でないと使えないもの。
  起動してログイン画面を無線接続で表示したい、とかは出来なかった。

  試してはいないが、HDMIワイヤレスエクステンダーなどと呼ばれる他の製品なら、メイン画面として使えるのでは?
  Windows OSの機能を使って接続してる訳ではないはずなので。
  そもそも、やたら価格が高い(数万円、有名ブランドは5万円以上)ので、買う気にならなかった。

■補足
 ・本製品の接続方式「ミラキャスト」は1対1接続らしい。(どこかの情報ソースで確認した)
  よって、本製品を複数買って、無線接続で複数ディスプレイと接続、は出来ないと判断。(これがやりたかった)

 ・ミラキャストはWiFiとは別の接続なので、Wireless Display接続した状態でも、WiFi接続は出来た。

■購入した背景

これまでUSB to HDMIアダプタで画面を拡張してきた。
しかし、ノートPCなどにはUSBポート数に限界がある点や、アダプタ同士の相性?がある様で、
モニタ拡張枚数に限界が出てしまう、といった注意点もある。

この製品はWindowsを起動してからでないと使えない(はず)ので、存在は知ってたが、そこまで興味はもってなかった。
PC周辺の機器を有線接続にすると配線が猥雑になるので、無線化も検討したくなったのが本製品を購入した理由だ。

■製品概要、接続方法

製品の紹介としては以下Amazonページを引用したい。
紹介写真を見て頂くと、ディスプレイとの接続方法も掲載されている。

Microsoft Wireless Display Adapter
https://www.amazon.co.jp/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88-%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%AC%E3%82%B9%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%83%BC-V2%E3%80%90Wi-Fi%E4%B8%8D%E8%A6%81%E3%80%91%E3%83%9F%E3%83%A9%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88%E3%83%86%E3%82%AF%E3%83%8E%E3%83%AD%E3%82%B8%E3%83%BC-%E6%90%AD%E8%BC%89%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E5%AF%BE%E5%BF%9C-P3Q-00009/dp/B01BG9NG5E

接続はシンプルで、まずは当たり前だが、製品のHDMIコネクタをディスプレイに接続する。
あとはUSBコネクタを電源供給ポートに接続するだけ。
USBはディスプレイ本体のポートでも良いらしいが、うちの環境では接続しにくかったので、
単にUSB電源アダプタで電源を供給する事にした。

■使い方

本製品をディスプレイにHDMI接続して、USBから電源供給すると、ディスプレイ画面には「Win + Kを押せ」とアナウンスが表示される。
さらにPC側を起動して、Windowsにログインする。
そこからWindowsキーを押しながらKキーを押すと、画面右下に「キャスト」というウィンドウが表示され、
さらにそこに、接続可能なデバイスとして、本製品の名前が表示されるはずだ。
そこをクリックして接続すると、数秒でディスプレイに画面が表示された。

■さらに使い方

ここまででディスプレイが2枚になったので、それを複製するか、拡張するかは使い方次第。
具体的には、デスクトップ画面(何もアプリを開いてない状態の画面)で右クリックから、ディスプレイ設定を選択。
そこで画面が2枚表示されているはずだが、その右横に、複製か、拡張か、の設定が出来る。

■今どんなPC構成?

これまではUSB to HDMIアダプタで、ノートPC本体 + ディスプレイ5枚、を構築していた。
そのうち1枚を今回のWireless Display Adapterに代えた。

ノートPC Lenovo x280
  HDMIポート > HDMIケーブル > ディスプレイ
  USB Type C > USB Type C to HDMIケーブル > ディスプレイ
  無線接続(ミラキャストと呼ぶ?) > Microsoft Wireless Display Adapter > ディスプレイ
  USBポート > USB to HDMI変換アダプタ(玄人志向) > ディスプレイ
  USBポート > USB to HDMI変換アダプタ(ABLEWE) > ディスプレイ

USB to HDMI変換アダプタの数を減らせた事で、本当にこれが理由か分からないが、
接続が一気に安定した。
これまではあるディスプレイだけ、マウスをそこに移動すると画面が消える不具合?が発生していたり、
そもそもUSB to HDMI変換アダプタ経由の接続が一部表示されなかったり、があった。
各社のドライバソフトウェアの問題かと思うが、どれがどう原因なのかは解明出来てない。

■Bluetooth、複数WiFiアダプタとの共存

・USB WiFiアダプタで認証するソフトウェアがあるため、アダプタを接続したら、Wireless Display接続が一旦切れた。
 何度か接続試行を繰り返して、最終的にはWireless Display接続が出来るようになった。

・Bluetoothキーボードを接続しようとすると、一旦Wireless Displayを切る必要がある、とのメッセージが出た。
 Bluetooth接続をした後、Wireless Display接続を何度も繰り返した後、接続が出来た。
 しかし、そのまま使い続けていたら、Wireless Display接続が切れてしまう。
 再度接続しても、時間が経つと何度も切れてしまう。
  → この原因や対策は現状不明。

[PC]EP805Aトラブルシュート

ある日突然無線LANが接続出来なくなったので、復旧までの手順メモ。

■症状
 ある日突然プリンタの無線LANがつながらなくなった。

■結論
 設定 > ネットワーク設定 > ネットワーク診断 > 印刷
 これで「MACアドレスフィルタリング設定の確認」がNGと診断された。
 診断結果を印刷した後、待っていただけで、無線LAN接続になぜか成功したようで印刷が始まった。(理由不明)

■詳細
 ・固定IPなので、そのIPへpingするも応答無し。
  このIPはDHCP範囲外なので、DHCPクライアントがそのIPを奪った、とかは無し。
 ・プリンタ本体の無線LAN設定(SSID、方式、固定IP、GW、DNS、サブネット、など)に問題は見当たらない。
 ・無線LAN親機でのMACアドレスフィルタリングに本プリンタのMACは以前から登録済。
 ・プリンタ本体を再起動しても変わらず。
 ・プリンタ無線LAN設定をOFF->ONしても変わらず。
 ・最後に、ネットワーク診断して、それを印刷したら、MACアドレスフィルタリングでNGくらっている事が分かった。
  その印刷物を読んでいる最中に、ストックされていた印刷命令が突然始まった。
  なぜかは分からない。

[LM32]ビルドバッチ

内容は以下。

1.micosystem.exeでBuild allした時のコピー(sw.elfが生成される)
2.micosystem.exeでSoftware Deploymentlした時のコピー(命令RAMとデータRAMの.memが生成される)
3.srec生成
4.elfをobjdump
5.memからmifへ変換(自作rubyプログラム)
6.rubyだと16進数のアドレスの0埋めが出来ずに空白埋めになるので、0へ変換
7.mifをシミュレーションフォルダへコピー


#!/bin/bash

\rm sw.elf
\rm *.mif
\rm *.srec
\rm *.bin.*
\rm *.objdump.txt
\rm *.o
\rm *.d

src_name=LEDTest

#GCC_OPT="-D__RELOCATE_EXCEPTION_TABLE__"
GCC_OPT=""

LM32ELFBIN=/cygdrive/c/lscc/diamond/3.12/micosystem/gtools/lm32/lm32-elf/bin
LM32BIN=/cygdrive/c/lscc/diamond/3.12/micosystem/gtools/lm32/bin
PJ_DIR=/cygdrive/c/hoge/DE2-115/micosystem/mico32/soc
LATTICE_UTIL_DIR=/cygdrive/c/lscc/diamond/3.12/micosystem/utilities
RUBYBIN="/cygdrive/c/hoge/ruby"

echo "INFO : build ------------------------------------------------------------------------";
cd ../mico32/Debug

$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../DDInit.c -o ../../Debug/Debug/DDInit.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../DDInit.c >> ../../Debug/Debug/DDInit.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../DDStructs.c -o ../../Debug/Debug/DDStructs.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../DDStructs.c >> ../../Debug/Debug/DDStructs.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../LCD.c -o ../../Debug/Debug/LCD.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../LCD.c >> ../../Debug/Debug/LCD.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../LatticeMico32.c -o ../../Debug/Debug/LatticeMico32.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../LatticeMico32.c >> ../../Debug/Debug/LatticeMico32.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../LatticeMico32DbgModule.S -o ../../Debug/Debug/LatticeMico32DbgModule.o
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../LatticeMico32Uart.c -o ../../Debug/Debug/LatticeMico32Uart.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../LatticeMico32Uart.c >> ../../Debug/Debug/LatticeMico32Uart.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../LatticeMicoUtils.S -o ../../Debug/Debug/LatticeMicoUtils.o
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../LookupServices.c -o ../../Debug/Debug/LookupServices.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../LookupServices.c >> ../../Debug/Debug/LookupServices.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../MicoExit.S -o ../../Debug/Debug/MicoExit.o
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../MicoFileClose.c -o ../../Debug/Debug/MicoFileClose.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../MicoFileClose.c >> ../../Debug/Debug/MicoFileClose.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../MicoFileDevices.c -o ../../Debug/Debug/MicoFileDevices.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../MicoFileDevices.c >> ../../Debug/Debug/MicoFileDevices.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../MicoFileIsAtty.c -o ../../Debug/Debug/MicoFileIsAtty.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../MicoFileIsAtty.c >> ../../Debug/Debug/MicoFileIsAtty.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../MicoFileOpen.c -o ../../Debug/Debug/MicoFileOpen.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../MicoFileOpen.c >> ../../Debug/Debug/MicoFileOpen.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../MicoFileRead.c -o ../../Debug/Debug/MicoFileRead.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../MicoFileRead.c >> ../../Debug/Debug/MicoFileRead.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../MicoFileSeek.c -o ../../Debug/Debug/MicoFileSeek.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../MicoFileSeek.c >> ../../Debug/Debug/MicoFileSeek.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../MicoFileStat.c -o ../../Debug/Debug/MicoFileStat.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../MicoFileStat.c >> ../../Debug/Debug/MicoFileStat.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../MicoFileWrite.c -o ../../Debug/Debug/MicoFileWrite.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../MicoFileWrite.c >> ../../Debug/Debug/MicoFileWrite.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../MicoGPIO.c -o ../../Debug/Debug/MicoGPIO.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../MicoGPIO.c >> ../../Debug/Debug/MicoGPIO.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../MicoGPIOService.c -o ../../Debug/Debug/MicoGPIOService.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../MicoGPIOService.c >> ../../Debug/Debug/MicoGPIOService.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../MicoInterrupts.c -o ../../Debug/Debug/MicoInterrupts.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../MicoInterrupts.c >> ../../Debug/Debug/MicoInterrupts.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../MicoSbrk.c -o ../../Debug/Debug/MicoSbrk.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../MicoSbrk.c >> ../../Debug/Debug/MicoSbrk.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../MicoSleepHelper.S -o ../../Debug/Debug/MicoSleepHelper.o
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../MicoStdStreams.c -o ../../Debug/Debug/MicoStdStreams.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../MicoStdStreams.c >> ../../Debug/Debug/MicoStdStreams.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../MicoUart.c -o ../../Debug/Debug/MicoUart.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../MicoUart.c >> ../../Debug/Debug/MicoUart.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../MicoUartService.c -o ../../Debug/Debug/MicoUartService.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../MicoUartService.c >> ../../Debug/Debug/MicoUartService.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../MicoUtils.c -o ../../Debug/Debug/MicoUtils.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../MicoUtils.c >> ../../Debug/Debug/MicoUtils.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. ../printf_shrink.c -o ../../Debug/Debug/printf_shrink.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I. -MM -MG -P -w ../printf_shrink.c >> ../../Debug/Debug/printf_shrink.d

cd ../../Debug

rm -f Debug/../LEDTest.o
rm -f Debug/../lm32_func.o
rm -f Debug/crt0ram.o

touch force_clean_archive_objs

$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled $GCC_OPT -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I./../mico32 ../LEDTest.c -o Debug/../LEDTest.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled $GCC_OPT -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I./../mico32 -MM -MG -P -w ../LEDTest.c >> Debug/../LEDTest.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled $GCC_OPT -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I./../mico32 ../lm32_func.c -o Debug/../lm32_func.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled $GCC_OPT -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I./../mico32 -MM -MG -P -w ../lm32_func.c >> Debug/../lm32_func.d
$LM32BIN/lm32-elf-gcc -c -mbarrel-shift-enabled $GCC_OPT -ffunction-sections -O0 -g2 -Wall -D__lm32__ -I./../mico32 ./../mico32/crt0ram.S -o Debug/crt0ram.o
$LM32BIN/lm32-elf-gcc -mbarrel-shift-enabled -T ../mico32/Debug/linker.ld -osw.elf Debug/../LEDTest.o Debug/../lm32_func.o Debug/crt0ram.o ./Debug/libmico32.a -lm -lsmallc -lgcc ./Debug/libmico32.a -lnosys -Wl,--gc-sections
$LM32BIN/lm32-elf-size sw.elf



echo "INFO : objcopy elf to bin (boot, text) ----------------------------------"; $LM32BIN/lm32-elf-objcopy -j .boot -j .text -O binary $PJ_DIR/sw/Debug/sw.elf $PJ_DIR/sw/Debug/Application.bin.boot_text
echo "INFO : objcopy bin to mem (boot, text) ----------------------------------"; $LATTICE_UTIL_DIR/bin_to_verilog --h --EB --width 4 $PJ_DIR/sw/Debug/Application.bin.boot_text $PJ_DIR/sw/Debug/hoge_Instruction_IM.mem
echo "INFO : objcopy elf to bin (rodata, bss) ----------------------------------"; $LM32BIN/lm32-elf-objcopy -j .rodata -j .bss -O binary $PJ_DIR/sw/Debug/sw.elf $PJ_DIR/sw/Debug/Application.bin.rodata_bss
echo "INFO : objcopy bin to mem (rodata, bss) ----------------------------------"; $LATTICE_UTIL_DIR/bin_to_verilog --h --EB --width 4 $PJ_DIR/sw/Debug/Application.bin.rodata_bss $PJ_DIR/sw/Debug/hoge_Data_IM.mem


echo "INFO : convert Debug/sw.elf to $src_name.srec ----------------------------"; $LM32BIN/lm32-elf-objcopy -O srec sw.elf $src_name.srec
echo "INFO : objdump sw.elf -----------------------------------------"; $LM32ELFBIN/objdump.exe -d sw.elf > sw.elf.objdump.txt

\rm data_ram_data.mif
\rm inst_ram_data.mif

#echo "INFO : convert mem to mif (inst) --------------------"; ruby $RUBYBIN/mem2mif_v01.rb hoge_Instruction_IM.mem inst_ram_data.mif
echo "INFO : convert mem to mif (inst) --------------------"; ruby mem2mif_v01.rb hoge_Instruction_IM.mem inst_ram_data.mif
#echo "INFO : convert mem to mif (data) --------------------"; ruby $RUBYBIN/mem2mif_v01.rb hoge_Data_IM.mem data_ram_data.mif
echo "INFO : convert mem to mif (data) --------------------"; ruby mem2mif_v01.rb hoge_Data_IM.mem data_ram_data.mif

echo "INFO : padding 000 (inst) ---------------------------"; sed -i 's/ /000/g' inst_ram_data.mif
echo "INFO : padding 000 (data) ---------------------------"; sed -i 's/ /000/g' data_ram_data.mif

echo "INFO : padding 00 (inst) ---------------------------"; sed -i 's/ /00/g' inst_ram_data.mif
echo "INFO : padding 00 (data) ---------------------------"; sed -i 's/ /00/g' data_ram_data.mif

echo "INFO : padding 0 (inst) ---------------------------"; sed -i 's/00 /000/g' inst_ram_data.mif
echo "INFO : padding 0 (data) ---------------------------"; sed -i 's/00 /000/g' data_ram_data.mif

echo "INFO : cp inst_ram_data.mif ../../ ------------------"; \cp inst_ram_data.mif ../../
echo "INFO : cp data_ram_data.mif ../../ ------------------"; \cp data_ram_data.mif ../../


[Quartus]コンパイルバッチ

これでFPGAへのプログラムまで自動で行ける。
Quartus Prime v21.1で確認済。
USB Blasterがどんな名前で認識されているか、一度はProgrammer画面で確認してね。

#!/bin/bash

PJNAME=DE2_115
echo "INFO : quartus_map -------------------------------------------"; quartus_map --read_settings_files=on --write_settings_files=off $PJNAME -c $PJNAME
echo "INFO : quartus_fit -------------------------------------------"; quartus_fit --read_settings_files=on --write_settings_files=off $PJNAME -c $PJNAME
echo "INFO : quartus_asm -------------------------------------------"; quartus_asm --read_settings_files=on --write_settings_files=off $PJNAME -c $PJNAME
echo "INFO : quartus_sta -------------------------------------------"; quartus_sta $PJNAME -c $PJNAME
echo "INFO : jtagconfig -------------------------------------------"; jtagconfig -n
#echo "INFO : quartus_pgm -------------------------------------------"; quartus_pgm --cable="USB-Blaster [3-4]" $PJNAME.cdf
echo "INFO : quartus_pgm -------------------------------------------"; quartus_pgm --cable="USB-Blaster [USB-0]" $PJNAME.cdf

[Quartus]Timing Analyzerコマンドライン

https://www.intel.com/content/dam/support/jp/ja/programmable/support-resources/bulk-container/pdfs/literature/hb/qts/qts-qii53018-j.pdf


久しぶりにTerasic VEEKをいじってる。
コマンドラインでバッチ処理したいので、メモ。

対話(インタラクティブ)モードで起動
$ quartus_sta.exe -s

STAコマンドをまとめたファイルがあったらこれで読み込める。
$ tcl> source sta.tcl

sta.tcl例

project_open -force "C:/xxx/DE2_115.qpf" -revision DE2_115
create_timing_netlist -model slow
read_sdc
check_timing
update_timing_netlist
create_timing_summary -setup -panel_name "summary_Setup" -multi_corner
create_timing_summary -hold -panel_name "summary_hold" -multi_corner
create_timing_summary -recovery -panel_name "summary_recovery" -multi_corner
create_timing_summary -removal -panel_name "summary_removal" -multi_corner
create_timing_summary -mpw -panel_name "summary_min_pulse_width" -multi_corner
report_clock_fmax_summary -panel_name "fmax" -multi_corner
report_clock_transfers -panel_name "clock_transfer"
report_ucp -panel_name "unconst_path"
check_timing

# ここから先はSTAやってなくて、回路を解析するために使うコマンド文法メモ
get_ports CLOCK_50
get_nets mico32:ether1|lm32_top:LM32|lm32_cpu:cpu|valid_m
get_cells CLOCK_25



create_clock -period 20.000ns [get_ports CLOCK_50]
create_clock -period 20.000ns [get_ports CLOCK2_50]
create_clock -period 20.000ns [get_ports CLOCK3_50]

#**************************************************************
# Create Generated Clock
#**************************************************************
derive_pll_clocks
# for CLOCK_25
derive_clocks -period 40



derive_clocks -period 40の所は内部レジスタ(Flip Flop)に自動的にクロックを設定するコマンド。
本来なら、外部クロックポートCLOCK_50からの伝搬遅延を考慮して、以下のように書くべきだろう。
create_clock -period 40.000ns [get_pins CLOCK_25|clock_pin_name]
INTEL FPGAのレジスタってピン名が何になるのか調べて無いが。

ケーキ値上がりエグい

けっこうお気に入りのメロンショートケーキ。。。一年ぶりに買ってみたら、小さいショートなのに900円近くに値上がりしてた。
何年か前までは550円くらいだったのに・・・
味も落ちた気がするし、今度は別の店を探すか・・・
カレンダー
01 | 2024/02 | 03
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 - -
累積訪問者
現在の訪問者
現在の閲覧者数:
最新記事
最新トラックバック
最新コメント
月別アーカイブ
カテゴリ
プロフィール

bobgosso

Author:bobgosso
FPGAのブログへようこそ!

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード