Forum: FPGA, VHDL & Co. AXI i2c HILFE


von xilinx_gast (Gast)


Lesenswert?

Hallo zusammen,

ich muss ein Axi I2c BUS benutzen,ich habe den Ip-core in Xps 
hinzugefügt (AXI IIC v1_02).
ich habe leider ein Problem mit den Signalen und zwar:
SCL und SDA habe ich als Externel Ports gemacht,und ich will die dann in 
mein Top_level verbinden.
im internet habe ich etwas gefunden aber ich kann es nicht verstehen:

scl <= scl_pad_o when (scl_padoen_oe = '0') else 'Z';
sda <= sda_pad_o when (sda_padoen_oe = '0') else 'Z';
scl_pad_i <= scl;
sda_pad_i <= sda;

könnt ihr bitte mir erklären was ich genau in den Top_level machen soll?
was mache ich mit den anderen signalen vom IIC-CORE 
(SCL_I,SCL_0,SCL_T,SDA_I,SDA_O,SDA_T).?

ich will nur ein beispiel erstellen und mit Schipscope die signal scl 
und sda anschauen.

Ich würde mich für jede Hilfe freuen.

von Klaus F. (kfalser)


Lesenswert?

scl/sda oder scl_o/sda_o, scl_i/sda_i, scl_t/sda_t sind alternativ.

Du hast 2 Möglichkeiten:

Durchschleifen von scl/sda (Tri-State in Core)
1
scl_pad <= scl;
2
sda_pad <= sda;

oder Tri-State im Top-Level:
1
scl_pad <= scl_o when (SCL_T = '0') else 'Z';
2
sda_pad <= sda_o when (SDA_T = '0') else 'Z';
3
scl_i <= scl_pad;
4
sda_i <= sda_pad;

scl_pad und sda_pad sind die Signalnamen des Top-Levels nach außen 
(müssen vom Typ inout sein.
scl/sda, scl_o/sda_o, scl_i/sda_i, scl_t/sda_t sind die Signalnamen des 
Microblaze Cores (external ports).

von xilinx_gast (Gast)


Lesenswert?

Hallo Klaus,

vielen Dank für die schnelle Antwort.

wenn ich richtig verstanden habe, falls ich mich für die zweite 
möglichkeit entscheide muss ich alle signale des AXI IIC als EXTERNEL 
PORTS machen,

habe ich auch gemacht leider kriege ich ein Fehlermeldung:

 ERROR:EDK:4068 -INSTANCE: axi_iic_0, PORT: Sda_I - THREE_STATE port, 
Sda, in use. Multiple drivers found on TRI_I port, Sda_I
ERROR:EDK:4068 - INSTANCE: axi_iic_0, PORT: Scl_I - THREE_STATE port, 
Scl, in use. Multiple drivers found on TRI_I port, Scl_I

Hier ist ein Teil meines MHS-file

BEGIN axi_iic
 PARAMETER INSTANCE = axi_iic_0
 PARAMETER HW_VER = 1.02.a
 PARAMETER C_INTERCONNECT_S_AXI_MASTERS = axi_cdma_0.M_AXI
 PARAMETER C_BASEADDR = 0x41600000
 PARAMETER C_HIGHADDR = 0x4160ffff
 BUS_INTERFACE S_AXI = axi_interconnect_hp
 PORT S_AXI_ACLK = processing_system7_0_FCLK_CLK0
 PORT IIC2INTC_Irpt = axi_iic_0_IIC2INTC_Irpt
 PORT Sda_O = axi_iic_0_Sda_O
 PORT Sda_T = axi_iic_0_Sda_T
 PORT Scl_I = net_axi_iic_0_Scl_I_pin
 PORT Scl_O = axi_iic_0_Scl_O
 PORT Scl_T = axi_iic_0_Scl_T
 PORT Sda_I = net_axi_iic_0_Sda_I_pin
 PORT Sda = axi_iic_0_Sda
 PORT Scl = axi_iic_0_Scl
 PORT Gpo = axi_iic_0_Gpo
END

vielen Dank im Vorauss

von Klaus F. (kfalser)


Lesenswert?

Wie gesagt, nach meiner Erinnerung sind scl/sda und scl_o/sda_o, 
scl_i/sda_i, scl_t/sda_t alternativ, d.h. entweder das eine oder das 
andere.

Versuch einmal scl und sda aus den external ports zu löschen, Du 
brauchts sie nicht.

Oder lösche scl_o/sda_o, scl_i/sda_i, scl_t/sda_t und verwende Methode 
1.

von xilinx_gast (Gast)


Lesenswert?

hallo Klaus es hat jetzt ohne Fehler geklappt danke,

jetzt habe ich noch eine Frage und zwar die scl_pad und sda_pad signale 
sollen "inout" sein. wo soll ich die hinfügen in der Entity? oder soll 
ich eine eingene Component für IIC erzeugen ?
meine idee ist nur die scl_pad und sda_pad mit schipscope zu verbinden 
und mit einem example c-code testen.

bitte um hilfe da ich die IIC verbindung nicht ganz verstehe

Danke im Vorauss

von Klaus F. (kfalser)


Lesenswert?

Leider ist mir Dein Problem noch nicht klar.
Hast Du überhaupt ein Top-Level?
Was sind nun scl_pad und sda_pad?
Versuch bitte den Quellcode, oder zumindest Ausschnitte zu posten.

von xilinx_gast (Gast)


Lesenswert?

Erstmal vielen Dank für deine schnelle Rückmeldung.
ja ich habe schon eine Top level :

so sieht ein Teil meiner Top level aus:
entity fifo_cdma_stub is
  port (
    BTNs_5Bits_TRI_IO : inout std_logic_vector(4 downto 0);
    processing_system7_0_MIO : inout std_logic_vector(53 downto 0);
    processing_system7_0_PS_SRSTB : in std_logic;
    processing_system7_0_PS_CLK : in std_logic;
    processing_system7_0_PS_PORB : in std_logic;
    processing_system7_0_DDR_Clk : inout std_logic;
    processing_system7_0_DDR_Clk_n : inout std_logic;
    processing_system7_0_DDR_CKE : inout std_logic;
    processing_system7_0_DDR_CS_n : inout std_logic;
    processing_system7_0_DDR_RAS_n : inout std_logic;
    processing_system7_0_DDR_CAS_n : inout std_logic;
    processing_system7_0_DDR_WEB_pin : out std_logic;
    processing_system7_0_DDR_BankAddr : inout std_logic_vector(2 downto 
0);
    processing_system7_0_DDR_Addr : inout std_logic_vector(14 downto 0);
    processing_system7_0_DDR_ODT : inout std_logic;
    processing_system7_0_DDR_DRSTB : inout std_logic;
    processing_system7_0_DDR_DQ : inout std_logic_vector(31 downto 0);
    processing_system7_0_DDR_DM : inout std_logic_vector(3 downto 0);
    processing_system7_0_DDR_DQS : inout std_logic_vector(3 downto 0);
    processing_system7_0_DDR_DQS_n : inout std_logic_vector(3 downto 0);
    processing_system7_0_DDR_VRN : inout std_logic;
    processing_system7_0_DDR_VRP : inout std_logic;
    vga_r: out std_logic_vector(3 downto 0);
    vga_g: out std_logic_vector(3 downto 0);
    vga_b: out std_logic_vector(3 downto 0);
    vga_hsync: out std_logic;
    vga_vsync: out std_logic;
--camera ports
    write_error:out std_logic;
    SM_D4:out std_logic;
    SM_D5:out std_logic;
    SM_D6:out std_logic;
    SM_D7:out std_logic;
    SM_D8:out std_logic;
    SM_D9:out std_logic;
    SM_D10:out std_logic;
    SM_D11:out std_logic;
    SM_VSYNC:out std_logic;
    SM_CLK:out std_logic;
    SM_PCLK:out std_logic;
    SM_HSYNC:out std_logic;
    SM_NRESET_CON:out std_logic;
    SM_STROBE_CON:out std_logic;
    SM_NOE_CON:out std_logic;
    SM_I2C_SCL:inout std_logic;
    SM_I2C_SDA:inout std_logic;
    read_error: out std_logic
  );
end fifo_cdma_stub;

architecture STRUCTURE of fifo_cdma_stub is

  component fifo_cdma is
    port (
      BTNs_5Bits_TRI_IO : inout std_logic_vector(4 downto 0);
      processing_system7_0_MIO : inout std_logic_vector(53 downto 0);
      processing_system7_0_PS_SRSTB : in std_logic;
      processing_system7_0_PS_CLK : in std_logic;
      processing_system7_0_PS_PORB : in std_logic;
      processing_system7_0_DDR_Clk : inout std_logic;
      processing_system7_0_DDR_Clk_n : inout std_logic;
      processing_system7_0_DDR_CKE : inout std_logic;
      processing_system7_0_DDR_CS_n : inout std_logic;
      processing_system7_0_DDR_RAS_n : inout std_logic;
      processing_system7_0_DDR_CAS_n : inout std_logic;
      processing_system7_0_DDR_WEB_pin : out std_logic;
      processing_system7_0_DDR_BankAddr : inout std_logic_vector(2 
downto 0);
      processing_system7_0_DDR_Addr : inout std_logic_vector(14 downto 
0);
      processing_system7_0_DDR_ODT : inout std_logic;
      processing_system7_0_DDR_DRSTB : inout std_logic;
      processing_system7_0_DDR_DQ : inout std_logic_vector(31 downto 0);
      processing_system7_0_DDR_DM : inout std_logic_vector(3 downto 0);
      processing_system7_0_DDR_DQS : inout std_logic_vector(3 downto 0);
      processing_system7_0_DDR_DQS_n : inout std_logic_vector(3 downto 
0);
      processing_system7_0_DDR_VRN : inout std_logic;
      processing_system7_0_DDR_VRP : inout std_logic;
      axi_burst_0_vga_dout_pin : out std_logic_vector(23 downto 0);
      axi_burst_0_vga_rd_en_pin : in std_logic;
      axi_burst_0_vga_prog_empty_pin : out std_logic;
      clock_generator_0_RST_pin : in std_logic;
      clock_generator_0_LOCKED_pin : out std_logic;
      axi_burst_0_extern_rd_vga_clk_pin : in std_logic;
      clock_generator_0_CLKOUT0_pin : out std_logic;
      axi_burst_0_r_error_read_pin : out std_logic;
      axi_burst_0_w_error_write_pin : out std_logic;
      axi_burst_0_extern_empty_pin : out std_logic;
-- external ports des AXI IIC
      axi_iic_0_Sda_I_pin : in std_logic;
      axi_iic_0_Sda_O_pin : out std_logic;
      axi_iic_0_Sda_T_pin : out std_logic;
      axi_iic_0_Scl_I_pin : in std_logic;
      axi_iic_0_Scl_O_pin : out std_logic;
      axi_iic_0_Scl_T_pin : out std_logic
    );
ein VGA core habe ich auch drin in der Top level.
die idee ist die Camera an den Board anzuschliessen.
wie du siehst die camera ports habe ich auch in der Entity hinzugefügt, 
und um sie zu steuern brauche ich EIN Axi IIC BUS was ich leider nicht 
weiss, wie ich es genau machen soll.
ich habe den AXI IIC core in meiner schaltlung hinzugefügt und an einem 
AXI bus verbunden.(ich will es auch nicht jetzt an der camera 
anschliessen ich will nur den AXI IIC testen ob es funktioniert).
ich will nur die gesamte signale in Top level richtig anschliesse und 
einfach mit schipscope die w_SM_I2C_SCL und w_SM_I2C_SDA ansehe.
(sin die überhaupt die richtige signale die ich anschauen soll??)
hier sind die signale des IIC im Top level
  --I2C LINES Signals
  signal w_axi_iic_0_Sda_I_pin:   std_logic;
  signal w_axi_iic_0_Sda_O_pin :   std_logic;
  signal w_axi_iic_0_Sda_T_pin :   std_logic;
  signal w_axi_iic_0_Scl_I_pin :   std_logic;
  signal w_axi_iic_0_Scl_O_pin:   std_logic;
  signal w_axi_iic_0_Scl_T_pin:   std_logic;



begin

--Schreiben zugreifen
w_SM_I2C_SCL  <= w_axi_iic_0_Scl_O_pin when w_axi_iic_0_Scl_T_pin ='0' 
else 'Z';
w_SM_I2C_SDA <= w_axi_iic_0_Sda_O_pin when w_axi_iic_0_Sda_T_pin ='0' 
else 'Z';

--Lesen zugreifen
w_axi_iic_0_Scl_I_pin <= w_SM_I2C_SCL ;
w_axi_iic_0_Sda_I_pin <= w_SM_I2C_SDA;

Mein Problem ist die Signale :w_SM_I2C_SCL,w_SM_I2C_SDA die sollen als 
inout signale sein aber wo kann ich die deklariere?? in der Entity oder 
soll ich eine Eigene  AXI IIC Component schreibe.

Meine Hoffnung ist : axi IIC bus benutzen zu können (ohne camera)und 
mittels c code zu testen.

Danke im Vorauss

von Klaus F. (kfalser)


Lesenswert?

Die Namensgenung bei Dir ist vielleicht ein bischen verwirrend.

SM_I2C_SCL und SM_I2C_SDA sind die inout Ports (also bidirektionale 
Pins) des Top-Levels und diese gehen nach außen zu den Beinchen. So 
weit, so gut.

w_axi_iic_0_Sda_I_pin usw. sind die Signale IM Top-Level und gehen an 
die Komponente fifo_cdma, wo der IIC Core drinnen ist.
Heißen zwar _pin, sind aber nicht die Pins.
1
FC : fifo_cdma 
2
     port map (
3
        ... 
4
        axi_iic_0_Sda_I_pin => w_axi_iic_0_Sda_I_pin,
5
        ...
6
     );

Im Top-Level schreibst Du dann :
1
--Schreiben zugreifen
2
SM_I2C_SCL  <= w_axi_iic_0_Scl_O_pin when w_axi_iic_0_Scl_T_pin ='0' 
3
else 'Z';
4
SM_I2C_SDA <= w_axi_iic_0_Sda_O_pin when w_axi_iic_0_Sda_T_pin ='0' 
5
else 'Z';
6
7
--Lesen zugreifen
8
w_axi_iic_0_Scl_I_pin <= SM_I2C_SCL ;
9
w_axi_iic_0_Sda_I_pin <= SM_I2C_SDA;

von xilinx_gast (Gast)


Lesenswert?

hallo Klaus,

jetzt kriege ich ein Fehler bei der Bitstream Generierung:
wegen die ZWEI Kamera Signale (ich habe die kamera gar nicht 
angeschloßen)
    SM_I2C_SCL:inout std_logic;
    SM_I2C_SDA:inout std_logic;
ERROR:Bitgen:342 - This design contains pins which have locations (LOC) 
that are not user-assigned or I/O Standards (IOSTANDARD) that are not 
user-assigned.
   This may cause I/O contention or incompatibility with the board power 
or
   connectivity affecting performance, signal integrity or in extreme 
cases
   cause damage to the device or the components to which it is 
connected.  To
   prevent this error, it is highly suggested to specify all pin 
locations and I/O standards to avoid potential contention or conflicts 
and allow proper
   bitstream creation.  To demote this error to a warning and allow 
bitstream
   creation with unspecified I/O location or standards, you may apply 
the
   following bitgen switch: -g UnconstrainedPins:Allow


ich bin über Bitstream Setting/ Bitstream um die option zu deaktivieren 
(you may apply the following bitgen switch: -g UnconstrainedPins:Allow)
aber finde das (-g) nicht und ich kann es auch nicht hinzufügen.
gibt es irgend einen anderen weg das problem zu lösen

und vielen Dank nochmal

von Klaus F. (kfalser)


Lesenswert?

Wie sieht's mit Deinem Englisch aus?

Die Fehlermeldung sagt doch, dass Du 2 Signale hast, und diesen ist kein 
Pin (Location) zugeordnet.
Du musst beiden Signalen die FPGA-Pins zuordnen, wo diese Leitungen 
angeschlossen sind.
Das hängt von Deinem Board/Schaltplan ab, das kannst nur Du wissen.

Normalerweise macht man die Pinzuweisung im UCF File.

von xilinx_gast (Gast)


Lesenswert?

ah doch habe ich hingekriegt
endlich mal bitstream erfolgreich generiert :-)

jetzt gucke ich wie ich es teste auf SDK

von xilinx_gast (Gast)


Lesenswert?

also mein englich ist miese :-)

aber die pins habe ich schon im ucf datei eingegeben:

# "CAM-BIT_0"
NET "SM_D4"    LOC = "IO_L20P_T3" | IOSTANDARD=LVTTL;
# "CAM-BIT_1"
NET "SM_D5"    LOC = "IO_L16P_T2" | IOSTANDARD=LVTTL;
# "CAM-BIT_2"
NET "SM_D6"    LOC = "IO_L15P_T2_DQS" | IOSTANDARD=LVTTL;
# "CAM-BIT_3"
NET "SM_D7"    LOC = "IO_L7P_T1" | IOSTANDARD=LVTTL;
# "CAM-BIT_4"
NET "SM_D8"    LOC = "IO_L10P_T1" | IOSTANDARD=LVTTL;
# "CAM-BIT_5"
NET "SM_D9"    LOC = "IO_L21P_T3_DQS" | IOSTANDARD=LVTTL;
# "CAM-BIT_6"
NET "SM_D10"    LOC = "IO_L8P_T1" | IOSTANDARD=LVTTL;
# "CAM-BIT_7"
NET "SM_D11"    LOC = "IO_L17P_T2" | IOSTANDARD=LVTTL;
# "CAM-BIT_7"
NET "SM_D11"    LOC = "IO_L17P_T2" | IOSTANDARD=LVTTL;
# "CAM-VSYNC"
NET "SM_VSYNC"    LOC = "IO_L22P_T3" | IOSTANDARD=LVTTL;
# "CAM-CLK"
NET "SM_CLK"    LOC = "IO_L13P_T2_MRCC" | IOSTANDARD=LVTTL;
# "CAM-PCLK"
NET "SM_PCLK"    LOC = "IO_L14P_T2_SRCC" | IOSTANDARD=LVTTL;
# "CAM-HSYNC"
NET "SM_HSYNC"    LOC = "IO_L5P_T0" | IOSTANDARD=LVTTL;
# "CAM-NRESET_CON"
NET "SM_NRESET_CON"    LOC = "IO_L18P_T2" | IOSTANDARD=LVTTL;
# "CAM-STROBE_CON"
NET "SM_STROBE_CON"    LOC = "IO_L4P_T0" | IOSTANDARD=LVTTL;
# "CAM-NOE_CON"
NET "SM_NOE_CON"    LOC = "IO_L11P_T1_SRCC" | IOSTANDARD=LVTTL;
# "CAM-I2C_SCL"
NET "SM_I2C_SCL"    LOC = "IO_L13P_T2_MRCC" | IOSTANDARD=LVTTL;
# "CAM-I2C_SDA"
NET "SM_I2C_SDA"    LOC = "IO_L14P_T2_AD4P_SRCC" | IOSTANDARD=LVTTL;

aber jetzt geht es erstmal umd axi iic zu testen will die kamera gar 
nicht anschliessen.
macht sinn die signale w_axi_iic_0_Scl_I_pin und w_axi_iic_0_Sda_I_pin 
mit schipscope anzuschauen weil SM_I2C_SCL und SM_I2C_SDA kann ich nicht 
als schipscope signale nehmen. kriege ich eine Fehelermeldung.

schönen Gruss und vielen dank für deine Mühe.

von Klaus F. (kfalser)


Lesenswert?

xilinx_gast schrieb:
> also mein englich ist miese :-)

;-) könnte sein, "schipscope" schreibt sich nämlich "Chipscope"

xilinx_gast schrieb:
> macht sinn die signale w_axi_iic_0_Scl_I_pin und w_axi_iic_0_Sda_I_pin
> mit schipscope anzuschauen weil SM_I2C_SCL und SM_I2C_SDA kann ich nicht
> als schipscope signale nehmen

Wenn's nicht anders geht...
Chipscope habe ich fast nie verwendet. Nimmt man eher um interne Signale 
anzuschauen, ich würde aber eher simulieren.

von xilinx_gast (Gast)


Lesenswert?

was meinst du mit simulieren??
ich dachte Hardware kann man nicht simulieren ?
wenn ich den program (bit-datei) auf dem board lade ich kann nur die 
signale auf chipscope ansehe.

von Klaus F. (kfalser)


Lesenswert?

xilinx_gast schrieb:
> was meinst du mit simulieren??
> ich dachte Hardware kann man nicht simulieren ?
> wenn ich den program (bit-datei) auf dem board lade ich kann nur die
> signale auf chipscope ansehe.

Du kannst das bit-File nicht simulieren, das ist richtig.
Aber von einem VHDL Simulator hast Du vielleicht schon gehört, oder?

von xilinx_gast (Gast)


Lesenswert?

:-) ja schon habe ich auch schon mal benutzt ISIM

von Duke Scarring (Gast)


Lesenswert?

xilinx_gast schrieb:
> :-) ja schon habe ich auch schon mal benutzt ISIM
Fein :-)

Hardware kann man zwar wirklich nicht simulieren, aber ich modelliere 
mir meine Hardware mit VHDL und kann sie dann simulieren.
Manche Halbleiterhersteller bieten auch schon fertige Modelle an (z.B. 
von DRAMs).

Für ADC- und DAC-Modelle bietet es sich an, mit File-IO zu arbeiten.

Duke

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.