Java プログラムから HDL を生成し FPGA 上の HW にするための
プロジェクト JavaRock を使用しサンプルプログラムを実行する手順について記載します。
最新版のコンパイル済み JavaRock は javarock_20130708.jar 、
サンプルコード一式は samples_20130707.tar.gz です。
http://sourceforge.net/projects/javarock/files/20130708/
Ubuntu 12.04(32bit版)インストール後以下のパッケージをインストールします。
$ sudo apt-get install build-essential $ sudo apt-get install openjdk-7-jdk
javarock_20130708.jar を配置した PATH を環境変数JAVAROCK に設定します。
$ export JAVAROCK=/home/beat/JavaRock/javarock_20130708.jar
samples/pongをコンパイルします。
samplesディレクトリは/home/beat/JavaRock/samplesに配置しているものとします。
compile_fpga.shに実行権限がなければ実行権限を付与し、実行します。
$ cd JavaRock/ $ ls javarock_20130708.jar samples samples_20130707.tar.gz $ export JAVAROCK=/home/beat/JavaRock/javarock_20130708.jar $ cd samples/pong/ $ ls ButtonIF.java DE2-115 Game.java Top.java acknowledgement.txt compile_fpga.bat compile_fpga.sh $ chmod +x compile_fpga.sh $ ./compile_fpga.sh Compile: ButtonIF Compile: Game Compile: Top pass: connection pass: bypass pass: optimization pass: linkage pass: generate VHDLArrayAccess:getReadSignal: TO => net.wasamon.javarock.model.vhdl.VHDLIdent VHDLArrayAccess:getReadSignal: TO => net.wasamon.javarock.model.vhdl.VHDLIdent VHDLArrayAccess:getReadSignal: TO => net.wasamon.javarock.model.vhdl.VHDLIdent VHDLArrayAccess:getReadSignal: TO => net.wasamon.javarock.model.vhdl.VHDLIdent VHDLArrayAccess:getReadSignal: TO => net.wasamon.javarock.model.vhdl.VHDLIdent VHDLArrayAccess:getReadSignal: TO => net.wasamon.javarock.model.vhdl.VHDLIdent VHDLArrayAccess:getReadSignal: TO => net.wasamon.javarock.model.vhdl.VHDLIdent VHDLArrayAccess:getReadSignal: TO => net.wasamon.javarock.model.vhdl.VHDLIdent VHDLArrayAccess:getReadSignal: TO => net.wasamon.javarock.model.vhdl.VHDLIdent VHDLArrayAccess:getReadSignal: TO => net.wasamon.javarock.model.vhdl.VHDLIdent VHDLArrayAccess:getReadSignal: TO => net.wasamon.javarock.model.vhdl.VHDLIdent VHDLArrayAccess:getReadSignal: TO => net.wasamon.javarock.model.vhdl.VHDLIdent
コンパイル完了後、各classファイルと、vhdファイルが生成されていることが確認できます。
$ ls ButtonIF.class DE2-115 Game.java Top.java compile_fpga.bat game.vhd ButtonIF.java Game.class Top.class acknowledgement.txt compile_fpga.sh top.vhd
Mac OS X Mavericks (10.9.3) でのコンパイルは
JDK7 をインストールすると samples のコードはコンパイル出来るようになります。
OS X 上の標準 java の version を確認すると1.6系のため、1.7系に変更します。
$ java -version java version "1.6.0_65" Java(TM) SE Runtime Environment (build 1.6.0_65-b14-462-11M4609) Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-462, mixed mode)
$ /usr/libexec/java_home -V Matching Java Virtual Machines (2): 1.6.0_65-b14-462, x86_64: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home 1.6.0_65-b14-462, i386: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Oracle JDK の現行版(2014年5月時点)をインストールします。
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
上記 URL から jdk-7u55-macosx-x64.dmg をダウンロード完了後実行し、
インストーラー画面の指示に従ってインストールします。 ~
インストール完了後再度 version を確認します。
$ java -version java version "1.7.0_55" Java(TM) SE Runtime Environment (build 1.7.0_55-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)
$ /usr/libexec/java_home -V Matching Java Virtual Machines (3): 1.7.0_55, x86_64: "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_55.jdk/Contents/Home 1.6.0_65-b14-462, x86_64: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home 1.6.0_65-b14-462, i386: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
JDK7 がインストールされたことを確認しsamples/test/test.shを実行します。
$ cd ~/JavaRock/samples/test $ ./test.sh Compile: counter Compile: led Compile: SC1602Wrapper Compile: SC1602Writer Compile: sc1602_test Compile: echo Compile: rs232c Compile: test pass: connection pass: bypass pass: optimization pass: linkage pass: generate VHDLArrayAccess:getReadSignal: TO => net.wasamon.javarock.model.vhdl.VHDLIdent VHDLArrayAccess:getReadSignal: TO => net.wasamon.javarock.model.vhdl.VHDLIdent
$ ls counter.vhd rs232c.vhd test.class echo.vhd sc1602_test.vhd test.java led.vhd sc1602writer.vhd test.sh rs232c.class sim.VHD test.ucf rs232c.java test.bat test.vhd
正常に実行でき、class ファイルと vhd ファイルが生成されることが確認できます。
仮に Java のバージョンを変更せずに用意が上記test.shを実行すると、
以下のようなエラーが起こります。
$ cd ~/JavaRock/samples/test $ ./test.sh An exception has occurred in the compiler ((version info not available)). Please file a bug at the JavaRock BugTracks (http://sourceforge.net/p/javarock/bugs/) after checking the Bug Parade for duplicates. Include your program and the following diagnostic in your report. Thank you. java.lang.NoClassDefFoundError: javax/lang/model/type/UnionType at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:637) at java.lang.ClassLoader.defineClass(ClassLoader.java:621) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) at openjdk.com.sun.tools.javac.comp.MemberEnter.<init>(MemberEnter.java:95) at openjdk.com.sun.tools.javac.comp.MemberEnter.instance(MemberEnter.java:85) at openjdk.com.sun.tools.javac.comp.Enter.<init>(Enter.java:126) at openjdk.com.sun.tools.javac.comp.Enter.instance(Enter.java:114) at openjdk.com.sun.tools.javac.comp.Check.<init>(Check.java:96) at openjdk.com.sun.tools.javac.comp.Check.instance(Check.java:86) at openjdk.com.sun.tools.javac.code.Types.<init>(Types.java:101) at openjdk.com.sun.tools.javac.code.Types.instance(Types.java:88) at openjdk.com.sun.tools.javac.jvm.ClassReader.<init>(ClassReader.java:264) at openjdk.com.sun.tools.javac.jvm.ClassReader.instance(ClassReader.java:226) at openjdk.com.sun.tools.javac.main.JavaCompiler.<init>(JavaCompiler.java:331) at openjdk.com.sun.tools.javac.main.JavaCompiler.instance(JavaCompiler.java:88) at openjdk.com.sun.tools.javac.main.Main.compile(Main.java:424) at openjdk.com.sun.tools.javac.main.Main.compile(Main.java:353) at openjdk.com.sun.tools.javac.main.Main.compile(Main.java:342) at openjdk.com.sun.tools.javac.main.Main.compile(Main.java:333) at openjdk.com.sun.tools.javac.Main.compile(Main.java:76) at openjdk.com.sun.tools.javac.Main.main(Main.java:61) Caused by: java.lang.ClassNotFoundException: javax.lang.model.type.UnionType at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) ... 30 more
samples_20130707.tar.gz を展開した中身は以下のような構成になっています。
以下のディレクトリのうち、kc705はザイリンクス Kintex-7 FPGA KC705 、
testディレクトリは Virtex-6 FPGA ML605 Evaluation Kit 、microboardは Avnet Spartan-6 LX9 MicroBoard、
zedboard はザイリンクス ZedBoard のテスト用ディレクトリです。
samples ├── altera │ ├── DE2_115.qsf │ ├── DE2_115.v │ ├── Test.java │ ├── Top.java │ ├── mandelbrot │ │ ├── Firefly.java │ │ ├── Mandelbrot.java │ │ ├── SC1602Wrapper.java │ │ ├── SC1602Writer.java │ │ ├── VGAIf.java │ │ ├── VGAJavaTest.java │ │ ├── VGAWrapper.java │ │ ├── compile │ │ │ ├── mandelbrot.sof │ │ │ ├── test.qsf │ │ │ └── test.sof │ │ ├── main.java │ │ ├── sc1602_test.java │ │ ├── test.sh │ │ └── test.v │ ├── mandelbrot.sof │ ├── test │ │ ├── Firefly.java │ │ ├── Mandelbrot.java │ │ ├── SC1602Wrapper.java │ │ ├── SC1602Writer.java │ │ ├── VGAIf.java │ │ ├── VGAJavaTest.java │ │ ├── VGAWrapper.java │ │ ├── main.java │ │ ├── sc1602_test.java │ │ ├── test.sh │ │ └── test.v │ ├── test.qsf │ └── test.sof ├── arith │ ├── arith.java │ ├── assign.java │ └── floating.java ├── array │ ├── BitVectorTest.java │ ├── bitvectortest_sim.VHD │ ├── fill.java │ ├── fillsim.java │ ├── fillsim_sim.VHD │ ├── main.java │ ├── out.vcd │ ├── rx.java │ ├── sum.java │ ├── sumsim.java │ ├── sumsim_sim.VHD │ ├── test.java │ ├── test2.java │ ├── test3.java │ ├── testTest.java │ ├── testtestsim.VHD │ ├── tx.java │ └── work-obj93.cf ├── bench │ ├── BubbleSort.java │ ├── BubbleSortMod.java │ ├── BubbleSortSim.java │ ├── BubbleSortThread.java │ ├── Sieve.java │ ├── SieveMod.java │ ├── SieveSim.java │ ├── SieveThread.java │ ├── bubblesort.sh │ ├── sieve.sh │ ├── simbubble.VHD │ └── simsieve.VHD ├── bf e-trees exStick │ ├── BF.java │ ├── HW.java │ ├── IO.java │ ├── Test.java │ ├── TestHW.java │ ├── compile.sh │ ├── exstick.VHD │ ├── exstick.ucf │ ├── exstick2.ucf │ ├── rs232c.java │ ├── sim │ │ └── IO.java │ ├── sim.VHD │ ├── test.ucf │ └── top.VHD ├── callback │ ├── CallBackTest.java │ ├── Counter.java │ ├── test.ucf │ └── top.v ├── container │ ├── List.java │ ├── Stack.java │ └── Test.java ├── echo │ ├── UpperEcho.java │ ├── echo.java │ └── rs232c.java ├── float │ └── test.java ├── i2c │ ├── I2C_IF.java │ ├── I2C_Master_Wrapper.java │ ├── I2C_Test.java │ ├── SimpleI2C_Wrapper.java │ ├── top.VHD │ └── zedboard.ucf ├── kc705 │ ├── compile.bat │ ├── compile.sh │ ├── rs232c.java │ ├── test.java │ ├── test.sh │ ├── top.VHD │ └── top.ucf ├── led │ ├── Firefly.java │ ├── counter.java │ └── led.java ├── microboard │ ├── button.java │ ├── microboard.sh │ ├── sim.VHD │ ├── test.java │ ├── test.ucf │ └── top.VHD ├── old │ ├── Hoge.java │ ├── MUX.java │ ├── MyString.java │ ├── append.java │ ├── appendsim.java │ ├── arraysim.java │ ├── arraysim2.java │ ├── arraytest.java │ ├── arraytest2.java │ ├── echo0.java │ ├── echo1.java │ ├── put.java │ ├── state.java │ └── step.java ├── pong │ ├── ButtonIF.java │ ├── DE2-115 │ │ ├── DE2-115.qpf │ │ └── DE2-115.qsf │ ├── Game.java │ ├── Top.java │ ├── acknowledgement.txt │ ├── compile_fpga.bat │ └── compile_fpga.sh ├── prime │ ├── Prime.java │ ├── PrimeSim.java │ ├── PrimeThread.java │ ├── sim.VHD │ └── test.sh ├── random │ ├── Random19Wrapper.java │ └── sim.VHD ├── sc1602 │ ├── SC1602Wrapper.java │ ├── SC1602Writer.java │ ├── ml605_sc1602.ucf │ └── sc1602_test.java ├── sformat │ ├── SParser.java │ ├── SParserTest.java │ └── test.dat ├── syntax │ ├── cond.java │ ├── condtest.java │ ├── condtest_sim.VHD │ ├── for_test.java │ ├── for_test_test.java │ ├── for_test_test_sim.VHD │ ├── out.vcd │ ├── private_method.java │ ├── private_method_test.java │ ├── private_method_test_sim.VHD │ ├── public_constant.java │ ├── public_constant_test.java │ ├── public_constant_test_sim.VHD │ ├── subblock.java │ ├── subblock_test.java │ ├── subblock_test_sim.VHD │ ├── sync.java │ ├── sync_test.java │ ├── sync_test_sim.VHD │ ├── thread_test.java │ ├── thread_test_test.java │ ├── thread_test_test_sim.VHD │ ├── type_test.java │ ├── type_test_test.java │ ├── type_test_test_sim.VHD │ └── work-obj93.cf ├── test │ ├── rs232c.java │ ├── sim.VHD │ ├── test.bat │ ├── test.java │ ├── test.sh │ └── test.ucf ├── upl_tx_rx │ ├── Makefile │ ├── UPL32Test.java │ ├── UPL32_RX.java │ ├── UPL32_TX.java │ ├── UPL8Test.java │ ├── UPL8_RX.java │ ├── UPL8_TX.java │ ├── simpledualportram.VHD │ ├── upl32_sim.VHD │ ├── upl8_sim.VHD │ ├── vhdl_upl32_rx_wrapper.VHD │ ├── vhdl_upl32_tx_wrapper.VHD │ ├── vhdl_upl8_rx_wrapper.VHD │ ├── vhdl_upl8_tx_wrapper.VHD │ ├── vhdl_upl_rx.VHD │ └── vhdl_upl_tx.VHD ├── vgatest │ ├── VGAIf.java │ ├── VGAJavaTest.java │ ├── VGAWrapper.java │ ├── sramiface.VHD │ ├── swing │ │ └── VGAIf.java │ ├── vga.VHD │ ├── vgaclk.VHD │ ├── vgagen.VHD │ └── vgaiface.VHD ├── vhdl │ ├── arraytop.vhd │ ├── bitvector.vhd │ ├── blockram.vhd │ ├── button.vhd │ ├── clk_div.vhd │ ├── distributedram.vhd │ ├── ml605.ucf │ ├── rs232c_rx.vhd │ ├── rs232c_tx.vhd │ ├── sim.vhd │ └── simpledualportram.vhd ├── wait-notify │ ├── Consumer.java │ ├── NoWait.java │ ├── NoWait2.java │ ├── NoWait2Test.java │ ├── Producer.java │ ├── Simulation.java │ ├── Test.java │ ├── nowait2_sim.VHD │ └── nowait_sim.VHD └── zedboard ├── FPGAMain.java ├── HDMI_1280_720_Wrapper.java ├── LED.java ├── compile.sh ├── i2cmem ├── top.VHD └── zedboard.ucf 32 directories, 232 files
2014/05/26 初稿公開