2017.12.17

見積システムを開発しています

見積システムというのを作っています。

これはショッピングカートのようなものなのですが、見積書を出すことに特化しています。

Est1

「カートへ」を押すと、だいたいショッピングカートのような感じで進行していくのですが、

Est2

目的は、このような見積書を表示することにあります。

Est3

Webアプリケーションの中でPDFを作成しているので、ブラウザ内で印刷用のPDFを表示したり、メールでPDFを送ることができます。

Est4

ショッピングカートの前身のような感じですね。

いずれ、オンラインショップに発展させたいと考えています。

| | コメント (0)

2017.12.15

ZynqBerryでUbuntu Linuxを動かす

ZynqBerryでLinuxを動かすための情報を公開します。

◆FSBLの構築

ZynqBerryは、フレームバッファというしくみを使ってHDMIに画像表示を行います。この機能を有効にするにはFSBLにパッチを当てる必要があります。そのパッチを含めたFSBLのソース一式は、Trenz社からダウンロードしたプロジェクトアーカイブのsw_apps\zynq_fsbl\srcディレクトリにあるのですが、ps7_init.cとps7_init.hは間違っているようなので、これを使ってはいけません。

やり方としては、XSDKで新規にFSBLのプロジェクトを作成し、sw_apps\zynq_fsbl\srcからps7_init.cとps7_init.h以外を持ってくることになります。

また、

#define FSBL_DEBUG_INFO

は、付けた方がよいでしょう。

Trenz社から提供されたZYNQ Berry用のU-Bootと、新しいFSBLで起動した画面を下の図に示します。

Zb_fsbl

◆U-Bootの構築

ZynqBerryで普通にU-Bootを起動すると、MMCのclockがどうので止まってしまいます。それを回避しても、GEMがない、と止まってしまいます。さらにはSPI ROMから起動しようとして、非常に遅いメモリコピーをした挙句に、起動イメージがないと出ます。

U-Bootで改変しなければならない箇所は

  • sdhci0ではなく、sdhci1を使うようデバイスツリーを変える
  • defconfigのCONFIG_ZYNQ_GEMをnにする
  • serial0とserian1を入れ替える
  • memoryの範囲を<0x0 0x1F700000>にする

また、board.cというソースのboard_late_init()という関数を書き換えます

int board_late_init(void)
{
    switch ((zynq_slcr_get_boot_mode()) & ZYNQ_BM_MASK) {
        case ZYNQ_BM_QSPI:
        setenv("modeboot", "sdboot");
//      setenv("modeboot", "qspiboot");
        break;
・・・

U-Bootは、SPI ROMからZYNQが起動したら、SLCRというレジスタを読んでSPI BOOTであることを調べ、LinuxのイメージもSPI ROM上にあると想定した動作を行います。この修正を行うことで、SPI ROMから起動しても、SDカードからLinuxイメージを読み込むようになります。

下のリストは、FSBLとU-Bootが起動したときのメッセージです。

Xilinx First Stage Boot Loader
Release 2017.1  Dec 15 2017-16:06:19
Devcfg driver initialized
Silicon Version 3.1
Boot mode is QSPI
Single Flash Information
FlashID=0x1 0x20 0x18
SPANSION 128M Bits
QSPI is in single flash connection
QSPI Init Done
Flash Base Address: 0xFC000000
Reboot status register: 0x60480000
Multiboot Register: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 3
Partition Number: 1
Header Dump
Image Word Len: 0x0003DC28
Data Word Len: 0x0003DC28
Partition Word Len:0x0003DC28
Load Addr: 0x00000000
Exec Addr: 0x00000000
Partition Start: 0x000085D0
Partition Attr: 0x00000020
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFF3E346
Bitstream
In FsblHookBeforeBitstreamDload function
PCAP:StatusReg = 0x40000A30
PCAP:device ready
PCAP:Clear done
Level Shifter Value = 0xA
Devcfg Status register = 0x40000A30
PCAP:Fabric is Initialized done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x0802000B
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x00000A30
PCAP DMA SRC ADDR 0xF8007018: 0xFC021741
PCAP DMA DEST ADDR 0xF800701C: 0xFFFFFFFF
PCAP DMA SRC LEN 0xF8007020: 0x0003DC28
PCAP DMA DEST LEN 0xF8007024: 0x0003DC28
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800100
...................................................................................................
DMA Done !

FPGA Done !
In FsblHookAfterBitstreamDload function
Partition Number: 2
Header Dump
Image Word Len: 0x0001CB48
Data Word Len: 0x0001CB48
Partition Word Len:0x0001CB48
Load Addr: 0x04000000
Exec Addr: 0x04000000
Partition Start: 0x00046200
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xF7F639B6
Application
PCAP:StatusReg = 0x40000F30
PCAP:device ready
PCAP:Clear done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x00030004
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x00000F30
PCAP DMA SRC ADDR 0xF8007018: 0xFC118801
PCAP DMA DEST ADDR 0xF800701C: 0x04000001
PCAP DMA SRC LEN 0xF8007020: 0x0001CB48
PCAP DMA DEST LEN 0xF8007024: 0x0001CB48
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800110
...................................................................................................
DMA Done !
Handoff Address: 0x04000000
In FsblHookBeforeHandoff function
FSBL: Enabling VTC..
FSBL: Enabling Out VDMA at 0x1FC00000..
FSBL: Enabling In  VDMA at 0x1F700000..
SUCCESSFUL_HANDOFF
FSBL Status = 0x1


U-Boot 2017.01-00014-g5fa7d2e-dirty (Dec 15 2017 - 16:34:59 +0900)

Model: TrenzElectronic TE0726-03M ZynqBerry (U-Boot by Tokuden 1.0)
Board: Xilinx Zynq
I2C:   ready
DRAM:  ECC disabled 503 MiB
MMC:   sdhci@e0101000: 0 (SD)
SF: Detected s25fl128s_64k with page size 256 Bytes, erase size 64 KiB, total 16 MiB
*** Warning - bad CRC, using default environment

In:    serial@e0001000
Out:   serial@e0001000
Err:   serial@e0001000
Model: TrenzElectronic TE0726-03M ZynqBerry (U-Boot by Tokuden 1.0)
Board: Xilinx Zynq
Net:   No ethernet found.
reading uEnv.txt
115 bytes read in 8 ms (13.7 KiB/s)
Importing environment from SD ...
Hit any key to stop autoboot:  0
Berry> usb start
starting USB...
USB0:   USB EHCI 1.00
scanning bus 0 for devices... 4 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
Berry> usb info
1: Hub,  USB Revision 2.0
 - u-boot EHCI Host Controller
 - Class: Hub
 - PacketSize: 64  Configurations: 1
 - Vendor: 0x0000  Product 0x0000 Version 1.0
   Configuration: 1
   - Interfaces: 1 Self Powered 0mA
     Interface: 0
     - Alternate Setting 0, Endpoints: 1
     - Class Hub
     - Endpoint 1 In Interrupt MaxPacket 8 Interval 255ms

2: Hub,  USB Revision 2.0
 - Class: Hub
 - PacketSize: 64  Configurations: 1
 - Vendor: 0x0424  Product 0x9514 Version 2.0
   Configuration: 1
   - Interfaces: 1 Self Powered Remote Wakeup 2mA
     Interface: 0
     - Alternate Setting 0, Endpoints: 1
     - Class Hub
     - Endpoint 1 In Interrupt MaxPacket 1 Interval 12ms
     - Endpoint 1 In Interrupt MaxPacket 1 Interval 12ms

3: Vendor specific,  USB Revision 2.0
 WDC-150SU2M ?凪i}・己O
 - Class: (from Interface) Vendor specific
 - PacketSize: 64  Configurations: 1
 - Vendor: 0x056e  Product 0x4008 Version 0.0
   Configuration: 1
   - Interfaces: 1 Bus Powered Remote Wakeup 500mA
     Interface: 0
     - Alternate Setting 0, Endpoints: 3
     - Class Vendor specific
     - Endpoint 1 In Bulk MaxPacket 512
     - Endpoint 2 Out Bulk MaxPacket 512

usb startとusb infoでUSBデバイスのj情報が取得できていることがわかります。

◆Linuxの構築

Linuxの構築はセミナーで説明したとおりにやれば、USBやWiFiが使えるようになりますが、それに加えてHDMI出力を有効にするために、Drivers→Graphics Support→Frame Buffer Driversの中のSimple framebuffer supportを有効にします。

Fb

これで画像出力対応になります。

これで、Linuxの起動時にペンギンの絵が出るようになります。

Linuxfb

◆リッチなLinuxの構築

まずは、Linaro Ubuntuのイメージをとってきます。

http://www.tokudenkairo.co.jp/cosmoz/files/cosmoz-ubuntu12.img

から、ZYNQ用のLinaro Ubuntu 12のイメージをとってきて、Win32DiskImagerでSDカードに書き込みます。

そして、第一パーティションに、devicetree.dtb、u-boot.rgba、uEnv.txt、uImageを入れます。

このSDカードで起動すれば、ZynqBerryでLinaro Ubuntu 12が起動するはずです。

そうしたら、/etc/resolv.confを削除し、/etc/hostnameを書き換えてホスト名を決めてください。そして、決めたホスト名が127.0.0.1をさすように/etc/hostsも設定してください。

127.0.0.1       zynqberry

Linuxが起動したときの画面を下の図に示します。

Zb_linux

こうして、めでたくZynqBerryでリッチなUbuntu Linux 12が起動します。

コンソールからも使えますが、キーボードやマウス、HDMIをなぐとパソコンのようになります。

Zb_linux1 Zb_linux2

フレームバッファというのは単純にメモリの内容を画像として出力するだけのもので、アクセラレータもないので、とても遅いです。GUIでさわるともっさりもっさりした動作ですが、RaspBerry Pi2くらいの速度は出ているように思えます。コンソールからのアクセスならばそんれほど遅さは感じません。

ビルド済みのBoot.binは下記のURLにアップロードしました。

また、Linuxの起動に必要なビルド済みのSDカード内容は下記のURLにアップロードしました。

Ubuntu Linuxのイメージはこちらです。

これで、ZYNQで動くリッチなLinuxがご堪能いただけると思います。

| | コメント (0)

2017.12.14

火鍋

◆これから書く

| | コメント (0)

2017.12.13

Trenz&ZYNQセミナーを開催しました

秋葉原の駅前のビルで、「Trenz製品&ZYNQセミナー」を開催しました。ご来場いただいた皆様、ありがとうございました。

反省点としてはいっぱいあるのですが、とにかく時間が足りなくて、最初の1時間は早口で環境構築の話を説明してしまい、手を動かす時間がほとんどなかったことです。

アンケートを行ったので、その結果を集計しました。

まず、このセミナーにご来場いただいたのは19名、そのうちアンケートの提出が18名(無記名が4名)でした。

ご参加いただいた目的のほとんどが、ZYNQでLinuxを動かすための情報を知りたかったとのことですが、目的を達成できたかどうかというと・・

Tassei

約50%の人が「はい」と答えてくれました。

「いいえ」の人の理由を見てみると、やはり時間がなくて実際に試せなかったという意見が優勢でした。

それから、このセミナーを少人数で、時間をかけて、テキストも配布するとしたら、いくらの価値があるかという質問は、

Price

半数の方が10000円と答えてくれました。今回のセミナーは無料だったので、印刷した資料を提供する余裕はなかったのですが、今後はサービス品質を向上させた有料のセミナーを目指していきたいですね。

それから、満足度ですが、

Satisfaction

このように、不満と満足がほぼ半々でした。

sun

皆様からいただいた改善点や不満な点を挙げていくと、

  • 手を動かしている時間がない
  • ハンズオン形式でいっしょにやってみたかった
  • ZynqBerryでLinuxが起動できなかった
  • GigaZeeとZynqBerryという複数のHWがあるので混乱
  • アンケートをネットで記入できるようにしてほしい

とう意見がありました。とにかく、急ぎすぎました。これは次回のセミナーでは改善したいと思います。

また今回のセミナーでは紹介しなかったことを聞きたかったという意見では、

  • Linuxカーネル構築の詳細を知りたかった
  • 独自I/Oの作り方を知りたかった
  • PLアクセスの方法が知りたかった

などがありました。このあたりは、今後のセミナーで検討していきます。

最後に、皆様からいただいた良い意見で締めくくりたいと思います。

  • デバイスツリーのあたりが聞けて良かった
  • 無料でここまで対応してくれるのはすばらしい
  • 配布資料がとてもよかった
  • Linuxを立ち上げることができそうなところまで教えていただいた
  • Linuxを動かすための流れが一通りわかった
  • 説明だけでなく、実際に変更したファイルやビルド済みバイナリが公開されていた
  • 予習がしっかりやりやすい
  • 貴重な情報を共有していただき、ありがとうございます

自己評価では40点くらいでした。

次回のセミナーは、今回の反省点を踏まえて改善したものを、2018年1月10日(水)に開催します。12月20日(水)から受付を開始する予定ですので、皆様、どしどしご応募ください。

| | コメント (0)

2017.12.12

GigaZeeでLinuxを動かす方法

◆あとで書く

| | コメント (0)

2017.12.10

セミナー資料3章 Trenzボードの使い方

13日に開催するZYNQ&Trenzセミナーの資料 第3章を公開します。

■ ZYNQ&Trenz製品セミナー第3章 PDF

Sec3

要約します。

この手順を試すために必要なものは、

  • XILINX Vivado 2017.1または2017.2 (2017.2が推奨)
  • Trenz社のプロジェクトファイル

です。

USB-JTAGとVivadoからの認識

まず、Trenz社のZYNQボードにはUSB-UART兼USB-JTAGが乗っています。このUSBのドライバは、パソコンに挿すだけでWindowsが勝手にドライバを探してインストールしてくれます。したがって、最初に挿したら1分ほど放置します。

USB-JTAGのソフトウェアはDigilentからライセンスされているものを使用しているので、動作させるにはDigilent AdeptのRUNTIMEが必要です。Digilent AdeptのRUNTIMEは、

<Vivadoをインストールしたディレクトリ>¥data¥xicom¥cable_drivers¥nt64¥di gilent

にあります。

Sec3_2

Vivadoを起動して、Hardware Managerから認識されれば、成功です。xilinx_tcf/digilent の文字が出て、 ZYNQが認識されているはずです。

Sec3_3

もし、うまくいかない場合は、

  • Degilent adeptがインストールされていない
  • Vivadoのhw_server.exeがゾンビになっている
  • Vivadoよりも先にUSB-JTAG用のCOMポートを先に開いてしまっている

という原因が考えられます。

Vivadoプロジェクトの作成

これができたら、Trenz社のプロジェクトをダウンロードします。

Trenz社のプロジェクトは、Vivadoプロジェクト(xpr)ではなく、ソースコードやXML、Tclなどで与えられています。これを謎スクリプトを使って処理して、Vivadoプロジェクトを生成するというスタイルです。

プロジェクトは、ZynqBerryGigaZee にあります。

プロジェクトファイルをダウンロードし、解凍したら

_create_win_setup.cmd

を実行します。DOSプロンプトが現れるので、1を押します。

様々なコマンドファイルが生成されるので、•design_basic_settings.cmdを開き、XILINXディレクトリへのパス、Vivadoのバージョン、を変更します。

Sec3_4

ボードの型番は、ZynqBerryは3、Gigazeeの1CFは5、GigaZeeの2IFは1です。それから、@set SWAPP=NAを@set SWAPP=u-bootにしておきます。

Vivadoプロジェクトの作成

また、Trenz社のプロジェクトは2017.1用に作られているので、 block_design¥zsys_bd.tcl を開き、25行目の

set scripts_vivado_version 2017.1

set scripts_vivado_version 2017.2

に変更します。

そして、vivado_create_project_guimode.cmdを実行すると、Vivadoのプロジェクトが生成されます。

TclやVHDL、XMLのソースからバッチファイルでプロジェクトを自動生成して、GUIモードで開くさまは圧巻です。

また、こういうボードの写真入りのプロジェクトを作るとか、芸が細かくてニクいですね。

Sec3_5

書き込み

ZynqBerryやGigaZeeに書き込むには、program_flash_binfile.cmdを実行します。

設定が正しければ、下の図のように書き込みが行われます。

Sec3_6

なお、Flash Operation Successfulと出ていれば、そのあとでエラーが出ていても問題ありません。

そうでない場合の原因と対処法については、記事先頭のPDFファイルをご覧ください。

| | コメント (0)

2017.12.09

Linuxカーネル3.17と4.9

◆あとで書く

| | コメント (0)

2017.12.08

1GspsのADCボード

特電のアルバイトさんが、Cosmo-Zに挿す1G ADCの拡張ボードとFPGAを作って、Pythonのキャプチャプログラムまで作ってくれました。

Np1094_1

当初のプリアンプも改造してくれて、設計どおりに450MHz付近で急峻に切れるLPFも動き、歪も少ない素晴らしい1Gsps 14bit 2chのADCに仕上がってきました。

Cosmoz1g

当初の特性は全然ダメで、歪も-40dBくらいあったように思えます。

その原因は、広帯域可変ゲイン作動アンプにありました。シリアルでゲインを可変できるアンプだったのですが、こいつがすべての元凶でした。

下の写真でジャンパでバイパスされているのが、可変ゲインアンプです。

Np1094_2

ただし、可変ゲインアンプと、1段目の作動アンプでは出力インピーダンスが違うようなので、発振してしまったり望の周波数特性が出なかったりという問題はありましたが、抵抗の値をうまく合わせることで所望の特性になったとのことです。

1MHzの正弦波を1GHzでサンプリングした波形を示します。8個の波形が見えますが、1GHz 1chの波形を125MHz 8chにインターリーブしてFPGAに取り込んでいるためです。

ZYNQ的には1GHzのクロックで信号は処理できませんが、125MHzで処理することは容易です。

1mhz

↑8個の波形はほとんど重なっています。

次の波形は10MHzの正弦波を1GHzでサンプリングしたものです。8個のチャネルが少しずつずれています。

10mhz

最後は100MHzの波形を1GHzでサンプリングしたものです。

100

ぐちゃぐちゃっとしていますが、つなげていけば、周期10の正弦波になっているのでしょう。

| | コメント (0)

«ZYNQセミナーの資料 第1章