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
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.
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.