Ich schaue mir gerade BlockRAM an. Die Blockrams haben Parität-Bits, kann mann die Eingänge offen bzw. ungenutzt lassen? Braucht Blockram die Angaben selbst, oder ist es eine Möglichkeit, die man als USER nutzen kann? DIA : in std_logic_vector (31 downto 0); DIPA : in std_logic_vector (3 downto 0); -- parity
Wie das Datenblatt des Virtex II sagt: "These extra parity bits [...] behave exactly as the other bits." Sprich: Du kannst damit tun und lassen was du willst, genauso wie mit den Datenbits auch.
Genau. Und offen lassen geht wie mit allen Eingängen natürlich nicht. Wenn du sie nciht brauchst, dann leg die Paritätseingänge alle auf 0 und lass die Ausgänge offen.
Ok danke, habe aber gelesen, dass bei passend deklarierten Arrays die Synthese die Arrays in BlockRAMs umsetzt. Das klappt auch soweit, nur leider nicht mit einem dual-port Blockram. Hier ist der Code, vielleicht fällt jemanden was auf?
1 | ----------------------------------------------------------------------------------
|
2 | --
|
3 | -- Read-First Mode
|
4 | --
|
5 | ----------------------------------------------------------------------------------
|
6 | library IEEE; |
7 | use IEEE.STD_LOGIC_1164.ALL; |
8 | use IEEE.STD_LOGIC_ARITH.ALL; |
9 | use IEEE.STD_LOGIC_UNSIGNED.ALL; |
10 | |
11 | |
12 | entity BRAM is |
13 | port ( clk : in std_logic; |
14 | -- A
|
15 | we : in std_logic; |
16 | en : in std_logic; |
17 | -- B
|
18 | web : in std_logic; |
19 | enb : in std_logic; |
20 | |
21 | addr : in std_logic_vector(8 downto 0); |
22 | addrb : in std_logic_vector(8 downto 0); |
23 | |
24 | --a
|
25 | di : in std_logic_vector(31 downto 0); |
26 | do : out std_logic_vector(31 downto 0); |
27 | --b
|
28 | dib : in std_logic_vector(31 downto 0); |
29 | dob : out std_logic_vector(31 downto 0)); |
30 | end BRAM; |
31 | |
32 | architecture Behavioral of BRAM is |
33 | |
34 | type ram_type is array (255 downto 0) of std_logic_vector (31 downto 0); |
35 | signal RAM, RAMb: ram_type; |
36 | begin
|
37 | p1: process (clk) |
38 | begin
|
39 | if clk'event and clk = '1' then |
40 | if en = '1' then |
41 | if we = '1' then |
42 | RAM(conv_integer(addr)) <= di; |
43 | end if; |
44 | do <= RAM(conv_integer(addr)) ; |
45 | end if; |
46 | end if; |
47 | end process; |
48 | |
49 | p2: process (clk) |
50 | begin
|
51 | if clk'event and clk = '1' then |
52 | if enb = '1' then |
53 | if web = '1' then |
54 | RAMb(conv_integer(addrb)) <= dib; |
55 | end if; |
56 | dob <= RAMb(conv_integer(addrb)) ; |
57 | end if; |
58 | end if; |
59 | end process; |
60 | |
61 | |
62 | |
63 | end Behavioral; |
Warum schreibst du eine eigene entity? xilinx bietet da knapp 30 verschiedene primitives (single- und dualported, positive und negative Clock, 1,2,4,8,18 oder 36 Bit breit, eine oder zwei clocks....) an, die einfach einzubinden sind und garantiert einen BlockRAM erzeugen. (Da ISE bereits an beschriebenen einfachen dual-data-rate-flip-flops scheitert, kann ich mir gut vorstellen, dass du viel tricksen musst, um das so zum Laufen zu bekommen)
Warum? Ganz einfach, um sich die Arbeit zu ersparen, die primitives zu benutzen, weil XST die richtig gewählte Arraygröße schon in BlockRAMs umsetz.
Hat sich erledigt im XST User Guide gibt es dazu Beispiele, die auch funktionieren (Seite 187).
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.