I like fpga

change the world by fpga
2021/04/24

How to add custom ip in vivado

FPGA   VERILOG   ZYNQ   

自作のIPを作る手順をまとめておく。XilinxのVivadoのマニュアルを読めば良いと思うが、マニュアルが多くて、いろいろ読む気しない。。。FPGAのエンジニアはすごいなぁと思う。

IPの作り方

自作のIPを作成する手順です。

Tools->Create and Package New IP…を選択する

Nextを選択する

今回は、AXIのIPを作成するので、Create AXI4 Peripheralを選択して、Nextを選択する

IPの名前を適当に入力して、Nextを選択する

ここで必要なAXI系を追加が必要であれば、追加しておく、今回は、AXIのSlave IFがあれば良いので、追加なし。

少しIPを修正するので、Edit IPを選択して、Finishを選択する

IPのプロジェクト用のVivadoが起動する。

今回は、レジスタをライトしたら、信号をHigh→LowするIPを作成する

コードは2個用意されている。

今回のIPの最終イメージになります。レジスタをライトすると、STARTの信号を制御するIPになる。

myip_test_v1_0.vを修正する。Users to add ports here にSTARTという信号を追加する。

	module myip_test_v1_0 #
	(
		parameter integer C_S00_AXI_DATA_WIDTH	= 32,
		parameter integer C_S00_AXI_ADDR_WIDTH	= 4
	)
	(
		// Users to add ports here
		output wire START,   //★追加
		// User ports ends

myip_test_v1_0.vに、もう1箇所追加する。下位のモジュールにSTARTの信号を接続する。

	myip_test_v1_0_S00_AXI # ( 
		.C_S_AXI_DATA_WIDTH(C_S00_AXI_DATA_WIDTH),
		.C_S_AXI_ADDR_WIDTH(C_S00_AXI_ADDR_WIDTH)
	) myip_test_v1_0_S00_AXI_inst (
		.START(START),  //★追加
		.S_AXI_ACLK(s00_axi_aclk),

次に、myip_test_v1_0_S00_AXI.v側を修正する。同じように、STARTの信号を追加する。


	module myip_test_v1_0_S00_AXI #
	(
		parameter integer C_S_AXI_DATA_WIDTH	= 32,
		parameter integer C_S_AXI_ADDR_WIDTH	= 4
	)
	(
		// Users to add ports here
		output wire START,//★追加
		// User ports ends

myip_test_v1_0_S00_AXI.vで、regを追加する

	reg start = 0; //★追加
	assign START = start;//★追加

myip_test_v1_0_S00_AXI.vで、レジスタ制御部分を追加する。テンプレート通りだと200行目付近のalwaysで、slv_reg_wrenのelse節を追加する。

	always @( posedge S_AXI_ACLK )
	begin
//省略....
	    if (slv_reg_wren)
	      begin
//省略....
		  end else begin                        //★追加
			  if (slv_reg0[0] == 1'b1) begin//★追加
				  start <= 1'b1;         //★追加
				  slv_reg0[0] <= 1'b0;  //★追加
			  end else begin               //★追加
				  start <= 1'b0;       //★追加
			  end                          //★追加

コードの追加が終わったら、Package IPを確認する。Packaging Stepsで、緑になっていない部分があったら、Merge…のところをクリックしてチェック完了とする。

そして、最後に、Review and Packageをクリックして、Re-Package IPをクリックする。

これで、IPの作成は完了だ。

カスタムIPを使う

IPを使う側は、まずは、プロジェクトを起動する。そして、Tools→Settingsを選択する。

IP Repositoryで、IP Repositoriesで、↑で、作成したIPのディレクトリを指定する。そうすると、+ボタンを押した時に、カスタムIPが表示される。

そして、OKをクリックする。

あとは、Block desginで、「+」をクリックして、IPを選択する画面に、自分で作ったIPがあらわれるはずだ。

IPを選択すると、Block Desgin上に追加される。

IPの修正

次に、IPを修正したくなった場合だ。

IPのVivadoのプロジェクトファイル のxprファイルは、今回は、IPを保存するディレクトリにできた。

そうしたら、IPを編集画面が表示できた。必要に応じて、コードを編集するのが良いと思う。

そして、変更が終わったら、SourcesのDesign Sources のIP-XACTにあるComponent.xmlをクリックする

そうすると、Package IPがでてきて、各項目をチェックし、最後に、Review and Packageで、Re-Package IPをクリックする。

自分の場合は、IPを使っている側で、Updateされたかわからなくなるので、Package IPのIdentificationでバージョンを少しあげておく。

IPを更新する

もし、自作したIPを、あるプロジェクトで使用していた場合は、プロジェクト側に、IPが更新されたことが通知される。Report IP Statusをクリックする。

IP Statusを確認すると、Current Versionが1.0で、更新されたバージョン(Recommended Version)は、1.01と表記されている。


 

更新するIPをクリックして、Upgrade Selectedをクリックする。

そうすると、IPがアップデートされる。Generate Output Productを行う。

こちらが、今回作成したIPのプロジェクトとコードになります。

https://github.com/y38y38/how_to_add_cutom_ip

« »