0.目 次
1.はじめに
今までCPLDやFPGAは雑誌の付録基板等を使って遊んでいましたが、JTAGのI/F機能も込みの基板なので専用のJTAGケーブルを準備(以前はパソコンのパラレルポートを使った自作情報もあったけれど)しないとそのままでは自作の基板に応用できないので遊ぶ気分が盛り上がりませんでした。
最近(2025/05/03)になってありがたいことになひたふ(@nahitafu)さんが
MITOUJTAG Free版をリリースされ、秋月電子さんの
FT2232D USBシリアル2ch変換モジュールキット EEPROM実装済を使えば多くのCPLDやFPGAに書き込めるようになることから秋月電子さんが秋葉原店で格安で販売しているSuper AKI-80を購入する際に「FT2232D USBシリアル変換モジュールキット」も購入しておきました。
2.開発環境の構築
開発環境の構築に関する情報はネット上に豊富にあるのでここではメモ程度に記録しておきたいと思います。
Windows版のXilinX ISEはVirtualBox上で動作するので事前にVirtualBoxをインストールする必要があります。ISEのLinux版をインストールすればVirtualBoxは不要ですが、VirtualBoxではスナップショットを使って前の状態に戻れる等の利点があるのでWindows版をインストールすることにしました(しかも使用する環境はWindows10環境です)。
開発環境の構築に必要な作業としては
- Oracle VirtualBoxのインストール
- Xilinxs ISE Xilinxs_ISE_14.7 Win10/11用のインストール
- MITOUJTAGのインストール
です。
2-a.Oracle VirtualBoxのインストール
Download VirtualBoxのサイトで「Windows hosts」をクリックして
VirtualBox-7.2.0-170228-Win.exeをダウンロードします。
|
Oracle VirtualBoxのダウンロードサイト
|
|
|
VirtualBox-7.2.0-170228-Win.exeをダブルクリックして起動し、特に問題なく終了しました。
2-b.XilinX ISEのインストール
Xikinxのダウンロードサイトで最新のISE(14.7 Windows 10 および Windows11)をクリックし、ダウンロードしたXilinx_ISE_14.7_Win10_14.7_VM_0213_1.zip(15.5 GB (16,664,981,504 バイト))を解凍します。ダウンロードするにはAMDへのユーザー登録が必要です。
解凍後、下記のファイルが展開されるのでxsetup.exeをダブルクリックします。
Windows10固有のエラーの可能性がありますが、下図のエラーが発生するので次の手順でHyper-Vを無効化します。
- コントロールパネルを開く
- 「プログラムと機能」を選択
- 「Windowsの機能の有効化または無効化」を選択
- Hyper-Vのチェックを外す
- パソコンをリセットする
|
Xilinx ISE インストール時のエラー(その1)
|
|
|
これはWindows10だけで発生する問題のようですが下記のエラーが発生します。
|
Xilinx ISE インストール時のエラー(その2)
|
|
|
しかしBIOSを確認すると
Virtualizeitionは既にEnableになっています。
AMDのサポートに対処が記載されていることが
ISE14.7 for Windows10のインストールのサイトに書いてありました。
対処方法は解凍した bin/validate_virtualization_enabled.bat ファイル内の下記の行をコメントアウト後にxsetup.exeを実行することでエラーが解消されました。
|
rem %SYSTEMROOT%\system32\windowspowershell\v1.0\powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "& '%~dnp0.ps1'"
|
画面キャプチャーを取っていませんがISEインストール時に共有フォルダの設定項目があり、そこに設定したフォルダを使ってLinux環境のISEとWindows環境間でファイルのやり取りができるようになります。
ISEをインストール後にVirtualBoxを起動すると下図のようにISEがVirtualBox内にインストールされた状態になります。
2-c.MITOUJTAGのインストール
MITOUJTAGは
MITOUJTAG Free (無料版)からダウンロードし、特に問題なくインストールできました。
尚、FT2232D USBシリアル変換モジュールの設定と接続は
MPSSE-JTAGの作り方のサイトの情報を参考にさせて頂きました。
★追記 2025/09/06 {
FT2332D側の信号表とXC9572のJTAGピンを下図に示します。青色部分がブレッドボード上で接続しました。
}
3.ISEでVerilog HDLでの開発
実際にCPLDに書き込むコンフィグレーションファイル(*.jed)を作成するためには下記の作業が必要です。
- 新規プロジェクトの作成
- Verilog HDLのソースとピン定義ファイルの作成
- コンパイル
3-a.新規プロジェクトの作成
次の手順で新規プロジェクトを作成します。
- 「New Project」をクリックしプロジェクト名やフォルダを設定します
- デバイ情報(デバイス名、パッケージ、速度)を設定します
44ピンのQFPパッケージならQP44を選択します
- 内容を確認後「Finish」ボタンを押下して完了です
3-b.Verilog HDLのソースとピン定義ファイルの作成
次の手順で作成します。
- 左側のウィンドのデバイス名をクリック後、右クリックし「New Aource」えお選択
- 「Verilog Module」を選択しファイル名とロケーションを入力後「Next」押下
- モジュール名を入力し「Next」を押下(Port Nameは後で変更できるので入力不要で入力すると自動生成されるソースに反映される)
- 内容を確認し、「Finish」押下
- ロケーションのディレクトリが無い場合作成するか聞いてくるので「Yes]を押下し、「Finish」押下
- 同様にデバイス名クリックで表示されるメニューで「New Source」を選択後、「Implementation Constrains File」を選択し、「Next」押下
- 内容を確認し「Finish」押下
以上の操作でファイルの追加ができました。今回は習作として4つのLEDをナイトライダーのように点灯してみました。作成したファイルの内容は以下のとおりです。
尚、今回使用したXC9572XLは3.3V動作(入力は5Vトレラント)なのでFT2232DのJP2AのジャンパーピンはオープンにしてVCCIOAピンに3.3Vを供給しました。
|
Verilog HDLファイル
|
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: skyriver
//
// Create Date: 20:58:06 08/22/2025
// Design Name:
// Module Name: NightVeri
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module BinCntVerilog(
input CLK,
output wire[3:0] NIGHT_RIDER
);
integer COUNTER = 0;
reg[3:0] LED = 4'b0001;
reg DIR = 1'b0;
always @ (posedge CLK) begin
if (COUNTER == (20000000 - 1) ) begin // 1sec when CLK is 20MHz
COUNTER <= 0;
if (DIR == 0) begin
if (LED[3] == 0) begin
LED <= { LED[2:0], 1'b0 };
end
if (LED[2]) begin
DIR <= 1;
end
end else begin
if (LED[0] == 0) begin
LED <= { 1'b0, LED[3:1] };
end
if (LED[1]) begin
DIR <= 0;
end
end
end else begin
COUNTER <= COUNTER + 1;
end
end
assign NIGHT_RIDER = LED;
endmodule
|
|
ピン定義ファイル
|
// NightRider Pin assign
NET "CLK" LOC = "P1";
NET NIGHT_RIDER[0] LOC = "P2";
NET NIGHT_RIDER[1] LOC = "P3";
NET NIGHT_RIDER[2] LOC = "P5";
NET NIGHT_RIDER[3] LOC = "P6";
|
3-c.コンパイル
必要なファイルの準備ができたら下図の左下のウィンドの「Inplement Design」をダブルクリックしてコンパイルを開始します
。
無事コンパイルが完了すると下記のような画面になりコンフィグレーションファイル(*.jed)が生成されます。
4.MITOUJTAGでの書き込み
下図はMITOUJTAGを起動し、デバイス指定して接続完了後、左側ウィンドのピン定義ファイルとコンフィグレーションファイルの部分を右クリックしてファイル指定した状態の画面キャプチャーです。
中央の図のチップをクリックした状態にすると上部の右端の「書き換え」が選択可能になり、CPLDへの書き込みが可能になります。
下図は、MITOUJTAGでのロジアナ画面のキャプチャです。トリガ条件を設定でき、
スクリプトにより信号発生も可能なので優れたディバッグ環境になりそうです(信号出力機能はまだ試していません)。
※訂正 2025/08/24 スクリプト機能はPro版で使える機能です。GUIによる端子操作はFree版でも可能です。
X(旧Twitter)に投稿したメッセージに添付した動画も貼っておきます。
★追記 2025/08/24
always句の中では主にノンブロッキング代入(<=)を使用するのでシフト方向の切替処理等がC言語等と比較してまどろっこしい印象がありました。
しかし、シフト時にブロッキング代入を使えば、その後のIF文でシフト後の値を参照できるのでは?と考えてソースをシンプルにしてみました。実チップでも問題なく動作しましたがコンパイル結果としてどれくらいのリソースを使用しているのかの確認方法がまだ解らないのでソースは短くなったけどリソースの消費量がどうなったのかが気になるところです。
|
Verilog HDLファイル(改善版)
|
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: skyriver
//
// Create Date: 2025/08/24 20:46
// Design Name:
// Module Name: NightVeri
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.02 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module BinCntVerilog(
input CLK,
output wire[3:0] NIGHT_RIDER
);
integer COUNTER = 0;
reg[3:0] LED = 4'b0001;
reg DIR = 1'b0;
always @ (posedge CLK) begin
if (COUNTER == (20000000 - 1) ) begin // 1sec when CLK is 20MHz
COUNTER <= 0;
if (DIR == 0) begin
LED = { LED[2:0], 1'b0 }; // blocking
if (LED[3]) begin
DIR <= 1;
end
end else begin
LED = { 1'b0, LED[3:1] }; // blocking
if (LED[0]) begin
DIR <= 0;
end
end
end else begin
COUNTER <= COUNTER + 1;
end
end
assign NIGHT_RIDER = LED;
endmodule
|
少し見づらくなりますがalways句内をノンブロッキング代入だけでもできますね。
|
Verilog HDLファイル(改善版3)
|
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: skyriver
//
// Create Date: 2025/08/24 20:46
// Design Name:
// Module Name: NightVeri
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.03 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module BinCntVerilog(
input CLK,
output wire[3:0] NIGHT_RIDER
);
integer COUNTER = 0;
reg[3:0] LED = 4'b0001;
reg DIR = 1'b0;
always @ (posedge CLK) begin
if (COUNTER == (20000000 - 1) ) begin // 1sec when CLK is 20MHz
COUNTER <= 0;
if (DIR == 0) begin
LED <= { LED[2:0], 1'b0 };
if (LED[2]) begin
DIR <= 1;
end
end else begin
LED <= { 1'b0, LED[3:1] };
if (LED[1]) begin
DIR <= 0;
end
end
end else begin
COUNTER <= COUNTER + 1;
end
end
assign NIGHT_RIDER = LED;
endmodule
|
★追記 2025/08/25
リソースの使用状況の確認方法が判りました。下図のように「Resource Summary」を選択すると表示されます。
上記の二つのソースで確認した結果、下図のようになりリソース使用量は全く同じでした。
[TOP] [ 前へ ]
CPLD(XC9572)で遊ぶ [ 次へ ]