Forum: FPGA, VHDL & Co. BlackRAM mit generate vervielfachen


von T.M. (Gast)


Lesenswert?

Hallo.
Ich möchte in einem Spartan2 Baustein den integrierten BlockRAM nutzen.
Dazu habe ich aus dem Template Beispielen mir den 512x16 Single Port
genommen und mit einer generate Anweisung 16 Stück davon initialisiert.
 Das funktioniert wohl auch soweit. Nur gibt es ein Problem mit dem
Datenausgang, bei der Synthese wird bemängelt dass DOUT mehrere Souces
habe. Ich dachte eigentlich, dass durch den Adressdecoder (der ein
Enablevektor erzeugt, der wiederrum immer nur 1 RAM aktiviert) ich die
ganzen Ausgänge der RAMS einfach parallel schalten kann... Weiss
jemand, wie sich bei den von integrierten BlackRAMs die Ausgänge
verhalten, wenn sie nicht aktiviert sind?

Mein VHDL-Code:
1
library UNISIM;                 -- für SRAM Template
2
use UNISIM.vcomponents.all;     -- für SRAM Template
3
library ieee;
4
use ieee.std_logic_1164.all;
5
use ieee.std_logic_unsigned.all;
6
7
entity RAM_4096x16 is
8
  port (CLK, EN, RST, WE: in std_logic;
9
        A: in std_logic_vector(11 downto 0);
10
        DOUT: out std_logic_vector(15 downto 0);
11
      DIN: in std_logic_vector(15 downto 0));
12
end RAM_4096x16;
13
14
architecture Struktur of RAM_4096x16 is
15
16
signal ENABLE: std_logic_vector(15 downto 0);
17
signal HADR: std_logic_vector(3 downto 0);
18
signal LADR: std_logic_vector(7 downto 0);
19
20
begin
21
22
HADR <= A(11 downto 8);
23
LADR <= A(7 downto 0);
24
25
Decoder: process(HADR)
26
  variable ENABLE_VAR: std_logic_vector(15 downto 0);
27
  variable INT: integer range 0 to 15;
28
  begin
29
    ENABLE_VAR := (others => '0');
30
   INT := conv_integer(HADR);
31
   ENABLE_VAR(INT) := '1';
32
   ENABLE <= ENABLE_VAR;
33
end process Decoder;
34
35
--  <-----Cut code below this line and paste into the architecture
36
body---->
37
38
   -- RAMB4_S16: Virtex/E, Spartan-II/IIE 256 x 16 Single-Port RAM
39
   -- Xilinx  HDL Language Template version 7.1i
40
41
GEN: for I in 15 downto 0 generate
42
  RAMB4_S16_inst_01 : RAMB4_S16
43
   generic map (
44
      INIT_00 =>
45
X"0000000000000000000000000000000000000000000000000000000000000000",
46
      INIT_01 =>
47
X"0000000000000000000000000000000000000000000000000000000000000000",
48
      INIT_02 =>
49
X"0000000000000000000000000000000000000000000000000000000000000000",
50
      INIT_03 =>
51
X"0000000000000000000000000000000000000000000000000000000000000000",
52
      INIT_04 =>
53
X"0000000000000000000000000000000000000000000000000000000000000000",
54
      INIT_05 =>
55
X"0000000000000000000000000000000000000000000000000000000000000000",
56
      INIT_06 =>
57
X"0000000000000000000000000000000000000000000000000000000000000000",
58
      INIT_07 =>
59
X"0000000000000000000000000000000000000000000000000000000000000000",
60
      INIT_08 =>
61
X"0000000000000000000000000000000000000000000000000000000000000000",
62
      INIT_09 =>
63
X"0000000000000000000000000000000000000000000000000000000000000000",
64
      INIT_0A =>
65
X"0000000000000000000000000000000000000000000000000000000000000000",
66
      INIT_0B =>
67
X"0000000000000000000000000000000000000000000000000000000000000000",
68
      INIT_0C =>
69
X"0000000000000000000000000000000000000000000000000000000000000000",
70
      INIT_0D =>
71
X"0000000000000000000000000000000000000000000000000000000000000000",
72
      INIT_0E =>
73
X"0000000000000000000000000000000000000000000000000000000000000000",
74
      INIT_0F =>
75
X"0000000000000000000000000000000000000000000000000000000000000000")
76
   port map (
77
      DO => DOUT,       -- 16-bit data output
78
      ADDR => LADR,     -- 8-bit address input
79
      CLK => CLK,       -- Clock input
80
      DI => DIN,        -- 16-bit data input
81
      EN => ENABLE(I),  -- RAM enable input
82
      RST => RST,       -- Synchronous reset input
83
      WE => WE          -- RAM write enable input
84
   );
85
86
  end generate;
87
88
end Struktur;

von FPGA-User (Gast)


Lesenswert?

die Ausgänge können nich parallel geschaltet werden,
Du brauchst einen Daten-MUX an den Ausgängen.

von T.M. (Gast)


Lesenswert?

Danke.
Hab ich grad noch in den Appl.Notes gelesen, dass wenn enable nicht
aktiv, der Zustand an den DOUT sich nur nicht ändert. Das mit den MUX
würde aber bei einer höheren Anzahl doch ziemlich heftig werden, ich
müsste ja in oberen Beispiel 16x16 bit Vektoren muxen... Werd ich wohl
doch mit etwas weniger RAM auskommen müssen, mein Baustein hat sowieso
nur 8 Blöcke...

von Stefan M. (Gast)


Lesenswert?

Wenn mich nicht alles täuscht, dann hat der Spartan2 aber interne
Tristate-Puffer. Die kannst Du wie folgt benutzen:

DOUT_TS <= DOUT when OE = '0' else
           (others => 'Z');

Die Tristate-Ausgänge können dann problemlos parallelgeschaltet
werden.

ciao, Stefan.

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.