Hallo VHDL Profi's,
ich habe folgendes Problem. Ich habe eine BRAM Componente instanziiert,
welche aus dem Top Level die Write und Read Adressen erhält. Anhand
einer Testbench konnte ich jedoch sehen, dass die erste Zeile des RAM's
nicht ausgelesen wird. Erst die zweite Zeile ist Anfang des RAM's.
Entweder wird die erste Zeile gar nicht mit dem ersten Wert beschrieben
oder die erste Zeile wird nicht richtig ausgelesen.
Hier der Code für den Adressen Prozess:
1 | process (clk, lval)
|
2 | begin
|
3 | if rising_edge(clk) then
|
4 | if lval = '1' then
|
5 | enable <= '1'; -- nachdem lval = 1, enable 1
|
6 | write_counter <= write_counter + 1;
|
7 | else
|
8 | write_counter <= (others => '0');
|
9 |
|
10 | end if;
|
11 |
|
12 | if lval = '0' then
|
13 | if (enable = '1') then
|
14 | read_counter <= read_counter + 1;
|
15 | end if;
|
16 |
|
17 | else
|
18 | read_counter <= (others => '0');
|
19 |
|
20 | end if;
|
21 | end if;
|
22 | write_address <= std_logic_vector(write_counter);
|
23 | read_address <= std_logic_vector(read_counter);
|
24 | write_address_test <= std_logic_vector(write_counter);
|
25 | read_address_test <= std_logic_vector(read_counter);
|
26 |
|
27 | end process;
|
write_address_test und read_address_test dienen nur zur Anzeige der
Signalwerte.
Solange lval = 1 ist, soll der RAM beschrieben werden, sobald lval auf 0
wechselt, soll der RAM auslesen werden. Enable wird gesetzt, sobald lval
= 1 ist. Eine Abbruchbedingung für den Auslese - Adressencounter und
enable ist noch nicht implementiert, dies wird abhängig sein von der
Anzahl der Elemente im Speicher. Später soll auch nur ein gewisser
Bereich des RAM's ausgelesen werden und nicht mehr alle Werte. Aber das
zu späteren Stunde.
Die Portmap sieht folgendermaßen aus:
1 | PM1: BRAM port map ( clk => clk,
|
2 | data_a => data_a,
|
3 | data_b => data_b,
|
4 | write_address => write_address,
|
5 | read_address => read_address,
|
6 | enable => enable,
|
7 | write_enable => lval,
|
8 | data_out_a => data_out_a,
|
9 | data_out_b => data_out_b
|
10 | );
|
Ein Screenshot habe ich dem Anhang hinzugefügt. Die ersten zwei Werte,
welche in im Speicher mit einer Breite von 24 Bit (2 x 12) ablegegt
werden, fehlen bei der Ausgabe (data_out_a und data_out_b), also die 53
und 61.
Kann mir jmd. sagen, wo ich den Denkfehler habe?
Viele Dank und Grüße,
Tom