2017-10-13 4 views
3

BRAMを使用してデータを保存/読み取りするためのIPを書きたいと思います。ポートをブラムインターフェイスに結合する

私がこれまでに(C)DMAを使用してRAMからメモリマップデータを読み込み、AXISを取得しています。

次にVHMLで新しいソースファイルを作成して、魅力的に機能していたAXISを受け入れました。 一方、私はBRAMインターフェイスを作成したいが、vivadoはBRAMインターフェイス用のポートを結合していない。

"vivado/data/ip/interfaces/bram_v1_0"フォルダには "bram_rtl.xml"というファイルがあります。 xmlファイルで使用されているポートを使用しようとしました。 特に、「required」タグを持つポート。

AXI BRAMコントローラはそれらを正しく組み合わせているので、私が間違っていると確信しています。 AXI BRAMコントローラのような同じ名前を使用しても機能しませんでした。

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity AXIS_TO_BRAM is 
    generic (
     addr_size : integer range 1 to 12 := 10 
    ); 
    Port (
     --axistream 
     tdata : in std_logic_vector(31 downto 0); 
     tkeep : in std_logic_vector(3 downto 0); 
     tlast : in std_logic; 
     tready : out std_logic; 
     tvalid : in std_logic; 
     aclk : in std_logic;  

     --BRAM 
     en : out std_logic; 
     dout : in std_logic_vector(31 downto 0); 
     din : out std_logic_vector(31 downto 0); 
     we : out std_logic; 
     addr : out std_logic_vector(addr_size-1 downto 0); 
     clk : out std_logic; 
     rst : out std_logic); 
end AXIS_TO_BRAM; 

architecture Behavioral of AXIS_TO_BRAM is 

begin  
end Behavioral; 

私はLinux上でのZynq 7020用vivado 2016.4を使用しています:

私のVHDLは、このようになります。

VHDLコードに何か不足していますか?vivadoが私のポートをBRAMインターフェイスとして認識するか、これはこのバージョンのバグですか?

は、ここで任意のアイデア

+0

\ Vivado \ 2016.4 \ data \ ip \ xilinx \ axi_bram_ctrl_v4_0 \ component.xmlを見ましたか?ポートがどのように接続されているかを見ることができます。 – JHBonarius

+1

私はそれを試みましたが、残念ながら名前は私がすでに試みたものと同じです。 これは、vhdlコードをIPにパッケージ化し、そのためのcomponent.xmlを作成する場合にのみ可能です。 –

+2

アトリビュートを追加する必要があります。アトリビュートを「dout:SIGNAL IS」xilinx.com:interface:bram:1.0 BRAM_PORTA DOUT「;」などのアーキテクチャに追加する必要があります。その後、ザイリンクスのBRAMポートとして推測されます。またはIPを作成し、既存のザイリンクスインターフェイスにBRAMポートをマッピングします –

答えて

4

のためにあなたに感謝し、完全な作業と合成可能なVHDLコードです。

正しい解決策(または少なくとも重要な部分)は、Vinay Madapura氏のコメントに記載されています。

定義済みのインターフェイスは、$ vivado/$ version/data/ip/interfacesフォルダにあります。

このコードが他の人々が同様の問題に苦しんでいるのに役立つことを願っています。

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity AXIS_TO_BRAM is 
generic(
    addr_size : integer range 1 to 12 := 10 
); 
Port(
    tdata : in std_logic_vector(31 downto 0); 
    tkeep : in std_logic_vector(3 downto 0); 
    tlast : in std_logic; 
    tready : out std_logic; 
    tvalid : in std_logic; 
    aclk : in std_logic; 

    addra : out std_logic_vector(addr_size-1 downto 0); 
    clka : out std_logic; 
    dina : out std_logic_vector(31 downto 0); 
    douta : in std_logic_vector(31 downto 0); 
    ena : out std_logic; 
    rsta : out std_logic; 
    wea : out std_logic_vector(0 downto 0) 
); 
end AXIS_TO_BRAM; 

architecture Behavioral of AXIS_TO_BRAM is 

    ATTRIBUTE X_INTERFACE_INFO : string; 
    ATTRIBUTE X_INTERFACE_INFO OF addra: SIGNAL IS "xilinx.com:interface:bram:1.0 BRAM_PORTA ADDR"; 
    ATTRIBUTE X_INTERFACE_INFO OF clka: SIGNAL IS "xilinx.com:interface:bram:1.0 BRAM_PORTA CLK"; 
    ATTRIBUTE X_INTERFACE_INFO OF dina: SIGNAL IS "xilinx.com:interface:bram:1.0 BRAM_PORTA DIN"; 
    ATTRIBUTE X_INTERFACE_INFO OF douta: SIGNAL IS "xilinx.com:interface:bram:1.0 BRAM_PORTA DOUT"; 
    ATTRIBUTE X_INTERFACE_INFO OF ena: SIGNAL IS "xilinx.com:interface:bram:1.0 BRAM_PORTA EN"; 
    ATTRIBUTE X_INTERFACE_INFO OF rsta: SIGNAL IS "xilinx.com:interface:bram:1.0 BRAM_PORTA RST"; 
    ATTRIBUTE X_INTERFACE_INFO OF wea: SIGNAL IS "xilinx.com:interface:bram:1.0 BRAM_PORTA WE"; 

begin 
end Behavioral; 
関連する問題