Ich habe Probleme, das Verhalten eines Block-RAMs bei Xilinx und Vivado
zu simulieren. Es kann nichts hineingeschrieben oder herausgelesen
werden.
Ich habe den Verdacht, dass etwas nicht richtig eingebunden ist, obwohl
kein Fehler gemeldet wird. Die Komponente als solche ist da.
Ich erkläre am Besten die Architektur: Benuzt wird ein Dual-RAM der
Grösse 24 Bit und 64k. Das entstehende VHO in der Liste sieht auch
vielversprechend aus:
1 | COMPONENT delay64k
|
2 | PORT (
|
3 | clka : IN STD_LOGIC;
|
4 | wea : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
|
5 | addra : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
|
6 | dina : IN STD_LOGIC_VECTOR(23 DOWNTO 0);
|
7 | clkb : IN STD_LOGIC;
|
8 | addrb : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
|
9 | doutb : OUT STD_LOGIC_VECTOR(23 DOWNTO 0)
|
10 | );
|
11 | END COMPONENT;
|
Ich schreibe auf A rein und lese mit 50.000 samples verzögert wieder
aus. Es kommt aber nichts. Der Simulator zeigt auch nicht, das etwas
geschrieben wäre.
Aufgefallen ist mir:
Es werden 44 RAMs benutzt, was ich seltsam finde. Mit keiner Kombination
aus 32/36 und 16 sowie kann ich bei den gewünschten 24 Bit diese 44 RAMs
erklären. Angeblich haben die 18Bit. Soweit ich es verstehe, hätte ich
32+16 = 48 erwartet.
Ferner werden zwei Clock-Eingänge gezeigt, obwohl ich ein "simple dual
port RAM" verwende mit "common clock".
Dann habe ich mir die Details angesehen und finde in den
Simulationsdateien u.a. im "blk_mem_gen_v8_4.vhd" Dinge, die ich so
nicht vorgegeben hatte:
1 | 1) C_FAMILY : string := "virtex7";
|
2 | C_XDEVICEFAMILY : string := "virtex7";
|
3 |
|
4 |
|
5 | 2) C_AXI_TYPE : integer := 1;
|
6 |
|
7 |
|
8 | 3) C_WRITE_WIDTH_A : integer := 9;
|
9 | C_READ_WIDTH_A : integer := 9;
|
10 | C_WRITE_DEPTH_A : integer := 2048;
|
11 | C_READ_DEPTH_A : integer := 2048;
|
1) eingestellt war "Artix"!
2) eingestellt war "native" und nicht AXI!
3) passt irgendwie nicht zu den Breiten und Tiefen oben!
Stimmt das so oder produziert der Mist?
Ich habe das alles gelöscht, die Einstellungen wiederholt, erhalte aber
das gleiche Ergebnis.