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? :-)