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を書けば幸せになれそうだ。

CentOS7でXのキーマップが日本語にならなくてつらいとき

  • Xのキーマップは独立してるということを忘れてはいけない(2行目)
localectl set-keymap jp106
setxkbmap jp -model jp106

最初の一歩: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

Mac OSX上にCentOS7の仮想マシンを建ててQuartus Prime Lite 17.0をインストールしよう

FPGAを触ってみたいと思ったときに最初の障壁になるのは、「どのFPGAを買えばいいのかわからない!」だと思うのですが、次の大きな障壁といえば、開発環境の構築ではないでしょうか。

というのも、大抵のFPGA開発環境は、WindowsLinuxには対応しているのですが、Macには対応していません。これはつらい!

ということで、今回はVM上に建てたCentOSにQuartus Primeを入れることで、MacでもなんとかFPGAの開発環境を手に入れることを目標としました。

検証環境

この記事の内容は、以下の環境で検証しました。

  • ホストPC

    • macOS Sierra (10.12.4)
    • 8GB メモリ
  • ゲストOS

ちなみに、Quartus Primeのインストールで14GB程度の領域を消費しましたので、VMのイメージ等も含めると、30GB程度の空き容量は確保しておいた方がよさそうです。

楽をしたい人向けの情報

このページの一番下を読んでください。

手順

以下の手順は、

  • 時間が十分にあるときに
  • 高速で安定したインターネット接続がある場所

で行ってください。特に、Quartus Primeのダウンロードは長丁場になることが予想されるため、十分に注意してください。

ノートPCの方は、電源の確保も忘れずに!

まずはVagrantCentOS 7の仮想マシンを建てる

とりあえず、Vagrantの設定ファイルを保存するフォルダ centos-quartus を作成して移動しましょう。

mkdir centos-quartus
cd centos-quartus

このフォルダで、Vagrantを使用して仮想マシンを建てます。 今回はCentOS 7を使用しますので、以下のコマンドを実行してください。

vagrant init centos/7

そして、仮想マシンを起動します。 はじめてこのコマンドを実行する際は、仮想マシンのイメージをインターネットから取得してくるため、ネットワーク接続の安定したところで、時間のあるときにやりましょう。

vagrant up

そこそこ時間がかかるのでのんびり待ちます。

うまくいったら、とりあえず仮想マシンssh接続してみましょう。

vagrant ssh

プロンプトが[vagrant@localhost ~]$となれば、成功です!

Quartus Primeをインストールするために必要なパッケージを入れる

sudo yum groupinstall "GNOME Desktop"

途中で2回くらいIs this ok?と聞かれますので、内容を確認してyと答えてEnterを押してあげてください。 これまた少し時間がかかります。

インストールが終わったら、OSの起動時にGUIが立ち上がるように設定します。

sudo systemctl set-default graphical.target

あと、Quartusの動作に必要なので、libpng12も入れましょう。

sudo yum install libpng12

最後に、32bitのバイナリを実行できるようにi686glibcを入れます。(これがないとQuartusのインストールが走らない。)

sudo yum install glibc.i686

ここまでできたら、いったんVMの電源を切ります。一度exitしてホストに戻ってから、haltします。

exit
vagrant halt

電源が切れたら、Vagrantfileの設定を変更します。以下にdiffを示します。

@@ -49,13 +49,13 @@ Vagrant.configure("2") do |config|
   # backing providers for Vagrant. These expose provider-specific options.
   # Example for VirtualBox:
   #
-  # config.vm.provider "virtualbox" do |vb|
+  config.vm.provider "virtualbox" do |vb|
   #   # Display the VirtualBox GUI when booting the machine
-  #   vb.gui = true
+     vb.gui = true
   #
   #   # Customize the amount of memory on the VM:
-  #   vb.memory = "1024"
-  # end
+     vb.memory = "2048"
+  end
   #
   # View the documentation for the provider you are using for more
   # information on available options.

変更しているところは、vagrant upをした際に、VirtualBoxGUIを表示するか否かと、仮想マシンのメモリ容量の部分です。

メモリ容量については、各自のマシンに合わせて適宜増やしてください。

変更が終わったら、再度VMを起動します。

vagrant up

任意:Virtual Box Guest Addonsを入れる

以下の記事が参考になります。

qiita.com

Quartus Prime Liteをダウンロードする

以下のURLからダウンロードしてください。

http://dl.altera.com/?edition=lite

可能であれば、VM内に直接ダウンロードした方が楽です。firefoxVMにはインストールされているので、それを使いましょう。

もし難しいようであれば、ホスト側でダウンロードしたのち、ゲスト側にコピーしてください。scpなどを使うとよいでしょう。

この際、myAlteraへのユーザー登録が必須となっているので、アカウントを持っていない方は作成してください。

すごく時間がかかりますが、がんばって耐えましょう。

インストー

VMsshして、ダウンロードしたファイルのある階層に移動してください。

ダウンロードしたファイルがQuartus-lite-17.0.0.595-linux.tarであると仮定して以下の説明を行います。

まず、tarを展開します。

tar -xvf Quartus-lite-17.0.0.595-linux.tar

展開されたファイルに含まれているsetup.shを実行します。(このとき、sudoをつけてはいけない!rootのホームディレクトリにインストールされてしまう。)

./setup.sh

すると、インストールがconsole modeで開始します。

とりあえずEnterを連打してください。

Licenseの文面が表示されるので最後まで目を通してあげると、Do you accept this license? [y/n]:と聞かれます。 問題がなければ、yと答えてあげてください。

この後の選択肢は全て、デフォルトのままで問題ありません。ですから、ひたすらEnterを連打してください。

すべて選択し終えると、インストールが始まります。 ゆっくり待ちましょう。

インストールが終わると、最後にいくつか選択肢が表示されますが、 Launch Quartus Prime Lite Edition [Y/n]: だけはnと回答し、それ以外はデフォルトで(Enterを押せば)OKです。

これでインストールが完了しました!GUIの方をみてみると、たしかにQuartus Primeのアイコンが追加されてますね!

f:id:hikalium:20170522100355p:plain

お疲れ様です…でも面倒だよね。

ということで、Quartus Primeをインストールする直前までの手順を実行した仮想マシンイメージをvagrant経由で配布しております!

Virtual Box Guest Addonsも入れてあるので、クリップボード共有とかもされていて便利です。

https://atlas.hashicorp.com/hikalium/boxes/centos7-quartus

これを使うためのVagrantfileも用意しました!

github.com

というわけで、

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

とすれば、必要なライブラリ等がインストールされたCentOSが立ち上がります。

あとは「ダウンロード」と「インストール」の項にしたがって、Quartusをインストールしてください。

Macユーザーのみなさんも、これで一緒にバリバリFPGAを使いたおしましょう!