コマンドラインから Quartus II を使った場合のメモ

たまたま Altera の Quartus II を使う機会がったのでメモ。
調べたことはコマンドラインから Quartus II を使う方法と、ピン制約のやり方について。

Introduction to the quartuss II softwareの1章に書かれていることをピックアップして記述する。普段は Xilinx の ISE を使っているので、Xiilnx ではどうなってる、というのを分かる範囲で補足したつもり。

Quartus II を使ったデザイン・フローは、おおまかに分けると、合成 -> 配置配線 -> .sof, .pof ファイル ( Xilinx の bitstream に相当 ) の生成 という感じで手順が分かれる。Xilinx ほどステップは細かく無い。

合成
合成を行うには quartus_map というコマンドを使う。
合成するにあたり、quartus_map はプロジェクトファイル( .qpf, .qsf )というものを必要とするが、プロジェクトファイルが無い場合は quartus_map が勝手に生成してくれる。
プロジェクトファイルには以下の情報がテキストで含まれる:

Xilinx のツールでは .ucf ファイルにピン制約を書くが、quartus II ではプロジェクトファイルにピン制約を書くようだ。
ピン制約情報は必須では無く、現に quartus_map コマンドがプロジェクトファイルを自動生成したときはピン制約情報は含まれない(配置配線の説明でさらに述べる)
コマンドラインから使うには、

quartus_map トップレベルエンティティ名 --part=デバイス名 --source=ソースファイル1 --source=ソースファイル2 ...

のようにして使う。
バイス名は省略可能だが、この場合はデフォルト値として、デバイスファミリ = Cyclone IV GX, デバイス = AUTO ( 意味が良くわからない)が適用されるようだ( Quartus II 10.1 の場合 )


配置配線( prace and route )
配置配線を行うには quartus_fit コマンドを使う。
このコマンドを実行すると配置配線が行われるが、同時にプロジェクトファイル .qsf にあるピン制約情報を元に、.pin ファイルというものも生成される。このファイルはどの信号がどのピンに割り当てられているかを表にしたテキストファイルだ。(このファイルは一方的に出力されるだけで、このファイルを quartus II のツールが読み込むことは無い、とQuartus II Handbook に書かれていた)
もし pin 制約情報が .qsf に無ければ、quartus_fit は適当な値で .pin ファイルを生成するようだ。ISE と違い、Quartus II ではピン制約情報が無くても配置配線は適当に終了してしまう。
コマンドラインから使うには、

quartus_fit トップレベルエンティティ名


プログラミングファイル .sof, .pof の生成
Xilinx の bitstream に相当する、.sof, .pof ファイルを生成するには quartus_asm コマンドを使う。
コマンドラインから使うには、

quartus_asm トップレベルエンティティ名

各コマンドには細かいオプションがある。quartus_xxx --help または quartus_xxx --help=option name で詳細な情報を得ることが出来る。

      • -

シンプルな例:

TestModule.vhd :

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity TestModule is
	port (
		clk		: in std_logic;
		rst		: in std_logic;
		led1	: out std_logic
	);
end TestModule;

architecture Behavioral of TestModule is
	signal st			: std_logic;
	constant waitVal	: integer := 50000000;
	signal count		: integer range 0 to waitVal;

begin

	process ( clk, rst ) begin
		if ( rst = '1' ) then
			st <= '0';
			count <= 0;
		elsif ( clk'event and clk = '1' ) then
			if ( count = waitVal ) then
				st <= not st;
				count <= 0;
			end if;

			count <= count + 1;
		end if;
	end process;

	led1 <= st;

end Behavioral;

コマンドインから使う例:

$ quartus_map TestModule --part=EP1C3T100A8 --source=TestModule.vhd
$ quartus_fit TestModule
$ quartus_asm TestModule

他に、.tcl スクリプトを使ったやり方があるが、これは後日調べる予定。