VirtualBox上のCentOS7でQuartus Primeを動かすためのVagrant Boxの使い方

タイトルが長すぎますね。反省。

作ったもの

概要

Quartus PrimeはMac向けのバイナリはない。そのため、Macで無理やり開発をするためには、VM上のWindowsLinuxにインストールする必要がある。

VM上のCentOS7にQuartus Primeを入れるためには、いろいろなパッケージやVirtualBox Guest Add-on を入れたりする必要がある。 これが面倒なので、それらの事前準備をすべて終えた状態のBoxを作成した。

Quartus Primeはインストールされていないので、以下の手順でインストールする必要がある。(容量とライセンスの関係から入れなかった。)

検証環境

手順

準備

事前に Oracle VM VirtualBoxVagrant by HashiCorp をインストールしておいてください。

また、事前にQuartus Prime Lite のLinux版を http://dl.altera.com/?edition=lite からダウンロードしておいてください。

さらに、以下のコマンドを実行して、Vagrantにscpのpluginをインストールしてください。

vagrant plugin install vagrant-scp

VMを作成・起動

適当なディレクトリで以下を実行(初回は仮想マシンイメージをダウンロードするので、ネットワーク接続のよいところで実行してください!)

git clone https://github.com/hikalium/centos-quartus.git
cd centos-quartus
vagrant up

QuartusのパッケージをVM内に転送する

vagrant scp <Quartus-lite-xxx.tarのパス> /home/vagrant/

ちょっと時間がかかります。

Quartusを展開してインストー

vagrant ssh
  • 以下はsshで接続したVM内での作業
tar -xvf <Quartus-lite-xxx.tar のファイル名>
./setup.sh
  • とりあえずEnterを連打して、ライセンスの条文を読む。
  • Do you accept ~?と出てきたら、yと入力してEnter
  • そのあとはすべてEnterでOK
  • インストールが開始する(少し時間がかかる)
  • インストールが終了したら、 「Launch Quartus ~ ?」だけはnと入力し、それ以外はyもしくは単にEnterでOK
  • VMGUI画面のデスクトップに、Quartusが追加されていたら成功です!

Verilog-HDLで算術右シフトを書く方法

結論

以下のように書けばよい。

重要な点は、signed>>>である。

何をどう勘違いしていたのか

算術右シフトをVerilog-HDLで書けるのか調べていたところ、以下の記事にぶつかった。

d.hatena.ne.jp

この記事では、>>>を使用すれば、算術シフト、>>を使用すれば論理シフトになるかのように読み取れる。

しかし、>>>を使用しても、私の手元では算術シフトにならず、論理シフトとして扱われていた。

当初、私はこれをエミュレータのバグではないかと疑っていた(icarus-verilogを使っていたため)。

しかし、Quartus付属のModelSimでも同様の動作であったため、これは根本的にコードが間違っているということに気づいた。

そして、以下のような記事を発見した。

FPGAの部屋 Verilog HDL で unsigned, signed の演算をする1

やはりいつも最後にはmarseeさんの情報にたどり着く。この記事には、算術右シフトのことについては触れられていなかったが、もしかしてと思ってsignedとつけたら、うまく動作した。

結論

  • Verilog-HDLでは標準で符号なしなので、符号ありとして扱いたい場合はsignedをつける
    • 符号なしの値に対して>>>を使ったら警告くらい出してくれてもいいのに…(気づかなかっただけか?)
  • 私は無知すぎる
  • エミュレーターを疑う前に自分の頭を疑うべき
  • やはり http://marsee101.blog19.fc2.com/ の情報は有用なのでもっと読むべき

CentOS7でModelSimが起動しない問題の解決策

結論

以下のライブラリが不足しているので入れればよい。

sudo yum install libX11-devel.i686 libXext-devel.i686 libXft-devel.i686 ncurses-libs.i686

現象

Tools -> Run Simulation Tool -> RTL Simulationを選択すると、以下のエラーメッセージが出て起動しない。

ライセンス関係やパス、環境変数の問題に見えるが、実際はそうではなかった。

原因追求

エラーメッセージに記載のログファイルを開いたところ、modelsim_ase/bin/vsimを実行しようとして落ちていることまでわかった。そこで直接これを実行したところ、ライブラリが見つからない旨表示された。

指定されたライブラリを以下のコマンドで探索した。

yum whatprovides */libname

見つかったパッケージを.i686をつけてinstallし、再度vsimを起動させることを数回繰り返した結果、起動するようになった。

結論

  • yum whatprovides */libnameはめっちゃ便利
  • レポートは早めにやろう

QuartusのプロジェクトをGitで管理する

意外にも日本語の情報が少なかったので書いた。

QuartusのようなIDEが作ってくれるプロジェクトをGitで管理する場合、問題になるのは、どこまでが自動生成のファイルで、どこからが自動生成ではないファイルなのか、というところである。

端的に言うと、.gitignoreをどう書けばいいのか、という情報を知りたいわけだ。

quartus project gitで検索をかけたところ、Alteraのフォーラムなどで同じことを考えている人がたくさんいることは発見した。

また、altera wiki に以下のようなページがあった。

Version Control - Altera Wiki

さらに、GitHubで良さげな.gitignoreを書いている人も見つけた。

github.com

というわけで、上の二つの資料を参考に.gitignoreを書けば幸せになれそうだ。

最初の一歩:FPGAでLチカ(2)

はじめに

この記事は以下の記事の続きです。

hikalium.hatenablog.jp

Verilog HDLのソースファイルを作成しよう

というわけで、次はついにVerilog HDLのソースを書いてゆきます。

File->New のメニューからVerilog HDL Fileを選択します。

f:id:hikalium:20170528160243p:plain

すると、Verilog1.vというファイルが開かれた状態になります。

f:id:hikalium:20170528160255p:plain

とりあえず、ここに以下のソースを打ち込んでみてください。

できましたか?

VirtualBoxを使っている方は、デバイス->クリップボードの共有->双方向のチェックを入れると、ホストOSでコピーしたものを貼り付けられるので覚えておいてください。

では、このファイルを保存します。Ctrl-SもしくはFile->Saveを押してください。

f:id:hikalium:20170528160312p:plain

すると、ファイルの保存先を聞かれます。保存先ディレクトリがプロジェクトのルートディレクトリ、ファイル名がled.vとなっていることを確認して、Saveを押してください。

これでソースファイルはできあがりました!

とりあえずコンパイルしてみよう

では、今打ち込んだソースをコンパイルしてみます。

Ctrl-LもしくはProcessing->Start Compilationを押してください。

f:id:hikalium:20170528160332p:plain

すると、左下のTasksというところの進捗状況が進んで、下のMessagesウィンドウに色々と流れてきます。

全部うまくいくと、こんな感じになります。

f:id:hikalium:20170528160344p:plain

次は、ピン割り当てをしましょう。

ピン割り当てをする

先のコンパイルで、FPGA内に論理回路を構成することはできました。しかし、これだけでは使い物になりません。

というのも、FPGAにはたくさんのピンがあるわけですが、どのピンに論理回路のどの入出力を割り当てるのか、Quartusさんは知りません。なので、内部の論理回路は正しくても、FPGAの外の世界と正しくつながっているかは、神のみぞ知る、といった状態です。それでは困りますよね。

今回の場合は、2つのLED(led1, led2)と1つのスイッチ(btn)、そして1つのクロック信号(clk)が必要ですから、その4つの信号を適切なピンに割り当てなければいけません。 そうしないと、意図したLEDが光らなかったり、スイッチだと思ったらLEDだったり、下手をするとショートして回路が壊れてしまったりするわけです。

ちなみに、この指定をしないでコンパイルした場合(さっきのコンパイル)は、Quartusさんが都合のいいように適当にピン配置を決めてくれてしまいます。 では早速、Quartusさんに適切なピン配置を教えてあげましょう。

Assignments->Pin Plannerを開いてください。

f:id:hikalium:20170528160519p:plain

すると、このような画面が出てきます。上半分にでている大きな正方形は、FPGAのイメージです。

そして、下の方にある表が、ピン配置の表です。Node Nameが、先ほど打ち込んだソース上での信号名を指しています。そして、今回設定するのはLocationの列です。

ここで、今回のボードにおける、各ピンとその先につながっているデバイスの表を見てみましょう。

ピン番号 つながっているもの
23 クロック(50MHz)
88 プッシュスイッチ1
87 LED1
86 LED2

なるほど。では早速これをPin Plannerで設定してゆきましょう!

といっても、作業は非常に単純です。変更したいLocationのセルをダブルクリックして、横に出てくる下矢印を選択すると、選択可能な信号の一覧が出てきます。この中から、適切な信号を選ぶだけです。

f:id:hikalium:20170528160550p:plain

すべて設定すると、こんな感じになります。できあがったら、Pin Plannerは閉じてしまってかまいません。

f:id:hikalium:20170528160603p:plain

再度コンパイルする

元の画面に戻ってくると、左側のTasksウィンドウに?がたくさん浮かんでいることに気づきます。これは、ピン配置を変更したため、配置配線(Place & Route)からやり直す必要があるためです。

というわけで、もう一回コンパイルしてあげましょう。

うまくいけば、また全て緑のチェックマークになります。

次はついに書き込みです!

FPGAに書き込む!

ここまでの手順で、FPGAに書き込むデータまでは完成しました!もうあとは書き込むだけです。

Tools->Programmerを開いてください。

f:id:hikalium:20170528160648p:plain

この段階で、USB BlasterをPCに接続し、FPGAボードの電源もオンにしておきましょう。

Virtual Boxを使っている方は、デバイス->USB->Altera USB Blasterにチェックを入れておきましょう。これにより、仮想マシンにUSB Blasterが接続されます。

次に、左上のHardware Setup ...ボタンを押してください。ここで、どの書き込み器を使用するか選択します。

f:id:hikalium:20170528160708p:plain

Available hardware items のところに、USB-Blasterという表示があれば、その名前をダブルクリックしてください。すると、その書き込み器が選択された状態になります。

f:id:hikalium:20170528160802p:plain

何も出てこない場合は、接続やVirtualBoxの設定等を確認し、Hardware Setupのウィンドウを再度開いたり、根気よく試してみてください。

どうしてもだめな場合は、書き込み器が壊れている場合があります(私も壊れたUSB-Blasterに当たってしまって困り果てました…)。

さて、うまくいったら、Hardware Setupのウィンドウは閉じてOKです。

次に、左にあるAuto Detectというボタンを押しましょう。

ここでも、よくコケます。根気よくいきましょう…。

うまくいくと、エラーが出ずにAuto Detectが終了します。

そうしたら、左上のStartというボタンを押して、書き込みましょう!

f:id:hikalium:20170528160733p:plain

うまくいけば、右上のProgressが100%(Successful)になり、ボード上ではあなたの書いたプログラムが動いています!!!

ちなみに、こんな感じに動けばOKです。

おつかれさまでした!これでもうなんでも作れますね!(さすがにきつい…。)

最初の一歩:FPGAでLチカ(1)

プログラミング入門で最初にやることといえば、皆さんご存知、Hello, worldですよね!

でも、Hello, worldをFPGAでするのはすごくたいへんです。そもそも、文字表示をどうやって実現するか、そこから考えなければいけません。(まあ後でやりますが。)

というわけで、今回は電子回路でよくやるHello, worldこと、Lチカをやってみたいと思います。

まあ、回路的にはほぼ意味なんてありません。Quartusの使い方に慣れる練習とでも考えてください。

とりあえずやってみよう

ひとまず、Quartusを起動してください。

初回起動時には、以下のような画面が出るかもしれません。

f:id:hikalium:20170524233619p:plain

これは、ライセンスファイルがあるなら指定してね、という画面ですが、私たちは今回無料版で突き進んでゆくので、真ん中のRun the Quartus Prime softwareを選んでOKを押しましょう。

プロジェクトを作成する

さて、起動したら、真ん中のHomeのタブにあるNew Project Wizardというボタンを押してください。

f:id:hikalium:20170525003857p:plain

すると、以下のようなウィンドウが出てきます。

f:id:hikalium:20170525004003p:plain

まあ黙ってNextを押しましょう。

f:id:hikalium:20170525004042p:plain

次に出てきたのは、プロジェクトファイルの保存先を指定する画面です。

一番上には適当なディレクトリへのパスを入力しておいてください。存在しない場所を指定した場合は、作成しますか?とNextを押した際に出てきますので、Yesを押してあげてください。

真ん中には適当にledとでも入れておきましょう。

次はなんでしょうか。

f:id:hikalium:20170525004339p:plain

プロジェクトの種類を指定してくださいとのことです。今回はデフォルトのEmpty projectで大丈夫です。次に行きましょう。

f:id:hikalium:20170525004518p:plain

既存ファイルをここで追加できます。でも、今は既存のファイルなんてありませんのでスキップです。次へ。

f:id:hikalium:20170525004601p:plain

この画面は重要です!書き込み先のFPGAの型番をQuartusに教えてあげます。

これは、みなさんの使うボードに合わせて設定してほしいのですが、今回はEP4CE6E22C8NというFPGAが載ったボードをつかっているので、その場合で説明しましょう。

f:id:hikalium:20170525010131j:plain

このFPGAはCyclone IV Eファミリですから、左上のDevice familyはCyclone IV Eを選びます。

そして、右下のName filterに、チップの型番を入れてゆきます。

EP4CE6E22C8まで入れると、下のAvailable devicesのリストに、それっぽいチップが出てきました! もう一つLがついたチップもありますが、どうもコア電圧が低いやつみたいなので、上でよさそうです。

というわけで、これを選択してNextを押します。

f:id:hikalium:20170525005530p:plain

ツールの設定です。これもデフォルトで問題ありません。次へ。

f:id:hikalium:20170525005610p:plain

作成予定のプロジェクトの概要が表示されました。これで大丈夫そうです!Finishを押しましょう。

すると、ウィンドウが閉じて先ほどの画面に戻ります。

f:id:hikalium:20170525005725p:plain

これでプロジェクトの作成は完了です!

ちょっと長くなってしまったので、続きは別記事で。

hikalium.hatenablog.jp