Forum: FPGA, VHDL & Co. AXI UART Lite


von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich würde gerne den AXI UART Lite IP von Xilinx verwenden. Diesen habe 
ich im Vivado IP Catalog gefunden. Sowie ich das verstanden habe ist 
dieser Block ein UART<->AXI Converter. Mit UART können doch nur 2 
Teilnehmer miteinander kommunizieren oder? Deshalb frage ich mich ob ich 
die Adressleitung vom AXI Interface weglassen kann? Wenn ich mir aber im 
RTL die AXI Adressleitung genauer ansehe dann sehe ich das diese 
verwendet wird. Sie läuft in einen address_decoder rein (siehe Anhang). 
Ich frage mich wofür der gut sein soll.
Vielleicht könnt ihr mir da weiterhelfen. Danke

Grüße

Alex

von Mrs. MultiTask (Gast)


Lesenswert?

Das ist kein standalone UART sondern ist als peripheral für ein 
mikroblaze/ARM System konzipiert. Dieser µC kommuniziert über AXI 
(AMBA-Weiterentwicklung)mit dem uart. Die Sdressleitungen wählen diverse 
Register in dem UART aus, und blenden diesen in den Adressraum ein.
Wenn du keinen Mikroblaze/Zynq-ARM einsetzt brauchst du diesen UART-core 
nicht.

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Danke für die Antwort Mrs. MultiTask.
Mein Ziel ist es eigentlich diesen IP zu erweitern um eine AXI Stream 
Schnittstelle. Ich möchte Daten vom UART lesen und an einen DMA 
schicken. Dieser hat ein AXI Stream Interface. Erstmal möchte ich aber 
verstehen wie dieser IP überhaupt funktioniert. Im Datenblatt habe ich 
jetzt die möglichen Adressen gefunden(siehe Anhang). Verstehe ich das 
richtig, dass wenn ich die Adresse 0h anlege, kann ich Daten die 
empfangenen Daten auslesen?

von Mrs. MultiTask (Gast)


Lesenswert?

Alex schrieb:
> Verstehe ich das
> richtig, dass wenn ich die Adresse 0h anlege, kann ich Daten die
> empfangenen Daten auslesen?

Im Prinzip ja, allerdings solltest du vorher den Status checken ob auch 
neue Daten drinstehen. Oder du benutzt XUartLite_RecvByte() (?) aus 
xuartlite_l.h .  Und natürlich ist 0x00h nur der Offset zur 
Anfangsadresse des Uart-modules. Da mal ein Beispiel, sicher nicht das 
beste, aber das was ich auf die Schnelle gefunden hab:
http://fileadmin.cs.lth.se/cs/Education/EDA385/HT06/doc/2004Group1_Final.pdf

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, danke für das Beispiel. Werde ich mir noch ansehen. Da ich aber 
in diesen IP noch eine AXIStream Schnittstelle einbauen möchte, muss ich 
erstmal verstehen wie die bisherige AXI Lite Schnittstelle funktioniert. 
Ich habe zunächst habe ich folgendes ausprobiert. Ich habe mir eine 
Testbench erstellt die mir das Lesen und schreiben simulieren soll. Das 
Schreiben geht(siehe auskommentiert) aber das Lesen leider nicht. Meine 
Testbench sieht folgendermaßen aus:
1
 comp_design_1_wrapper : design_1_wrapper
2
      port map (
3
                S_AXI_araddr  => S_AXI_araddr,
4
                S_AXI_arready => S_AXI_arready,
5
                S_AXI_arvalid => S_AXI_arvalid,
6
                S_AXI_awaddr  => S_AXI_awaddr,
7
                S_AXI_awready => S_AXI_awready,
8
                S_AXI_awvalid => S_AXI_awvalid,
9
                S_AXI_bready  => S_AXI_bready,
10
                S_AXI_bresp   => S_AXI_bresp,
11
                S_AXI_bvalid  => S_AXI_bvalid,
12
                S_AXI_rdata   => S_AXI_rdata,
13
                S_AXI_rready  => S_AXI_rready,
14
                S_AXI_rresp   => S_AXI_rresp,
15
                S_AXI_rvalid  => S_AXI_rvalid,
16
                S_AXI_wdata   => S_AXI_wdata,
17
                S_AXI_wready  => S_AXI_wready,
18
                S_AXI_wstrb   => S_AXI_wstrb,
19
                S_AXI_wvalid  => S_AXI_wvalid,
20
                UART_rxd      => RX,
21
                UART_txd      => UART_txd,
22
                s_axi_aclk    => clk,
23
                s_axi_aresetn => reset_l
24
   );
25
   
26
       bclk_process : PROCESS
27
  BEGIN
28
    clk <= '0';
29
    WAIT FOR clk_period/2;
30
    clk <= '1';
31
    WAIT FOR clk_period/2;
32
  END PROCESS;
33
   
34
     axi_simu : process
35
  begin
36
    reset_l <= '0';
37
    wait for 300 ns;
38
    reset_l <= '1';
39
    wait for 300 ns;
40
    
41
    S_AXI_araddr <= "0001";
42
    S_AXI_arvalid <= '1';
43
    -- S_AXI_awaddr <= "0100";
44
    -- S_AXI_awvalid <= '1';
45
    -- S_AXI_wdata <= "00000000000000000000000001010011";
46
    -- S_AXI_wvalid <= '1';
47
    
48
    wait;
49
  end process; 
50
   
51
    -- Add your stimulus here ...
52
  uart_simu : process
53
  begin
54
    -- read "10101010"
55
    RX       <= '0'; --start bit
56
    wait for 8680 ns;
57
    RX       <= '1'; --"1
58
    wait for 8680 ns;
59
    RX       <= '0'; --"10
60
    wait for 8680 ns;
61
    RX       <= '1'; --"101
62
    wait for 8680 ns;
63
    RX       <= '0'; --"1010
64
    wait for 8680 ns;
65
    RX       <= '1'; --"10101
66
    wait for 8680 ns;
67
    RX       <= '0'; --"101010
68
    wait for 8680 ns;
69
    RX       <= '1'; --"1010101
70
    wait for 8680 ns;
71
    RX       <= '0'; --"10101010"
72
    wait for 8680 ns;
73
    RX       <= '0'; -- parity
74
    wait for 8680 ns;
75
    RX       <= '1'; -- stop bit
76
    wait for 8680 ns;
77
  end process; 
78
79
80
end Behavioral;

Wenn ich das simuliere dann sehe ich das auf S_AXI_1_RDATA keine Daten 
kommen(siehe Anhang). Das heisst irgendwas geht da schief beim lesen. 
Kann du mir sagen was ich falsch gemacht habe? Danke

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.