« Vivadoで、RTLで書いた自作のIPを修正しても更新されない問題について(長文注意) | トップページ | VivadoとArtix-7でハマったバグ!?仕様!? »

2016.08.14

VivadoのIPインテグレータでRTLソースをIP化せずに、モジュールとして追加する

RTLで書いたソースをIPインテグレータで使うため、IP化するのは面倒です。

そこで、RTLソースをIP化せずにさくっとモジュールとして使う方法を紹介します。

RTLモジュールの作り方

まず、Vivadoでプロジェクトを作り、ブロックデザインを新規作成します。(この時点では白紙です)

作ったブロックデザインの名前はmain.bdとしておきます。

Addrtl_1

Design Sourcesで右クリックし、Add Sourcesを行います。

Addrtl_2

あらかじめ用意しておいたRTLのソースを追加するか、VHDLやVerilogのファイルを新規作成します。

Addrtl_3

作ったソースはこんな感じ。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_arith.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
  
entity ledchika is
	Generic (
		   period : integer := 10000000 
	);
    Port ( clk : in STD_LOGIC;
    		down : in STD_LOGIC;
           led_op : out STD_LOGIC_VECTOR (7 downto 0));
end ledchika;
  
architecture Behavioral of ledchika is
	signal timer : integer range 0 to 1000000000 := 0;
	signal led : std_logic_vector(7 downto 0);
begin
	process(clk) begin
		if(clk'event and clk='1') then
			if(timer = period) then
				timer <= 0;
				if(down = '1') then
					led <= led - 1;
				else
					led <= led + 1;
				end if;
			else
				timer <= timer + 1;
			end if;
		end if;
	end process;
	led_op <= led;
end Behavioral;

ここではledchika.vhdというファイルを追加しました。

main.bdの下にledchika.vhdが見えています。

Addrtl_4

ブロックデザインの白いところで、右クリックし、Add Moduleを行います。

Addrtl_5

先ほどのledchika.vhdをプロジェクトに追加したので、Add Moduleで追加する候補に出てきます。これを追加します。

Addrtl_6

IPコアであるかのように、ブロックデザインにモジュールが追加されました。

IPコアとの違いは、四角の中にRTLと書かれていることです。

Addrtl_7

適当に入出力ポートをつないで、回路図を完成させます。

Addrtl_8

Sourcesを見てみると、main.bdの下に直接RTLがつながるのではなく、間に1段、ラッパが被さっているのがわかります。このラッパはシステムが自動的に生成してくれていて、バージョン番号などが書かれています。(↑の図でいうledchika_v1_0など)

Addrtl_9

このラッパの中身は

--Copyright 1986-2016 Xilinx, Inc. All Rights Reserved.
----------------------------------------------------------------------------------
--Tool Version: Vivado v.2016.2 (win64) Build 1577090 Thu Jun  2 16:32:40 MDT 2016
--Date        : Sun Aug 14 13:48:44 2016
--Host        : nahitafu running 64-bit major release  (build 9200)
--Command     : generate_target main.bd
--Design      : main
--Purpose     : IP block netlist
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library UNISIM;
use UNISIM.VCOMPONENTS.ALL;
entity main is
  port (
    led_op : out STD_LOGIC_VECTOR ( 7 downto 0 );
    pushsw_ip : in STD_LOGIC;
    xtalclk_ip : in STD_LOGIC
  );
  attribute CORE_GENERATION_INFO : string;
  attribute CORE_GENERATION_INFO of main : entity is "main,IP_Integrator,{x_ipVendor=xilinx.com,x_ipLibrary=BlockDiagram,x_ipName=main,x_ipVersion=1.00.a,x_ipLanguage=VHDL,numBlks=1,numReposBlks=1,numNonXlnxBlks=0,numHierBlks=0,maxHierDepth=0,numSysgenBlks=0,numHlsBlks=0,numHdlrefBlks=1,numPkgbdBlks=0,bdsource=USER,synth_mode=Global}";
  attribute HW_HANDOFF : string;
  attribute HW_HANDOFF of main : entity is "main.hwdef";
end main;
  
architecture STRUCTURE of main is
  component main_ledchika_0_0 is
  port (
    clk : in STD_LOGIC;
    down : in STD_LOGIC;
    led_op : out STD_LOGIC_VECTOR ( 7 downto 0 )
  );
  end component main_ledchika_0_0;
  signal ledchika_0_led_op : STD_LOGIC_VECTOR ( 7 downto 0 );
  signal pushsw_ip_1 : STD_LOGIC;
  signal xtalclk_ip_1 : STD_LOGIC;
begin
  led_op(7 downto 0) <= ledchika_0_led_op(7 downto 0);
  pushsw_ip_1 <= pushsw_ip;
  xtalclk_ip_1 <= xtalclk_ip;
ledchika_0: component main_ledchika_0_0
     port map (
      clk => xtalclk_ip_1,
      down => pushsw_ip_1,
      led_op(7 downto 0) => ledchika_0_led_op(7 downto 0)
    );
end STRUCTURE;

ですが、ユーザは編集できません。

あとは普段の手順どおりmain.bdで右クリックし、Create HDL Wrapperを行い、トップのbd用のラッパを作り、ビルドすれば完成です。

Addrtl_10

なお、ブロックデザイン上でRTLのアイコンをダブルクリックすると、IPのパラメータではなく、VHDLで書いたGenericのパラメータが編集できます。

Addrtl_11

IP化した場合との違い

RTLをIP化せずに直接モジュール化した場合との違いは、

  • Reset Ourput Productsで中間ファイルが削除されることもない
  • 画面上に「RTL」と表示される
  • IP化の場合はソースを編集できないが、RTLモジュールならソースを編集できる
  • ソースを編集すると、すぐに結果に反映される
  • 面倒くさくない
  • パラメータの伝搬とかが少し違うかも?
  • バージョン番号の管理などがシステム任せになる

です。

特に大きなデメリットはないように思えるので、RTLで書いたソースはIP化するのではなく、RTLモジュールのまま使っていくのがいいのではないかと思います。

最初からIP化するのではなく、それは、プロジェクトが完成してからでいいのだと思います。

|

« Vivadoで、RTLで書いた自作のIPを修正しても更新されない問題について(長文注意) | トップページ | VivadoとArtix-7でハマったバグ!?仕様!? »

コメント

コメントを書く



(ウェブ上には掲載しません)




« Vivadoで、RTLで書いた自作のIPを修正しても更新されない問題について(長文注意) | トップページ | VivadoとArtix-7でハマったバグ!?仕様!? »