Ich habe begonnen, ein Design zu erzeugen und bin dabei auf einen (für mich wichtigen) Unterschied zwischen A. und X. gestossen: Bei Xilinx kann ich BRAM mit bis zu 1024 Bit Breite definieren, die über eine Adresse (bei insgesamt N Adressen) angesprochen werden und dann bitweise anwählbar sind, bei Adressierung mit N+10 bits. Das bekomme ich bei Altera nicht hin. Die Adressbreiten dürfen sich nicht 1024:1 unterscheiden, sondern nur 128:1, wie mir scheint und es gibt auch maximal 288 Bit. Ich beziehe mich auf den Vergleich Spartan 3/6 gegenüber Cyclone 3/4. Ist das so? Bekommt man gfs bei Stratix flexiblere Konfigurationen hin? Nun ist mir bewusst, dass ich mehrere Altera RAMs passend verschalten kann, um meine Funktion zu erhalten, aber warum kann man das nicht per Core? Ich denke nicht, dass die Xilinx BRAMs grundsätzlich anders funktionieren und dass nur der CoreGen mehr Bauarbeit leistet. Oder hat es doch HW-Gründe?
Ich würde mich an den Standard halten (IEEE Std 1076.6™-2004). Damit ist man Herstellerunabhängig und variabel:
1 | -- Example 1: A RAM with edge-sensitive write to storage elements
|
2 | library ieee; |
3 | use ieee.std_logic_1164.all; |
4 | use ieee.numeric_std.all; |
5 | use ieee.rtl_attributes.all; |
6 | |
7 | entity ram is |
8 | generic ( |
9 | WIDTH : Natural := 8; |
10 | DEPTH : Natural := 16); |
11 | port ( |
12 | q : out std_logic_vector(WIDTH-1 downto 0); -- Ram output |
13 | d : in std_logic_vector(WIDTH-1 downto 0); -- Ram data input |
14 | a : in std_logic_vector(DEPTH-1 downto 0); -- Address |
15 | we : in std_logic; -- Write enable |
16 | clk : in std_logic); -- system clock |
17 | end entity ram; |
18 | |
19 | architecture RTL of ram is |
20 | type ram_typ is array(0 to 2**DEPTH-1) of |
21 | std_logic_vector(WIDTH-1 downto 0); |
22 | |
23 | signal ram : ram_typ; -- ram element |
24 | attribute ram_block of ram : signal is "RAM_CELL XYZ01"; |
25 | -- For RAM design with registers logic use:
|
26 | -- attribute logic_block of z : signal is TRUE;
|
27 | |
28 | begin -- architecture RTL |
29 | -- purpose: Synchronous Ram definition
|
30 | -- type : combinational
|
31 | |
32 | Ram_Proc: process is |
33 | begin -- process Ram_Proc |
34 | wait until clk = '1'; |
35 | if we = '1' then |
36 | ram(to_integer(unsigned(a))) <= d; |
37 | end if; |
38 | end process Ram_Proc; |
39 | |
40 | q <= ram(to_integer(unsigned(a))); |
41 | |
42 | end architecture RTL; |
Duke
Dieses RAM hat aber nicht die beiden benötigten Ports und die unterschiedlichen Schreib-Lesebreiten.
Gerald Hellinghaus schrieb: > Dieses RAM hat aber nicht die beiden benötigten Ports und die > unterschiedlichen Schreib-Lesebreiten. Das stimmt. Was möchtest Du denn konkret machen? Vielleicht kann man Dein Problem auch anders lösen. Duke
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.