mikrocontroller.net

Forum: FPGA, VHDL & Co. NiosII Read-Interface


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo alle miteinander,
ich habe eine Hardwarestruktur aufgebaut die ihre prozessierten 
Ergebnisse in einem FIFO zwischenspeichert. Nun gilt es dieses FIFO mit 
Hilfe des NiosII Prozessors auszulesen. Hat jemand von euch Erfahrung 
mit dieser CPU. Wie lässt sich ein solches Interface (bestehend aus 
einem ReadEnable + ReadData[15:0] )am besten Realisieren ?

Benutze momentan zwei PIO cores zum Generieren eines FifoReadEn Signals 
sowie zum anschliessend Einlesen der Daten (Ziemlicher Murks, 
funktioniert jedoch).

Wie könnte man sowas besser machen, wie etwa mit Hilfe eines 
Avalon-Slaves !?! Mache meine ersten Gehversuche in der Welt der 
Softcore-Cpus und würde mich über Hilfe freuen.

Schönes WE,
Martin

Autor: Roger Steiner (edge)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das schreit nach einem Avalon Slave, ist eigentlich ganz simpel. Hier 
ein Beispiel einer einfachen PIO.
entity my_pio is
  Port (
    clk          : in std_logic;
    reset       : in std_logic;
    address      : in std_logic_vector(0 downto 0);
    chipselect  : in std_logic;
    write        : in std_logic;
    writedata    : in std_logic_vector(31 downto 0);
    read        : in std_logic;
    readdata    : out std_logic_vector(31 downto 0);
    
    pio_output  : out std_logic_vectors(31 downto 0);
    pio_input   : in std_logic_vectors(31 downto 0)
  );
end my_pio;


architecture Behavioral of my_pio is
begin

  process(clk)
  begin
    if rising_edge(clk) then
    
      readdata <= pio_input;
      
      if chipselect = '1' and write = '1' then
        if address(0) = '0' then
          pio_output <= writedata;  -- register 0
        else
          pio_output <= not writedata;  -- register 1
        end if;
      end if;
    
    end if;
  end process;

end Behavioral;

Das solltest du im SOPC Builder importieren koennen (New Component...).

Cheers, Roger

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Roger,
vielen Dank für deinen Post. Das klappt super und schaut um Ecken besser 
aus wie meine 'Notlösung'.
Gruss,
Martin

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo wir schon mal dabei sind hätte ich noch mal ein Frage. In Hinblick 
auf ein zukünftig anstehendes Design würde ich gerne einen NiosII 
einsetzen der mit möglichst geringer Latenz auf einen 'NiosII externen' 
onchip Dual-port Speicher zugreift und diesen Ausliest ?

Gibt es zudem die Möglichkeit, dass eine Custom Instruction auf einen 
Avalon-Speicher zugreift ?
Gruss,
Martin

Autor: Roger Steiner (edge)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Latenz vom internen Speicher hast du immer, jedoch kannst du deinem 
Avalon Slave piplined oder burst transfers beibringen, womit du dann den 
Durchsatz etwas steigern kannst.

Eine Custom Instruction kann nicht direkt auf den Avalon zugreifen. Im 
Prinzip waehre es moeglich, wenn auch nicht sehr elegant.

Fragt sich was du durch die Custom Instruction gewinnst, meistens ist es 
besser das ganze als core einzubinden, ein solcher kann ja neben einem 
Avalon Slave auch einen Avalon Master enthalten.

Cheers, Roger

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
wollte gerade mal den von Roger geposteten Code ausprobieren, aber 
irgendwie haut es nicht so ganz hin. Mein Problem besteht schon bei der 
Generierung der Komponente im SOPC Builder.

Nach dem Einladen des Codes im Component Editor habe ich Probleme die 
Signale mit ihrem Typ zu spezifizieren.
Wäre klasse wenn jemand mal für die von Roger erstellte Komponente diese 
Einstellungen mal posten könnte.
Danke,
Dennis

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für clk + reset bekomme ich die Warning:

Signal "clk"/reset has unknown type "export"

Was gilt es hier einzustellen ??????
Die übrigen Signal habe ich als new_avalon_slave_0 deklariert.

Dennis

Autor: Kest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
clk + reset sind "Clock Sink". Und vergiss nicht bei new_avalon_slave_0 
"Clock sink" auch dann anzugeben, damit AVALON-Interface weis, in 
welcher Clock-Domäne er sich befindet

Kest

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Kest,
vielen Dank für den Hinweis! Klappt nun bestens. Warum muss eigentlich 
das reset signal ebenfalls als "clock sink" deklariert werden ???
Danke,
Dennis

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey,
hätte noch mal eine Frage zur oberen Geschichte. Wenn ich wie Martin 
oben beschrieben ein FIFO Speicher auslesen möchte haut es mit dem 
zeitlichen Ablauf bei mir nicht ganz so hin:
Nachdem das Read-Enable müsste ein Takt gewartet werden bevor das 
Ausgabeworts des FIFOs gelesen wird. Wenn ich so vorgehe wie oben 
beschrieben lese ich beim ersten Zugriff eine NULL aus und erst mit dem 
zweiten erhalte ich mein erwartetes Datenwort.

Natürlich könnte man das jetzt dadurch lösen, dass ich mein FIFO im 
show-ahead mode arbeiten lasse.

Mich würde jedoch interresieren wie ich das Avalon intern realisieren 
könnte.
Vielen Dank,
Dennis

Autor: Kest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim Avalon kannst Du Readlatancy einstellen, die stellst Du dann auf 2 
ein, somit sind Deine Daten dann nach zwei Takten gültig.

Ich, llerdings, mache alles komplett anders. Readlatancy ist bei mir 
immer 0. Dafür verwende ich aber auch readdatavalid - Signal, um dem 
Avalon zu signalisieren, wann die Daten dann tatsächlich gültig sind.

Etwa so:

  process(clk)
  begin
    if rising_edge(clk) then

      as_readdatavalid <='0';

      if as_chipselect = '1' and as_read = '1' then
        case as_address is
          when x"0"   => as_readdata <= x"55";
                         as_readdata_valid <='1';
      ....
     end if;
  end process;

Dann darfst Du aber nicht vergessen, maximum Pending bytes (oder wie es 
heißt) auf mindestens 1 zu stellen (bekommst Du aber auch eine Warnung)

Grüße,

Kest

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Kest,
vielen Dank für deine Hinweise. Habe beide von dir beschriebenen Wege 
zum Laufen bekommen.
Gruss,
Dennis

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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