2025年09月07日

CPLD(XC9572)で遊ぶ(その3)5V対応の9572入手


1.はじめに
 前回の記事までは3.3V動作のXC9572XLを使って評価していましたが、1世代前の5V電源で動作するXC9572を10個入手できました(下の写真)。安かった(¥1,417)ので偽物の可能性もあることから書込み可能か試してみました。

購入したXC9572


2.変換アダプタの作成
 PLCCパッケージ(44ピンのXC9572にはQFPパッケージ版は無い)のままではブレッドボードで使えないのでDIP変換ボードを探したところ、aitendoさんで「PLCC44ソケット with 基板」を見つけましたが、PLCCパッケージ自体がQFPよりもかなり大きいのでブレッドボードに刺した状態では使用可能なピン挿入ラインが1ラインのみになってしまいます。
 注文していたPLCCのソケットが届いたので変換基板を自作することにしました。下図はPLCCソケット(44ピン)の裏側から見たピン番号の対応です。

PLCC44ピン番号

 最初は簡単にできるだろうと思っていましたが完成するまでには結構時間がかかりました。下の写真が完成したPLCC-DIP変換基板です。ブレッドボードに刺した際、最小の幅になるようにしてピン挿入ラインを最大限(上下各4ライン)使えるようにしました。
 また、使用する機会はあまり無いのですが今回の制作では「ミニテーブルソーの購入」の記事で書いたミニテーブルソーが活躍しました。

PLCC44DIP変換基板(トップ面)

 裏面が下の写真です。何かしらのカバーを付けないとそのうち断線しそうですね。3Dプリンタでカバーを検討してみます。

PLCC44DIP変換基板(ボトム面)


3.書込み試験
 下図はブレッドボード上に組み上げた評価環境です。クリックすると拡大表示されます(XC9572の刻印が見えるようにサイズ大きめ)。

完成したXC9572の評価環境

 今回の評価で使用するコンフィグファイルは「CPLD(XC9572)で遊ぶ」の記事で書いたナイトライダー表示処理をXC9572用にコンパイルしたものです。
 書き込みの際、最初に実行されるErase処理でエラーが発生(下図)し(一瞬ですが「応答なし」と表示される)、Erase処理を2回リトライ(合計3回)後書込みとベェリファイはエラー無く処理されます。XC9572を別のチップに交換してみましたが状況は同じでした。また、「Erase over protect」をチェック状態にしても同様でした。

Eraseで発生するエラー

 Erase処理でエラーが発生しますが下図のように動作は問題ありませんでした。

MITOUJTAGのバウンダリースキャンによるロジアナ表示


4.まとめ
 MITOUJTAGの自動認識機能でXC9572と検出される(1回目ではエラーで2回目で認識されます←XC9572XLでも同様でした)ことから今回購入したものは本物であると言えると思います。上述のように書き込み時のErase処理では応答無しになりましたが、書き込みとベリファイは問題無く終了します。10個中2個しか試していませんが、Verilog HDLで記述したように動作しているので今回購入したチップは使用できそうです。



★追記 2025/09/07
 断線防止のためにDIP変換基板にカバーが必要と書きましたが作ってみました。
 下図はCADでデザインしたものです。裏面の配線部分を包み込むようにしました。

PLCC44DIP変換基板のカバー(CAD画面)

 カバーを装着した状態のDIP変換基板が下の写真です。基板の淵を溝に嵌めながらスライドして装着し先端のフックで固定します。

カバー付きPLCC44DIP変換基板(トップ面)

 カバー装着後のボトム面が下の写真です。配線材はカバーで覆われるのでブレッドボードへの抜き差し作業時の断線防止になると思います。

カバー付きPLCC44DIP変換基板(ボトム面)




[TOP] [ 前へ ] CPLD(XC9572)で遊ぶ [ 次へ ]

posted by skyriver at 13:37| Comment(4) | CPLD | このブログの読者になる | 更新情報をチェックする

2025年08月24日

CPLD(XC9572)で遊ぶ(その2)ISim


1.はじめに
 今回インストールした Xilinx ISE には ISim をいうデバッグ用のシミュレート機能があるので使ってみました。テスト対象は前回作成した4つのLEDをナイトライダー点灯する処理です。


2.シミュレーション用ソースの作成
 シミュレーションで動作確認するためには、設計した処理の入力信号を生成するテスト用のVerilogソースが必要になります。
 下図のようにソース部分を右クリック(または上部の「Project」クリック)で表示されるメニューで「New Source」を選択します。

新規ファイルの追加

 次に下図のように「Verilog Test Fixture」を選択し、ファイル名と格納場所を入力します。

テストファイル名の設定

 次はテスト対象のソースの選択ですが今回は、ソースが一つしかないのでそのままで次に進みます。

テスト対象ソースの選択

 下図のような最終確認画面が表示されるので問題が無ければ「Finish」押下します。

テストファイルの設定内容の確認

 左上のDesignウィンドで「Simulation」側を選択すると下図のように先程追加したテスト用ファイルの名前が表示されます。

追加したテストファイル名の表示確認

 テスト用のソースのスケルトンが自動生成されるのでテスト用のコードを追加していきます。今回生成する入力信号はCLKだけなので殆ど追加は無いのですが、20MHzのクロックを生成し、シミュレート時間が7秒になるようにしました。

シミュレーション用のVerilog HDLファイル内容
`timescale 1ns / 1ps

////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: skyriver
//
// Create Date:   2025/08/24
// Design Name:   BinCntVerilog
// Module Name:   /home/ise/ise/Proj/Night/src/Night_TF.v
// Project Name:  Night
// Target Device:  
// Tool versions:  
// Description: 
//
// Verilog Test Fixture created by ISE for module: BinCntVerilog
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
////////////////////////////////////////////////////////////////////////////////

module Night_TF;

	parameter SEC = 40000000;		// 1sec at 20MHz
	parameter UNTIL = 7;				// test time[sec]

	// Inputs
	reg CLK;

	// Outputs
	wire [3:0] NIGHT_RIDER;

	// Instantiate the Unit Under Test (UUT)
	BinCntVerilog uut (
		.CLK(CLK), 
		.NIGHT_RIDER(NIGHT_RIDER)
	);

	integer i,j;
	initial begin
		// Initialize Inputs
		CLK = 0;

		// Wait 100 ns for global reset to finish
		#100;
		// Add stimulus here
		for ( i = 0; i < UNTIL; i = i + 1 ) begin
			for ( j = 0; j < SEC; j = j + 1 ) begin
				#25 CLK = ~CLK;
			end
		end
	end
      
endmodule



3.シミュレーションの実行
 シミュレーションを実行するためには下図の左下にある「Simulate Behavioral Model」をダブルクリックします(テスト用ソースのチェックのみを行いたい場合は「Behavioral Check Syntax」をダブルクリック)。

シミュレーションの実行

 テスト用のソースがチェックされ、問題が無ければ下図のような ISim のウィンドが新たに開きシミュレーション処理が開始されます。
 7秒のシミュレーションを完了するには結構な時間がかかりましたがナイトライダー制御は問題なくできているようです。
 本来なら入力信号の変化パターンを網羅的に生成して想定通りの出力になっているかを検証するような使い方になるかと思います。

ISimのウィンド



[TOP] [ 前へ ] CPLD(XC9572)で遊ぶ [ 次へ ]

posted by skyriver at 23:54| Comment(0) | CPLD | このブログの読者になる | 更新情報をチェックする

2025年08月23日

CPLD(XC9572)で遊ぶ


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環境です)。
 開発環境の構築に必要な作業としては
  1. Oracle VirtualBoxのインストール
  2. Xilinxs ISE Xilinxs_ISE_14.7 Win10/11用のインストール
  3. 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をダブルクリックして起動し、特に問題なく終了しました。

Oracle VirtualBoxのインストール


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をダブルクリックします。

Xilinx ISE の解凍後のファイル

 Windows10固有のエラーの可能性がありますが、下図のエラーが発生するので次の手順でHyper-Vを無効化します。
  1. コントロールパネルを開く
  2. 「プログラムと機能」を選択
  3. 「Windowsの機能の有効化または無効化」を選択
  4. Hyper-Vのチェックを外す
  5. パソコンをリセットする

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内にインストールされた状態になります。

Xilinx ISE On VirtualBox


2-c.MITOUJTAGのインストール
 MITOUJTAGはMITOUJTAG Free (無料版)からダウンロードし、特に問題なくインストールできました。
 尚、FT2232D USBシリアル変換モジュールの設定と接続はMPSSE-JTAGの作り方のサイトの情報を参考にさせて頂きました。

★追記 2025/09/06 {
 FT2332D側の信号表とXC9572のJTAGピンを下図に示します。青色部分がブレッドボード上で接続しました。

FT2332D信号表

XC9572 JTABピン
}


3.ISEでVerilog HDLでの開発
 実際にCPLDに書き込むコンフィグレーションファイル(*.jed)を作成するためには下記の作業が必要です。
  1. 新規プロジェクトの作成
  2. Verilog HDLのソースとピン定義ファイルの作成
  3. コンパイル

3-a.新規プロジェクトの作成
 次の手順で新規プロジェクトを作成します。
  1. 「New Project」をクリックしプロジェクト名やフォルダを設定します
  2. デバイ情報(デバイス名、パッケージ、速度)を設定します
    44ピンのQFPパッケージならQP44を選択します
  3. 内容を確認後「Finish」ボタンを押下して完了です
プロジェクト作成(a)
プロジェクト作成(b)
プロジェクト作成(c)


3-b.Verilog HDLのソースとピン定義ファイルの作成
 次の手順で作成します。
  1. 左側のウィンドのデバイス名をクリック後、右クリックし「New Aource」えお選択
  2. 「Verilog Module」を選択しファイル名とロケーションを入力後「Next」押下
  3. モジュール名を入力し「Next」を押下(Port Nameは後で変更できるので入力不要で入力すると自動生成されるソースに反映される)
  4. 内容を確認し、「Finish」押下
  5. ロケーションのディレクトリが無い場合作成するか聞いてくるので「Yes]を押下し、「Finish」押下
  6. 同様にデバイス名クリックで表示されるメニューで「New Source」を選択後、「Implementation Constrains File」を選択し、「Next」押下
  7. 内容を確認し「Finish」押下

ファイルの作成(a)
ファイルの作成(b)
ファイルの作成(c)
ファイルの作成(d)
ファイルの作成(e)
ファイルの作成(f)
ファイルの作成(g)

 以上の操作でファイルの追加ができました。今回は習作として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への書き込みが可能になります。

CPLD接続後のMITOUJTAG画面

 下図は、MITOUJTAGでのロジアナ画面のキャプチャです。トリガ条件を設定でき、スクリプトにより信号発生も可能なので優れたディバッグ環境になりそうです(信号出力機能はまだ試していません)。
※訂正 2025/08/24 スクリプト機能はPro版で使える機能です。GUIによる端子操作はFree版でも可能です。

MITOUJTAGのロジアナ解析画面


 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」を選択すると表示されます。
 上記の二つのソースで確認した結果、下図のようになりリソース使用量は全く同じでした。

MITOUJTAGのロジアナ解析画面



[TOP] [ 前へ ] CPLD(XC9572)で遊ぶ [ 次へ ]

posted by skyriver at 23:43| Comment(0) | CPLD | このブログの読者になる | 更新情報をチェックする