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?

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.