www.mikrocontroller.net

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


Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
library UNISIM;                 -- für SRAM Template
use UNISIM.vcomponents.all;     -- für SRAM Template
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity RAM_4096x16 is
  port (CLK, EN, RST, WE: in std_logic;
        A: in std_logic_vector(11 downto 0);
        DOUT: out std_logic_vector(15 downto 0);
      DIN: in std_logic_vector(15 downto 0));
end RAM_4096x16;

architecture Struktur of RAM_4096x16 is

signal ENABLE: std_logic_vector(15 downto 0);
signal HADR: std_logic_vector(3 downto 0);
signal LADR: std_logic_vector(7 downto 0);

begin

HADR <= A(11 downto 8);
LADR <= A(7 downto 0);

Decoder: process(HADR)
  variable ENABLE_VAR: std_logic_vector(15 downto 0);
  variable INT: integer range 0 to 15;
  begin
    ENABLE_VAR := (others => '0');
   INT := conv_integer(HADR);
   ENABLE_VAR(INT) := '1';
   ENABLE <= ENABLE_VAR;
end process Decoder;

--  <-----Cut code below this line and paste into the architecture
body---->

   -- RAMB4_S16: Virtex/E, Spartan-II/IIE 256 x 16 Single-Port RAM
   -- Xilinx  HDL Language Template version 7.1i

GEN: for I in 15 downto 0 generate
  RAMB4_S16_inst_01 : RAMB4_S16
   generic map (
      INIT_00 =>
X"0000000000000000000000000000000000000000000000000000000000000000",
      INIT_01 =>
X"0000000000000000000000000000000000000000000000000000000000000000",
      INIT_02 =>
X"0000000000000000000000000000000000000000000000000000000000000000",
      INIT_03 =>
X"0000000000000000000000000000000000000000000000000000000000000000",
      INIT_04 =>
X"0000000000000000000000000000000000000000000000000000000000000000",
      INIT_05 =>
X"0000000000000000000000000000000000000000000000000000000000000000",
      INIT_06 =>
X"0000000000000000000000000000000000000000000000000000000000000000",
      INIT_07 =>
X"0000000000000000000000000000000000000000000000000000000000000000",
      INIT_08 =>
X"0000000000000000000000000000000000000000000000000000000000000000",
      INIT_09 =>
X"0000000000000000000000000000000000000000000000000000000000000000",
      INIT_0A =>
X"0000000000000000000000000000000000000000000000000000000000000000",
      INIT_0B =>
X"0000000000000000000000000000000000000000000000000000000000000000",
      INIT_0C =>
X"0000000000000000000000000000000000000000000000000000000000000000",
      INIT_0D =>
X"0000000000000000000000000000000000000000000000000000000000000000",
      INIT_0E =>
X"0000000000000000000000000000000000000000000000000000000000000000",
      INIT_0F =>
X"0000000000000000000000000000000000000000000000000000000000000000")
   port map (
      DO => DOUT,       -- 16-bit data output
      ADDR => LADR,     -- 8-bit address input
      CLK => CLK,       -- Clock input
      DI => DIN,        -- 16-bit data input
      EN => ENABLE(I),  -- RAM enable input
      RST => RST,       -- Synchronous reset input
      WE => WE          -- RAM write enable input
   );

  end generate;

end Struktur;

Autor: FPGA-User (Gast)
Datum:

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

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Stefan May (smay4finger)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.