FC2カウンター FPGAの部屋 Linux

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

enscript でソースコードをHTML にする

今までWindows ではSourceConverter でソースコードをHTML にしてきた。
Ubntu 16.04 を使うようになって、ソースコードのHTML 化をどうするか?考える必要が出てきた。調べてみると enscript というGNU Project のコマンドでテキストをHTML にすることができるようだ。

最初に”[linux] ソースコードをHTMLに変換するコマンド:enscript”を参考にした。
しかしどうも、タブが8キャラクタになってしまう。-T または、--tabsize を設定しても、やはりタブは8キャラクタだった。
出力後のHTML ファイルを見てみるとタブはそのままタブとして出力されていた。
タブをスペースに変換はしてくれないようなので、geany を立ち上げて、文書メニューから「タブを空白で置換」を選択して、タブをスペースに変換した。
C ソースコードをHTML 化するのに使用したコマンドは、
enscript --highlight=cpp --color -C --tabsize=4 -w html -o output.html straight_dataset_bmp.cpp
だった。

また、enscript_cpp というバッチファイルを作って、任意のC ソースコードをHTML に変換できるようにした。enscript_cpp の中身を示す。

enscript --highlight=cpp --color -C --tabsize=4 -w html -o output.html $1


HTML 化したコードには、<pre>タグが使われていて、FC2ブログでは良いのだが、ライブドア・ブログに持っていた時にきちんと表示されるかが心配だ。
enscript を使用したC ソースコードの表示例は、”Ubuntu 16.04 上のVivado HLS 2017.2 でOpenCV を使用したプロジェクトでエラー発生”に貼ってあるので参照のこと。
enscript のヘルプメッセージを貼っておく。

Usage: enscript [OPTION]... [FILE]...
Mandatory arguments to long options are mandatory for short options too.
  -#                         an alias for option -n, --copies
  -1                         same as --columns=1
  -2                         same as --columns=2
      --columns=NUM          specify the number of columns per page
  -a, --pages=PAGES          specify which pages are printed
  -A, --file-align=ALIGN     align separate input files to ALIGN
  -b, --header=HEADER        set page header
  -B, --no-header            no page headers
  -c, --truncate-lines       cut long lines (default is to wrap)
  -C[START], --line-numbers[=START]
                             precede each line with its line number
  -d                         an alias for option --printer
  -D, --setpagedevice=KEY[:VALUE]
                             pass a page device definition to output
  -e[CHAR], --escapes[=CHAR]       enable special escape interpretation
  -E[LANG], --highlight[=LANG]     highlight source code
  -f, --font=NAME            use font NAME for body text
  -F, --header-font=NAME     use font NAME for header texts
  -g, --print-anyway         nothing (compatibility option)
  -G                         same as --fancy-header
      --fancy-header[=NAME]  select fancy page header
  -h, --no-job-header        suppress the job header page
  -H[NUM], --highlight-bars[=NUM]  specify how high highlight bars are
  -i, --indent=NUM           set line indent to NUM characters
  -I, --filter=CMD           read input files through input filter CMD
  -j, --borders              print borders around columns
  -J,                        an alias for option --title
  -k, --page-prefeed         enable page prefeed
  -K, --no-page-prefeed      disable page prefeed
  -l, --lineprinter          simulate lineprinter, this is an alias for:
                               --lines-per-page=66, --no-header, --portrait,
                               --columns=1
  -L, --lines-per-page=NUM   specify how many lines are printed on each page
  -m, --mail                 send mail upon completion
  -M, --media=NAME           use output media NAME
  -n, --copies=NUM           print NUM copies of each page
  -N, --newline=NL           select the newline character.  Possible
                             values for NL are: n (`\n') and r (`\r').
  -o                         an alias for option --output
  -O, --missing-characters   list missing characters
  -p, --output=FILE          leave output to file FILE.  If FILE is `-',
                             leave output to stdout.
  -P, --printer=NAME         print output to printer NAME
  -q, --quiet, --silent      be really quiet
  -r, --landscape            print in landscape mode
  -R, --portrait             print in portrait mode
  -s, --baselineskip=NUM     set baselineskip to NUM
  -S, --statusdict=KEY[:VALUE]
                             pass a statusdict definition to the output
  -t, --title=TITLE          set banner page's job title to TITLE.  Option
                             sets also the name of the input file stdin.
  -T, --tabsize=NUM          set tabulator size to NUM
  -u[TEXT], --underlay[=TEXT]      print TEXT under every page
  -U, --nup=NUM              print NUM logical pages on each output page
  -v, --verbose              tell what we are doing
  -V, --version              print version number
  -w, --language=LANG        set output language to LANG
  -W, --options=APP,OPTION   pass option OPTION to helper application APP
  -X, --encoding=NAME        use input encoding NAME
  -z, --no-formfeed          do not interpret form feed characters
  -Z, --pass-through         pass through PostScript and PCL files
                             without any modifications
Long-only options:
  --color[=bool]             create color outputs with states
  --continuous-page-numbers  count page numbers across input files.  Don't
                             restart numbering at beginning of each file.
  --download-font=NAME       download font NAME
  --extended-return-values   enable extended return values
  --filter-stdin=NAME        specify how stdin is shown to the input filter
  --footer=FOOTER            set page footer
  --h-column-height=HEIGHT   set the horizontal column height to HEIGHT
  --help                     print this help and exit
  --help-highlight           describe all supported --highlight languages
                             and file formats
  --highlight-bar-gray=NUM   print highlight bars with gray NUM (0 - 1)
  --list-media               list names of all known media
  --margins=LEFT:RIGHT:TOP:BOTTOM
                             adjust page marginals
  --mark-wrapped-lines[STYLE]
                             mark wrapped lines in the output with STYLE
  --non-printable-format=FMT specify how non-printable chars are printed
  --nup-columnwise           layout pages in the N-up printing columnwise
  --nup-xpad=NUM             set the page x-padding of N-up printing to NUM
  --nup-ypad=NUM             set the page y-padding of N-up printing to NUM
  --page-label-format=FMT    set page label format to FMT
  --ps-level=LEVEL           set the PostScript language level that enscript
                             should use
  --printer-options=OPTIONS  pass extra options to the printer command
  --rotate-even-pages        rotate even-numbered pages 180 degrees
  --slice=NUM                print vertical slice NUM
  --style=STYLE              use highlight style STYLE
  --swap-even-page-margins   swap left and right side margins for each even
                             numbered page
  --toc                      print table of contents
  --ul-angle=ANGLE           set underlay text's angle to ANGLE
  --ul-font=NAME             print underlays with font NAME
  --ul-gray=NUM              print underlays with gray value NUM
  --ul-position=POS          set underlay's starting position to POS
  --ul-style=STYLE           print underlays with style STYLE
  --word-wrap                wrap long lines from word boundaries

Report bugs to <bug-enscript@gnu.org>.

  1. 2017年07月30日 06:16 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

ikwzm さんの構築したPYNQ ボード用DebianでのPS出力クロックfclkの設定方法

”FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1対応)”を試してみる9(入れ替え2)”を解決する試み。

昨日のFASTX コーナー検出、ラプラシアンフィルタ、アンシャープ・マスクキング・フィルタの回路が動かないと書いたが、ikwzm さんがクロックはどうなっているかと聞いてくれて、それでハッと気が付いた。Zynq のクロックはPSから供給されていて、ビットファイルは関係ない。。。
ikzwm さんから、”Linux でユーザー空間から Zynq の PLクロック信号を制御するデバイスドライバ”を教えて頂いた。いつもありがとうございます。しかし、何でも作ってありますね。。。
更に、今回のFASTX コーナー検出、ラプラシアンフィルタ、アンシャープ・マスクキング・フィルタの回路用の設定も教えてもらった

ikwzm/fclk-install によると、デバイスツリー・オーバーレイを設定する dtbocfg.rb というコマンドがPYNQ ボードのDebian に入っているそうだ。
PYNQ_Linux_ikwzm_95_170414.png

ikwzm/fclk-install の 4 つの DTS ファイルを fclk0-zynq-pynq.dts、fclk1-zynq-pynq.dts、fclk2-zynq-pynq.dts、fclk3-zynq-pynq.dts ファイルとして、~/device_tree_overlay/fclk_install ディレクトリにセーブした。
PYNQ_Linux_ikwzm_96_170414.png

4 つの DTS ファイルのうちの fclk0-zynq-pynq.dts ファイルを示す。なお、これらのファイルはikwzm/fclk-install の fclk0-zynq-zybo.dts ~ fclk3-zynq-zybo.dts のコピーだ。
fclk0-zynq-pynq.dts を示す。

/dts-v1/;
/ {
    fragment@0 {
        target-path = "/amba";
        __overlay__ {
            fclk0 {
                compatible  = "ikwzm,fclkcfg-0.10.a";
                clocks      = <1 15>;
            };
        };
    };
};


fclk1-zynq-pynq.dts は fclk0 が fclk1 に変更されている。
更に、
clocks      = <1 15>;

clocks      = <1 16>;
になっていて、+1 されている。これは、fclk2, fclk3 も同様だ。

さて、 fclk0-zynq-pynq.dts をデバイスツリー・オーバーレイとしてロードしてみよう。
スーパーユーザーになって、次のコマンドを実行した。
dtbocfg.rb --install --dts fclk0-zynq-pynq.dts fclk0
PYNQ_Linux_ikwzm_97_170414.png

シリアル接続のコンソールに fclk0 の表示が出た。
PYNQ_Linux_ikwzm_106_170414.png

/config/device-tree/overlays ディレクトリに fclk0 ディレクトリができた。
PYNQ_Linux_ikwzm_98_170414.png

fclk0 ディレクトリの中には、dtbo と status ファイルがあった。
PYNQ_Linux_ikwzm_99_170414.png

/sys/class/flckcfg ディレクトリには、fclk0 ディレクトリへのリンクがあった。
PYNQ_Linux_ikwzm_100_170414.png

/sys/class/flckcfg/fclk0 ディレクトリの内容を示す。
PYNQ_Linux_ikwzm_101_170414.png

enable, rate, round_rate ファイルをリードした。
PYNQ_Linux_ikwzm_102_170414.png

enable = 1, rate = 100000000 で 100 MHz だった。round_rate は値がおかしいというか、0 Hz の設定値だったら 251.953 KHz だよ、ということなんだろう?と思う。

試しにスーパーユーザーになって、100000000 を設定してみたところ、100000000 になった。
PYNQ_Linux_ikwzm_103_170414.png

試しに
echo 25000000 > rate
で、fclk0 を 25 MHz に設定してみた。
PYNQ_Linux_ikwzm_104_170414.png
  1. 2017年04月14日 05:12 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

”FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1対応)”を試してみる2(Micro SDカードの準備)

”FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1対応)”を試してみる1(FPGA-SoC-Linux のクローン)”の続き。

前回は、FPGA-SoC-Linux をクローンした。今回は、Micro SDカードをフォーマットして、パーティションを切った。

最初に、SDカードフォーマッターでMicro SDカードをフォーマットする。このMicro SDカードはPYNQ用のイメージを書いてあるので、上書きフォーマットで論理サイズ調整 ON でフォーマットする。

SDFormatter V4.0 を起動して、オプション設定ボタンをクリックする。
PYNQ_Linux_ikwzm_15_170325.png

フォーマットオプション設定で、上書きフォーマットと論理サイズ調整 ON を指定してOKボタンをクリックする。
PYNQ_Linux_ikwzm_16_170325.png

フォーマットボタンをクリックし、Micro SDカードのフォーマットを行う。
PYNQ_Linux_ikwzm_17_170325.png

確認ダイアログが出るので、OKボタンをクリックした。
PYNQ_Linux_ikwzm_18_170325.png

しばらくの間、フォーマットしていたが、フォーマットが終了した。
PYNQ_Linux_ikwzm_19_170325.png

次にMicro SDカードにパーティションを作っていこう。
ZedBoard用のUbuntu Linuxをビルド6(SDカードを用意する)”を参考にした。
なお、FPGAマガジン No.5 の第3章”Zynq評価ボードZedBoardでLinuxを動かそう”という石原 ひでみさんの記事の中の48ページの”図17 SDカードのパーティション操作手順”を参考にさせて頂いています。

私の環境はWindows 10 でVirtualBoxを使用して、Ubuntu 16.04 をインストールしてある。
Micro SDカードは、秋月電子で購入した”TOSHIBA マイクロSDカード(microSDHC)EXCERIA 16GB 48MB/s”を使用している。このMicro SDカードは古いカード・リーダー・ライタでは認識できなかった。

Windows 10 のパソコンに挿入した Micro SDカードをVirtualBox 上のUbuntu にマウントするためにVirtualBox のデバイスメニュー -> USB -> USBリーダーの名前(Micro SDカードが装着してある)を選択した。
PYNQ_Linux_ikwzm_20_170326.png

/media/masaaki/1BC2-1630 としてマウントされた。
PYNQ_Linux_ikwzm_21_170326.png

lsblk コマンドを実行して、SDカードを検索した。
PYNQ_Linux_ikwzm_22_170326.png

/dev/sdb がSDカードのようだ。
sudo umount /dev/sdb1 で sdb1 をアンマウントしておく。こうしないと後で w コマンドで書き込むときにエラーになってしまう。
sudo fdisk /dev/sdb コマンドを実行してSDカードのフォーマットを開始した。
PYNQ_Linux_ikwzm_23_170326.png

p コマンドで既存のパーティションを表示した。FAT32パーティションが生成されていた。
d コマンドでパーティションを削除した。
p コマンドで見ると、パーティションが消去されていた。
PYNQ_Linux_ikwzm_24_170326.png

プライマリ・ディスクのパーティション番号1に100 MBの領域を確保する

n コマンドで新たにパーティションを作製した。
p を押して、primary パーティションを指定した。
パーティション番号を 1 にセット。
First sector で、リターンキーを入力した。
Last sector で、+100M を入力して、100 MB の領域を確保した。
p コマンドででパーティションを表示した。
PYNQ_Linux_ikwzm_25_170326.png

プライマリ・ディスクのパーティション番号2に残っている領域(14.3 GB)を確保する
n コマンドで新たにパーティションを作製した。
p を押して、primary パーティションを指定した。
パーティション番号を 2 にセット。
First sector で、リターンキーを入力した。
Last sector で、リターンキーを入力した。
p コマンドででパーティションを表示した。
PYNQ_Linux_ikwzm_26_170326.png

プライマリ・ディスクのパーティション番号1をFAT32にして、ブート可能フラグを付ける
t コマンドを入力した。
パーティション番号に 1 を入力した。
16進コードに、b を入力した。(W95 FAT32)
a コマンドを入力して、ブート可能フラグを付ける。
パーティション番号に 1 を入力した。
p コマンドででパーティションを表示した。
PYNQ_Linux_ikwzm_27_170326.png

SDカードへの書き込み

w コマンドを実行して、今まで設定してきたパーティション情報をMicro SDカードにWrite した。
PYNQ_Linux_ikwzm_28_170326.png

lsblk を行うと、設定したパーティションが sdb1, sdb2 として見えている。
FPGAマガジン No.5 の第3章”Zynq評価ボードZedBoardでLinuxを動かそう”という石原 ひでみさんの記事を参考に、/dev/sdb1 に対して、

sudo mkfs.msdos -n PYNQ_BOO /dev/sdb1

を実行した。(PYNQ_BOOT としたかったが、PYNQ_BOO とタイポしてしまった)
PYNQ_Linux_ikwzm_29_170326.png

PYNQ_BOO がマウントされた。
PYNQ_Linux_ikwzm_30_170326.png

同様に、/dev/sdb2 に対して、

sudo mkfs.ext3 -L ROOT_FS /dev/sdb2

を実行した。(ファイルシステムは ext3 指定だった)
Writing superblocks and filesystem accounting infomation: でリターンを入力した。
PYNQ_Linux_ikwzm_31_170326.png

コマンドが終了した。
PYNQ_Linux_ikwzm_32_170326.png

ROOT_FS がマウントされた。
PYNQ_Linux_ikwzm_33_170326.png

これで、Micro SDカードの用意は終了した。
  1. 2017年03月27日 04:50 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

”FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1対応)”を試してみる1(FPGA-SoC-Linux のクローン)

ikwzm さんの”FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1対応)”を試してみようと思う。

Device Tree Overlay+FPGA Managerが使用できれば、SDSoC でビットストリームとアプリケーションソフトが作れれば、すでに動作しているLinux 上でリブートすること無しにいくらでも試すことができる。”FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1対応)”もこのままの状態で起動したら、Device Tree Overlay+FPGA Managerでハードウェアとそのデバイスツリーを使ってFPGA を使うことができるはずだ。つまりLinux は動作しながら、FPGAでアクセラレーションできるわけだ。という理由でやってみることにした。
参考資料

FPGA+SoC+LinuxでDevice Tree Overlayを試してみた
”FPGA+SoC+LinuxでFPGA Managerを試してみた


まずは、”FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1対応)”で指定されているように、Git LFS(Large File Storage)を自分のVirtualBox 上のUbuntu 16.04 に追加します。
sudo apt-get install git-lfs
PYNQ_Linux_ikwzm_1_170325.png

git-lfs が無いと言われてしまう。
GitHub のgit-lfs/git-lfs の Installation を見るとUbuntu での git-lfs のインストール方法が書いてあった。その手順に従ってUbuntu 16.04 上で git-lfs のインストールを行う。

sudo apt-get install python-software-properties
PYNQ_Linux_ikwzm_2_170325.png

Yをクリックしてインストールを進めると、python-software-properties がインストールできた。
sudo add-apt-repository ppa:git-core/ppa
PYNQ_Linux_ikwzm_3_170325.png

PYNQ_Linux_ikwzm_4_170325.png

ppa をインストールすることができた。
この後で、sudo apt-get update をするように書いてあるが、忘れてしまった。最後にsudo apt-get updatesudo apt-get upgrade を実行しておいたが、これで良いかどうか?よくわからない?

curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
PYNQ_Linux_ikwzm_5_170325.png

sudo apt-get install git-lfs
PYNQ_Linux_ikwzm_6_170325.png

git lfs install
PYNQ_Linux_ikwzm_7_170325.png

これで git lfs がインストールできた。

さて、ikwzm さんのFPGA-SoC-Linux をクローンする。
git clone git://github.com/ikwzm/FPGA-SoC-Linux
cd FPGA-SoC-Linux
ls

PYNQ_Linux_ikwzm_8_170325.png

FPGA-SoC-Linux ディレクトリの下には12個のファイルまたはディレクトリがあった。
PYNQ_Linux_ikwzm_10_170325.png

git checkout v0.3.0
PYNQ_Linux_ikwzm_11_170325.png

git lfs pull
PYNQ_Linux_ikwzm_12_170325.png

FPGA-SoC-Linux ディレクトリの下のファイルまたはディレクトリが 9 個に減った。
PYNQ_Linux_ikwzm_13_170325.png

FPGA-SoC-Linux/target/zynq-pynqz1/boot ディレクトリのファイルを示す。
PYNQ_Linux_ikwzm_14_170325.png

boot.bin や u-boot, デバイスツリーの dts と dtb, uEnv.txt, zImage などが入っていた。
  1. 2017年03月26日 06:01 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

ZYBOのUbuntuでMicro SDのMS DOSの第1パーティションをマウントする

ZYBO で動作しているUbuntu でMS DOS(FAT フォーマット)第1パーティションをマウントできて書き換えられれば、Micro SDカードを外さなくてもBOOT.bin や devicetree.dtb などを書き換えて、再度ブートすることでハードウェアの環境を書き換えることができるだろう?ということでやってみた。

まずは、lsblk でMicro SDの各パーティションの情報を見た。
ZYBO_Ubuntu_mount_1_170113.png

マウント用のディレクトリ zybo_boot を /mnt の下に作成した。mkdir zybo_boot
ZYBO_Ubuntu_mount_2_170113.png

mmcblk0p1 がマウントしたいMS DOS のFATフォーマットのドライブのようだ。これの実体は /dev にあった。
ZYBO_Ubuntu_mount_3_170113.png

起動時に実行される /etc/rc.local にマウント コマンドを書く。 vi /etc/rc.local
ZYBO_Ubuntu_mount_4_170113.png

/etc/rc.local に mount -t vfat -o rw /dev/mmcblk0p1 /mnt/zybo_boot コマンドを書いた。
ZYBO_Ubuntu_mount_5_170113.png

これで、reboot すると、/mnt/zybo_boot にMicro SDカードの第1パーティションのドライブがマウントされた。
ZYBO_Ubuntu_mount_6_170113.png
  1. 2017年01月13日 17:30 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

Linux の C 言語でノンブロッキングキー入力をする

Linux の C 言語でノンブロッキングキー入力をする方法を探していたのだが、「mfumiの日記」さんの「Cでnon-blocking IO」に書いてあったコードで見事、ノンブロッキングキー入力ができました。ありがとうございました。

私のコードではキー入力が見えた方が良いので、エコーバックは除いていないです。
このノンブロッキングキー入力のコードは、「2台の Zybot での隊列走行5(追従走行を試してみた)」の platoon_car1.cpp で使っていて、うまく動いています。
  1. 2016年12月01日 20:34 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

FPGA GO のXiltera ディストリビューションをビルドした

FPGAマガジンNo.12の「第4章 共通カスタムLinuxディストリビューションの開発」をやってみた1”でXiltera のビルドに失敗したので、ひでみさんのFPGA GO の 24 ページの Xiltera ディストリビューションをビルドしてみることにした。

ただし、、ひでみさんのFPGA GO では、Ubuntu 16.04 を使用していたが、私が使用しているのはUbuntu 14.04 だ。

最初の 28 ページの下準備は”FPGAマガジンNo.12の「第4章 共通カスタムLinuxディストリビューションの開発」をやってみた1”でやったのでパスした。

repo もすでにインストールされている。Ubuntu 14.04 では apt-get では repo のパッケージがなかった。

git clone git://github.com/aquaxis/build-xiltera.git
cd build-xitrea
を行った。
XA_Linux_build_8_161108.png

./bulid-xiltera.sh を行った。
XA_Linux_build_9_161109.png

エラーが出て進まない。やはりUbuntu 14.04 ではダメなのかな?
  1. 2016年11月12日 04:28 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0
»