So-net無料ブログ作成
検索選択
前の10件 | -

ML110 G7 ESXi+OpenIndiana 追記 [PC]

前の記事では、ESXi 5.1.0U2+oi151a8で構成しましたが、問題が出てました。Windowsでファイル共有させ、大きめのファイルを転送すると止まる事がある、というものです。ネットワーク周りな感じです。

現在はESXi 5.0.0U3にしています。上記の問題も無く、PCIパススルーもちゃんと動いてます。やっぱりこの辺が一番安定しているようです。
導入方法は大体同じですが、ローカルストレージで追加したSATAカードを認識させるところで、ファイル名が異なります。
5.1では「/bootbank/sata_ahc.v00」ですが、
5.0では「/bootbank/sata-ahc.v00」です。
_と-が違います。

ESXiの外部データストアとしてRaspberryPiにNFSやらせ、ついでにファン制御もさせていましたが、データストアがローカルになったのでRaspberryPiも外しました。ファン制御は結局PICマイコンに任せてます。なんかず~っと遠回りしてスタート地点に戻ってきた感じですな(笑)NE555まで立ち戻ってはいないけど。
8ピンの12F683でデューティー比2~30%のPWM波形をソフトループで作ってるだけです。PWMの周波数が可聴域まで落ちてきましたが、コイル鳴きなどは無さそうです。
今後は温度センサとUSB-UART付けて回転数制御するかな~ぐらいは考えてますが、このままでも良いかも…(って思った時点で負けてるんですがw)

nwamdの大量エラーはVNCサーバー止めたらやみました。セキュリティがらみかその辺な感じですかね。ヒントは出たのでそのうち直せそうです。今はOIのVNCを止めてます。

Windowsのファイル共有をzfsのsharesmbにしていますが、ちょっと問題あるんですね。AndroidのESファイルエクスプローラーなどから見えないなど。SUNWsmbaでは普通に使えていたのでそっちに戻すかな~でもスナップショットが以前のバージョンから見えるのは便利だしな~で悩みどころ。

OpenIndiana設定メモ改 [PC]

改と言うほどでも無いですが、ESXi更新ついでにこちらも。
ちょっと変わったのでメモし直しです。

・「OpenIndiana 151a8 Desktop」にした(Xアプリが使いたくなった)。
・IP固定をnwamのままで行う(defaultにはしない)。
・zfsのsharesmbを使用(ACLがらみで敬遠してた)。
辺りが変更点です。

インストールは通常通り。isoをマウントしてブートすれば導入されます。DesktopにしてXが入ったことでサイズは増えてます。pkgなどのアップデート後は7~8GBほど消費します。ESXiの仮想ディスクをちょっと多めに作ります。

IPv4アドレスを固定にします。
# nwamcfg
nwamcfg> list
NCPs:
        Automatic
Locations:
        Automatic
        NoNet
        User
nwamcfg> select ncp Automatic		Automaticを選択
nwamcfg:ncp:Automatic> list
NCUs:
        phys    e1000g0
        ip      e1000g0
nwamcfg:ncp:Automatic> select ncu ip e1000g0	e1000g0のIPを選択
nwamcfg:ncp:Automatic:ncu:e1000g0> list
ncu:e1000g0
        type                    interface
        class                   ip
        parent                  "Automatic"
        enabled                 true
        ip-version              ipv4,ipv6
        ipv4-addrsrc            dhcp
        ipv6-addrsrc            dhcp,autoconf
nwamcfg:ncp:Automatic:ncu:e1000g0> walkprop	変更開始
enabled (true) [true|false]>
ip-version (ipv4,ipv6) [ipv4|ipv6]>
ipv4-addrsrc (dhcp) [dhcp|static]> static	固定
ipv4-addr> 192.168.0.11				自機アドレス
ipv4-default-route> 192.168.0.1			デフォルトルート
ipv6-addrsrc (dhcp,autoconf) [dhcp|autoconf|static]>
ipv6-default-route>
nwamcfg:ncp:Automatic:ncu:e1000g0> list
ncu:e1000g0
        type                    interface
        class                   ip
        parent                  "Automatic"
        enabled                 true
        ip-version              ipv4,ipv6
        ipv4-addrsrc            static
        ipv4-addr               "192.168.0.11"
        ipv4-default-route      "192.168.0.1"
        ipv6-addrsrc            dhcp,autoconf
nwamcfg:ncp:Automatic:ncu:e1000g0> commit	変更を反映
「walkprop」で編集する時は変更が必要な項目だけ入力します。「commit」すると即アドレスが変更されるので、SSHなどで入っていた時は切断されます。再度接続してDNSを編集します。
# nwamcfg
nwamcfg> list
NCPs:
        Automatic
Locations:
        Automatic
        NoNet
        User
nwamcfg> select loc Automatic		Automaticを選択
nwamcfg:loc:Automatic> list
loc:Automatic
        activation-mode                 system
        enabled                         false
        nameservices                    dns
        nameservices-config-file        "/etc/nsswitch.dns"
        dns-nameservice-configsrc       dhcp
nwamcfg:loc:Automatic> walkprop		変更開始
activation-mode (system) [manual|conditional-any|conditional-all]>
enabled (false) [true|false]>
nameservices (dns) [dns|files|nis|ldap]>
nameservices-config-file ("/etc/nsswitch.dns")>
dns-nameservice-configsrc (dhcp) [manual|dhcp]> manual	マニュアルに
dns-nameservice-domain>
dns-nameservice-servers> 192.168.0.1		DNSサーバーアドレス(ルーター)
dns-nameservice-search>
nfsv4-domain>
ipfilter-config-file>
ipfilter-v6-config-file>
ipnat-config-file>
ippool-config-file>
ike-config-file>
ipsecpolicy-config-file>
nwamcfg:loc:Automatic> list
loc:Automatic
        activation-mode                 system
        enabled                         false
        nameservices                    dns
        nameservices-config-file        "/etc/nsswitch.dns"
        dns-nameservice-configsrc       manual
        dns-nameservice-servers         "192.168.0.1"
nwamcfg:loc:Automatic> commit	変更を反映
Committed changes
同じく「walkprop」で変更していきます。
終わったらpingやpkgを動かして設定が正しいか試します。
※現時点でpkg update, pkg image-updateを行うと、GNOMEのデスクトップがおかしくなります。私は元に戻しました。

追記:nwamdで大量エラー
nwamdで以下のエラーが大量に出てました。
nwamd[75]: [ID 234669 daemon.error] 3: nwamd_door_switch
: need solaris.network.autoconf.read for request type 1
検索してもいまいち意味がわかりませんでした。仕方ないので保留、physical:nwamを止めてphysical:defaultを使います。
前の設定方法

vncを有効にする。151a8デスクトップ版ではインストール済みなので設定だけです。
# vi /etc/gdm/custom.conf

[security]
DisallowTCP=false

[xdmcp]
Enable=true

# svcadm enable xvnc-inetd
# svcadm restart gdm

# svcs | grep xvnc
online         12:01:50 svc:/application/x11/xvnc-inetd:default
これでつながりますが、vncクライアントを終了させるとログインセッション以下、全て終了されてしまいます。
# svccfg -s xvnc-inetd
svc:/application/x11/xvnc-inetd> editprop
viが立ち上がるので、以下を編集、保存。
setprop inetd/wait = boolean: true

svc:/application/x11/xvnc-inetd> exit
# svcadm restart xvnc-inetd
この設定でvncを閉じてもログインセッションが維持されます。ただし、立ち上げっぱなしだとパスワード無しでいきなりつながるので、セキュリティ上は大問題でしょう。なにか設定はあると思いますが、今のところこのまま。

ユーザーの追加。
# useradd -u 1001 -g family -d /export/home/daresore -s /bin/bash -m daresore
# usermod -R root daresore		su可能にする場合

smb/cifsの設定。smbとcifsの違いとか、認証のルールとか正直よくわからんが動いてます。
pamの設定。
vi /etc/pam.conf
other password required pam_smb_passwd.so.1 nowarn
パスワードを与える。ユーザー毎に繰り返します。
# passwd daresore
New Password:
Re-enter new Password:
passwd: password successfully changed for daresore
ワークグループへ参加。
# smbadm join -w workgroup
After joining workgroupthe smb service will be restarted automatically.
Would you like to continue? [no]: yes
Successfully joined workgroup
zfsのプロパティを変更して公開。
# zfs sharesmb=name=daresore rpool/export/home/daresore
これでまずは公開され、Windowsから見えます。

アクセス権限のところでACLが出てきて、自分には高度すぎて面倒なんですが、とりあえず
# chmod -R A=owner@:rwxpdDaARWcCos:fd:allow daresore
# ls -V
drwx------+  9 daresore family        11 3月 18 02:47 daresore
                 owner@:rwxpdDaARWcCos:fd-----:allow

$ ls -l
./daresore : Permission denied	← 所有者とroot以外からは見えない。
と所有者に全権限継承有りを与えておくという手があります。まっ乱暴(笑)
ファイルに標準で実行権限が付くのが…という場合は
# chmod A=\
owner@:rw-pdDaARWcCos:f:allow,\
owner@:rwxpdDaARWcCos:d:allow \
daresore
とするとファイルから実行権限だけ落ちます。
共有フォルダとかに、所有者以外に権限を与える場合、
user:family1:rwxpdDaARWcCos:fd:allow,\
user:family2:rwxpdDaARWcCos:fd:allow
のようにユーザ指定で個別に権限付けるとか。
もちろん普通にowner,group,everyoneで権限切り分けることもできます。
けど家族数人とかなら個別に権限を管理してもそんなに手間では無いと思います。単純でわかりやすい気がするので自分はこちらでやってます。

NFSの場合はsharenfsをonにすればOKです。簡単。
iscsiはちょっと作業が必要です。

まずはファイル共有サーバーとしては動き出しました。sharesmbで共有してると、zfsで取ったスナップショットが、Windowsからはファイルのプロパティ、以前のバージョン、でアクセスできて便利です。

# cp /usr/lib/vmware-tools/configurator/X
Free86-3/XF86Config /usr/lib/vmware-tools/configurator/XFree86-3/XF86_VMware

ML110 G7 ESXi導入改 [PC]

しばらく安定してましたが、機械の中の掃除(物理)を行うついでにちょっと構成変えてみます。

ESXi 5.5(U1含む)へのバージョンアップも試してみたのですが、SATAコントローラー(Intel Cougar)のPCIパススルーで問題が起きました。ESXiの設定からは一見パススルーできているように見えるのですが、ゲストからは謎のI/Oとされてしまいます。
Image 001.pngゲストのOIから見るとこんな感じ。
どうやらIOMMU周りに問題があるようで、VMwareでは「HPの最新ファームウェアを使うこと」的な記述が見えます。最新がどのバージョンなのかはわかりませんが。
現在の自機のファームウェアは
・System ROMが「07/01/2013」
・iLO3が「Jan 09 2014、1.70 」
で、これは現在HPのダウンロードから入手可能なものと同じです。しかし、HPはファームウェアなどの無償公開を止めてしまったので(個人の安サーバーで年間保守契約は無いよ…)これからの更新は期待できません。

これで動くESXiを選ぶことになります。全部は面倒なので一部だけ。パッチには手を出してません。
2014-03-11 | 5.5.0 U1 ×
2013-09-22 | 5.5.0 ×
2014-01-16 | 5.1.0 U2 ○
2013-04-25 | 5.1.0 U1 ×
上から試していってここまでです。ネットの情報を見ると、PCIパススルーは5.0の方がうまく動くという報告が多いみたいです。今回はとりあえず動いた5.1.0U2で行ってみます。インストール先はUSBメモリです。
※iLOが1.5の時は5.1.0U1が動いていた、ような気がする(笑)

Raspberry piのNFSサーバーをやめて、SATAボードを追加し、ローカルストレージに変更します。こちらの方が速くて安定するので…追加したSATAボードはこちら。


Asmediaチップです。wiki見るとMarvellとかの動作報告もありますね。
IntelのSATAコントローラーをパススルーさせるとSATAのドライバーが消えて、このボードもESXiから見えなくなります。ドライバとチップの対応テーブルを編集してSATAボードとして認識させます。手順はこちらのページの通りです。感謝。
クソゲ〜製作所
作業は全てESXiのSSHコンソールです。
デバイスのIDを調べます。
# lspci -v
0000:0d:00.0 SATA controller Mass storage controller: ASMedia Technology Inc. ASM1062 Serial ATA Controller
         Class 0106: 1b21:0612
「1b21:0612」が必要な値です。
SATAのテーブルがあるファイルを展開します。
/tmp # mkdir work
/tmp # cd work/
/tmp/work # vmtar -x /bootbank/sata_ahc.v00 -o sata-ahc.tar
/tmp/work # tar xvf sata-ahc.tar
/tmp/work # rm sata-ahc.tar
マップに1行追加。
/tmp/work # vi etc/vmware/driver.map.d/ahci.map

regtype=linux,bus=pci,id=1b21:0612 0000:0000,driver=ahci,class=storage
名前も追加。インデントはtabでした。
/tmp/work # vi usr/share/hwdata/driver.pciids.d/ahci.ids

1b21 ASMedia Technology Inc.
	0612  ASM1062 Serial ATA Controller
再アーカイブして保存。
/tmp/work # tar cvf sata-ahc.tar etc usr
/tmp/work # vmtar -c sata-ahc.tar -o sata-ahc.vgz
/tmp/work # mv sata-ahc.vgz /bootbank/sata_ahc.v00

再起動でデータストアが使えます。Intel CougarはパススルーしてOpenIndianaに渡します。
ちなみに、OIネイティブから、上記SATAボード+ちょっと古い64GB SSD(データストア)を追加して仮想化した事による消費電力のオーバーヘッドは+8Wぐらいでした。追加したハードウェア以上に増えているのは若干の処理増加分があるんでしょう。でも+8WでPCが複数台まとめられた、と考えるとお得だと思います。

FlashAir + FAX (小ネタ)

久々ですがちょっとした小ネタなど。
FlashAir買いました。


本来の目的のデジカメに使うためですが、その前にちょっとSDHCカード対応のFAXに差し込んでみました。機種はPanasonicのおたくっすシリーズ。
事前に、こちらのページ(東芝)に従い、自分のSSIDの他、家のSSIDとパスワードを設定しておきました。FlashAirにワイヤレスで接続せずに、家のアクセスポイント経由でアクセスするとどうなるのかちと不明だったんですが、結論から言うと家のネットワークからアクセス可能でした。変なアクセス制限とかはかけてないみたいです。
FlashAir差し込んで、しばらくすると家のアクセスポイントにつながり、DHCPでアドレスもらってきます。同じネットワークの機器(有線でもOK)からブラウザでそのアドレスにアクセスすると、通常通りFlashAirの中身が見えます。このFAXではJPGで保存されてました。

これでFAXをネットワーク経由のPCで見られるようになりました。便利♪
インクリボンもったいないし、毎回印刷するほどの必要性もないし、あまり頻度は高くないのでFAXをネットワーク対応のものに買い換えるほどじゃないし、どうするかな~って思ってたんですが、これでも良いかな?小容量の買ってFAX専用にしてしまうのも。
ちょっと気になったのは消費電力が+2~3W増えたこと。このカードサイズで常に2W喰ってたら熱々になりそうなので、本体側が増えたんだとは思いますが。

最後のSONY製品

オーディオでちょっと思い出したので…

昔はSONY製品好きで、何かと買っていました。Walkmanシリーズはもちろん、MD関連とかグラストロンとか。VAIOも使ってたな~
SONY「だから」買ってみるか、みたいな所もありました。そしてこの製品。
MDR-DS5100
ホームシアターとかワイヤレスヘッドフォンなんてのが盛り上がった頃の高機能機種として出てきた製品です。気になってやっぱり入手してみました。

ところが

とりあえず光ケーブルでCDをつないでみたところ、アタックの入るところやsやthなどの摩擦音が入るとAGC(自動ゲイン調整)が強烈に入り、音量がばたばたしてとても聴いてて気持ち悪い製品でした。AGCが効くとサッと音量が下がり、数秒かけてゆっくり上がるというのを繰り返します。
これ現象をSONYのサービスに質問したところ「最近のCDは音量を高めに録音しているのでそういった現象が出る」という回答。「ダイナミックレンジと録音レベルは違う話なのでは?また、CD初期の1985年頃の頃の録音でも出るので時期は関係ないのでは?」と返したら「すぐに対策品を送るので元の本体を送り返して欲しい」と来ました。こちらから送り返す前に「対策品」が到着します。
到着した「対策品」にはアッテネータースイッチが付いていて、D/A変換後のレベルを下げるという物でした。結果再生側の音量を上げることになり、ヒスノイズが酷いことになります。

これは色々な意味で残念でした。
・まずは適当な対応(録音レベルの話)で反応を見る
・納得すればそれまで
・食い下がってきた人には素直に「対策品」を送る
というマニュアルができていたと考えられます。
私が購入したのはほぼ製品発売直後だったので、「対策品」は最初から用意されていたと考えるのが自然です。リアパネルのプリント自体はシールでしたが、綺麗に穴は空いてるし、アッテネーターのスイッチは基板に付いてて、パターンも引かれてます。手半田でリワークした跡はあり、アッテネータを有効にする作業を行ったのが「対策品」のようです。
つまり最初からこの製品はダメだとわかっており、クレームが来た顧客向けに回答と「対策品」を用意しておき、製品発売に踏み込んだ、と想像されます。

ダメだとわかった時点で製品化を見送れなかったのか、ユーザはこの程度か、好きだっただけに結構ショックで(今でも覚えてるぐらいですしw)、これ以降SONYの製品に興味が無くなってしまいます。嫌いになるならまだ救いがあったんでしょうが、好き・嫌いとは真逆の感情、無関心、になってしまったわけです。

PlayStationとかSONYの製品を持ってないわけではありません。けど、SONY「だから」買った、のはこの製品が最後となってしまいました。ちょっとしか使いませんでしたが、なんか捨てられず、15年目になった今も手元にあります。

オーディオ環境

あけましておめでとうございます。
今年はちょっとは役立つ内容も書きたいですね~

といいつついきなりなんの役にも立たない書き込みです。
事の発端はこちら。TU-879S最終生産
初心者向け真空管アンプの定番キットという認識で、そのうち買いたいな~なんて思ってたら生産終了とのこと。


ついポチってしまいました。で、買ったは良いけど作る暇無くそのままほったらかし…
ちょっとずつ作ってようやく音出しとか、そんな状態です。
ちなみに当方、耳が良いとかそんなこととても言えません。目隠しされてストラトヴァリウスとヤマハを聴かされても言い当てられないでしょう。ましてや光ケーブルの種類とか記録媒体のHDDとかで音が変わるという、そんなオカルティックな聴力はありません。というかそんなの聞き分けられたら鬱陶しいので欲しくもありませんが。
その程度の耳でも真空管アンプは聴いてて面白く、CDとかiPodから音を流してます。
で、もうちょっと便利にしよう、ってことで

audio-technica USBヘッドホンアンプ 24bit/96kHZ対応 AT-HA40USB

audio-technica USBヘッドホンアンプ 24bit/96kHZ対応 AT-HA40USB

  • 出版社/メーカー: オーディオテクニカ
  • メディア: エレクトロニクス

こちらとRaspberryPiを追加購入。RaspyFiを導入してネットワークプレーヤーに仕立て上げます。
といっても特にやること無し。RaspyFiのイメージをダウンロードしてSDカードに書き込み、RaspberryPiとAT-HA40USBをつないで電源入れるだけ。やったことと言えばIPアドレスを固定した事ぐらいでしょうか。これもブラウザ経由のGUIで済みます。
Image 016.png
NASの音源フォルダをNFSで公開してRaspyFiにマウントさせたら完了。ADD NEW MOUNTを押してNASを指定します。USBにFlashか余ってるHDDをつないだ方が手軽で良いかもしれませんね。
Image 014.png
そのままでAT-HA40USBから音が出てくれました。ハードウェア音量制御もOK。MPD Configurationから下の方のMixer TypeをHardwareにするとAT-HA40USB側の音量制御が使われるようです。
Image 015.png
ほとんどCDからのFLACやMP3でハイレゾ音源では無いですが音も十分綺麗。こちらはWEBラジオの再生中。
Image 019.png
選曲、選局、音量をタブレット端末やPCのブラウザで操作します。専用アプリじゃ無くてもこれが便利。安定度も高く、うっかり止め忘れたWEBラジオが数日流れてても平気な顔してます。日本のラジオ局も登録しようかな~
安いので良いんだけど、さすがに自分でノイズ対策するの面倒だしある程度の物を、ってことで選んだAT-HA40USBでしたが、これまた便利。出力が3系統あり、ライン出力で真空管アンプ、光出力でミニコンポ、ヘッドホンと使い分けてます。真空管アンプ良いんですが消費電力が高いので、普段はミニコンポからBGM出してます。大体70W対10Wぐらい。D級アンプは効率よいですね~ほとんど熱くならないし、夏場は真空管アンプはお休みでしょうか。大体この省電力時代に70Wも喰って出力数Wってのが間違えてるんですが(笑)

ふにゃふにゃHDL [HDL]

最近verilogが多いです。好みはVHDLですが。
検証は(system)verilogが使えると便利だと思います。しかしModelSimの混在シミュレーションライセンスなんて持ってるわけもないので(というかAltera Starter Edition、無料、ありがたや)、やるときはどちらかですが。ホントはCが使いたいですけどね~

そんなverilogの妙ながら便利な記述について。
非同期な動作と同期な動作を記述するとき、例えばリセットが2系統あるとき、
always @(posedge a_reset or posedge c_clock) begin
	if (a_reset) begin
		/*非同期リセット処理*/
	end
	else begin
		if (c_reset) begin
			/*同期リセット処理*/
		end
		else begin
			/*同期処理*/
		end
	end
end	
って書いたりします。これは割と普通。VHDLではこんな感じ。
process(a_reset, c_clock)
begin
	if (a_reset = '1') then
		--非同期リセット処理
	elsif (c_clock'event and c_clock = '1') then
		if (c_reset = '1') then
			--同期リセット処理
		else
			--同期処理
		end if;
	end if;
end process;
似てますが、クロックエッジの判定をverilogではalways文で行って、VHDLではif文で行うところが異なります。実はこの書き方、VHDL風に寄せてverilogを書いていて、「非同期処理と同期処理は別ですよ~」って明示するために「a_reset 」のブロックとそれ以外のブロックに大きく分けて書いてます。

けど、verilogはそんな書き方をする必要なかったりします。
always @(posedge a_reset or posedge c_clock) begin
	if (a_reset) begin
		/*非同期リセット処理*/
	end
	else if (c_reset) begin
		/*同期リセット処理*/
	end
	else begin
		/*同期処理*/
	end
end	
非同期処理と同期処理が同じレベルな事に注意。この書き方はVHDLは不許可です。
さらにもし非同期と同期のリセット処理が同じだったら、
always @(posedge a_reset or posedge c_clock) begin
	if (a_reset || c_reset) begin
		/*非同期/同期リセット処理*/
	end
	else begin
		/*同期処理*/
	end
end	
という書き方もできます。条件が増えてもOK。
always @(posedge a_reset or posedge c_clock) begin
	if (a_reset || c_reset) begin
		/*非同期/同期リセット処理*/
	end
	else if (ready) begin
		/*同期処理*/
	end
	else begin
		/*同期処理*/
	end
end	
シミュレーションはもちろん、合成してもちゃんとした回路ができてます(全ての処理系で試した訳では無いですが)。c_resetやready周りに変な回路ができるような様子も無さそうです。

…うわ~きもちわるい!!けど便利w
下の書き方を見ても「?なにがおかしいの?」と思う人がいるかも知れません。一方「ありえねぇ~!」って人もいるかも知れません。両極端になりそう。私は後者に近いです。けど便利なのでこの記述もしちゃいます。
verilogはVHDLに比べ記述が少ないのですが、この辺の緩さが逆に気持ち悪かったりします。

ところで、alwaysの記述で最初納得のいかなかった所は、非同期のa_resetの扱い。
例えばリセットの極性を切り替えるときはどうすれば良いでしょう?
正論理
always @(posedge a_reset or posedge c_clock) begin
	if (a_reset) begin
負論理
always @(negedge a_reset or posedge c_clock) begin
	if (~a_reset) begin
こう書くとシミュレーションできても合成はできない。
always @(a_reset or posedge c_clock) begin
	if (a_reset) begin
反転してから使う。
wire	reset = a_reset ^ pol;
always @(posedge reset or posedge c_clock) begin
	if (reset) begin
レベルセンスの信号なのにエッジを指定する必要がある、というのが腑に落ちません。また、posedge→if (areset)、negedge→if (~areset)、の関係は崩れないので冗長です。これまた気持ち悪い。そういうモノだ、と思うしか無いです。
VHDLでは素直な話です。
generic (
	pol	: std_logic	:= '0'	極性
…
process(a_reset, c_clock)
begin
	if (a_reset = pol) then

実体顕微鏡

前々からあると便利だなぁ~欲しいなぁ~って思ってたので、実体顕微鏡を買いました。

ホーザン 実体顕微鏡 L-46

ホーザン 実体顕微鏡 L-46

  • 出版社/メーカー: ホーザン
  • メディア: Tools & Hardware


そんなに使用頻度は高くないと踏み、比較的安価なのを、半田付けだけが目的でも無いので、ズームタイプにしました。これで7~45倍。倍率固定ならあと3万円~半額ぐらい安いです。

まずは軽いです。光学機器にありがちな「ずしり」感は薄く、ひょいって持ち上がります。といっても作業中に動いてしまうほど軽くは無く、私のようなお気軽ユーザにはメリットに感じます。使わないときは、つまみを緩めると本体だけ180度回って(接眼の出っ張りが支柱側を向く)比較的コンパクトに収まります。ホコリよけのビニールカバー付き。
ピント・ズームのつまみの動きも十分スムーズです。自然に落ちてきちゃうような事は(今のところ)ありません。ズームは回すと「ぢゅるぢゅる」って音が?。見てみるとグリスがすごい粘ついてる音でした(笑)。まぁ問題ないんでしょう。
ただ、材料や組み立ては価格なりでしょうか。外側の金属は薄いです。叩くと「ペンペン」って感じ。ネジのセンターがずれてたり(締め付けがいい加減)隙間が左右で違ったり。

光学系はまあまま明るく、色収差とか歪みとか十分だと思います。被写体深度は浅い気がしますが。V字型の斜めの光学系です。ちょっとしたLEDランプがあれば良いですね。見える範囲で円を描いてみると、最低倍率で直径30mm弱ぐらい、最大倍率で直径5mmぐらい。しかし、接眼側の視野が狭いと思います。頭を少し動かすと見えなくなります。以前会社で見たニコンのはもっと楽に見えたような気がするな~。

結論としては値段なりですが私には十分。もっと安いのでも良かったかもw
けど、日常的にのぞき込んで作業する人にはつらいかも知れません。そこはやはりニコンやオリンパスあたりの平行光学系の機材が欲しくなると思います。なんだかんだで最低20万超になりますね~

ZedBoard Linux (6) [FPGA]

FPGA側にDMA付けてみます。

まずは読むだけのメモリダンプ。
ZedBoardにはアナログRGBのD-SUBコネクタが付いてます。ここに指定したアドレスのデータをメモリダンプさせます。要はフレームバッファー。むか~しのマイコン時代から使われている、画像メモリでプログラムを動かしてデバッグしよう、方式です。
なんでHDMIがあるのにわざわざアナログRGBなんてレガシーな物を…って話ですが、レガシーだからこそ。レガシーなインターフェースって無手順で相手の都合を考えず一方的にデータを送りつけても良い、という使い方ができます。デバッグ当初のまだいろいろ立ち上がってない環境では楽ちんです。相変わらずUART(RS-232C)が使われ続ける理由と似てると思います。
12bitBGRなので、画素のサイズは16bit/pixelにします。4bitは無視。

そして書くだけのメモリフィラー。
こちらはボード上に簡単なデータ入力装置が無いので(マイク端子が楽ですが)指定したアドレスから指定したサイズのメモリにカウンターの値を無理矢理書き込むマスターにしてみます。もしLinuxの管理領域に書き込んだら即暴走。先に確保した128MB以降全部埋めてもLinuxが動き続けるのを確認します。本来はカメラのデータとか音声データを流し込みます。

あと、DMAでメモリから読み出したデータをアナログRGBのタイミングに載せるペリフェラルも用意します。これは昔からAvalon(AlteraのNios)で使ってる物をAPBに焼き直しました。タイミングのパラメータをX.Org(XFree86)のmodelineの値と同じ値が使えるようになってます。が、ちゃんと解像度可変にするにはピクセルクロックも可変にしないとならないので、結局固定です(笑)。まぁモニタの対応周波数内で動かせますがあまり意味ないです。周波数は100MHzにしてます。

とりあえずtopデザイン。tab=4そのままなので見にくいかも。
/************************
 *	top
 ************************/
`timescale 1ns / 1ps
`default_nettype none


//**************************************************************************************************
//	
module top
(
	//	==============================================
	//	Hard Wired
	inout	wire	[53:0]	MIO				,
	input	wire			PS_SRSTB		,
	input	wire			PS_CLK			,
	input	wire			PS_PORB			,
	inout	wire			DDR_Clk			,
	inout	wire			DDR_Clk_n		,
	inout	wire			DDR_CKE			,
	inout	wire			DDR_CS_n		,
	inout	wire			DDR_RAS_n		,
	inout	wire			DDR_CAS_n		,
	output	wire			DDR_WEB			,
	inout	wire	[ 2:0]	DDR_BankAddr	,
	inout	wire	[14:0]	DDR_Addr		,
	inout	wire			DDR_ODT			,
	inout	wire			DDR_DRSTB		,
	inout	wire	[31:0]	DDR_DQ			,
	inout	wire	[ 3:0]	DDR_DM			,
	inout	wire	[ 3:0]	DDR_DQS			,
	inout	wire	[ 3:0]	DDR_DQS_n		,
	inout	wire			DDR_VRN			,
	inout	wire			DDR_VRP			,
	//	==============================================
	//	VGA
	output	wire			VGA_HS			,
	output	wire			VGA_VS			,
	output	wire	[ 4:1]	VGA_B			,
	output	wire	[ 4:1]	VGA_G			,
	output	wire	[ 4:1]	VGA_R			
);
	////////////////////////////
	//	
	//	Property
	parameter	blen	= 16		;	//	burst length
	parameter	qdep	= 8			;	//	queue depth = 2**qdep
	parameter	Xsymb	= 1'bX		;	//	invalid Symbol
	//	Video
	parameter	vodw	= 12	 	;	//	VGA Out Data Width
	parameter	vsdw	= 16	 	;	//	Video Stream Data Width
	parameter	cntw	= 11	 	;	//	Counter Width
	//	AXI
	parameter	axiw	= 6			;	//	ID
	parameter	axaw	= 32		;	//	Address
	parameter	axdw	= 64		;	//	Data
	parameter	axmw	= axdw/8	;	//	Mask
	parameter	axrw	= 2			;	//	Response
	parameter	axlw	= 4			;	//	Length
	parameter	axsw	= 3			;	//	Size
	//	AXI master (static)
	parameter	axbw	= 2			;	//	Burst
	parameter	axcw	= 4			;	//	Cache
	parameter	axpw	= 3			;	//	Prot
	parameter	axkw	= 2			;	//	Lock
	parameter	axqw	= 4			;	//	QoS
	//	APB Slave
	parameter	apaw	= 32		;	//	Address
	parameter	apdw	= 32		;	//	Data
	parameter	apsw	= 4			;	//	Slaves


	////////////////////////////
	//	Clock
	wire			FCLK_CLK0;	//	66.6MHz
	wire			FCLK_CLK1;	//	100MHz
	wire			FCLK_CLK2;	//	166.6MHz
	wire			FCLK_CLK3;	//	200Mhz


	////////////////////////////
	//	EMIO GPIO
	wire	[63:0]	EMIO_GPIO_I;
	wire	[63:0]	EMIO_GPIO_O;
	wire	[63:0]	EMIO_GPIO_T;

	assign	EMIO_GPIO_I	= EMIO_GPIO_O ^ EMIO_GPIO_T;


	////////////////////////////
	//	APB
	wire				apb_pclk				;	//	clock
	wire				apb_presetn				;	//	reset_n
	wire	[apaw-1:0]	apb_paddr				;	//	address
	wire	[apsw-1:0]	apb_psel				;	//	select
	wire				apb_penable				;	//	enalbe
	wire				apb_pwrite				;	//	write
	wire	[apdw-1:0]	apb_pwdata				;	//	w data
	wire	[apdw-1:0]	apb_prdata	[apsw-1:0]	;	//	r data
	wire	[apsw-1:0]	apb_pready				;	//	ready
	wire	[apsw-1:0]	apb_pslverr				;	//	error

	assign	apb_pready	= apb_psel;			//	no-wait
	assign	apb_pslverr	= {apsw{1'b0}};		//	no-error

	assign	apb_prdata[3]	= apb_paddr;	//	unused slave


	////////////////////////////
	//	AXI HP
	wire				axi_hp_aclk		;	//	
	//	Address Write
	wire				axi_hp_awready	;	//	
	wire				axi_hp_awvalid	;	//	
	wire	[axiw-1:0]	axi_hp_awid		;	//	
	wire	[axaw-1:0]	axi_hp_awaddr	;	//	
	wire	[axlw-1:0]	axi_hp_awlen	;	//	
	wire	[axsw-1:0]	axi_hp_awsize	;	//	
	wire	[axbw-1:0]	axi_hp_awburst	;	//	static
	wire	[axcw-1:0]	axi_hp_awcache	;	//	static
	wire	[axpw-1:0]	axi_hp_awprot	;	//	static
	wire	[axkw-1:0]	axi_hp_awlock	;	//	static
	wire	[axqw-1:0]	axi_hp_awqos	;	//	static
	//	Write Data
	wire				axi_hp_wready	;	//	
	wire				axi_hp_wvalid	;	//	
	wire	[axiw-1:0]	axi_hp_wid		;	//	
	wire				axi_hp_wlast	;	//	
	wire	[axdw-1:0]	axi_hp_wdata	;	//	
	wire	[axmw-1:0]	axi_hp_wstrb	;	//	
	//	Write Response
	wire				axi_hp_bready	;	//	
	wire				axi_hp_bvalid	;	//	
	wire	[axiw-1:0]	axi_hp_bid		;	//	
	wire	[axrw-1:0]	axi_hp_bresp	;	//	
	//	Address Read
	wire				axi_hp_arready	;	//	
	wire				axi_hp_arvalid	;	//	
	wire	[axiw-1:0]	axi_hp_arid		;	//	
	wire	[axaw-1:0]	axi_hp_araddr	;	//	
	wire	[axlw-1:0]	axi_hp_arlen	;	//	
	wire	[axsw-1:0]	axi_hp_arsize	;	//	
	wire	[axbw-1:0]	axi_hp_arburst	;	//	static
	wire	[axcw-1:0]	axi_hp_arcache	;	//	static
	wire	[axpw-1:0]	axi_hp_arprot	;	//	static
	wire	[axkw-1:0]	axi_hp_arlock	;	//	static
	wire	[axqw-1:0]	axi_hp_arqos	;	//	static
	//	Read Data
	wire				axi_hp_rready	;	//	
	wire				axi_hp_rvalid	;	//	
	wire	[axiw-1:0]	axi_hp_rid		;	//	
	wire				axi_hp_rlast	;	//	
	wire	[axdw-1:0]	axi_hp_rdata	;	//	
	wire	[axrw-1:0]	axi_hp_rresp	;	//	


	////////////////////////////
	//	clock,reset wiring
	wire	a_reset;
	wire	c_clock;
	wire	c_reset;

	assign	a_reset		= ~apb_presetn;	//	
	assign	c_clock		= FCLK_CLK1;	//	
	assign	c_reset		= 1'b0;			//	
	assign	axi_hp_aclk	= c_clock;		//	


	////////////////////////////
	//	Video
	wire				v_hsync		;	//	H Sync
	wire				v_vsync		;	//	V Sync
	wire	[vodw-1:0]	v_data	 	;	//	data

	wire				tx_kick		;	//	kick
	wire				tx_ready	;	//	ready
	wire				tx_valid	;	//	valid
	wire	[vsdw-1:0]	tx_data 	;	//	data

	assign	VGA_HS	= v_hsync;
	assign	VGA_VS	= v_vsync;
	assign	{VGA_R,VGA_G,VGA_B}	= v_data;


	////////////////////////////
	//	VGA I/F
	vga_if
	#(
		//	Property
		.vodw	(vodw	),		//	parameter	vodw	= 12 	,	//	VGA Out Data Width
		.vsdw	(vsdw	),		//	parameter	vsdw	= 16 	,	//	Video Stream Data Width
		.cntw	(cntw	),		//	parameter	cntw	= 11 	,	//	Counter Width
		//	APB Slave
		.apaw	(apaw	),		//	parameter	apaw	= 32	,	//	Address
		.apdw	(apdw	)		//	parameter	apdw	= 32		//	Data
	)
	voif
	(
		//	==============================================
		//	common
		.a_reset		(a_reset	),		//	input	wire				a_reset		,	//	reset
		.c_clock		(c_clock	),		//	input	wire				c_clock		,	//	clock
		.c_reset		(c_reset	),		//	input	wire				c_reset		,	//	reset
		//	==============================================
		//	VGA
		.v_hsync		(v_hsync	),		//	output	wire				v_hsync		,	//	H Sync
		.v_vsync		(v_vsync	),		//	output	wire				v_vsync		,	//	V Sync
		.v_data			(v_data		),		//	output	wire	[vodw-1:0]	v_data	 	,	//	data
		//	==============================================
		//	Transmit Stream + kick
		.tx_kick		(tx_kick	),		//	output	wire				tx_kick		,	//	kick
		.tx_ready		(tx_ready	),		//	output	wire				tx_ready	,	//	ready
		.tx_valid		(tx_valid	),		//	input	wire				tx_valid	,	//	valid
		.tx_data		(tx_data	),		//	input	wire	[vsdw-1:0]	tx_data 	,	//	data
		//	==============================================
		//	APB
		.apb_pclk		(apb_pclk		),		//	input	wire				apb_pclk	,	//	clock
		.apb_presetn	(apb_presetn	),		//	input	wire				apb_presetn	,	//	reset_n
		.apb_paddr		(apb_paddr		),		//	input	wire	[apaw-1:0]	apb_paddr	,	//	address
		.apb_psel		(apb_psel	[0]	),		//	input	wire				apb_psel	,	//	select
		.apb_penable	(apb_penable	),		//	input	wire				apb_penable	,	//	enalbe
		.apb_pwrite		(apb_pwrite		),		//	input	wire				apb_pwrite	,	//	write
		.apb_pwdata		(apb_pwdata		),		//	input	wire	[apdw-1:0]	apb_pwdata	,	//	data
		.apb_prdata		(apb_prdata	[0]	)		//	output	reg 	[apdw-1:0]	apb_prdata	,	//	data
	);


	////////////////////////////
	//	VGA DMA
	vga_dma
	#(
		//	Property
		.vsdw	(vsdw	),		//	parameter	vsdw	= 16		,	//	Video Stream data width
		.blen	(blen	),		//	parameter	blen	= 16		,	//	burst length
		.qdep	(qdep	),		//	parameter	qdep	= 8			,	//	queue depth = 2**qdep
		//	AXI master
		.axiw	(axiw	),		//	parameter	axiw	= 6			,	//	ID
		.axaw	(axaw	),		//	parameter	axaw	= 32		,	//	Address
		.axdw	(axdw	),		//	parameter	axdw	= 64		,	//	Data
		.axmw	(axmw	),		//	parameter	axmw	= axdw/8	,	//	Mask
		.axrw	(axrw	),		//	parameter	axrw	= 2			,	//	Response
		.axlw	(axlw	),		//	parameter	axlw	= 4			,	//	Length
		.axsw	(axsw	),		//	parameter	axsw	= 3			,	//	Size
		//	AXI master (static)
		.axbw	(axbw	),		//	parameter	axbw	= 2			,	//	Burst
		.axcw	(axcw	),		//	parameter	axcw	= 4			,	//	Cache
		.axpw	(axpw	),		//	parameter	axpw	= 3			,	//	Prot
		.axkw	(axkw	),		//	parameter	axkw	= 2			,	//	Lock
		.axqw	(axqw	),		//	parameter	axqw	= 4			,	//	QoS
		//	APB Slave
		.apaw	(apaw	),		//	parameter	apaw	= 32		,	//	Address
		.apdw	(apdw	),		//	parameter	apdw	= 32		,	//	Data
		//	misc
		.Xsymb	(Xsymb	)		//	parameter	Xsymb	= 1'bX			//	invalid Symbol
	)
	vdma
	(
		//	==============================================
		//	common
		.a_reset		(a_reset	),		//	input	wire				a_reset		,	//	reset
		.c_clock		(c_clock	),		//	input	wire				c_clock		,	//	clock
		.c_reset		(c_reset	),		//	input	wire				c_reset		,	//	reset
		//	==============================================
		//	Transmit Stream + kick
		.tx_kick		(tx_kick	),		//	input	wire				tx_kick		,	//	kick
		.tx_ready		(tx_ready	),		//	output	wire				tx_ready	,	//	ready
		.tx_valid		(tx_valid	),		//	input	wire				tx_valid	,	//	valid
		.tx_data		(tx_data	),		//	input	wire	[vsdw-1:0]	tx_data 	,	//	data
		//	==============================================
		//	Address Read
		.axi_arready	(axi_hp_arready	),		//	input	wire				axi_arready	,	//	
		.axi_arvalid	(axi_hp_arvalid	),		//	output	wire				axi_arvalid	,	//	
		.axi_arid		(axi_hp_arid	),		//	output	wire	[axiw-1:0]	axi_arid	,	//	
		.axi_araddr		(axi_hp_araddr	),		//	output	wire	[axaw-1:0]	axi_araddr	,	//	
		.axi_arlen		(axi_hp_arlen	),		//	output	wire	[axlw-1:0]	axi_arlen	,	//	
		.axi_arsize		(axi_hp_arsize	),		//	output	wire	[axsw-1:0]	axi_arsize	,	//	
		.axi_arburst	(axi_hp_arburst	),		//	output	wire	[axbw-1:0]	axi_arburst	,	//	static
		.axi_arcache	(axi_hp_arcache	),		//	output	wire	[axcw-1:0]	axi_arcache	,	//	static
		.axi_arprot		(axi_hp_arprot	),		//	output	wire	[axpw-1:0]	axi_arprot	,	//	static
		.axi_arlock		(axi_hp_arlock	),		//	output	wire	[axkw-1:0]	axi_arlock	,	//	static
		.axi_arqos		(axi_hp_arqos	),		//	output	wire	[axqw-1:0]	axi_arqos	,	//	static
		//	Read Data
		.axi_rready		(axi_hp_rready	),		//	output	wire				axi_rready	,	//	
		.axi_rvalid		(axi_hp_rvalid	),		//	input	wire				axi_rvalid	,	//	
		.axi_rlast		(axi_hp_rlast	),		//	input	wire				axi_rlast	,	//	
		.axi_rid		(axi_hp_rid		),		//	input	wire	[axiw-1:0]	axi_rid		,	//	
		.axi_rdata		(axi_hp_rdata	),		//	input	wire	[axdw-1:0]	axi_rdata	,	//	
		.axi_rresp		(axi_hp_rresp	),		//	input	wire	[axrw-1:0]	axi_rresp	,	//	
		//	==============================================
		//	APB
		.apb_pclk		(apb_pclk		),		//	input	wire				apb_pclk	,	//	clock
		.apb_presetn	(apb_presetn	),		//	input	wire				apb_presetn	,	//	reset_n
		.apb_paddr		(apb_paddr		),		//	input	wire	[apaw-1:0]	apb_paddr	,	//	address
		.apb_psel		(apb_psel	[1]	),		//	input	wire				apb_psel	,	//	select
		.apb_penable	(apb_penable	),		//	input	wire				apb_penable	,	//	enalbe
		.apb_pwrite		(apb_pwrite		),		//	input	wire				apb_pwrite	,	//	write
		.apb_pwdata		(apb_pwdata		),		//	input	wire	[apdw-1:0]	apb_pwdata	,	//	data
		.apb_prdata		(apb_prdata	[1]	)		//	output	reg 	[apdw-1:0]	apb_prdata	,	//	data
	);


	////////////////////////////
	//	Filler
	fill_dma
	#(
		//	Property
		.blen	(blen	),		//	parameter	blen	= 16		,	//	burst length
		.qdep	(qdep	),		//	parameter	qdep	= 8			,	//	queue depth = 2**qdep
		//	AXI master
		.axiw	(axiw	),		//	parameter	axiw	= 6			,	//	ID
		.axaw	(axaw	),		//	parameter	axaw	= 32		,	//	Address
		.axdw	(axdw	),		//	parameter	axdw	= 64		,	//	Data
		.axmw	(axmw	),		//	parameter	axmw	= axdw/8	,	//	Mask
		.axlw	(axlw	),		//	parameter	axlw	= 4			,	//	Length
		.axsw	(axsw	),		//	parameter	axsw	= 3			,	//	Size
		.axrw	(axrw	),		//	parameter	axrw	= 2			,	//	Response
		//	AXI master (static)
		.axbw	(axbw	),		//	parameter	axbw	= 2			,	//	Burst
		.axcw	(axcw	),		//	parameter	axcw	= 4			,	//	Cache
		.axpw	(axpw	),		//	parameter	axpw	= 3			,	//	Prot
		.axkw	(axkw	),		//	parameter	axkw	= 2			,	//	Lock
		.axqw	(axqw	),		//	parameter	axqw	= 4			,	//	QoS
		//	APB Slave
		.apaw	(apaw	),		//	parameter	apaw	= 32		,	//	Address
		.apdw	(apdw	),		//	parameter	apdw	= 32		,	//	Data
		//	misc
		.Xsymb	(Xsymb	)		//	parameter	Xsymb	= 1'bX			//	invalid Symbol
	)
	filler
	(
		//	==============================================
		//	common
		.a_reset		(a_reset	),		//	input	wire				a_reset		,	//	reset
		.c_clock		(c_clock	),		//	input	wire				c_clock		,	//	clock
		.c_reset		(c_reset	),		//	input	wire				c_reset		,	//	reset
		//	==============================================
		//	Address Write
		.axi_awready	(axi_hp_awready	),		//	input	wire				axi_awready	,	//	
		.axi_awvalid	(axi_hp_awvalid	),		//	output	wire				axi_awvalid	,	//	
		.axi_awid		(axi_hp_awid	),		//	output	wire	[axiw-1:0]	axi_awid	,	//	
		.axi_awaddr		(axi_hp_awaddr	),		//	output	wire	[axaw-1:0]	axi_awaddr	,	//	
		.axi_awlen		(axi_hp_awlen	),		//	output	wire	[axlw-1:0]	axi_awlen	,	//	
		.axi_awsize		(axi_hp_awsize	),		//	output	wire	[axsw-1:0]	axi_awsize	,	//	
		.axi_awburst	(axi_hp_awburst	),		//	output	wire	[axbw-1:0]	axi_awburst	,	//	static
		.axi_awcache	(axi_hp_awcache	),		//	output	wire	[axcw-1:0]	axi_awcache	,	//	static
		.axi_awprot		(axi_hp_awprot	),		//	output	wire	[axpw-1:0]	axi_awprot	,	//	static
		.axi_awlock		(axi_hp_awlock	),		//	output	wire	[axkw-1:0]	axi_awlock	,	//	static
		.axi_awqos		(axi_hp_awqos	),		//	output	wire	[axqw-1:0]	axi_awqos	,	//	static
		//	Write Data
		.axi_wready		(axi_hp_wready	),		//	input	wire				axi_wready	,	//	
		.axi_wvalid		(axi_hp_wvalid	),		//	output	wire				axi_wvalid	,	//	
		.axi_wlast		(axi_hp_wlast	),		//	output	wire				axi_wlast	,	//	
		.axi_wid		(axi_hp_wid		),		//	output	wire	[axiw-1:0]	axi_wid		,	//	
		.axi_wdata		(axi_hp_wdata	),		//	output	wire	[axdw-1:0]	axi_wdata	,	//	
		.axi_wstrb		(axi_hp_wstrb	),		//	output	wire	[axmw-1:0]	axi_wstrb	,	//	
		//	Write Response
		.axi_bready		(axi_hp_bready	),		//	output	wire				axi_bready	,	//	
		.axi_bvalid		(axi_hp_bvalid	),		//	input	wire				axi_bvalid	,	//	
		.axi_bid		(axi_hp_bid		),		//	input	wire	[axiw-1:0]	axi_bid		,	//	
		.axi_bresp		(axi_hp_bresp	),		//	input	wire	[axrw-1:0]	axi_bresp	,	//	
		//	==============================================
		//	APB
		.apb_pclk		(apb_pclk		),		//	input	wire				apb_pclk	,	//	clock
		.apb_presetn	(apb_presetn	),		//	input	wire				apb_presetn	,	//	reset_n
		.apb_paddr		(apb_paddr		),		//	input	wire	[apaw-1:0]	apb_paddr	,	//	address
		.apb_psel		(apb_psel	[2]	),		//	input	wire				apb_psel	,	//	select
		.apb_penable	(apb_penable	),		//	input	wire				apb_penable	,	//	enalbe
		.apb_pwrite		(apb_pwrite		),		//	input	wire				apb_pwrite	,	//	write
		.apb_pwdata		(apb_pwdata		),		//	input	wire	[apdw-1:0]	apb_pwdata	,	//	data
		.apb_prdata		(apb_prdata	[2]	)		//	output	reg 	[apdw-1:0]	apb_prdata	,	//	data
	);


	////////////////////////////
	//	PS
	(* BOX_TYPE = "user_black_box" *)
	ps_module
	ps (
		//	==============================================
		//	Hard Wired
		.processing_system7_0_MIO			(MIO			),
		.processing_system7_0_PS_SRSTB_pin	(PS_SRSTB		),
		.processing_system7_0_PS_CLK_pin	(PS_CLK			),
		.processing_system7_0_PS_PORB_pin	(PS_PORB		),
		.processing_system7_0_DDR_Clk		(DDR_Clk		),
		.processing_system7_0_DDR_Clk_n		(DDR_Clk_n		),
		.processing_system7_0_DDR_CKE		(DDR_CKE		),
		.processing_system7_0_DDR_CS_n		(DDR_CS_n		),
		.processing_system7_0_DDR_RAS_n		(DDR_RAS_n		),
		.processing_system7_0_DDR_CAS_n		(DDR_CAS_n		),
		.processing_system7_0_DDR_WEB_pin	(DDR_WEB		),
		.processing_system7_0_DDR_BankAddr	(DDR_BankAddr	),
		.processing_system7_0_DDR_Addr		(DDR_Addr		),
		.processing_system7_0_DDR_ODT		(DDR_ODT		),
		.processing_system7_0_DDR_DRSTB		(DDR_DRSTB		),
		.processing_system7_0_DDR_DQ		(DDR_DQ			),
		.processing_system7_0_DDR_DM		(DDR_DM			),
		.processing_system7_0_DDR_DQS		(DDR_DQS		),
		.processing_system7_0_DDR_DQS_n		(DDR_DQS_n		),
		.processing_system7_0_DDR_VRN		(DDR_VRN		),
		.processing_system7_0_DDR_VRP		(DDR_VRP		),
		//	==============================================
		//	EMIO
		.processing_system7_0_GPIO_I_pin	(EMIO_GPIO_I	),
		.processing_system7_0_GPIO_O_pin	(EMIO_GPIO_O	),
		.processing_system7_0_GPIO_T_pin	(EMIO_GPIO_T	),
		//	==============================================
		//	Clock
		.processing_system7_0_FCLK_CLK0_pin	(FCLK_CLK0		),
		.processing_system7_0_FCLK_CLK1_pin	(FCLK_CLK1		),
		.processing_system7_0_FCLK_CLK2_pin	(FCLK_CLK2		),
		.processing_system7_0_FCLK_CLK3_pin	(FCLK_CLK3		),
		//	==============================================
		//	APB
		.axi_apb_bridge_0_M_APB_PCLK_pin	(apb_pclk		),
		.axi_apb_bridge_0_M_APB_PRESETN_pin	(apb_presetn	),
		.axi_apb_bridge_0_M_APB_PADDR_pin	(apb_paddr		),
		.axi_apb_bridge_0_M_APB_PSEL_pin	(apb_psel		),
		.axi_apb_bridge_0_M_APB_PENABLE_pin	(apb_penable	),
		.axi_apb_bridge_0_M_APB_PWRITE_pin	(apb_pwrite		),
		.axi_apb_bridge_0_M_APB_PWDATA_pin	(apb_pwdata		),
		.axi_apb_bridge_0_M_APB_PREADY_pin	(apb_pready		),
		.axi_apb_bridge_0_M_APB_PRDATA_pin	(apb_prdata[0]	),
		.axi_apb_bridge_0_M_APB_PRDATA2_pin	(apb_prdata[1]	),
		.axi_apb_bridge_0_M_APB_PRDATA3_pin	(apb_prdata[2]	),
		.axi_apb_bridge_0_M_APB_PRDATA4_pin	(apb_prdata[3]	),
		.axi_apb_bridge_0_M_APB_PSLVERR_pin	(apb_pslverr	),
		//	==============================================
		//	AXI HP0
		.processing_system7_0_S_AXI_HP0_ARREADY_pin	(axi_hp_arready	),
		.processing_system7_0_S_AXI_HP0_AWREADY_pin	(axi_hp_awready	),
		.processing_system7_0_S_AXI_HP0_BVALID_pin	(axi_hp_bvalid	),
		.processing_system7_0_S_AXI_HP0_RLAST_pin	(axi_hp_rlast	),
		.processing_system7_0_S_AXI_HP0_RVALID_pin	(axi_hp_rvalid	),
		.processing_system7_0_S_AXI_HP0_WREADY_pin	(axi_hp_wready	),
		.processing_system7_0_S_AXI_HP0_BRESP_pin	(axi_hp_bresp	),
		.processing_system7_0_S_AXI_HP0_RRESP_pin	(axi_hp_rresp	),
		.processing_system7_0_S_AXI_HP0_BID_pin		(axi_hp_bid		),
		.processing_system7_0_S_AXI_HP0_RID_pin		(axi_hp_rid		),
		.processing_system7_0_S_AXI_HP0_RDATA_pin	(axi_hp_rdata	),
		.processing_system7_0_S_AXI_HP0_ACLK_pin	(axi_hp_aclk	),
		.processing_system7_0_S_AXI_HP0_ARVALID_pin	(axi_hp_arvalid	),
		.processing_system7_0_S_AXI_HP0_AWVALID_pin	(axi_hp_awvalid	),
		.processing_system7_0_S_AXI_HP0_BREADY_pin	(axi_hp_bready	),
		.processing_system7_0_S_AXI_HP0_RREADY_pin	(axi_hp_rready	),
		.processing_system7_0_S_AXI_HP0_WLAST_pin	(axi_hp_wlast	),
		.processing_system7_0_S_AXI_HP0_WVALID_pin	(axi_hp_wvalid	),
		.processing_system7_0_S_AXI_HP0_ARBURST_pin	(axi_hp_arburst	),
		.processing_system7_0_S_AXI_HP0_ARLOCK_pin	(axi_hp_arlock	),
		.processing_system7_0_S_AXI_HP0_ARSIZE_pin	(axi_hp_arsize	),
		.processing_system7_0_S_AXI_HP0_AWBURST_pin	(axi_hp_awburst	),
		.processing_system7_0_S_AXI_HP0_AWLOCK_pin	(axi_hp_awlock	),
		.processing_system7_0_S_AXI_HP0_AWSIZE_pin	(axi_hp_awsize	),
		.processing_system7_0_S_AXI_HP0_ARPROT_pin	(axi_hp_arprot	),
		.processing_system7_0_S_AXI_HP0_AWPROT_pin	(axi_hp_awprot	),
		.processing_system7_0_S_AXI_HP0_ARADDR_pin	(axi_hp_araddr	),
		.processing_system7_0_S_AXI_HP0_AWADDR_pin	(axi_hp_awaddr	),
		.processing_system7_0_S_AXI_HP0_ARCACHE_pin	(axi_hp_arcache	),
		.processing_system7_0_S_AXI_HP0_ARLEN_pin	(axi_hp_arlen	),
		.processing_system7_0_S_AXI_HP0_ARQOS_pin	(axi_hp_arqos	),
		.processing_system7_0_S_AXI_HP0_AWCACHE_pin	(axi_hp_awcache	),
		.processing_system7_0_S_AXI_HP0_AWLEN_pin	(axi_hp_awlen	),
		.processing_system7_0_S_AXI_HP0_AWQOS_pin	(axi_hp_awqos	),
		.processing_system7_0_S_AXI_HP0_ARID_pin	(axi_hp_arid	),
		.processing_system7_0_S_AXI_HP0_AWID_pin	(axi_hp_awid	),
		.processing_system7_0_S_AXI_HP0_WID_pin		(axi_hp_wid		),
		.processing_system7_0_S_AXI_HP0_WDATA_pin	(axi_hp_wdata	),
		.processing_system7_0_S_AXI_HP0_WSTRB_pin	(axi_hp_wstrb	)
	);

endmodule
//
//**************************************************************************************************

`default_nettype wire

こう見ると長いですが、ほとんど同じ名前の信号をつなぐだけになってます。SystemVerilogのInterface記述やQsys、XPSといったツールが出てきたのもわかりますね。手で書いてたら無駄ですもん。コピペとマクロでやってても面倒くさい。(記述が無駄に冗長なのは半自動的だからです。)

DMA本体やVGAインターフェースもそのうち公開すると思いますが、複数のモジュールに別れてるので結構面倒くさい。どういう公開方法が楽かな?バージョン管理にgit使ってるのでそのままgithubとかに上げるのが良いのかな?ライセンスとかどうするのが良いんでしょ…オープンソースなハードウェアのライセンスってGPLとかCCとかで良いのかな?

モジュールに別れてますが、意外に小さいと思います。
VGA DMA:約270行
AXI Read シーケンサー:約240行
メモリフィル・DMA:約330行
AXI Write シーケンサー:約340行
VGAインターフェース:約280行
その他100~150行ぐらいの細かいファイルが5~6個
という構成。機能削ればこの程度です。

VGAのピン配置をZedBoardのマスターucfから持ってきて、コンパイルします。Sliceの使用率は6%程度。(そのうち約半分はXilinxのAPB関連のIP。しかもその中でまた新たにCritical Warning出てるしw。)
できあがったbitストリームを差し替えてBOOT.BINを作成。他のLinux関連のファイルはそのままです。立ち上げてもなにも変わりません。Linuxにはペリフェラル増えたとか通知してませんし。

PC側でSDKを立ち上げて、Linuxアプリを作成します。
(相変わらずエラーチェック無しのいい加減プログラム…)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>

typedef unsigned int uint32;
typedef unsigned short uint16;

const uint32 param[] = {1280, 1360, 1496, 1712, 960, 961, 964, 994}; タイミング

inline void putPixel(uint16 *fb, int x, int y, uint16 c)
{
	fb[y*param[0]+x] = c; 直接書き込みとか
}
…
#define MAP_SIZE 4096UL レジスタ空間のサイズ
#define FB_SIZE 1024UL*1024UL*(512-128) Linuxが取った128MB以外全部
…
main()
/dev/mem開いて直接アドレスでマッピング
    fd = open("/dev/mem", O_RDWR | O_SYNC);
    uint32 *voif = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x72800000); VGA I/F
    uint32 *vdma = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x60A00000); VGA DMA
    uint32 *fill = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x60A20000); Filler
    uint16 *fb   = mmap(0,  FB_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x08000000); フレームバッファー
    close(fd);

    vdma[4] = 0x08000000; ベースアドレス=128MB
    vdma[5] = width*height*2; 転送サイズ=画像サイズ

    voif[0x08] = param[0];
    voif[0x09] = param[1];
    voif[0x0a] = param[2];
    voif[0x0b] = param[3];
    voif[0x0c] = param[4];
    voif[0x0d] = param[5];
    voif[0x0e] = param[6];
    voif[0x0f] = param[7]; パラメータ設定

    vdma[1] = 0x00000001; DMAスタート
    voif[0] = 0x0000000b; VGAスタート

    fill[4] = 0x08000000; 128MB先頭から
    fill[5] = 384*1024*1024; 384MB一気書き込みとか
    fill[1] = 0x00000001;
    fill[1] = 0x00000000;

線引いたり円描いたり
    line(fb, width-1, 0, 0, height-1, 0xffff);
    circle(fb, width/2, height/2,  100, 0xffff);

最後に開放
    munmap(voif, MAP_SIZE);
    munmap(vdma, MAP_SIZE);
    munmap(fill, MAP_SIZE);
    munmap(fb  ,  FB_SIZE);

レジスタ構成とかはまた今度として、こんな感じでプログラム作ってLinuxに転送し実行すると画面に画が出てきます。
R0026628.JPG
Fill DMAがカウンター値を書き込んでるので、格子状のベタ画像になります。Linuxは動作し続けてるので、Fill DMAが書き込んだのはLinux管理外の領域となってるようです。Fill DMAの先頭アドレスを0x0000_0000とかにしてLinuxが管理してるはずのメモリ領域に書き込ませると、ちゃんと暴走します。VGA DMAの先頭アドレスをLinuxの領域にしてなにか操作すると画像が変わるのがわかります。
R0026630.JPGLinuxのどこかの管理領域。
Linuxでも絶対アドレスを指定したポインタによるアクセスって意外と簡単にできるんですね。知らんかったです。デバイスドライバとか書かなくて済むのでデバッグ時は楽です。デバイスドライバ書くとかpcore形式にしてXPSに登録するとか、これがうれしいのは繰り返し使うときで、一回しか使わないときは手間なんですよね。

これでまずはメモリを分けてLinuxの管理領域外のメモリを用意し、FPGAから直接操作する基本的な構成ができました。CPUのキャッシュとの関連とか帯域制御とかまだ色々ありそうですが、必要最低限は用意できたと思います。多分他のプラットフォーム(MBとかNiosIIとか)でも同じ方法で行けるはずです。
Linuxが使えるメモリが減ってしまい、自由度が下がるのが問題ですが、LinuxのページングモデルにFPGAロジックを摺り合わせるよりは楽だと思います。

ZedBoard Linux (5) [FPGA]

Linux管理外のメモリ空間がホントに思ったとおりになってるのか、FPGAから読み書きしてみます。

接続方法ですが、諸事情(笑)によりAXI3。
…はじめの頃はAXI4ににしてpcore形式で登録したりもしてたのですが、最近はハードマクロのAXI-HP0~3を直接外に出してそこにつなぐパターンが多くなってます。作る時に毎回XPS立ち上げてうんたらかんたらやるのが面倒に感じてしまい、まずはAXIを外に出してXPSの作業はおしまい、後は外で作成、って感じです。この場合、ハードマクロのインターフェースは、AXI4ではなくAXI3+QoSです。pcore形式でつなぐ場合はAXI4~AXI3変換が自動的に追加されてます。
AlteraのSOPC Builder、Qsysでは面倒に感じず、そのまま作業することが多いんですよね。なにかセンスが違うんでしょう。ARMの付いたSoCシリーズは使ったこと無いのでわかりませんが…VivadoのIPインテグレーターがどうかもまだ試していません。

ということで、FPGA側のAXIマスターはAXI3になります。スレーブはレジスタの読み書きぐらいしかしないので、AXI~APBブリッジのIPを使ってしまいます。手抜き手抜き。
ちなみにAXIの3と4の違いは中の情報(パケット、プロトコル)の違いであって、タイミングは変わりません(依存関係に追加規定はあります)。簡単なAXIマスターモジュールで関係するのはバースト長(AXI3:4bit:最大16回、AXI4:8bit:最大256回)ぐらいじゃないですかね?

XPSの作業。まずはAXI-APBブリッジを追加します。
Image 014.png
APBのスレーブ本数は適当に4本。
自動的にアドレスが割り当てられ、外部にポートが出ます。
Image 011.png
Image 011p.png

PSセッティングの画面からHigh Performance AXIをクリックし、設定画面からS_AXI_HP0を有効に。
Image 018.png
最初はどこにも接続されてないので、Portタブから「S_AXI_HP0」を「Make Ports External」にします。
Image 019.png
「S_AXI_HP0」が直接外部ポートに出てきます。
Image 020.png
※「S_AXI_HP0_ACLK」が入力な点に注意。AXI_HPはFIFOになっていて、クロックを自由に設定できます。他のAXIもクロックブリッジが付いてます。

こうしてできた_stub.vがこちら。
//-----------------------------------------------------------------------------
// ps_module_stub.v
//-----------------------------------------------------------------------------

module ps_module_stub
  (
    processing_system7_0_MIO,
    processing_system7_0_PS_SRSTB_pin,
    processing_system7_0_PS_CLK_pin,
    processing_system7_0_PS_PORB_pin,
    processing_system7_0_DDR_Clk,
    processing_system7_0_DDR_Clk_n,
    processing_system7_0_DDR_CKE,
    processing_system7_0_DDR_CS_n,
    processing_system7_0_DDR_RAS_n,
    processing_system7_0_DDR_CAS_n,
    processing_system7_0_DDR_WEB_pin,
    processing_system7_0_DDR_BankAddr,
    processing_system7_0_DDR_Addr,
    processing_system7_0_DDR_ODT,
    processing_system7_0_DDR_DRSTB,
    processing_system7_0_DDR_DQ,
    processing_system7_0_DDR_DM,
    processing_system7_0_DDR_DQS,
    processing_system7_0_DDR_DQS_n,
    processing_system7_0_DDR_VRN,
    processing_system7_0_DDR_VRP,
    processing_system7_0_GPIO_I_pin,
    processing_system7_0_GPIO_O_pin,
    processing_system7_0_GPIO_T_pin,
    processing_system7_0_FCLK_CLK0_pin,
    processing_system7_0_FCLK_CLK1_pin,
    processing_system7_0_FCLK_CLK2_pin,
    processing_system7_0_FCLK_CLK3_pin,
    axi_apb_bridge_0_M_APB_PCLK_pin,
    axi_apb_bridge_0_M_APB_PRESETN_pin,
    axi_apb_bridge_0_M_APB_PADDR_pin,
    axi_apb_bridge_0_M_APB_PSEL_pin,
    axi_apb_bridge_0_M_APB_PENABLE_pin,
    axi_apb_bridge_0_M_APB_PWRITE_pin,
    axi_apb_bridge_0_M_APB_PWDATA_pin,
    axi_apb_bridge_0_M_APB_PREADY_pin,
    axi_apb_bridge_0_M_APB_PRDATA_pin,
    axi_apb_bridge_0_M_APB_PRDATA2_pin,
    axi_apb_bridge_0_M_APB_PRDATA3_pin,
    axi_apb_bridge_0_M_APB_PRDATA4_pin,
    axi_apb_bridge_0_M_APB_PSLVERR_pin,
    processing_system7_0_S_AXI_HP0_ARREADY_pin,
    processing_system7_0_S_AXI_HP0_AWREADY_pin,
    processing_system7_0_S_AXI_HP0_BVALID_pin,
    processing_system7_0_S_AXI_HP0_RLAST_pin,
    processing_system7_0_S_AXI_HP0_RVALID_pin,
    processing_system7_0_S_AXI_HP0_WREADY_pin,
    processing_system7_0_S_AXI_HP0_BRESP_pin,
    processing_system7_0_S_AXI_HP0_RRESP_pin,
    processing_system7_0_S_AXI_HP0_BID_pin,
    processing_system7_0_S_AXI_HP0_RID_pin,
    processing_system7_0_S_AXI_HP0_RDATA_pin,
    processing_system7_0_S_AXI_HP0_ACLK_pin,
    processing_system7_0_S_AXI_HP0_ARVALID_pin,
    processing_system7_0_S_AXI_HP0_AWVALID_pin,
    processing_system7_0_S_AXI_HP0_BREADY_pin,
    processing_system7_0_S_AXI_HP0_RREADY_pin,
    processing_system7_0_S_AXI_HP0_WLAST_pin,
    processing_system7_0_S_AXI_HP0_WVALID_pin,
    processing_system7_0_S_AXI_HP0_ARBURST_pin,
    processing_system7_0_S_AXI_HP0_ARLOCK_pin,
    processing_system7_0_S_AXI_HP0_ARSIZE_pin,
    processing_system7_0_S_AXI_HP0_AWBURST_pin,
    processing_system7_0_S_AXI_HP0_AWLOCK_pin,
    processing_system7_0_S_AXI_HP0_AWSIZE_pin,
    processing_system7_0_S_AXI_HP0_ARPROT_pin,
    processing_system7_0_S_AXI_HP0_AWPROT_pin,
    processing_system7_0_S_AXI_HP0_ARADDR_pin,
    processing_system7_0_S_AXI_HP0_AWADDR_pin,
    processing_system7_0_S_AXI_HP0_ARCACHE_pin,
    processing_system7_0_S_AXI_HP0_ARLEN_pin,
    processing_system7_0_S_AXI_HP0_ARQOS_pin,
    processing_system7_0_S_AXI_HP0_AWCACHE_pin,
    processing_system7_0_S_AXI_HP0_AWLEN_pin,
    processing_system7_0_S_AXI_HP0_AWQOS_pin,
    processing_system7_0_S_AXI_HP0_ARID_pin,
    processing_system7_0_S_AXI_HP0_AWID_pin,
    processing_system7_0_S_AXI_HP0_WID_pin,
    processing_system7_0_S_AXI_HP0_WDATA_pin,
    processing_system7_0_S_AXI_HP0_WSTRB_pin
  );
  inout [53:0] processing_system7_0_MIO;
  input processing_system7_0_PS_SRSTB_pin;
  input processing_system7_0_PS_CLK_pin;
  input processing_system7_0_PS_PORB_pin;
  inout processing_system7_0_DDR_Clk;
  inout processing_system7_0_DDR_Clk_n;
  inout processing_system7_0_DDR_CKE;
  inout processing_system7_0_DDR_CS_n;
  inout processing_system7_0_DDR_RAS_n;
  inout processing_system7_0_DDR_CAS_n;
  output processing_system7_0_DDR_WEB_pin;
  inout [2:0] processing_system7_0_DDR_BankAddr;
  inout [14:0] processing_system7_0_DDR_Addr;
  inout processing_system7_0_DDR_ODT;
  inout processing_system7_0_DDR_DRSTB;
  inout [31:0] processing_system7_0_DDR_DQ;
  inout [3:0] processing_system7_0_DDR_DM;
  inout [3:0] processing_system7_0_DDR_DQS;
  inout [3:0] processing_system7_0_DDR_DQS_n;
  inout processing_system7_0_DDR_VRN;
  inout processing_system7_0_DDR_VRP;
  input [63:0] processing_system7_0_GPIO_I_pin;
  output [63:0] processing_system7_0_GPIO_O_pin;
  output [63:0] processing_system7_0_GPIO_T_pin;
  output processing_system7_0_FCLK_CLK0_pin;
  output processing_system7_0_FCLK_CLK1_pin;
  output processing_system7_0_FCLK_CLK2_pin;
  output processing_system7_0_FCLK_CLK3_pin;
  output axi_apb_bridge_0_M_APB_PCLK_pin;
  output axi_apb_bridge_0_M_APB_PRESETN_pin;
  output [31:0] axi_apb_bridge_0_M_APB_PADDR_pin;
  output [3:0] axi_apb_bridge_0_M_APB_PSEL_pin;
  output axi_apb_bridge_0_M_APB_PENABLE_pin;
  output axi_apb_bridge_0_M_APB_PWRITE_pin;
  output [31:0] axi_apb_bridge_0_M_APB_PWDATA_pin;
  input [3:0] axi_apb_bridge_0_M_APB_PREADY_pin;
  input [31:0] axi_apb_bridge_0_M_APB_PRDATA_pin;
  input [31:0] axi_apb_bridge_0_M_APB_PRDATA2_pin;
  input [31:0] axi_apb_bridge_0_M_APB_PRDATA3_pin;
  input [31:0] axi_apb_bridge_0_M_APB_PRDATA4_pin;
  input [3:0] axi_apb_bridge_0_M_APB_PSLVERR_pin;
  output processing_system7_0_S_AXI_HP0_ARREADY_pin;
  output processing_system7_0_S_AXI_HP0_AWREADY_pin;
  output processing_system7_0_S_AXI_HP0_BVALID_pin;
  output processing_system7_0_S_AXI_HP0_RLAST_pin;
  output processing_system7_0_S_AXI_HP0_RVALID_pin;
  output processing_system7_0_S_AXI_HP0_WREADY_pin;
  output [1:0] processing_system7_0_S_AXI_HP0_BRESP_pin;
  output [1:0] processing_system7_0_S_AXI_HP0_RRESP_pin;
  output [5:0] processing_system7_0_S_AXI_HP0_BID_pin;
  output [5:0] processing_system7_0_S_AXI_HP0_RID_pin;
  output [63:0] processing_system7_0_S_AXI_HP0_RDATA_pin;
  input processing_system7_0_S_AXI_HP0_ACLK_pin;
  input processing_system7_0_S_AXI_HP0_ARVALID_pin;
  input processing_system7_0_S_AXI_HP0_AWVALID_pin;
  input processing_system7_0_S_AXI_HP0_BREADY_pin;
  input processing_system7_0_S_AXI_HP0_RREADY_pin;
  input processing_system7_0_S_AXI_HP0_WLAST_pin;
  input processing_system7_0_S_AXI_HP0_WVALID_pin;
  input [1:0] processing_system7_0_S_AXI_HP0_ARBURST_pin;
  input [1:0] processing_system7_0_S_AXI_HP0_ARLOCK_pin;
  input [2:0] processing_system7_0_S_AXI_HP0_ARSIZE_pin;
  input [1:0] processing_system7_0_S_AXI_HP0_AWBURST_pin;
  input [1:0] processing_system7_0_S_AXI_HP0_AWLOCK_pin;
  input [2:0] processing_system7_0_S_AXI_HP0_AWSIZE_pin;
  input [2:0] processing_system7_0_S_AXI_HP0_ARPROT_pin;
  input [2:0] processing_system7_0_S_AXI_HP0_AWPROT_pin;
  input [31:0] processing_system7_0_S_AXI_HP0_ARADDR_pin;
  input [31:0] processing_system7_0_S_AXI_HP0_AWADDR_pin;
  input [3:0] processing_system7_0_S_AXI_HP0_ARCACHE_pin;
  input [3:0] processing_system7_0_S_AXI_HP0_ARLEN_pin;
  input [3:0] processing_system7_0_S_AXI_HP0_ARQOS_pin;
  input [3:0] processing_system7_0_S_AXI_HP0_AWCACHE_pin;
  input [3:0] processing_system7_0_S_AXI_HP0_AWLEN_pin;
  input [3:0] processing_system7_0_S_AXI_HP0_AWQOS_pin;
  input [5:0] processing_system7_0_S_AXI_HP0_ARID_pin;
  input [5:0] processing_system7_0_S_AXI_HP0_AWID_pin;
  input [5:0] processing_system7_0_S_AXI_HP0_WID_pin;
  input [63:0] processing_system7_0_S_AXI_HP0_WDATA_pin;
  input [7:0] processing_system7_0_S_AXI_HP0_WSTRB_pin;

  (* BOX_TYPE = "user_black_box" *)
  ps_module
    ps_module_i (
      .processing_system7_0_MIO ( processing_system7_0_MIO ),
      .processing_system7_0_PS_SRSTB_pin ( processing_system7_0_PS_SRSTB_pin ),
      .processing_system7_0_PS_CLK_pin ( processing_system7_0_PS_CLK_pin ),
      .processing_system7_0_PS_PORB_pin ( processing_system7_0_PS_PORB_pin ),
      .processing_system7_0_DDR_Clk ( processing_system7_0_DDR_Clk ),
      .processing_system7_0_DDR_Clk_n ( processing_system7_0_DDR_Clk_n ),
      .processing_system7_0_DDR_CKE ( processing_system7_0_DDR_CKE ),
      .processing_system7_0_DDR_CS_n ( processing_system7_0_DDR_CS_n ),
      .processing_system7_0_DDR_RAS_n ( processing_system7_0_DDR_RAS_n ),
      .processing_system7_0_DDR_CAS_n ( processing_system7_0_DDR_CAS_n ),
      .processing_system7_0_DDR_WEB_pin ( processing_system7_0_DDR_WEB_pin ),
      .processing_system7_0_DDR_BankAddr ( processing_system7_0_DDR_BankAddr ),
      .processing_system7_0_DDR_Addr ( processing_system7_0_DDR_Addr ),
      .processing_system7_0_DDR_ODT ( processing_system7_0_DDR_ODT ),
      .processing_system7_0_DDR_DRSTB ( processing_system7_0_DDR_DRSTB ),
      .processing_system7_0_DDR_DQ ( processing_system7_0_DDR_DQ ),
      .processing_system7_0_DDR_DM ( processing_system7_0_DDR_DM ),
      .processing_system7_0_DDR_DQS ( processing_system7_0_DDR_DQS ),
      .processing_system7_0_DDR_DQS_n ( processing_system7_0_DDR_DQS_n ),
      .processing_system7_0_DDR_VRN ( processing_system7_0_DDR_VRN ),
      .processing_system7_0_DDR_VRP ( processing_system7_0_DDR_VRP ),
      .processing_system7_0_GPIO_I_pin ( processing_system7_0_GPIO_I_pin ),
      .processing_system7_0_GPIO_O_pin ( processing_system7_0_GPIO_O_pin ),
      .processing_system7_0_GPIO_T_pin ( processing_system7_0_GPIO_T_pin ),
      .processing_system7_0_FCLK_CLK0_pin ( processing_system7_0_FCLK_CLK0_pin ),
      .processing_system7_0_FCLK_CLK1_pin ( processing_system7_0_FCLK_CLK1_pin ),
      .processing_system7_0_FCLK_CLK2_pin ( processing_system7_0_FCLK_CLK2_pin ),
      .processing_system7_0_FCLK_CLK3_pin ( processing_system7_0_FCLK_CLK3_pin ),
      .axi_apb_bridge_0_M_APB_PCLK_pin ( axi_apb_bridge_0_M_APB_PCLK_pin ),
      .axi_apb_bridge_0_M_APB_PRESETN_pin ( axi_apb_bridge_0_M_APB_PRESETN_pin ),
      .axi_apb_bridge_0_M_APB_PADDR_pin ( axi_apb_bridge_0_M_APB_PADDR_pin ),
      .axi_apb_bridge_0_M_APB_PSEL_pin ( axi_apb_bridge_0_M_APB_PSEL_pin ),
      .axi_apb_bridge_0_M_APB_PENABLE_pin ( axi_apb_bridge_0_M_APB_PENABLE_pin ),
      .axi_apb_bridge_0_M_APB_PWRITE_pin ( axi_apb_bridge_0_M_APB_PWRITE_pin ),
      .axi_apb_bridge_0_M_APB_PWDATA_pin ( axi_apb_bridge_0_M_APB_PWDATA_pin ),
      .axi_apb_bridge_0_M_APB_PREADY_pin ( axi_apb_bridge_0_M_APB_PREADY_pin ),
      .axi_apb_bridge_0_M_APB_PRDATA_pin ( axi_apb_bridge_0_M_APB_PRDATA_pin ),
      .axi_apb_bridge_0_M_APB_PRDATA2_pin ( axi_apb_bridge_0_M_APB_PRDATA2_pin ),
      .axi_apb_bridge_0_M_APB_PRDATA3_pin ( axi_apb_bridge_0_M_APB_PRDATA3_pin ),
      .axi_apb_bridge_0_M_APB_PRDATA4_pin ( axi_apb_bridge_0_M_APB_PRDATA4_pin ),
      .axi_apb_bridge_0_M_APB_PSLVERR_pin ( axi_apb_bridge_0_M_APB_PSLVERR_pin ),
      .processing_system7_0_S_AXI_HP0_ARREADY_pin ( processing_system7_0_S_AXI_HP0_ARREADY_pin ),
      .processing_system7_0_S_AXI_HP0_AWREADY_pin ( processing_system7_0_S_AXI_HP0_AWREADY_pin ),
      .processing_system7_0_S_AXI_HP0_BVALID_pin ( processing_system7_0_S_AXI_HP0_BVALID_pin ),
      .processing_system7_0_S_AXI_HP0_RLAST_pin ( processing_system7_0_S_AXI_HP0_RLAST_pin ),
      .processing_system7_0_S_AXI_HP0_RVALID_pin ( processing_system7_0_S_AXI_HP0_RVALID_pin ),
      .processing_system7_0_S_AXI_HP0_WREADY_pin ( processing_system7_0_S_AXI_HP0_WREADY_pin ),
      .processing_system7_0_S_AXI_HP0_BRESP_pin ( processing_system7_0_S_AXI_HP0_BRESP_pin ),
      .processing_system7_0_S_AXI_HP0_RRESP_pin ( processing_system7_0_S_AXI_HP0_RRESP_pin ),
      .processing_system7_0_S_AXI_HP0_BID_pin ( processing_system7_0_S_AXI_HP0_BID_pin ),
      .processing_system7_0_S_AXI_HP0_RID_pin ( processing_system7_0_S_AXI_HP0_RID_pin ),
      .processing_system7_0_S_AXI_HP0_RDATA_pin ( processing_system7_0_S_AXI_HP0_RDATA_pin ),
      .processing_system7_0_S_AXI_HP0_ACLK_pin ( processing_system7_0_S_AXI_HP0_ACLK_pin ),
      .processing_system7_0_S_AXI_HP0_ARVALID_pin ( processing_system7_0_S_AXI_HP0_ARVALID_pin ),
      .processing_system7_0_S_AXI_HP0_AWVALID_pin ( processing_system7_0_S_AXI_HP0_AWVALID_pin ),
      .processing_system7_0_S_AXI_HP0_BREADY_pin ( processing_system7_0_S_AXI_HP0_BREADY_pin ),
      .processing_system7_0_S_AXI_HP0_RREADY_pin ( processing_system7_0_S_AXI_HP0_RREADY_pin ),
      .processing_system7_0_S_AXI_HP0_WLAST_pin ( processing_system7_0_S_AXI_HP0_WLAST_pin ),
      .processing_system7_0_S_AXI_HP0_WVALID_pin ( processing_system7_0_S_AXI_HP0_WVALID_pin ),
      .processing_system7_0_S_AXI_HP0_ARBURST_pin ( processing_system7_0_S_AXI_HP0_ARBURST_pin ),
      .processing_system7_0_S_AXI_HP0_ARLOCK_pin ( processing_system7_0_S_AXI_HP0_ARLOCK_pin ),
      .processing_system7_0_S_AXI_HP0_ARSIZE_pin ( processing_system7_0_S_AXI_HP0_ARSIZE_pin ),
      .processing_system7_0_S_AXI_HP0_AWBURST_pin ( processing_system7_0_S_AXI_HP0_AWBURST_pin ),
      .processing_system7_0_S_AXI_HP0_AWLOCK_pin ( processing_system7_0_S_AXI_HP0_AWLOCK_pin ),
      .processing_system7_0_S_AXI_HP0_AWSIZE_pin ( processing_system7_0_S_AXI_HP0_AWSIZE_pin ),
      .processing_system7_0_S_AXI_HP0_ARPROT_pin ( processing_system7_0_S_AXI_HP0_ARPROT_pin ),
      .processing_system7_0_S_AXI_HP0_AWPROT_pin ( processing_system7_0_S_AXI_HP0_AWPROT_pin ),
      .processing_system7_0_S_AXI_HP0_ARADDR_pin ( processing_system7_0_S_AXI_HP0_ARADDR_pin ),
      .processing_system7_0_S_AXI_HP0_AWADDR_pin ( processing_system7_0_S_AXI_HP0_AWADDR_pin ),
      .processing_system7_0_S_AXI_HP0_ARCACHE_pin ( processing_system7_0_S_AXI_HP0_ARCACHE_pin ),
      .processing_system7_0_S_AXI_HP0_ARLEN_pin ( processing_system7_0_S_AXI_HP0_ARLEN_pin ),
      .processing_system7_0_S_AXI_HP0_ARQOS_pin ( processing_system7_0_S_AXI_HP0_ARQOS_pin ),
      .processing_system7_0_S_AXI_HP0_AWCACHE_pin ( processing_system7_0_S_AXI_HP0_AWCACHE_pin ),
      .processing_system7_0_S_AXI_HP0_AWLEN_pin ( processing_system7_0_S_AXI_HP0_AWLEN_pin ),
      .processing_system7_0_S_AXI_HP0_AWQOS_pin ( processing_system7_0_S_AXI_HP0_AWQOS_pin ),
      .processing_system7_0_S_AXI_HP0_ARID_pin ( processing_system7_0_S_AXI_HP0_ARID_pin ),
      .processing_system7_0_S_AXI_HP0_AWID_pin ( processing_system7_0_S_AXI_HP0_AWID_pin ),
      .processing_system7_0_S_AXI_HP0_WID_pin ( processing_system7_0_S_AXI_HP0_WID_pin ),
      .processing_system7_0_S_AXI_HP0_WDATA_pin ( processing_system7_0_S_AXI_HP0_WDATA_pin ),
      .processing_system7_0_S_AXI_HP0_WSTRB_pin ( processing_system7_0_S_AXI_HP0_WSTRB_pin )
    );
endmodule 
一気に信号が増えましたが、「axi_apb_bridge_0_M_APB」がAPB関連、「processing_system7_0_S_AXI_HP0」がAXI_HP関連です。基本一対一でつなぐだけなので、私はエディタのコピペと置換とマクロで半自動的につないでます。ところで、自動的にできるんならツールに任せようよ、ってできたツールがSOPC Builder、Qsys、XPSなどです。

XPSの作業は終了。後は普通にロジック作るだけです。
前の10件 | -

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。