電子工作・プログラミング ブログトップ
前の10件 | -

2024年の今、「FPGAボードで学ぶVerilog HDL」で遊ぶ (Xilinx Spartan-3E) (3) MicroBlaze MCS [電子工作・プログラミング]

前回で、本の内容に加えシリアル通信ができるようになり、初等的な内容をテストするには、だいぶお腹一杯という感じになってきました。
IPコアのリストを眺めていると、ISE 14.7では、ISE 8.2に比べ、Debug(ILA, VIO, ICON, ATC2)とEmbedded Processing(MicroBlaze MCS)が新たに選べるようになっていました。調べると、Xilinx社提供のソフトプロセッサMicroBlazeは、XilinxのFPGAであれば、無償で利用できるそうです。そこで、本書付属のFPGAボードで、MicroBlazeのテスト動作による学習をしてみたいと思います。

いくつか試したところ、本書同梱のボードに使用されているSpartan-3EのXC3S100Eはリソースが少ないので、フル機能のMicroBlazeはぎりぎり実装できますが、それで精一杯で、ほぼ何もできない感じでした。機能固定版のMicroBlaze MCSであれば、4割程度のリソースを残しつつ実装できたので、こちらの実装手順について、以下にメモします。

最初に、参考資料として、AMD社公式のプロダクトガイドを挙げておきます。
PG048 LogiCORE IP MicroBlaze Micro Controller System v1.4
PG052 LogiCORE IP I/O Module v1.03a
ポイントは、最新版ではなく、ISE 14.7版を参照することです。幸い、本日時点では問題なく参照できます。特にPG048のP34以降は、ISE 14.7のProject Navigatorでの操作をそのまま記載しています。以下のメモでも、基本的にこちらの手順に従います。
ちなみに、MicroBlaze MCS v3(Vivado用)のPG116であれば、日本語の資料もあります。

他には、下記2つのページをかなり参考にさせて頂きました。
ISE14.6でMicroBlazeを使う
MicroBlazeを使う

以下、手順のメモ

PlanAheadではなく、ISE 14.7のProject Navigatorで行いました。ISE起動後、新規プロジェクトの作成の後、Hierarchyウィンドウで右クリックし、New sourse...を選び、IPを選びます。選択画面から、Embedded Processing→Processor→MicroBlaze MCSを選びます。選択し生成すると、詳細設定のダイアログが開きます。
Instance Hierarchial Design Nameは適当に付けます。但し、後で作成するトップモジュールでは、間違いなくその名前でインスタンス化します。Input Clock Frequencyは、FPGAボードのクロックに合わせて33.333 MHzと入力します。Memory Sizeはケチって4KBとします。デフォルトではすべてのオプションのチェックボックスが外れているはずです。今回は、最小限の確認ということで、UARTのReceiver/Transmitterと、GPO1を1ビットだけONにしました。特に、MCSタブのEnable Debug SupportはOFFにしました。使えたらソフトウェアのデバッグに良いのですが、リソース不足のためか配置に成功しませんでした。ここまで設定したら、Generateでダイアログを閉じます。

Creatingと表示され、アイコンがぐるぐる回るので、しばし待つと、IPの生成が完了します。DesignビューのHierarchyでいま生成したIPを選択すると、ProcessesのCORE Generatorの中に、View HDL Instatntiation Templateがあります。ダブルクリックして表示すると、一番下のところにINSTANTIATION Templateがあるので、それをトップモジュールにペーストし、your_instance_nameを上で設定した名前に合わせます。他、適宜配線を行います。CLKはいつも通りボードのP63に、UART_RxはボードのP79に、UART_TxはボードのP83に、GPO1はLED1のP17に接続します。また、明確な記載が見つからなかったのですが、CPUのリセットはActive Highのようで、ボードのSW(P24)をそのままつなぐと、ちょうどボタン押下=リセットとなります。

トップモジュールと制約ファイルの記述ができたら、Synthesizeを実行します。成功したら、IPの詳細設定ダイアログのPlanAhead & Project Navigator Informationの記載に従い、microblaze_mcs_setup.tclスクリプトを実行します。View→Panels→Tcl ConsoleでTclコンソールを表示し、source ipcore_dir/microblaze_mcs_setup.tcl を入力し、Enterを押します。その後、ビットストリーム生成まで行います。

次いで、XSDKを起動しますが、仮想マシンでのエラー対策で、下記コマンドラインで起動します。
xsdk -vmargs -Dorg.eclipse.swt.internal.gtk.cairoGraphics="false"

先ほどProject Navigatorで表示されていた、IPの詳細設定ダイアログのMCSタブ中のSoftware Develeopment Informationの記載通りに進めます。適当な場所にworkspaceを作成し、Hardware Platform Specificationで、ハードウェアの設定のxmlファイルをインポートします。デフォルトの設定であれば、ISEのプロジェクトフォルダの直下のipcore_dirの中に、..._sdk.xmlがあるはずです。
xmlファイルを指定すると、BMMファイルは自動的に設定されますが、Implement中に生成された..._bd.bmmに選び直します。ついでに、先ほど生成したbitstreamも指定しておきます。Finishでダイアログを閉じます。
Welcome...のタブを閉じると、system.xmlの内容が表示されます。Software Develeopment Informationの記載にあった、Board Support Packageの作成は、省略しても、Application Project作成時に同時に作成されます。Application Project作成のダイアログでは、Project nameを適当につけます。Target Hardwareが、先ほど作成したPlatformとProcessorになっていることが確認できます。OS Platformはstandaloneに、LanguageはCとして進め、Hello Worldプロジェクトを選択してみます。

ソフトウェアのプロジェクトが作成されると、最初に自動でコンパイルが実行され、失敗します。最初のエラーメッセージを見ると、
section `.stack' will not fit in region `ilmb_cntlr_dlmb_cntlr'
と記載があります。スタックが大きいのかなと思い、減らしてみます。srcディレクトリの中にあるリンカスクリプトlscript.ldをダブルクリックで開き、Stack SizeとHeap Sizeがそれぞれ0x400(1024 bytes)となっているところを0x200に減らします。lscript.ldの変更を保存すると、再度コンパイルが行われ、今度は成功します。Console中のmb-Sizeの出力を見ると、dec 3598 bytesとなっていて、4KBに収まっていることが分かります。逆に、先ほどはbssがさらに1024 bytes大きかったはずなので、確かに4KBに収まっていなかったことが分かります。

デフォルトで記述されているプログラムは、標準出力にHello Worldと出力するプログラムです。標準入出力は、SDK側でUARTの送受信に結びつけられています。stdio.hがインクルードされているので、C言語の標準ライブラリのルーチンが使えると思われますが、あっという間にプログラムのサイズが4KBを超えてしまうので、ここは直接レジスタの値を操作して、簡単なシリアルの読み書きを行ってみます。

I/O Moduleのドキュメントから、アドレス0x80000008の1ビット目がシリアル受信完了、アドレス0x80000000の下8ビットがシリアル受信したデータ(UART_RX)、アドレス0x80000004の下8ビットがシリアル送信するデータ(UART_TX)と分かります。UART_RXは、読み込むだけでシリアル受信完了フラグが解除されるようです。そこで、シリアル受信完了をポーリングし、受信できていたらUART_RXをそのままUART_TXにエコーバックするプログラムを作成してみます。合間に、適当にGPO1(0x80000010)の1ビット目をON/OFFします。あと、レジスタは一応32ビット幅なので、上記のレジスタはvolatile int*として扱って、読み書きをします。作成したプログラムのコードを下記に示します。


保存するとmb-gccが走り、ELFファイルが生成されます。これでソフトウェアの用意ができました。

FPGAボードへの書き込み時は、Xilinx Tools→Configure JTAG SettingsでXilinx Parallel III Cableを明示的に選びます。PortにLPT1とありますが、そのまま変更無しでOKでした。(自動で/dev/parport0に置き換えられる?) JTAG Device Chainは自動認識のままでOKです。その後、Xilinx Tool→Program FPGAを選択するとダイアログが開き、書き込むファイルを選択します。bitstreamとbmmファイルは、先ほど選択したファイルがsystem...とリネームされて入っているので、そのままにします。
Software Configurationは、生成したelfファイルを選択します。デバッガが使えないので、bootloopを書き込み→後でソフトウェアをデバッグ実行、という手順は使えません。
Programボタンを押すと、elfcheckやdata2memが走り、downlaod.bitを作成した後、コンフィグレーションが実行されます。BMMファイルの選択が間違っていると、ここでエラーが発生します。無事にできていれば、プログレスバーが最大になったところで、回路とソフトウェアが動作するはずです。

各種設定を適切に合わせたターミナルソフトを開いておくと、回路が動作開始したときにHello Worldと文字が表示され、以降、ターミナルに何か入力すると、それがエコーバックされるはずです。同時に、人間が感知できる速さでLED1が点滅し、リセットボタンに割り当てたSW4を押すと、押している間は動作が停止し、離した瞬間に再度Hello Worldが表示されるはずです。

これで、「FPGAボードで学ぶVerilog HDL」の付属FPGAボードで、ソフトプロセッサMicroBlaze MCSの動作が確認できました。ただ、色々やろうとすると、やはりリソースが足りない気はします。そろそろこのボードは卒業して、新しいFPGAボードで遊ぶのが良いのかもしれません。

5月5日15時12分
fartrip
コメント(0) 

2024年の今、「FPGAボードで学ぶVerilog HDL」のXilinx Spartan-3Eで遊ぶ (2) シリアル通信 [電子工作・プログラミング]

前回の環境構築で本の内容ができるようになり、LEDと7セグで遊ぶのにも、いい加減お腹一杯という感じになってきました。
そのとき、書籍の付録Dを見ていると、オプションとしてシリアル・ポート (CN6) が用意されていることに気が付きました。本文中には一言も触れられていないのですが、ロジックレベルとRS-232C信号のレベルを変換するIC (SP3222EHCY) が既に実装されており、コネクタさえ自前ではんだ付けすれば、PCなどのRS-232Cに対応するデバイスと通信することができます。
これもまた運良く、僕の使用しているPCには、マザーボード上にピンヘッダとして、シリアル通信ポートが1つ用意されています。そこで、PC側のシリアル通信ポートを引き出し、FPGAボードとの通信を試みました。

部品の入手とはんだ付けを自前で行うべきFPGAボード側のコネクタ、実は推奨の型番についてエラッタが出ています。正しくはオムロンの「XM3B-0922-112」が推奨とのことです。

某電子部品パーツショップのネット注文でさくっと入手し、はんだ付けしました。ついでに、20ピンのピンヘッダ(HD1)と、+5V電源の端子台(CN2)も付けました。外部クロックの入力まではやらないつもりで、SMAコネクタ(HD2)は無しにしました。PROM(U2)も、もはや推奨品は入手が困難そうなので諦めました。

回路記述の方ですが、本文中に一言も触れられていないながら、制約ファイル例には、シリアルポート関連の信号がひっそりと記載されています。(例えばリスト2-2)
NET "TxD" LOC = "P83";
NET "RxD" LOC = "P79";
TxDがFPGAからの出力、RxDがFPGAへの入力です。付録Dの回路図を見ても、確かにそのように結線されています。これらの信号を用いた、テスト用の回路を作成します。

最初に、練習ということで、1文字8ビットのUART送信モジュール(serial_send.v)を作成しました。ACRiの関連のページ(シリアル通信で Hello, FPGA (2))を参考にしながら、ISEに合わせて、Verilogで改めて記述します。



送信モジュールserial_sendは、WEが立ったら8bitのDATA_INをラッチし、UARTで送信します。送信が完了するまで、BUSYを立てます。トップモジュール(コード省略)は、FPGAボードのスイッチが押されたら、適当なデータを送信モジュールに送り、WEを立ててすぐ下げます。

テストベンチによるシミュレーションでUARTの動作を目視で確認しつつ、実機でコンフィグレーションして、PCに接続して動作を見てみます。シリアル通信ソフトで19200bps、データ8bit、パリティ無し、フロー制御無しに設定して、COM1を開いて、FPGAボードのスイッチを押してみます。

動いた!

ので、続いて受信モジュール(serial_recv.v)も作成します。



受信モジュールは、Rxが0になったのを検知したら、ビットレート19200 bpsの半分だけ待ってからその時のRxの値(スタートビットなので必ずゼロのはず)を読み取ります。
続けて、ビットレートの分待ってRxの値を読み取っていき、8bitのDATAとしてまとめて出力します。
受信完了時には、1クロックだけVALIDを立てて、完了を知らせます。
トップモジュールは、PCから送信されたデータをDATAとして受け取りつつ、PCにはDATAをエコーバックする回路とします。送信モジュールは既にできているので、受信モジュールからのDATAとVALIDをそのまま送信モジュールに渡すだけで、エコーバックの回路は作成できます。可視化のために、受け取ったDATAは、書籍の内容で既にお腹一杯遊んだ7セグにも出力します。(コード省略)

改めてシミュレーションでUARTの動作を確認しつつ、実機でコンフィグレーションして、PCに接続して動作を見てみます。シリアル通信ソフトで19200bps、データ8bit、パリティ無し、フロー制御無しに設定して、COM1を開いて、適当にキーボードを押下してみます。

動いた!

これで、FPGAボードがPCとお話しできるようになりました。

5月2日8時48分
fartrip
コメント(0) 

2024年の今、「FPGAボードで学ぶVerilog HDL」のXilinx Spartan-3Eで遊ぶ (1) 環境構築 [電子工作・プログラミング]

もう15年ほど積んでしまっていた、「FPGAボードで学ぶVerilog HDL」(2007年、CQ出版) のFPGAボードで遊んでみようと思い立ちました。ただ、同書に収録されているISE 8.2は32 bitのWindows XPの頃のアプリケーションなので、現在のWindows 10機に入る気がしません。そこで、改めてAMD社のページから開発環境を調べてみました。

すると、ISE 14.7が、windows 10にも対応しているとのこと。下記のページも参考にしながら、AMDのユーザ登録もしつつ、インストールしてみました。無償で有難いです。

(AMD社ページ) Windows 10 用 ISE Design Suite - 14.7 (2020/02/20)

【回路設計ヒント】Microsoft Windows 10 でのiMPACT書き込み

最初に、インストールガイドもしっかり読んで、VirtualBoxのバージョン5.2.34をインストールします。入れていないと、エラーが出てISEをインストールできないのですが、その時のメッセージは文字化けしていて、何の情報も得られません...

インストールに成功すると、デスクトップにいくつかアイコンが生成されます。「Project Navigator」を実行すると、VirtualBox上で64 bitのOracle Linux 6.4の仮想マシンが起動し、ISE 14.7一式が使用できます。
ちなみに、ユーザ名はise、パスワードはxilinxで、パスワードを変更すると、デスクトップ上のショートカットはうまく動作しなくなります。このあたりの設定は、ショートカットの参照先 (インストール先ディレクトリ\Xilinx\14.7_VM\bin\app_launcher.bat) を見ると、何となくですが分かります。他の開発用ソフトウェアもインストールされているので、適切に環境変数を通せば、Oracle Linux内のターミナルから実行できます。sshで入ることもできます。

ところで、本書同梱のFPGAボードは、パラレルケーブルでPCと接続し、コンフィグレーションを行います。そのため、PC側のパラレルポートを、仮想マシンにマウントする必要があります。
運よく(!)僕が現在使用しているPC (Windows 10) は、マザーボード上にパラレルポートを装備していますので、ハードウェアとしては別途用意は不要でした。以前にパラレルポートのことを調べたとき、VirtualBoxでマウントする方法は分からなかったのですが、実は可能なようです。

LPTポートをVirtualBoxで使用する方法

VirtualBoxのマニュアル

`VBoxManage modifyvm`コマンドで、`--lptmode1 ...`と`--lpt1 ...`を使うようです。今回使用したPCはMB上にパラレルポートがありますので、参考にしたページと同様、`--lptmode1`に与えるパラレルポート名は`LPT1`、`--lpt1`に与えるアドレスは`0x378`で動きました。(PCIeなどで拡張したパラレルポートだと異なるかもしれませんが、未確認)
設定した後に仮想マシンを起動し、Oracle Linux側のターミナルから、`ls /dev`を実行すると、確かに`/dev/parport0`が存在しています。(うまくできていないときに、parport0が存在しないかは未確認ですが…)

これで開発環境の準備ができたので、ISEを起動し、本の通りにプロジェクトを作成します。新規プロジェクト作成の際に、本には記載のない項目もありますが、それはデフォルト値のままにして進めます。

書籍P18 図2-4 の、led_onoff.v をトップモジュールにする回路を合成すると、WARNING:Security:42 - Your software subscription period has lapsed.とか出ますが、無視して進めます。無事にビットストリームまで出力できます。また、その後の内容で、クロックCLK_Iを使う回路をImplementしようとすると、下記のエラーが発生し、Implement Designが失敗します。

ERROR:Place:1018 - A clock IOB / clock component pair have been found that are not placed at an optimal clock IOB / clock site pair. (後略)

(後略)した部分を読むと、本ボードがクロック入力として使用している端子P63は、IOとクロックの間の速いパスとして使うのは良くないとのことです。メッセージの最後に、
NET "CLK_I" CLOCK_DEDICATED_ROUTE = FALSE;
を.ucfファイルに記載すると、このエラーを警告に落とせる旨が書いてありました。ISE 8.2の頃は、上記はエラーにまではなっていなかったと思われます。ボードの設計はもちろん変えられないので、素直に上記をucfファイルに記載すると、無事にビットストリームの出力まで進められます。

ビットストリームが得られたら、iMPACTを起動します。起動後にプロジェクトを作るか聞かれますが、適当に答えます。
メニューバーの「View→Tabs→iMPACT Flows」で表示されるウィンドウのツリーのアイコン「Boundary Scan」をダブルクリックします。出てきたウィンドウで右クリックし、コンテキストメニューの「Cable Setup...」を選択します。
本書同梱のボードの書き込み回路はParallel Cable III相当です。「Communication Mode」はParallel Cable IIIを、「Port」はparport0を選びます。「Cable Location」はLocalを選び、「Cable Plug-in」のチェックボックスは外し、「OK」で設定ダイアログを閉じます。
再度ウィンドウで右クリックし、「Initialize Chain」を選びます。ウィンドウに青枠の文字で「Identify Succeeded」と表示されれば、認識成功です。
「Assign configuration files」のダイアログにYesと答え、コンフィグレーション用のbitファイルを選択します。「Attach SPI or BPI PROM」を聞かれますが、Noを選択します。その後、「Device Programming Properties」を聞かれますが、何も変更せずに「OK」で閉じます。その後、ウィンドウ内のFPGAのアイコンを右クリックし、「Program」でコンフィグレーションを実行します。30秒~1分ほどでプログレスバーがいっぱいになり、青枠の文字でProgram Succeededと表示されます。作成した回路が動き始めているはずです。

ここまでが、書籍の2.1.8節までの内容に相当します。以降は、書籍の内容に従って進められるはずです。
時代が進んでいるためか、セーブの度に簡単なシンタックスチェックを行ってくれて便利です。ただ、仮想環境上のLinuxでは、キーボードが英語として認識されてしまい、慣れていないと記号のタイピングが面倒です。OSのバージョンが古いので、気軽に色々入れたりしづらいのですが、VirtualBoxの機能でホスト側のフォルダのマウントは可能なので、ホスト側で現代的なエディタを使うのが良い気がします。

これで、環境構築としては完了です。Spartan-3Eは、規模は小さく、レガシーなFPGAですが、基礎的な学習用途として、遊んでみたいと思います。

2024年4月28日22時18分
fartrip
コメント(0) 

最近のLinux(RHEL9)でWindows XPのファイル共有にアクセスする [電子工作・プログラミング]

仮想マシン (virshによるlibvirt経由のKVM) のWindows XPを、Red Hat Enterprise Linux 9.3で初めて使ったところ、ホストとのWindowsファイル共有が中々できなくて困りました。ポイントは、Windows XPはファイル共有プロトコルがSMB1なことだったようで、以下でLinuxホストからWindows XPクライアントの共有ファイルにアクセスできました。
 $ smbclient --option='client min protocol=NT1' -U ユーザ名 //仮想マシンのアドレス/共有フォルダ名
もしくは、
 /etc/samba/smb.confに "client min protocol = NT1" を追記し、Nautilusの「他の場所」からマウント操作
もしくは、
 # mount -t cifs -o vers=1.0,user=ユーザ名 //仮想マシンのアドレス/共有フォルダ名 マウントポイント

いろいろやったので、本当にこれだけで済むかは分かりませんが、とりあえずメモしておきます。
ちなみに、smbclientのバージョンは4.18.6でした。

2024年2月14日21時31分
fartrip
コメント(0) 

Raspberry Pi OSで無線LANで固定IP接続にしたい [電子工作・プログラミング]

Raspberry Pi関係はWebにたくさん記事があるのですが、過去のバージョンの情報だったりして、中々思う通りに行かないこともあります。さらに、ネットワーク関係のことは、僕の理解の足りなさもあって、どうすれば良いか、結構調べる必要がありました。ので、備忘録としてSDカード作成から書いておきます。

1. Raspberry Pi OSの公式ページの"Manually install an operating system image"から、Raspberry Pi OS Liteをダウンロードする。December 11th 2023版、32-bit、Kernel version: 6.1、Debian version: 12 (bookworm)だった。
2. `dd if=ダウンロードしたimageファイル of=/dev/mmcblk0 bs=1M`で普通にSDカードにイメージを書き込み
3. Raspberry Pi (今回は3A+を使用) にディスプレイ、キーボード、電源を接続して起動。普通にインストールを進める
4. ターミナルでコマンドが打てるようになったら、`sudo raspi-config`でひとしきりの設定をする。特に、5 Location Optionsで、L4 WLAN Countryの設定をする。1 System Optionsから、無線LANのSSIDの設定をする。
5. /etc/NetworkManager/system-connections/SSIDから付けられているID名.nmconnectionを修正する。
6.`sudo nmcli connection reload && sudo nmcli connection up SSIDから付けられているID`で設定ファイルのリロード・更新

以上で何とかできました。5.と6.については、https://raspida.com/nmcli-static-ipaddressを参照し、「Raspberry PiのWi-Fi設定は、新しいbookwormからNetworkManagerになりました」とのこと。世の古い記事では、`/etc/dhcpcd.conf`を編集する旨あるのですが、最新の版のOSでは、そもそもそのファイルが無かったです。

12月16日17時11分
fartrip

コメント(0) 

ヘッドレスのLinux機でGUIを使う [電子工作・プログラミング]

先日、ずっと使っていたPC(CentOS 7)のPCI-Expressが全て故障し、ビデオカードからの出力ができなくなりました。そのため、強制的にヘッドレス機として運用することになり、GUIが必要な作業はtigervncで行っているのですが、CUI環境からでもGUIを要するプログラムを実行する方法として、Xvfb(https://www.x.org/releases/X11R7.6/doc/man/man1/Xvfb.1.xhtml)があることを知ったので、備忘録としてメモします。xvfb-run 一発で実行できるので、良い感じです。

12月30日19時50分
fartrip
コメント(0) 

Windowsでファイル名に(1)のついた大量のファイルから、(1)を外すコマンド [電子工作・プログラミング]

もう少し正確には、「DSC_xxxx (1).JPG」のように、数字だけで決まる単純なフォーマット+" (1)"のファイルが『大量』にあるときに、(1)を外すことを、コマンドプロンプトで行う方法です。僕が必要となったシーンは単純で、デジカメで撮像した大量のファイルを誤ってコピーした際、勝手にリネームされたような場合でした。

【方法(例)】コマンドプロンプトで、以下のコマンドを実行する:
 FOR /L %s IN (150, 1, 850) DO move "DSC_0%s (1).JPG" "DSC_0%s.JPG"

Windowsのコマンドプロンプトの「FOR」コマンドの/Lスイッチを利用して、変数%sに150から850まで、1刻みのテキストを代入し、DO以下のコマンドを実行します。ここでは、(1)付きのファイル名から(1)無しのファイル名にmoveしています。いま、ファイル名にスペースを含むので、ファイル名を二重引用符で囲っています。

いま、ファイル名を決め打ちしているので、1つの命名規則のファイルにしか対応していません。色々な命名規則には対応できない一方、ファイル名を解析してリネームする方法と違って、万一コマンドを間違えたりしても、存在しないファイルをリネームしようとするだけなので、被害が起きにくい利点もあります。

今回のファイルの命名規則は「DSC_xxxx.JPG」のように4桁で、1000以下の数に対しては0埋めされるようになっています。ただ、今回対象の数字は150から850と3桁なので、4桁目を0埋めする必要があります。コマンドプロンプトのバッチの奥義には適切に0埋めする技もあると思うのですが、ここでは単純に"0%s" とすることで、"0150"などの4桁の数字を得ています。

DO以降のコマンドは任意なので、例えば"echo" を実行することで、ファイル名の展開に関する事前のテストが可能ですし、他のコマンドでも何か使いでがある場合があるかもしれません。

8月8日9時55分
fartrip



コメント(0) 

3次元のMaxwell方程式(周波数定常)を有限要素法で解きたくて調べたメモ [電子工作・プログラミング]

3次元のMaxwell方程式(周波数定常)を有限要素法で解きたくて調べたメモ

弱形式
∫( (α∇×E)・(∇×F) - βE・F)dV - ∫(α∇×E)・n dS=∫ f・F dV
但し、α=1/μ、β=εω^2、nは領域外周の外向きのベクトル、fはソース項、Eは電界ベクトル、Fは試行関数ベクトル

離散化
・分割された要素内において、電界ベクトルEを形状関数Niと自由度eiを用いて
E = (N1, N2, ...)・(e1, e2, ...)^T と近似する。

形状関数
・Nedelecエッジ要素 (curl-conforming element) を用いる
・一般の形状を考えるのは大変なので、まず簡単な形状のリファレンス要素で考える。その後、座標変換して望みの形状の要素に対する形状関数を得る

Nedelecエッジ要素の具体的な形
・1次要素は、1辺に1自由度を持つ。簡単な四面体のリファレンス要素(頂点がp0=(0,0,0), p1=(1,0,0), p2=(0,1,0), p3=(0,0,1))のとき、形状関数をηijとすると
η01 = (1-y-z, x, x), η02 = (y, 1-x-z, y), η03 = (z, z, 1-x-y)
η12 = (-y, x, 0), η23 = (0, -z, y), η31 = (z, 0, -x)
確かに全てdivを取ると0になる。また、体積座標λiを用いて、ηij = λi∇λj - λj∇λi とも書ける。

・2次以上の高次要素は簡単には書き下せない。代わりに、別の基底ベクトルの組{φ_j}を考え、各辺・面・領域に対応する自由度に対する条件を満たすよう係数u_jを決め、形状関数η_i=Σu_ij φ_jを求める。四面体に対する2次要素の自由度数は、各辺2自由度、各面2自由度の計20。詳細は文献[1]など参照だが、調べ中。

座標変換
・リファレンス要素における3次元座標をξ、望みの四面体要素における3次元座標をxとするとき、リファレンス要素から望みの四面体要素へのアフィン変換Fは
x = F(ξ) = Bk ξ + bk, 但しBkは3x3の行列、bkは3次元ベクトル
となる。四面体要素の頂点の3次元座標をa0, a1, a2, a3とすると、Bk = (a1-a0, a2-a0, a3-a0)、bk=a0 となる。
・形状関数はベクトルなので、リファレンス要素から座標変換するときにはPiola変換が必要になる。リファレンス要素における形状関数をη(ξ)、望みの四面体要素の形状関数をN(x)とすると
N(x) = (Bk^T)^-1 η(F^-1(x))
となる。
・curlに関する座標変換は
∇×N(x) = 1/det(Bk) Bk ∇×η(F^-1(x))

係数行列の作成
・質量行列 Mij = ∫Ni・Nj dx
・剛性行列 Kij = ∫(∇×Ni)・(∇×Nj) dx
・エッジの向きがあるため、自由度eiにも向きがある。リファレンス要素のエッジの向きと自由度として保持するエッジの向きが逆のときは負号をつける

積分関連
・∫dx = |det(Bk)|∫dξ
・ガウス積分で求める。正確に積分される多項式の次数を2とすると、
三角形:頂点(0,0), (1,0), (0,1)のとき、積分点は(1/2, 0), (0, 1/2), (1/2, 1/2)の3つで、重みは全て1/3×三角形の面積1/2。
四面体:頂点(0,0,0), (1,0,0), (0,1,0), (0,0,1)のとき、積分点は(α, β, β, β), (β, α, β, β), (β, β, α, β), (β, β, β, α)の4つで、重みは全て1/4×四面体の体積1/6。但し、α=0.58541020, β=0.13819660

参考文献
[1] M. Olm, S. Badia and A. F. Martin, Adv. Eng. Softw. 132, 74-91 (2019)
[2] I. Anjam and J. Valdman, Comput. Appl. Math. 267, 252-263 (2015)
[3] Peter Monk, "Finite Element Methods for Maxwell's Equations", Oxford Science Publications, 2003
[4] 小柴正則, 光・波動のための有限要素法の基礎, 森北出版, 1990

間違いなどあればぜひ教えてほしいです。

5月7日23時57分
fartrip

コメント(0) 

CentOS 7のqemu-kvmでパラレルポートが使えない [電子工作・プログラミング]

数年ぶりにvitr-managerから仮想マシンでパラレルポート (ホストのPCIe増設パラレルポートの /dev/parport0 に接続) を使おうと思ったら、" 'isa-parallel' is not a valid device model name "のエラーが出て、起動できませんでした。調べると、CentOS7のqemu-kvmではパラレルポートのサポートが無効化されているようで:https://bugzilla.redhat.com/show_bug.cgi?id=1174145

代わりに入れると良いパッケージもあるようですが、中々上手く行かなかったので、qemuを手元でビルドして使うことにしました。どのページを参考にしたか失念したのですが、qemu-4.2.0.tar.xzをダウンロード・展開して、特別な設定無しにconfigure、make installしてできたqemuを使ったら、パラレルポートを使って無事起動し、仮想マシン内のアプリケーション (パラレルポートのI/Oアドレス0x378を仮定) から正常に動作しました。

・設定したconfigureオプションは'./configure --target-list=x86_64-softmmu --enable-kvm --enable-spice --prefix=/home/user/to/install'
・途中で足りないと言われたdevelパッケージはyumで入れる
・virt-managerで設定した仮想マシンに、手元でビルドして出来たバイナリ 'qemu-system-x86_64' を使うよう設定する方法として、virshを使った。'virsh edit 仮想マシン名' とするとviが起動するので、<emulator>タグにqemu-system-x86_64 のフルパスを入れる。また、<type>タグのmachine属性にチップセットの種類を入れるが、OS付属のqemu-kvmで対応しているmachine( 'pc-i440fx-rhel7.6.0' など)と手元でビルドしたqemuが対応するmachineは違うので、'qemu-system-x86_64 -machine help' で調べるか、単に 'pc' を入力する。
・手元の環境のCentOSのバージョンは7.9.2009だった。

11月30日24時5分
fartrip

2023年5月5日追記
qemuでのコマンドラインオプションは次の通り:
 -parallel /dev/parport0
もしくは、virt-managerが生成したものに沿って:
 -chardev parallel,id=charparallel0,path=/dev/parport0 -device '{"driver":"isa-parallel","chardev":"charparallel0","id":"parallel0"}'
いずれも、qemu 7.2.1のqemu-system-x86_64で動作確認。
コメント(0) 

gmshで有限要素法用のメッシュを作るときのTips [電子工作・プログラミング]

昔は直方体一つ作るにも随分な作業量が必要で必要でしたが、ver.3からOpenCASCADE kernelが使えるようになり、boxコマンド一発で直方体が作れるようになりました。
GUIはSalomeなどの方が親切なようですが、いったん出来上がったモデルの寸法をコマンドラインから変えたりできてそれはそれで便利なので、gmshを少しだけ使ってみました。
そこで、使う上で便利(というかまともなユーザビリティを得るために必要)と思ったことをメモします。

☆いくつかの要素が一体に形成されたメッシュが欲しい
 → Box, Cylinderなどを配置した後、最後にCoherence; もしくはBooleanFragmentsを行う。
   今回使ってみようと思った動機であり、各要素の重なった面・領域で分割をしつつ重複した面を結合し、一体の結合した領域が得られる。

☆境界や領域の番号を見たい
 → Tools->Options->Geometry->Visibility->Surface labelsやCurve labelsのチェックをONにする。Label typeをElementary tagsにする。

☆境界番号の文字が小さくて見えない!
 → Tools->Options->General->Aspect->Default fontの値を大きくする

☆境界番号の文字の色が見えない!
 → Tools->Options->Geometry->Color の中の色を変更する。SurfaceやVolumesを変えたいことが多いと思う。

☆コンソールの文字が小さい!
 → 起動時、gmsh -fontsize 18などとする

☆立体をどの面からみているか分からなくなった
 → Tools->Options->General->Aspect->Projection mode をperspectiveにする

☆メッシュの向きを知りたい
 → メッシュ作成した後、Tools->Options->Mesh->Visibility->Normals and tangentsの値を大きくする

等々。気付いたら追記していきたいと思います。

11月15日21時37分
fartrip

コメント(0) 
前の10件 | - 電子工作・プログラミング ブログトップ