Hallo, ich will VHDL Code schreiben, der dazu führt, dass die Synthesesoftware XST von Xilinx BlockRam als Speicher verwendet. Jetzt weiß ich, dass dazu synchron gelesen, als auch geschrieben werden muss. Was ist aber wenn ich eine Vergleich mache mit Speicherinhalt aus dem BlockRam? Hier sei x Speicherinhalt aus dem BlockRam. Wenn dieser Vergleich asynchron gemacht wird, wird nicht mehr als BlockRam synthetisiert oder? if x = y then ... end if;
Unnormaley schrieb: > Wenn dieser Vergleich > asynchron gemacht wird, wird nicht mehr als BlockRam synthetisiert oder? Synchron oder Asynchron hat damit nichts zu tun... Dieser Vergleich eines kompletten RAMS mit einem anderen geht sowieso nicht! Du kannst nicht das ganze Blockram auf einmal lesen (oder gar schreiben) und so mit einem anderen vergleichen, denn von dem RAM sind je nach Datenbusbreite ja maximal 32 (bzw. 36) Bits über die Datenleitungen zu sehen! So ein Blockram ist nämlich in allererster Linie ein RAM, das über Adressleitungen ein Wort speichern oder lesen kann.
Hallo, danke für die Antwort. Ja das stimm natürlich, ich habe mich undeutlich ausgedrückt. Ich addressiere eine 32-Bit Zeile in meinem BlockRam mit x, und y ist einfach ein 32-Bit Signal (nicht im Blockram )
Unnormaley schrieb: > Hier sei x Speicherinhalt aus dem BlockRam. Wenn dieser Vergleich > asynchron gemacht wird, wird nicht mehr als BlockRam synthetisiert oder? Beim BRAM muss die Lese-Adresse (!) getaktet sein: http://www.lothar-miller.de/s9y/archives/20-RAM.html#extended Sieh dir einfach mal den XST-Users-Guide an. Da steht drin, wie ein RAM beschrieben werden muss, damit ein BRAM rauskommt...
Eine letzte Frage. Ich habe jetzt diese VHDL Beschreibung geschrieben. Ich möchte jetzt gerne, dass für das array ram BlockRam verwendet wird. Würde das in der Synthese so durchgehen? Was mir Angst macht ist "adr <= memory_adr(4 downto 0);".
1 | entity bram is |
2 | port( |
3 | CLK : in std_logic; |
4 | memory_adr : in std_logic_vector(31 downto 0) |
5 | we : in std_logic; |
6 | data_i : in std_logic_vector(31 downto 0); |
7 | data_o : out std_logic_vector(31 downto 0); |
8 | );
|
9 | end entity bram; |
10 | |
11 | architecture behavior of bram is |
12 | |
13 | signal adr : std_logic_vector (4 downto 0); |
14 | |
15 | type t_ram is array (31 downto 0) of std_logic_vector(31 downto 0); |
16 | signal ram : t_ram; |
17 | |
18 | begin
|
19 | adr <= memory_adr(4 downto 0); |
20 | |
21 | process(Clk) |
22 | begin
|
23 | if(rising_edge(CLK)) then |
24 | if(we='1') then |
25 | ram(adr) <= data_i; |
26 | end if; |
27 | data_o <= ram(adr); |
28 | end if; |
29 | end process; |
30 | |
31 | |
32 | |
33 | end behavioral; |
Lothar Miller schrieb: > Du kannst nicht das ganze Blockram auf einmal lesen (oder gar > > schreiben) Doch geht, wenn man es als ein-Bit breites Ram nimmt.
Das geht so sicher nicht durch, weil zum Indizieren eines Arrays in VHDL nur Integer zulässig sind...
Ja stimmt, das hatte ich vergessen, dazu zu schreiben. Und wenn ich jetzt mit conv_integer arbeite, würde das dann durchgehen? :)
Nimm besser die NUMERIC_STD statt der alten Synopsys Libs...
OK, danke für die Hilfe. Ich werde heut gleich auf der Arbeit los synthetisieren :D und hoffe auf BlockRam!
Lothar Miller schrieb: > Nimm besser die NUMERIC_STD statt der alten Synopsys Libs... Ist aber bei Rams ziemlich schnuppe.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.