> Wie löse ich das Problem, ist so etwas überhaupt als BRAM realisierbar?
Es gibt keine BRAMS mit 1024 Bit Breite. Für eine Verktorbreite von 1024
müssten 1024/36 = 29 BRAMs parallel geschaltet werden. Hast du so viele?
Das hier:
1 | port (di : in std_logic_vector(1023 downto 0));
|
2 | type ram_type is array (0 downto 0) of std_logic_vector (1024 downto 0);
|
3 | signal RAM : ram_type;
|
4 | :
|
5 | RAM (0) <= di;
|
6 | :
|
könnte genausogut so geschrieben werden:
1 | port (di : in std_logic_vector(1023 downto 0));
|
2 | type ram_type is std_logic_vector (1023 downto 0);
|
3 | signal RAM : ram_type;
|
4 | :
|
5 | RAM <= di;
|
6 | :
|
oder gleich so:
1 | port (di : in std_logic_vector(1023 downto 0));
|
2 | signal RAM : std_logic_vector (1023 downto 0);
|
3 | :
|
4 | RAM <= di;
|
5 | :
|
Und dafür brauchst du überhaupt kein RAM.
Lies nochmal den Beitrag "Re: RAM Initialisierung in VHDL"
BTW:
1 | signal counter : integer range -1 to 16;
|
2 | signal counter2 : integer range -1 to 16;
|
Du hast m.E. offenbar noch grundlegende Probleme mit irgendwelchen
Randbedingungen.
Deine Ablaufsteuerung sollte besser über ein Zustandssignal geschehen,
nicht über die Counter.
1 | architecture syn of ram_test is
|
2 |
|
3 | signal RAM : std_logic_vector (1023 downto 0);
|
4 | signal counter : integer range 0 to 15;
|
5 | signal write : std_logic := '1';
|
6 | signal read : std_logic := '1';
|
7 | begin
|
8 | process begin
|
9 | wait until rising_edge (clk);
|
10 | if rst ='1' then
|
11 | counter <= 0;
|
12 | write <= '1';
|
13 | read <= '0';
|
14 | elsif ce ='1' then
|
15 | -- Schreiben
|
16 | if write='1' then
|
17 | RAM(1023-(64*counter) downto 1023-63-(64*counter)) <= di;
|
18 | end if;
|
19 | -- Lesen
|
20 | if read = '1' then
|
21 | do <= RAM(1023-(64*counter2) downto 1023-63-(64*counter2));
|
22 | end if;
|
23 | -- Verwaltung
|
24 | if counter < 15 then
|
25 | counter <= counter + 1;
|
26 | else -- fertig gezählt
|
27 | counter <= 0;
|
28 | if (write='1) then -- wenn schreiben fertig:
|
29 | write <= '0'; -- mit lesen weitermachen
|
30 | read <= '1';
|
31 | end if;
|
32 | if (read='1) then -- wenn lesen fertig:
|
33 | read <= '0'; -- ende
|
34 | end if;
|
35 | end if;
|
36 | end if;
|
37 | end process;
|
38 | end syn;
|
Insgesamt habe ich den Eindruck, du willst was Einfaches unnötig
kompliziert machen... :-/