Forum: FPGA, VHDL & Co. Virtex Blockrams


von Gast (Gast)


Lesenswert?

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

von Jan M. (mueschel)


Lesenswert?

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.

von Matthias (Gast)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

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;

  

von Jan M. (mueschel)


Lesenswert?

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)

von Gast (Gast)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.