[[DE0-Nano]] ~


#contents

* DE0-Nano/Synthesijer [#c664fa6b]
JavaRock の後継プロジェクトの [[Synthesijer>http://synthesijer.sourceforge.net/]] の synthesijer_samples-20140818 を ~
Terasic 社製 FPGA ボード DE0-Nano 上で動作させる手順について記載します。 ~
~
本稿の大まかな流れ、Quartus のバージョンなど一部項目については [[DE0-Nano/JavaRock]] と重複しています。~
~
本稿の大まかな流れは以下のとおりです。~
~
- ホストマシン上の構成 ~
Windows PC 上に Virtul Machine(Ubuntu 12.04LTS、64bit版)を作成し作業を行います。 ~
(Ubuntu 12.04LTSのインストールについては本稿では省略します) ~
また Windows、Ubuntu 上で使用しているアプリケーションの概要について記載しています。 ~
~
- Ubuntu の設定とファイル編集 ~
Ubuntu上での開発ツールのインストールや、DE0-Nano を動作させるための ~
変更点などについて記載しています。 ~
~
- DE0-Nano への書き込み ~
Synthesijer のサンプルを DE0-Nano 上で実行する手順について記載してます。 ~
~
** ホストマシン上の構成 [#jd4ef5c5]
本稿のホストマシン上の構成について記載します。 ~
使用する OS と主なアプリケーションは以下のとおりです。 ~
~
また本稿の作業はほぼ Ubuntu 12.04LTS(64bit版)上で行っています。 ~
~
OS: ~
~
- ホストOS: Windows7 (64bit版、以降 Windows と記載します) ~
- ゲスト OS: Ubuntu 12.04LTS(64bit版、以降 Ubuntu と記載します) ~
~
アプリケーション: ~
~
- VMware Player (Windows) ~
- DE0-Nano System Builder (Windows) ~
- Quartus II 12.0sp1 (Ubuntu、以降Quartusと記載します) ~
~

VMware Player 上に Ubuntu のイメージを作成します。 ~
ディスク容量は20GBとしています。 ~
~
DE0-Nano System Builder は Terasic社から提供されている DE0-Nano の qpf(プロジェクトファイル)、~
qsf(ピンアサイン等の設定ファイル)を作成するためのアプリケーションです。~
~
また DE0-Nano System Builderは Windows 上でのみ実行可能です。~
~
Quartus は ALTERA 社から提供されている FPGA 、CPLD などのデザイン開発ツールです。 ~
~
Quartus は Ubuntu 上にインストールします、本稿でのバージョンは12.0sp1を使用しています ~
これは DE0-Nano/JacaRock で使用しているバージョンとあわせるためです。 ~
~
** Ubuntu の設定とファイル編集 [#j1949d65]
Ubuntu の設定とファイル編集について記載します。~

*** 開発ツールのインストール [#jcddb250]
Ubuntu 上に Quartus をインストールするために以下の開発ツールを ~
インストールします。 ~
~

 $ sudo apt-get install build-essential ia32-libs

ia32-libs は Quartus の各バイナリが 32bit版のためインストールしています。 ~
~
下記 Java SE、Synthesijer、Quartus の配置、インストールは /home/beat ディレクトリで ~
行っていますが、適宜変更してください。~
~
Synthesijer を動作させるために Java SE 7u67 をインストールします。 ~
Oracle の Web ページから Linux 版の Java SE 7u67 をダウンロードしアーカイブを展開します。~
~

 $ tar xvfz jdk-7u67-linux-x64.tar.gz

注:Synthesijer のWeb では Java SE 7 and later と記載がありますが  ~
synthesijer-20140818.jar では Java8 で使用するとアノテーションエラーがでるため ~
Java SE 7u67 を使用しています。 ~
~
synthesijer-20140818.jar、synthesijer_samples-20140818.zipを ~
http://synthesijer.sourceforge.net/ からダウンロードします。 ~
synthesijer_samples-20140818.zip は unzip コマンドで解凍します。~
~

 $ unzip synthesijer_samples-20140818.zip

Quartus をインストールします。アーカイブを展開し setup を実行します。~
以降 GUI に沿ってインストールを行ってください。~
~

 $ tar xvfz 12.0sp1_232_quartus_free_linux.tar.gz
 $ cd 12.0sp1_232_quartus_free_linux/
 $ ./setup

また、この状態で Quartus を起動すると下記のエラーが ~
表示されますので~/altera/12.0sp1/quartus/ 以下に linux64 という ~ 
シンボリックリンクを作成します。 ~
~

 $ cd ~/altera/12.0sp1/quartus/
 $ ln -s linux linux64

 *** The Quartus II software cannot be started because the current platform,
     'linux64', does not appear to be installed in:
     '/home/beat/altera/12.0sp1/quartus'.
 
 /home/beat/altera/12.0sp1/quartus/bin/jtagd: 69: exit: Illegal number: -1


作業を行いやすくするため以下の3行を .bashrc の末尾に追加します。 ~

 $ vi .bashrc
 
 export JAVA_HOME=/home/beat/jdk1.7.0_67
 export PATH=$JAVA_HOME/bin:/home/beat/altera/12.0sp1/quartus/bin:$PATH
 export SYNTHESIJER=/home/beat/synthesijer-20140818.jar


*** udevルールの追加と適用 [#j65bca02]
DE0-NanoとUbuntuをUSB接続しプログラミング(イメージの転送)するためのデバイス USB-Blaster を ~
Ubuntu 上で認識させるため udev (自動的にデバイスファイルの作成や削除を行う仕組み)のルールファイルに ~
USB-Blaster 用ルールファイル /etc/udev/rule.dにを51-usbblaster.rules を追加します。 ~
~
また追加のみでは動作しないためルールファイル追加後 udev を再起動します。 ~

 $ sudo vi /etc/udev/rules.d/51-usbblaster.rules
 
 SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="09fb", ATTRS{idProduct}=="6001", MODE="0666", SYMLINK+="usbblaster/%k"

 $ sudo udevadm control --reload-rules

** DE0-Nano への書き込み [#y343e4e7]
synthesijer_samples-20140818 内の quickstart サンプルをビルドし ~
DE0-Nano 上で動作させる手順について記載します。 ~

*** quickstart [#e16cde72]
quickstart は LED が点滅するサンプルです。 ~
Synthesijer の Web ページに記載されているのと同様の手順でビルドします。~

 $ cd ~/synthesijer_samples/sample/quickstart/
 $ java -cp $SYNTHESIJER synthesijer.Main Test.java Top.java
 Output VHDL: Top.vhd
 Output VHDL: Test.vhd
 Output Verilog HDL: Top.v
 Output Verilog HDL: Test.v

DE0-Nano System Builder でプロジェクトファイルを作成します。~
Synthesijer の quickstart に合わせてプロジェクト名は Top にします。 ~
~
#ref(SystemBuilder.png,,60%);  ~


作成したプロジェクトを Ubuntu に移動します。 ~
その際プロジェクトファイル内にある Top.v はリネームしておきます。~
~
Ubuntu 上で Top.qsf をビルドした quickstart のTop.vhd にあわせて以下のように編集します。~
また上記ビルドした Top.vhd、Test.vhd をコピー同じディレクトリにコピーします。~
~

 $ vi Top.vhd
 
 library IEEE;
 use IEEE.std_logic_1164.all;
 use IEEE.numeric_std.all;
 
 entity Top is
   port (
     clk : in std_logic;
     reset : in std_logic;
     flag_return : out std_logic
   );
 end Top;
 ...<略>


 $ vi Top.qsf
 
 ...<略>
 #============================================================
 # CLOCK
 #============================================================
 set_location_assignment PIN_R8 -to clk
 set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to clk
 #set_location_assignment PIN_R8 -to CLOCK_50
 #set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to CLOCK_50
 #============================================================
 # LED
 #============================================================
 set_location_assignment PIN_A15 -to flag_return
 set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to flag_return
 #set_location_assignment PIN_A15 -to LED[0]
 #set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED[0]
 ...<略>
 #============================================================
 # End of pin assignments by Terasic System Builder
 #============================================================
 set_location_assignment PIN_A11 -to reset
 set_instance_assignment -name IO_STANDARD 2.5V -to reset
 set_global_assignment -name VHDL_FILE Test.vhd
 set_global_assignment -name VHDL_FILE Top.vhd
 set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "2.5 V"

Quartus を起動し、File -> Open Project から Top.qpf を選択します。 ~

 $ quartus

#ref(quartus001.png,,60%);  ~

Processing -> Start Complication を押下します。 ~
ここで作成した Project 内の各ファイルのコンパイル(分析・統合)を行います。 ~
注: Warning は大量に表示されますが、特に問題ありません。 ~
~

Assignments -> Pin Planner を押下し、上記変更箇所が反映されていることを確認します。~
~
#ref(quartus002.png,,60%);  ~

Tools -> Programmer を押下します。~
Programmer は作成されたイメージを DE0-Nano にプログラミング(書き込む)ための機能です。 ~
またどのデバイスで書き込むかも選択します。本稿では上記で設定した USB-Blaster を選択します。 ~
~
もし No Hardware と表示されている場合、Hardware Settingsを押下し、 ~
下図のように Currently selected hardware 内の USB-Blasterを選択します。 ~
~
注:USB-Blaster の選択が表示されていない場合は再度追加した ~
udev ルールファイルを確認してください。 ~
~
完了後Programeer 内 Startを押下します。~
これで作成されたイメージを DE0-Nano に転送します。 ~
~
Progress が 100%(Successful)になることを確認し、~
その際 DE0-Nano の LED0が点滅を開始することを確認します。 ~ 

#ref(quartus003.png,,60%);  ~
~
#ref(quickstart.JPG,,20%);  ~

以上で quickstart の動作確認は完了です。~

*** led [#g8fcfe8a]
quickstart と同じく LED が点滅するサンプルです。 ~
led ディレクトリ内に Makefile がありますので make コマンドでビルドを実行します。~

 $ cd ~/synthesijer_samples/sample/led/
 $ make
 java -cp /home/beat/synthesijer-20140818.jar synthesijer.Main led.java counter.java
 Output VHDL: counter.vhd
 Output VHDL: led.vhd
 Output Verilog HDL: counter.v
 Output Verilog HDL: led.v
 javac -cp /home/beat/synthesijer-20140818.jar:. led_top.java
 java -cp /home/beat/synthesijer-20140818.jar:. led_top

DE0-Nano System Builder でプロジェクトファイルを作成します。~
Synthesijer の led に合わせてプロジェクト名は led_top にします。 ~
~
作成したプロジェクトを Ubuntu に移動します。 ~
その際プロジェクトファイル内にある led_top.v はリネームしておきます。~
~
Ubuntu 上で led_top.qsf をビルドした led の led_top.vhd にあわせて以下のように編集します。~
ここでは、exstick.ucf にあるように reset の PIN は配置しません。~
また上記ビルドした led_top.vhd、led.vhd、counter.vhd をコピー同じディレクトリにコピーします。~

 $ vi exstick.ucf
 
 NET reset      LOC = A12  | IOSTANDARD = LVCMOS33;    # "USER_RESET"
 NET reset      TIG;
 
 NET clk        LOC = N7 | IOSTANDARD = LVCMOS33;               # "USER_CLOCK"
 
 NET clk TNM_NET = clk;
 TIMESPEC ts_clk = PERIOD clk 25000 kHz;
 
 NET q LOC = A2 | IOSTANDARD = LVCMOS33;


 $ vi led_top.vhd
 library IEEE;
 use IEEE.std_logic_1164.all;
 use IEEE.numeric_std.all;
 entity led_top is
   port (
     clk : in std_logic;
     reset : in std_logic;
     q : out std_logic
   );
 end led_top;
 ...<略>


 $ vi led_top.qsf
 ...<略>
 #============================================================
 # CLOCK
 #============================================================
 set_location_assignment PIN_R8 -to clk
 set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to clk
 # set_location_assignment PIN_R8 -to CLOCK_50
 # set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to CLOCK_50
 #============================================================
 # LED
 #============================================================
 set_location_assignment PIN_A15 -to field_flag_output
 set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to field_flag_output
 #set_location_assignment PIN_A15 -to LED[0]
 #set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED[0]
 ...<略>
 #============================================================^M
 # End of pin assignments by Terasic System Builder^M
 #============================================================^M
 ^M
 set_global_assignment -name VHDL_FILE led.vhd^M
 set_global_assignment -name VHDL_FILE counter.vhd^M
 set_global_assignment -name VHDL_FILE led_top.vhd^M
 set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "2.5 V"^M

あとは上記 quickstart と同じ手順にて DE0-Nano の動作確認ができます。 ~
~
以下は led サンプルをDE0-Nano で動作させた際の動画です。~

#youtube(ghHBbJ3bLk8);
#youtube(ghHBbJ3bLk8); ~
~
~

*** serial_echo(ToUpper) [#i3f71223]
serial_echo のサンプルには EchoTest(入力文字をそのまま返すサンプル)と ~
ToUpper(大文字で返すサンプル)があります。 ~
ここではToUpper(大文字にするサンプル)について記載します。 ~
~
DE0-Nano には serial port がありませんので GPIO PIN に TX、RX を割り当てます。 ~
またその GPIO PIN に接続するため今回は FTDI CHIP 社製の FT232H を搭載した ~
USB to UART ケーブル C232HD-DDHSP-0 を使用しています。 ~
http://www.ftdichip.com/Support/Documents/DataSheets/Cables/DS_C232HD_UART_CABLE.PDF ~
~
シリアル接続は Windows 上 Teraterm で確認しています。~
(C232HD-DDHSP-0 のドライバインストール、Teraterm のインストールについては省略します) ~

- ソースファイルの修正 ~

serial_echo の以下のソースファイルを修正します。~
注:これは DE0-Nano 用ですので、他の FPGA で同様の修正で動作するかは未確認です。 ~
~
対象の FPGA は DE0-Nano ですので、Makefile を以下のように修正します。~

 $ vi Makefile
 
 VERILOG_SOURCES = $(SOURCES:.java=.v)
 
 all: hdl
 # all: hdl exstick microboard
 
 hdl: $(SOURCES)

ToUpper.java の sys_clk を 50MHz に設定します。 ~

 $ vi ToUpper.java
 
 public class ToUpper{
 
         private final RS232C_RX_Wrapper rx = new RS232C_RX_Wrapper("sys_clk", "50000000", "rate", "9600");
         //private final RS232C_RX_Wrapper rx = new RS232C_RX_Wrapper("sys_clk", "100000000", "rate", "9600");
         private final RS232C_TX_Wrapper tx = new RS232C_TX_Wrapper("sys_clk", "50000000", "rate", "9600");
         //private final RS232C_TX_Wrapper tx = new RS232C_TX_Wrapper("sys_clk", "100000000", "rate", "9600");
 
         public void run(){


修正完了後、make を実行します。 ~

 $ make

上記までと同様にDE0-Nano System Builder でプロジェクトファイルを作成します。~
Synthesijer の ToUpper に合わせてプロジェクト名は ToUpper にします。 ~
~
作成したプロジェクトを Ubuntu に移動します。 ~
その際プロジェクトファイル内にある ToUpper.v はリネームしておきます。~
serial_echoサンプルの clk_div.vhd、rs232c_rx.vhd、rs232c_tx.vhd とビルドした ToUpper.vhdを ~
同じディレクトリにコピーします。 ~
~
Ubuntu 上で ToUpper.qsf をビルドした ToUpper.vhd にあわせて以下のように編集します。~
今回はGPIO[32] を RX、GPIO[33] を TX として割り当てています。 ~

 $ vi ToUpper.qsf
 
 #============================================================
 # CLOCK
 #============================================================
 set_location_assignment PIN_R8 -to clk
 set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to clk
 # set_location_assignment PIN_R8 -to CLOCK_50
 # set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to CLOCK_50
 ...<略> 
 set_location_assignment PIN_D12 -to rx_din
 set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to rx_din
 set_location_assignment PIN_B12 -to tx_dout
 set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to tx_dout
 #set_location_assignment PIN_D12 -to GPIO[32]
 #set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to GPIO[32]
 #set_location_assignment PIN_B12 -to GPIO[33]
 #set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to GPIO[33]
 #============================================================
 # End of pin assignments by Terasic System Builder
 #============================================================
 set_location_assignment PIN_A11 -to reset
 set_instance_assignment -name IO_STANDARD 2.5V -to reset
 set_global_assignment -name VHDL_FILE clk_div.vhd
 set_global_assignment -name VHDL_FILE rs232c_rx.vhd
 set_global_assignment -name VHDL_FILE rs232c_tx.vhd
 set_global_assignment -name VHDL_FILE ToUpper.vhd
 set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "2.5 V"

また、DE0-Nano 上の GPIO[32] に C232HD-DDHSP-0 の TXD にあたるオレンジの端子を ~
GPIO[33] に RXD にあたる黄色の端子を接続します。 ~

#ref(serial.JPG,,20%); ~

後は quickstart と同様に Quartus を起動し Complication の実行、Pin Planner で PIN 配置の確認を ~
行い Programmer からイメージを DE0-Nano に流し込みます。 ~
~
動作確認のため C232HD-DDHSP-0 を接続した Windows 上で Teraterm を起動し対象の COM Port を ~
開き ボーレート 9600 になっていることを確認し a〜z までの文字列をタイプした際、TeraTerm 上で ~
大文字になって表示されることを確認します。 ~

#ref(toupper.png,,80%); ~

以上で serial_echo 内 ToUpper の動作確認は完了です。 ~
~
~

*** serial_echo(EchoTest) [#p13cb264]
serial_echo のサンプルには EchoTest(入力文字をそのまま返すサンプル)と ~
ToUpper(大文字で返すサンプル)があります。 ~
ここではEchoTest(入力文字をそのまま返すサンプル)について記載します。 ~
~
上記 serial_echo(ToUpper) で記載したようにDE0-Nano には serial port がありませんので ~
GPIO PIN に TX、RX を割り当てます。 ~

またその GPIO PIN に接続するため今回は FTDI CHIP 社製の FT232H を搭載した ~
USB to UART ケーブル C232HD-DDHSP-0 を使用しています。 ~
~
シリアル接続は Windows 上 Teraterm で確認しています。~
(C232HD-DDHSP-0 のドライバインストール、Teraterm のインストールについては省略します) ~


- ソースファイルの修正 ~

serial_echo の以下のソースファイルを修正します。~
注:これは DE0-Nano 用ですので、他の FPGA で同様の修正で動作するかは未確認です。 ~
~
対象の FPGA は DE0-Nano ですので、Makefile を以下のように修正します。~

 $ vi Makefile
 
 VERILOG_SOURCES = $(SOURCES:.java=.v)
 
 all: hdl exstick
 # all: hdl exstick microboard
 
 hdl: $(SOURCES)

EchoTest.java の sys_clk を 50MHz に設定します。 ~

 $ vi EchoTest.java
 
 public class EchoTest{
 
         private final RS232C_RX_Wrapper rx = new RS232C_RX_Wrapper("sys_clk", "50000000", "rate", "9600");
         //private final RS232C_RX_Wrapper rx = new RS232C_RX_Wrapper("sys_clk", "100000000", "rate", "9600");
         private final RS232C_TX_Wrapper tx = new RS232C_TX_Wrapper("sys_clk", "50000000", "rate", "9600");
         //private final RS232C_TX_Wrapper tx = new RS232C_TX_Wrapper("sys_clk", "100000000", "rate", "9600");
 
         public void run(){


修正完了後、make を実行します。 ~
注:serial_echo(ToUpper) でmake を実行している場合は ~
make clean を実行してから make を実行してください。~

 $ make

上記までと同様にDE0-Nano System Builder でプロジェクトファイルを作成します。~
Synthesijer の EchoTestTop に合わせてプロジェクト名は EchoTestTop にします。 ~
~
作成したプロジェクトを Ubuntu に移動します。 ~
serial_echoサンプルの clk_div.vhd、rs232c_rx.vhd、rs232c_tx.vhd と ~
ビルド後作成された EchoTest.vhd と top.vhd を同じディレクトリにコピーします。 ~
~
Ubuntu 上で EchoTestTop.qsf をビルドした top.vhd にあわせて以下のように編集します。~
TOP_LEVEL_ENTITY を top に変更し ~
serial_echo(ToUpper) と同じくGPIO[32] を RX、GPIO[33] を TX として割り当てています。 ~

 $ vi EchoTestTop.qsf
 
 set_global_assignment -name TOP_LEVEL_ENTITY "top"
 #set_global_assignment -name TOP_LEVEL_ENTITY "EchoTestTop"
 ...<略>
 #============================================================
 # CLOCK
 #============================================================
 set_location_assignment PIN_R8 -to clk
 set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to clk
 #set_location_assignment PIN_R8 -to CLOCK_50
 #set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to CLOCK_50
 ...<略>
 set_location_assignment PIN_D12 -to rx_din
 set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to rx_din
 set_location_assignment PIN_B12 -to tx_dout
 set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to tx_dout
 #set_location_assignment PIN_D12 -to GPIO[32]
 #set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to GPIO[32]
 #set_location_assignment PIN_B12 -to GPIO[33]
 #set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to GPIO[33]
 #============================================================
 # End of pin assignments by Terasic System Builder
 #============================================================
 
 set_global_assignment -name VHDL_FILE clk_div.vhd
 set_global_assignment -name VHDL_FILE rs232c_rx.vhd
 set_global_assignment -name VHDL_FILE rs232c_tx.vhd
 set_global_assignment -name VHDL_FILE EchoTest.vhd
 set_global_assignment -name VHDL_FILE top.vhd
 set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "2.5 V"

また、上記と同様に DE0-Nano 上の GPIO[32] に C232HD-DDHSP-0 の TXD にあたるオレンジの端子を ~
GPIO[33] に RXD にあたる黄色の端子を接続します。 ~

quickstart と同様に Quartus を起動し Complication の実行、Pin Planner で PIN 配置の確認を ~
行い Programmer からイメージを DE0-Nano に流し込みます。 ~
~
動作確認のため C232HD-DDHSP-0 を接続した Windows 上で Teraterm を起動し対象の COM Port を ~
開き ボーレート 9600 になっていることを確認し入力した文字列が、TeraTerm 上で表示されることを確認します。 ~

#ref(echotest.png,,80%); ~

以上で serial_echo 内 EchoTest の動作確認は完了です。 ~


* 参考文献 [#ub40a974]
三好 健文(2013) 『インターフェース ZERO No.4 Hello World から始める FPGA 入門』 CQ出版社 ~
~

* 更新履歴 [#i6694731]
2014/09/02 項目追加(serial_echo(ToUpper),serial_echo(EchoTest)) ~
2014/08/27 項目追加(led) ~
2014/08/27 初稿公開 ~


RIGHT:syariten


BC::labsへの質問は、bc9-dev @ googlegroups.com までお願い致します。
トップ   新規 一覧 単語検索 最終更新   最終更新のRSS