Forum: FPGA, VHDL & Co. Vivado: Verwendung von Interface-Definitionen in RTL-Modulen


von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein paar Fragen zur Xilinx Vivado 2016.2 und neuer.

Besteht eigentlich bei der Verwendung eines RTL-Moduls in einem 
Blockdesign die Möglichkeit, mit Interfacedefinitionen zu arbeiten?

Oder können Interfaces nur in Verbindung mit IP-Blöcken verwendet 
werden, so dass sich Module nur mit Einzelsignalen (und AXI-Interfaces) 
einsetzen lassen?

Bedeutet das auch, dass man von Modulen aus keine Verbindungen zu 
Interfaces ziehen kann, die z.B. in einer Boardbeschreibung (board.xml, 
part0_pins.xml) definiert sind?

Kann man denn wenigstens, vorzugsweise per TCL oder XDC-Datei, auf die 
vergebenen Namen von Pindefinitionen direkt zugreifen, so in etwa wie:
1
set_property PACKAGE_PIN [get_board_part_pin ADC1_BUSY  [get_ports ch1_adc_busy]

Leider konnte ich bisher keine TCL-Funktion finden, die einem 
"get_board_part_pin" entspricht. Und in der I/O-Port-Definition von 
Vivado werden die Tabellenspalten "Board Part Pin" und "Board Part 
Interface" auch nur für Pins gefüllt, für die eine Verbindung zu 
IP-Blöcken besteht.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Nachtrag:

Ich habe festgestellt, dass ich bei der Suche nach geeigneten 
TCL-Kommandos fälschlicherweise immer get_bd_... statt get_board_... 
getippt hatte und natürlich deswegen nicht fündig wurde. AUA

Mittlerweile habe ich aber auch herausgefunden, dass man die Zuordnung 
anhand der Board Part Pins wie folgt durchführen kann:
1
set_property BOARD_PART_PIN ADC1_BUSY [get_ports ch1_adc_busy]

Allerdings können auf diese Art und Weise nur schon in anderen 
Interfaces verwendete Pins referenziert werden und nicht welche, die nur 
in der part0_pins.xml definiert wurden.

von Klakx (Gast)


Lesenswert?

Es sollte zumindest möglich sein aus deinem RTL einen IP zu erstellen, 
der dann Interfaces unterstützt.

Falls eine direkte Variante über RTL möglich wäre, fände ich das auch 
interessant.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Ich habe nach etlichen Stunden des Herumprobierens herausgefunden, wie 
es geht. Die Vorgehensweise ist in UG994, Kapitel 12 "Referencing RTL 
Modules" genau beschrieben; vielleicht hätte ich dieses Kapitel 
ausführlicher studieren sollen.

Entscheidend für die Erkennung von Interfaces im Blockdesign ist die 
Verwendung des Attributs X_INTERFACE_INFO in der Architecture des 
RTL-Modules. Bei meinem obigen Beispiel wäre das z.B.
1
entity mid_ch1 is
2
  generic (
3
    -- Users to add parameters here
4
5
    -- User parameters ends
6
    -- Do not modify the parameters beyond this line
7
8
    -- Parameters of Axi Slave Bus Interface S_AXI
9
    C_S_AXI_DATA_WIDTH  : integer := 32;
10
    C_S_AXI_ADDR_WIDTH  : integer := 6
11
  );
12
  port (
13
    -- Users to add ports here
14
        
15
    -- Ports of mid_adc1_ctrl
16
    adc_busy            : in    std_logic;
17
    adc_cnv             : out   std_logic;
18
    adc_rdl_sdi         : out   std_logic;
19
20
    -- User ports ends
21
    -- Do not modify the ports beyond this line
22
23
24
    -- Ports of Axi Slave Bus Interface S_AXI
25
    s_axi_aclk  : in std_logic;
26
    s_axi_aresetn : in std_logic;
27
    s_axi_awaddr  : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
28
    s_axi_awprot  : in std_logic_vector(2 downto 0);
29
    s_axi_awvalid : in std_logic;
30
    s_axi_awready : out std_logic;
31
    s_axi_wdata : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
32
    s_axi_wstrb : in std_logic_vector((C_S_AXI_DATA_WIDTH/8)-1 downto 0);
33
    s_axi_wvalid  : in std_logic;
34
    s_axi_wready  : out std_logic;
35
    s_axi_bresp : out std_logic_vector(1 downto 0);
36
    s_axi_bvalid  : out std_logic;
37
    s_axi_bready  : in std_logic;
38
    s_axi_araddr  : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
39
    s_axi_arprot  : in std_logic_vector(2 downto 0);
40
    s_axi_arvalid : in std_logic;
41
    s_axi_arready : out std_logic;
42
    s_axi_rdata : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
43
    s_axi_rresp : out std_logic_vector(1 downto 0);
44
    s_axi_rvalid  : out std_logic;
45
    s_axi_rready  : in std_logic
46
  );
47
end mid_ch1;
48
49
architecture arch_imp of mid_ch1 is
50
51
  ATTRIBUTE X_INTERFACE_INFO : STRING;
52
  ATTRIBUTE X_INTERFACE_INFO of adc_busy: SIGNAL is "schweigstill.de:user:mid_adc1_ctrl:1.0 adc_ctrl busy";
53
  ATTRIBUTE X_INTERFACE_INFO of adc_cnv: SIGNAL is "schweigstill.de:user:mid_adc1_ctrl:1.0 adc_ctrl cnv";
54
  ATTRIBUTE X_INTERFACE_INFO of adc_rdl_sdi: SIGNAL is "schweigstill.de:user:mid_adc1_ctrl:1.0 adc_ctrl rdl_sdi";

Das, was ich leider noch nicht hinbekommen habe, ist die Verknüpfung 
dieses Interfaces mit Hilfe einer Boardbeschreibung. Stattdessen habe 
ich dann die entsprechenden Pins direkt in der vivado_target.xdc 
eingetragen, was dann auch wunderbar funktionierte.
1
set_property PACKAGE_PIN K1 [get_ports ch1_adc_ctrl_busy]
2
set_property PACKAGE_PIN K2 [get_ports ch1_adc_ctrl_cnv]
3
set_property PACKAGE_PIN G2 [get_ports ch1_adc_ctrl_rdl_sdi]

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.