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.