Forum: FPGA, VHDL & Co. Avalon Master


von Hi (Gast)


Lesenswert?

Hi,

ich habe mir zum ersten Mal ein System mit einem Nios aufgebaut. Das 
System besteht aus einem Nios, SDRAM-Controller, 
CF-Speicherkartencontroller. Zuerst habe ich mir Daten von der 
Speicherkarte in den SDRAM geladen. Dies funktioniert auch. Nun möchte 
ich diese Daten über einen DAC ausgeben. Ich habe das mit der Ausgab der 
Daten probiert, aber leider ist die Ausgabe der Daten zu langsam und 
außerdem werden die Daten wegen der Bearbeitung der C-Befehle nicht 
kontinuierlich ausgegeben. Jetzt wollte ich mir einen Avalon-Master 
bauen, der den SDRAM-Controller anspricht. Leider habe ich keine Ahnung 
wie das in etwa aussehen müsste. Hat jemand von euch schon einmal ein 
Avalon-Master in VHDL programmiert? Was gäbe es noch für eine 
Möglichkeit um die Daten aus dem SDRAM kontinuierlich und mit recht 
hoher Geschwindigkeit auszulesen (ca. 4 MHz.)?

Danke für die Hilfe.

von Gastinformatiker (Gast)


Lesenswert?

Die SPEC von Altera enthält infos, was da zu machen ist. Im Prinzip 
brauchst du die Gegenstelle zum Slave. Es kommt aber darauf an, was Du 
für ein Interface bauen willst. MM oder ST ? Und wie willst du an den 
Rest ankoppeln ?

Deine RAM-Probleme könnten im Übrigen von der Altera Ruond Robin 
Architaktur mit der 3/7 Zeitscheibe für den Proz herrühren.

von SeriousSam (Gast)


Lesenswert?

Hi,

Die Spezifikationen zum Avalonsystem findest du hier: 
http://altera.com/literature/manual/mnl_avalon_spec.pdf

Wenn du den SDRAM-Controller von Altera verwendest stellt dieser ein 
Avalon-MemoryMapped-Slaveinterface bereit welches du ansprechen kannst. 
Der einfachste Master, der nur lesen kann, benötigt folgende Signale: 
Takt, Adressausgang, Dateneingang, Lesesignal. Mit einer Fifo sollte es 
kein Problem darstellen, die Daten genug schnell auszulesen und 
weiterzugeben.

Wenn du etwas VHDL-Code willst kann ich mal suchen gehen. Aber ich habe 
nur sehr spezielle Masterinterfaces geschrieben bisher. Mit den 
Spezifikationen sollte es jedoch ein leichtes sein, ein einfaches 
Interface zu erstellen. Danach musst du im SOPC-Builder einen neuen 
Komponenten erstellen und in dein System einfügen. Zur Kontrolle kannst 
du ihm auch einige Register als Avalon-Slave verpassen.

Hier doch noch etwas Code:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity MyUnit is
  port(
  signal clk, reset : in std_logic;

  --Control slave (typ avalon slave)
  signal ctrl_address_in : in std_logic_vector(11 downto 0);
  signal ctrl_write_in, ctrl_read_in : in std_logic;
  signal ctrl_writedata_in : in std_logic_vector(31 downto 0);
  signal ctrl_readdata_out : out std_logic_vector(31 downto 0);
  signal ctrl_waitrequest_out : out std_logic;

  --Read Master (typ avalon master)
  signal address_out : out std_logic_vector(31 downto 0);
  signal read_out : out std_logic;
  signal readdata_in : in std_logic_vector(31 downto 0);
  signal waitrequest_in : in std_logic;

  --User signals (typ export)
  signal ...
  );
end entity;

architecture arch of MyUnit is
  type State_t is (READMEM, IDLE);
  signal state : State_t := IDLE;
begin
  ctrl_waitrequest_out <= '0';
  process(clk, reset)
  begin
    if reset = '1' then
      state <= IDLE;
      read_out <= '0';
    elsif rising_edge(clk) then
      --Write at adress 0 triggers read
      if ctrl_write_in = '1' then
        if ctrl_address_in = X"000" then --read address given
          address_out <= ctrl_writedata_in;
          read_out <= '1';
          state <= READ;
        end if;
      end if;

      if state = READ and waitrequest_in = '0' then
        --data available on readdata_in
        read_out <= '0';
        state <= IDLE;
      end if;
    end if;
  end process;
end arch;

Mit dem Process in diesem Code kannst du zum Beispiel eine FIFO füllen 
und dann mit einem anderen Process weiterverarbeiten.

von Maddi (Gast)


Lesenswert?

@Gastinformatiker
Hi, könntest du vielleicht hierzu etwas erzählen: ... Altera Ruond Robin
Architaktur mit der 3/7 Zeitscheibe ..
Danke Dir,
Maddi

von Gastinformatiker (Gast)


Lesenswert?

Es gibt da ein Scheduling Modell, nach dem dem NIOS Rechenzeit 
zugewiesen wird, wenn mehr als ein Master aktiv sind, z.B. DMA oder so. 
Der Avalon Master NIOS kriegt dann nur einen begrenzten Anteil an 
Rechenzeit. Meiner Errinnerung navh waren das 3/7 oder so.

Müsste aber in der SPEC stehen.

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.