Hallo allerseits,
ich habe eine Frage bezüglich des Auslesens eines RAM's in VHDL.
Ich habe mir ein BlockRam erstellt.
Der Code für den Ram sieht so aus:
| 1 | entity BRAM is
 | 
| 2 | port(
 | 
| 3 | clk    : IN std_logic;
 | 
| 4 | wert_a : IN std_logic_vector(11 downto 0);
 | 
| 5 | wert_b : IN std_logic_vector(11 downto 0);
 | 
| 6 | write_address : IN std_logic_vector (11 downto 0);
 | 
| 7 | read_address : IN std_logic_vector (11 downto 0);
 | 
| 8 | enable : IN std_logic;
 | 
| 9 | write_enable :  IN std_logic;
 | 
| 10 | wert_out_a: OUT std_logic_vector(11 downto 0);
 | 
| 11 | wert_out_b: OUT std_logic_vector(11 downto 0)
 | 
| 12 | );
 | 
| 13 | end BRAM;
 | 
| 14 | 
 | 
| 15 | 
 | 
| 16 | architecture Behavioral of BRAM is
 | 
| 17 | type t_bram is array(0 to 4095) of std_logic_vector(23 downto 0);
 | 
| 18 | signal bram : t_bram;
 | 
| 19 | 
 | 
| 20 | 
 | 
| 21 | 
 | 
| 22 | 
 | 
| 23 | begin
 | 
| 24 | 
 | 
| 25 | 
 | 
| 26 | 
 | 
| 27 | process (clk)
 | 
| 28 | begin
 | 
| 29 |    if rising_edge(clk) then 
 | 
| 30 |     if enable = '1' then
 | 
| 31 |       if write_enable='1' then      
 | 
| 32 |         bram(conv_integer(write_address)) <= wert_a & wert_b;
 | 
| 33 |       
 | 
| 34 |       else      
 | 
| 35 |         wert_out_a <= bram(conv_integer(read_address))(23 downto 12);
 | 
| 36 |         wert_out_b <= bram(conv_integer(read_address))(11 downto 0);       
 | 
| 37 |       end if;  
 | 
| 38 |     end if;
 | 
| 39 |    end if;    
 | 
| 40 | end process;
 | 
| 41 | 
 | 
| 42 | 
 | 
| 43 | 
 | 
| 44 | 
 | 
| 45 | end Behavioral;
 | 
Erste Frage:
| 1 | type t_bram is array(0 to 4095) of std_logic_vector(23 downto 0);
 | 
| 2 | signal bram : t_bram;
 | 
Würde dies bedeuten, dass mir dann als Block betrachtet 4096 Ram-Zeilen 
mit jeweils 24 Bit zur Verfügung stehen? Dieser dann also ein 
Speichervolumen von (24 Bit * 4096) aufweist?
Zweite Frage:
Angenommen der RAM ist beschrieben. Um ihn auszulesen, muss ich dazu den 
Baustein von aussen mit dem enable Signal und den Leseaddressen 
versorgen. Nun möchte ich den Ram nicht komplett auslesen, sondern nur 
im Bereich von bespielsweise adresse 'start' - 250 bis adresse 'start' + 
250. Also dann insgesamt 500 Zeilen.
Wie realisiere ich am geschicktesten den dazu nötigen Zähler, der jetzt 
von Adresse start-250 bis start+250 zählt? (normaler Zähler mit zähler 
+= 1 oder FOR-LOOP?)Dazu soll der Zähler nur dann gestartet werden, wenn 
der 'start'Wert > 250 und ('start'Wert + 250) <  Anzahl der vorhandenen 
RAM Zeilen ist, damit es nicht dazu kommt, weniger als 500 Zeilen 
auszulesen.
Habe ich mich so ausgedrückt, dass man mich verstehen kann? :-)