Virtex Blockrams

Gast #581802
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
Gast #581936
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;

  
#581978
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren