mikrocontroller.net

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


Autor: Laura (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
library ieee;
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;
USE work.reg_pack.ALL;

library unisim;
use unisim.vcomponents.all;
library work;

entity uart_top_ro is
   port (
         brd_clk : in std_logic;
         rxfifo_dat    : OUT STD_LOGIC_VECTOR (7 downto 0);
         rx : in std_logic;
         tx : out std_logic;
         dat_received  : OUT std_logic;
         debug  : OUT STD_LOGIC_VECTOR (15 downto 0)
        
         );
end entity;

architecture arch_uart_top_ro of uart_top_ro is

-- Pragma Added to supress synth warnings
--attribute DowngradeIPIdentifiedWarnings: string;
--attribute DowngradeIPIdentifiedWarnings of impl : architecture is "yes";


component axi_uartlite_0 is
  PORT (
-- System signals
      s_axi_aclk           : in  std_logic;
      s_axi_aresetn         : in  std_logic;
      interrupt             : out std_logic;
-- AXI signals
      s_axi_awaddr          : in  std_logic_vector(3 downto 0);
      s_axi_awvalid         : in  std_logic;
      s_axi_awready         : out std_logic;
      s_axi_wdata           : in  std_logic_vector
                              (31 downto 0);
      s_axi_wstrb           : in  std_logic_vector
                              (3 downto 0);
      s_axi_wvalid          : in  std_logic;
      s_axi_wready          : out std_logic;
      s_axi_bresp           : out std_logic_vector(1 downto 0);
      s_axi_bvalid          : out std_logic;
      s_axi_bready          : in  std_logic;
      s_axi_araddr          : in  std_logic_vector(3 downto 0);
      s_axi_arvalid         : in  std_logic;
      s_axi_arready         : out std_logic;
      s_axi_rdata           : out std_logic_vector
                              (31 downto 0);
      s_axi_rresp           : out std_logic_vector(1 downto 0);
      s_axi_rvalid          : out std_logic;
      s_axi_rready          : in  std_logic;

-- UARTLite Interface Signals
     rx                    : in  std_logic;
      tx                    : out std_logic
   );
end component;

---------------------------------------------------------------
--Component Declaration reset_gen_ctr
component reset_gen_ctr is
port (
      ck    : in  STD_LOGIC;
      axi_nres : OUT  STD_LOGIC 
      );
end component;

component fsm_axi_uart_lite is
port (
ck: in std_logic;
reg_rdy: in std_logic;
rd_valid: in std_logic;
reg_sel : out std_logic;
rd_ready: out std_logic
);
end component;

component reg_read is 
port (
    start      : in  STD_LOGIC;
    reg_adr    : in STD_LOGIC_VECTOR (31 downto 0);
    reg_dat    : OUT STD_LOGIC_VECTOR (31 downto 0);
    reg_ready  : OUT  STD_LOGIC;
    ------------------------------------------------
    ax_ack     : in  STD_LOGIC;
    ax_resetn  : in  STD_LOGIC;    
      ax_arready : in  STD_LOGIC;
      ax_rvalid  : in  STD_LOGIC;
    ax_rdata   : in  STD_LOGIC_VECTOR (31 downto 0);
      ax_arvalid : OUT  STD_LOGIC;
      ax_rready  : OUT  STD_LOGIC;
      ax_ar_adr  : OUT  STD_LOGIC_VECTOR(31 downto 0)    

);
end component;

signal    m_axi_lite_awready          :  std_logic                         ;-- AXI4-Lite
signal    m_axi_lite_awvalid          :  std_logic                         ;-- AXI4-Lite
signal    m_axi_lite_awaddr           :  std_logic_vector (3 downto 0);-- AXI4-Lite
signal    m_axi_lite_wready           :  std_logic                         ;-- AXI4-Lite
signal    m_axi_lite_wvalid           :  std_logic                         ;-- AXI4-Lite
signal    m_axi_lite_wdata            :  std_logic_vector (31 downto 0);-- AXI4-Lite
signal    m_axi_lite_bready           :  std_logic                         ;-- AXI4-Lite
signal    m_axi_lite_bvalid           :  std_logic                         ;-- AXI4-Lite
signal    m_axi_lite_bresp            :  std_logic_vector(1 downto 0)      ;-- AXI4-Lite
signal    s_axi_lite_arready          :  std_logic                         ;-- AXI4-Lite
signal    s_axi_lite_arvalid          :  std_logic                         ;-- AXI4-Lite
signal    s_axi_lite_araddr           :  std_logic_vector (3 downto 0);-- AXI4-Lite
signal    s_axi_lite_rready           :  std_logic                         ;-- AXI4-Lite
signal    s_axi_lite_rvalid           :  std_logic                         ;-- AXI4-Lite
signal    s_axi_lite_rdata            :  std_logic_vector (31 downto 0);-- AXI4-Lite
signal    s_axi_lite_rresp            :  std_logic_vector(1 downto 0)      ;-- AXI4-Lite

signal clk:  std_logic;
signal reset : std_logic;
signal reg_addr0: std_logic_vector (31 downto 0);
signal rxfifo_dat_int: std_logic_vector (7 downto 0);
signal tx_int : std_logic;
--signal dat_received_int: std_logic;
signal rd_valid0: std_logic;
signal reg_read_rdy0: std_logic;
signal rd_ready0 : std_logic;
signal reg_adr : std_logic_vector (31 downto 0);
signal reg_dat: std_logic_vector(31 downto 0);
signal ax_ar_adr: std_logic_vector(31 downto 0);
signal reg_sel1: std_logic;
signal start : std_logic;
---
begin
clkf_buf: BUFG
    port map (
      I => brd_clk,
      O => clk
    );
--Register-Leser
uut: reg_read
port map (
         start      => start,
         reg_adr    => reg_addr0,
         reg_dat    => reg_dat,
         reg_ready  => reg_read_rdy0,
         ------------------------------------------------
         ax_ack     => clk,
         ax_resetn  => reset,
         ax_arready => s_axi_lite_arready,
         ax_rvalid  => s_axi_lite_rvalid,
         ax_rdata   => s_axi_lite_rdata,
         ax_arvalid => s_axi_lite_arvalid,
         ax_rready  => s_axi_lite_rready,
         ax_ar_adr  => ax_ar_adr
);

rxfifo_dat_int ( 7 downto 0 ) <= reg_dat( 7 downto 0);
s_axi_lite_araddr (3 downto 0 ) <= ax_ar_adr(3 downto 0);

i_fsm_axi_uart_lite: fsm_axi_uart_lite
port map(
ck=> clk,
reg_rdy=> reg_read_rdy0,
rd_valid=> rd_valid0,
reg_sel=> reg_sel1,
rd_ready=> rd_ready0
);
   
i_res_gen_ctr: reset_gen_ctr 
    port map (
          ck        => clk,
          axi_nres  => reset
          );       
          
i_reg_data_out: reg_par
    generic map (reg_width => 8)
    Port map (
            ck=> clk,
            ld_par => rd_ready0,
            data_in => rxfifo_dat_int,
            data_out => rxfifo_dat
    );          
ual : axi_uartlite_0
    PORT MAP (
    interrupt     => open,       
    s_axi_aclk       => clk,
    s_axi_aresetn    => reset,
    s_axi_awaddr     => m_axi_lite_awaddr (3 downto 0),
    s_axi_awvalid    => m_axi_lite_awvalid,
    s_axi_awready    => m_axi_lite_awready,
    s_axi_wdata      => m_axi_lite_wdata,
    s_axi_wstrb      => "1111",
    s_axi_wvalid     => m_axi_lite_wvalid,
    s_axi_wready     => m_axi_lite_wready,
    s_axi_bresp      => m_axi_lite_bresp,
    s_axi_bvalid     => m_axi_lite_bvalid,
    s_axi_bready     => m_axi_lite_bready,
    s_axi_araddr     => s_axi_lite_araddr (3 downto 0),
    s_axi_arvalid    => s_axi_lite_arvalid,
    s_axi_arready    => s_axi_lite_arready,
    s_axi_rdata      => s_axi_lite_rdata,
    s_axi_rresp      => s_axi_lite_rresp,
    s_axi_rvalid     => s_axi_lite_rvalid,
    s_axi_rready     => s_axi_lite_rready,
    rx               => rx,    -- these will go to board 
    tx               => tx_int
    );    
    tx <= tx_int;
---------------------------------------------------------------
-- Mux1
reg_addr0 <= x"00000008" when reg_sel1= '0' else
             x"00000000";
--Mux2
rd_valid0 <= '1' when rxfifo_dat_int(0)= '1' else
             '0';
--Erst mal alles ruhigstellen:
      m_axi_lite_awaddr (3 downto 0) <= "0000";
      m_axi_lite_awvalid <= '0';
      m_axi_lite_wdata   <= (others => '0');
      m_axi_lite_wvalid  <= '0';
      m_axi_lite_wready  <= '0';
      m_axi_lite_bready  <= '0';



--debug, an Pmod-Steckern angeschlossen:
debug(0) <= rx;  
debug(1) <= '0';
debug(2) <= s_axi_lite_arvalid;
debug(3) <= s_axi_lite_arready;
debug(4) <= s_axi_lite_araddr (3);
debug(5) <= s_axi_lite_araddr (1);
debug(6) <= s_axi_lite_araddr (0);
--debug(7) <= dat_received_int;
debug(7) <= rd_ready0;
debug(15 downto 8) <=  rxfifo_dat_int;

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
Autor: Gustl Buheitel (-gb-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Laura (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gustl Buheitel (-gb-)
Datum:

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

Autor: Laura (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, danke.

Autor: Gustl Buheitel (-gb-)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Gustl Buheitel (-gb-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Edit:

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

Autor: Laura (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Gustl Buheitel (-gb-)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Laura (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Gustl Buheitel (-gb-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Laura (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Autor: Gustl Buheitel (-gb-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Laura K. (laura721)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Weltbester FPGA-Pongo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gustl Buheitel (-gb-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.