Forum: FPGA, VHDL & Co. Kommunikation mit UART um einen Register zu lesen


von Laura (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe dieses Projekt (Bild 1 & 2 ) bekommen und komme jetzt nicht 
weiter. Ich brauche Hilfe.
Ich soll einen Regsiter lesen (mit Hilfe eines Register-Lesers, der ich 
schon programmiert habe und richtigfunktioniert) über die 
UART-Schnittstelle. Im Projekt wird eine Datei gehängt, die eine Folge 
von Nummern beinhaltet. Ich habe im Anhang meinen Code gespeichert. Die 
Testbench habe ich bekommen. Ich benutze vivado um zu simulieren 
(Simulation auch im Anhangunter "Bild 5"). Und bei den Variablen 
"reg_dat" und "rx_fifo" habe ich keinen Wert. Die Konfigurationsdatei 
(constraint) habe ich auch schon. Sie hat keinen Fehler.

Kann mir bitte jemand helfen? Ich muss bald abgeben und weiss nicht was 
los ist.

Danke im Voraus.

VG.

Hier ist mein Source Code:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
use ieee.std_logic_misc.all;
5
use ieee.std_logic_arith.all;
6
use ieee.std_logic_unsigned.all;
7
USE work.reg_pack.ALL;
8
9
library unisim;
10
use unisim.vcomponents.all;
11
library work;
12
13
entity uart_top_ro is
14
   port (
15
         brd_clk : in std_logic;
16
         rxfifo_dat    : OUT STD_LOGIC_VECTOR (7 downto 0);
17
         rx : in std_logic;
18
         tx : out std_logic;
19
         dat_received  : OUT std_logic;
20
         debug  : OUT STD_LOGIC_VECTOR (15 downto 0)
21
        
22
         );
23
end entity;
24
25
architecture arch_uart_top_ro of uart_top_ro is
26
27
-- Pragma Added to supress synth warnings
28
--attribute DowngradeIPIdentifiedWarnings: string;
29
--attribute DowngradeIPIdentifiedWarnings of impl : architecture is "yes";
30
31
32
component axi_uartlite_0 is
33
  PORT (
34
-- System signals
35
      s_axi_aclk           : in  std_logic;
36
      s_axi_aresetn         : in  std_logic;
37
      interrupt             : out std_logic;
38
-- AXI signals
39
      s_axi_awaddr          : in  std_logic_vector(3 downto 0);
40
      s_axi_awvalid         : in  std_logic;
41
      s_axi_awready         : out std_logic;
42
      s_axi_wdata           : in  std_logic_vector
43
                              (31 downto 0);
44
      s_axi_wstrb           : in  std_logic_vector
45
                              (3 downto 0);
46
      s_axi_wvalid          : in  std_logic;
47
      s_axi_wready          : out std_logic;
48
      s_axi_bresp           : out std_logic_vector(1 downto 0);
49
      s_axi_bvalid          : out std_logic;
50
      s_axi_bready          : in  std_logic;
51
      s_axi_araddr          : in  std_logic_vector(3 downto 0);
52
      s_axi_arvalid         : in  std_logic;
53
      s_axi_arready         : out std_logic;
54
      s_axi_rdata           : out std_logic_vector
55
                              (31 downto 0);
56
      s_axi_rresp           : out std_logic_vector(1 downto 0);
57
      s_axi_rvalid          : out std_logic;
58
      s_axi_rready          : in  std_logic;
59
60
-- UARTLite Interface Signals
61
     rx                    : in  std_logic;
62
      tx                    : out std_logic
63
   );
64
end component;
65
66
---------------------------------------------------------------
67
--Component Declaration reset_gen_ctr
68
component reset_gen_ctr is
69
port (
70
      ck    : in  STD_LOGIC;
71
      axi_nres : OUT  STD_LOGIC 
72
      );
73
end component;
74
75
component fsm_axi_uart_lite is
76
port (
77
ck: in std_logic;
78
reg_rdy: in std_logic;
79
rd_valid: in std_logic;
80
reg_sel : out std_logic;
81
rd_ready: out std_logic
82
);
83
end component;
84
85
component reg_read is 
86
port (
87
    start      : in  STD_LOGIC;
88
    reg_adr    : in STD_LOGIC_VECTOR (31 downto 0);
89
    reg_dat    : OUT STD_LOGIC_VECTOR (31 downto 0);
90
    reg_ready  : OUT  STD_LOGIC;
91
    ------------------------------------------------
92
    ax_ack     : in  STD_LOGIC;
93
    ax_resetn  : in  STD_LOGIC;    
94
      ax_arready : in  STD_LOGIC;
95
      ax_rvalid  : in  STD_LOGIC;
96
    ax_rdata   : in  STD_LOGIC_VECTOR (31 downto 0);
97
      ax_arvalid : OUT  STD_LOGIC;
98
      ax_rready  : OUT  STD_LOGIC;
99
      ax_ar_adr  : OUT  STD_LOGIC_VECTOR(31 downto 0)    
100
101
);
102
end component;
103
104
signal    m_axi_lite_awready          :  std_logic                         ;-- AXI4-Lite
105
signal    m_axi_lite_awvalid          :  std_logic                         ;-- AXI4-Lite
106
signal    m_axi_lite_awaddr           :  std_logic_vector (3 downto 0);-- AXI4-Lite
107
signal    m_axi_lite_wready           :  std_logic                         ;-- AXI4-Lite
108
signal    m_axi_lite_wvalid           :  std_logic                         ;-- AXI4-Lite
109
signal    m_axi_lite_wdata            :  std_logic_vector (31 downto 0);-- AXI4-Lite
110
signal    m_axi_lite_bready           :  std_logic                         ;-- AXI4-Lite
111
signal    m_axi_lite_bvalid           :  std_logic                         ;-- AXI4-Lite
112
signal    m_axi_lite_bresp            :  std_logic_vector(1 downto 0)      ;-- AXI4-Lite
113
signal    s_axi_lite_arready          :  std_logic                         ;-- AXI4-Lite
114
signal    s_axi_lite_arvalid          :  std_logic                         ;-- AXI4-Lite
115
signal    s_axi_lite_araddr           :  std_logic_vector (3 downto 0);-- AXI4-Lite
116
signal    s_axi_lite_rready           :  std_logic                         ;-- AXI4-Lite
117
signal    s_axi_lite_rvalid           :  std_logic                         ;-- AXI4-Lite
118
signal    s_axi_lite_rdata            :  std_logic_vector (31 downto 0);-- AXI4-Lite
119
signal    s_axi_lite_rresp            :  std_logic_vector(1 downto 0)      ;-- AXI4-Lite
120
121
signal clk:  std_logic;
122
signal reset : std_logic;
123
signal reg_addr0: std_logic_vector (31 downto 0);
124
signal rxfifo_dat_int: std_logic_vector (7 downto 0);
125
signal tx_int : std_logic;
126
--signal dat_received_int: std_logic;
127
signal rd_valid0: std_logic;
128
signal reg_read_rdy0: std_logic;
129
signal rd_ready0 : std_logic;
130
signal reg_adr : std_logic_vector (31 downto 0);
131
signal reg_dat: std_logic_vector(31 downto 0);
132
signal ax_ar_adr: std_logic_vector(31 downto 0);
133
signal reg_sel1: std_logic;
134
signal start : std_logic;
135
---
136
begin
137
clkf_buf: BUFG
138
    port map (
139
      I => brd_clk,
140
      O => clk
141
    );
142
--Register-Leser
143
uut: reg_read
144
port map (
145
         start      => start,
146
         reg_adr    => reg_addr0,
147
         reg_dat    => reg_dat,
148
         reg_ready  => reg_read_rdy0,
149
         ------------------------------------------------
150
         ax_ack     => clk,
151
         ax_resetn  => reset,
152
         ax_arready => s_axi_lite_arready,
153
         ax_rvalid  => s_axi_lite_rvalid,
154
         ax_rdata   => s_axi_lite_rdata,
155
         ax_arvalid => s_axi_lite_arvalid,
156
         ax_rready  => s_axi_lite_rready,
157
         ax_ar_adr  => ax_ar_adr
158
);
159
160
rxfifo_dat_int ( 7 downto 0 ) <= reg_dat( 7 downto 0);
161
s_axi_lite_araddr (3 downto 0 ) <= ax_ar_adr(3 downto 0);
162
163
i_fsm_axi_uart_lite: fsm_axi_uart_lite
164
port map(
165
ck=> clk,
166
reg_rdy=> reg_read_rdy0,
167
rd_valid=> rd_valid0,
168
reg_sel=> reg_sel1,
169
rd_ready=> rd_ready0
170
);
171
   
172
i_res_gen_ctr: reset_gen_ctr 
173
    port map (
174
          ck        => clk,
175
          axi_nres  => reset
176
          );       
177
          
178
i_reg_data_out: reg_par
179
    generic map (reg_width => 8)
180
    Port map (
181
            ck=> clk,
182
            ld_par => rd_ready0,
183
            data_in => rxfifo_dat_int,
184
            data_out => rxfifo_dat
185
    );          
186
ual : axi_uartlite_0
187
    PORT MAP (
188
    interrupt     => open,       
189
    s_axi_aclk       => clk,
190
    s_axi_aresetn    => reset,
191
    s_axi_awaddr     => m_axi_lite_awaddr (3 downto 0),
192
    s_axi_awvalid    => m_axi_lite_awvalid,
193
    s_axi_awready    => m_axi_lite_awready,
194
    s_axi_wdata      => m_axi_lite_wdata,
195
    s_axi_wstrb      => "1111",
196
    s_axi_wvalid     => m_axi_lite_wvalid,
197
    s_axi_wready     => m_axi_lite_wready,
198
    s_axi_bresp      => m_axi_lite_bresp,
199
    s_axi_bvalid     => m_axi_lite_bvalid,
200
    s_axi_bready     => m_axi_lite_bready,
201
    s_axi_araddr     => s_axi_lite_araddr (3 downto 0),
202
    s_axi_arvalid    => s_axi_lite_arvalid,
203
    s_axi_arready    => s_axi_lite_arready,
204
    s_axi_rdata      => s_axi_lite_rdata,
205
    s_axi_rresp      => s_axi_lite_rresp,
206
    s_axi_rvalid     => s_axi_lite_rvalid,
207
    s_axi_rready     => s_axi_lite_rready,
208
    rx               => rx,    -- these will go to board 
209
    tx               => tx_int
210
    );    
211
    tx <= tx_int;
212
---------------------------------------------------------------
213
-- Mux1
214
reg_addr0 <= x"00000008" when reg_sel1= '0' else
215
             x"00000000";
216
--Mux2
217
rd_valid0 <= '1' when rxfifo_dat_int(0)= '1' else
218
             '0';
219
--Erst mal alles ruhigstellen:
220
      m_axi_lite_awaddr (3 downto 0) <= "0000";
221
      m_axi_lite_awvalid <= '0';
222
      m_axi_lite_wdata   <= (others => '0');
223
      m_axi_lite_wvalid  <= '0';
224
      m_axi_lite_wready  <= '0';
225
      m_axi_lite_bready  <= '0';
226
227
228
229
--debug, an Pmod-Steckern angeschlossen:
230
debug(0) <= rx;  
231
debug(1) <= '0';
232
debug(2) <= s_axi_lite_arvalid;
233
debug(3) <= s_axi_lite_arready;
234
debug(4) <= s_axi_lite_araddr (3);
235
debug(5) <= s_axi_lite_araddr (1);
236
debug(6) <= s_axi_lite_araddr (0);
237
--debug(7) <= dat_received_int;
238
debug(7) <= rd_ready0;
239
debug(15 downto 8) <=  rxfifo_dat_int;
240
241
end arch_uart_top_ro;


[MOD: bitte künftig VHDL-Code mit den VHDL-Tags umrahmen. Oder besser 
noch: langen Quelltext als *.vhd-Datei /anhängen/]

: Bearbeitet durch Moderator
von Gustl B. (-gb-)


Lesenswert?

Was für Daten stehen denn im Register an dieser Adresse? Da kommt ja 
noch UU vor.

Ausserdem:

use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_misc.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

Das ist zu viel.

use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

reicht.

Darf man fragen an welcher Uni/FH Du studierst? Mir kommt das grob 
bekannt vor und ich tippe auf Ostbayern.

von Laura (Gast)


Lesenswert?

Hallo,
ich studiere im Ostbayern.

Gustl B. schrieb:
> Was für Daten stehen denn im Register an dieser Adresse?

Welche Adresse meinen Sie? Um herrlich zu sein, verstehe ich auch nicht 
so gut die Aufgabe und weiß nicht wie das alles funktioniert. Eine 
Erklärung wäre willkommen und sehr hilfreich.

von Gustl B. (-gb-)


Lesenswert?

An der OTH bei Herrn Kohlert? Ja also ich hab da was, das kann ich am 
Abend hier anhängen.

von Laura (Gast)


Lesenswert?

ok, danke.

von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

So, was macht die Beschreibung?

Es wird zyklich von Adresse x"8" (Status) gelesen. Wenn da was Neues 
liegt wird es dann in einem zusätzlichen Lesevorgang gelesen von Adresse 
x"0".

Die Testbench schickt über einen UART Daten und die werden dann 
zurückgesendet.

von Gustl B. (-gb-)


Lesenswert?

Edit:

Weil UART langsam ist sollte man längere Zeit simulieren, so 5 ms 
müssten passen.

von Laura (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

vielen Dank für die Antwort und die Erklärung. Ich habe versucht, Ihr 
Programm  grob  zu verstehen.  Jetzt verstehe ich was hier passiert. 
Aber in meiner Aufgabe soll ich einen Register lesen und nichts selber 
in UArt schreiben. Ich habe eine Datei, deren Werte gelesenwerden 
sollen. Ich weiß zumindest nicht, ob diese Datei überhaupt geöffnet 
wird. Ich hänge mal mein Projekt. Könnten Sie bitte einen Blick drauf 
werfen? Ich möchte nur wissen, was ich nicht richtig gemacht habe.
Übrigens, ich kann auch nicht 5ms simulieren. Ich habe eine Meldung: 
"Fatal run time error".

Danke im Voraus.

von Gustl B. (-gb-)


Lesenswert?

Oh OK. HM ... also erstmal ... wir duzen uns hier. Und dann bitte auch 
die .vhd Dateien anhängen/hochladen. Das .xpr ist nur eine XML Datei die 
keine Hardwarebeschreibung enthält.

Ich kann hier 5ms simulieren. Welches Vivado hast du? Vielleicht den IP 
mal upgraden. Was steht in der Vivado Konsole, also welche 
Fehlermeldung?

von Laura (Gast)


Angehängte Dateien:

Lesenswert?

oh ok. Alles klar:). Ich habe vivado 2017.3. Ich habe die Dateien 
hochgeladen.

Hier ist die Fehlermeldung:

run 5 ms
ERROR: File test_data.dta is not open. Cannot call endfile on it
Time: 2 us  Iteration: 0  Process: /tb_uart_top_ro/test_sim
  File: E:/project_3_2 update26.12/tb_uart_top_ro_raw.vhd

HDL Line: E:/project_3_2 update26.12/tb_uart_top_ro_raw.vhd:65


Die angehängte Datei kann anscheinend nicht geöffnet werden. Ich habe 
sie als "simulation source" hinzugefügt. Hatte früher mit "design 
source" probiert. Aber es hatte nicht geklappt.

von Gustl B. (-gb-)


Lesenswert?

Hallo nochmal.

Ich habe mir das jetzt mal angeguckt und werde nicht schlau daraus. Ich 
verstehe noch nicht einmal die Aufgabenstellung, das sieht einfach nur 
konfus aus und deutlich zu kompliziert für die Aufgabenstellung.

Mir ist klar, dass Du es für den Kurs vermutlich so machen musst wie es 
der Lehrer will, aber falls Du selber VHDL und Hardwarebeschreibung 
lernen möchtest, dann kannst Du Dich gerne hier melden mit der 
Aufgabenstellung und wir lösen das etwas eleganter.

von Laura (Gast)


Lesenswert?

Hallo,

vielen Dank für das Angebot. Ich hatte Prüfungen. Ist das Angebot noch 
gültig?

von Gustl B. (-gb-)


Lesenswert?

UPS, hatte nicht mitgelesen. Klar. Einfach her mit den Aufgaben. Für den 
FPGA Kurs an der Uni Regensburg hatte ich mal Aufgaben erstellt, die 
kann ich auch mal rausgeben.

von Laura K. (laura721)


Angehängte Dateien:

Lesenswert?

Hallo,

danke. :)
Die Aufgabe ist im Anhang. Die pdf-Datei ist die Aufgabenstellung. Ich 
bin bei der Aufgabe 3.2 (ab S.9) auf Schwierigkeiten gestoßen. Ich muss 
erstmal ein Zustandsdiagramm, eine "state machine" und ein 
Timing-diagramm erstellen. Diese stehen auch im Ordner(ich weiß nicht, 
ob sie richtig sind). Die Testbench habe ich vom Prof. bekommen. alles 
was ich bekommen habe, steht im Ordner "uart_top_raw". Die zwei Bilder 
sind richtig. Ich habe sie von einem Kumpel bekommen aber ich kann es 
nicht nachvollziehen (er auch nicht).
Am Ende muss ich haben:
-Zustandsdiagramm
-state machine
-Timing-diagramm
-testbench
-uart_top_raw (hier weiß ich nicht, wie ich den Komponent initialiseren 
soll, bei dem "PORT MAP")

Ich bin schon verwirrt und weiß nicht wie ich weiter machen kann.

Ich würde mich um Hilfe freuen.

Danke im Voraus.

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Ich bin wieder mal um und wech, wenn Ich sehe, welch ein abartig 
gigantischer overhead bei diesem AXI-If anfällt, um ein so simples 
Problem, wie das Einlesen eines seriellen IF-Wertes umzusetzen.

Wir haben das früher mit einem Zähler gemacht, der ein Schieberegister 
überwacht hat und nach gusto was eingetaktet hat. Wahrscheinlich stamme 
Ich aber aus einer anderen Zeit.

von Gustl B. (-gb-)


Lesenswert?

Hallo,
also man kann das schon elegant lösen und auch knapp, aber dann wird es 
eben nicht wie in der Aufgabe verlangt. Weiter oben hatte ich ein axi 
Projekt angehängt das eigentlich genau das tut was auch die Aufgabe 
will: Statusregister lesen und wenn neue Daten empfangen wurden dann 
diese über nehmen. Das kannst du jetzt noch in einen extra registerleser 
packen aber das macht es nicht schöner.

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.