mikrocontroller.net

Forum: FPGA, VHDL & Co. Block Ram Mode


Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich wuerde gerne fuer mein Blockram den Mode aendern von default
"write first" in "read first". Ich benutze keine Templates fuer den
Blockram, weil es kein Template fuer diese Ramgroesse gibt.
Normalerweise stellt man den Mode ueber Generic Map ein, aber bei
meinem Modul bekomme ich dann Synthesize Fehler. Hat jemand ein Tipp?

Kann mir jemand helfen oder komme ich in diesen Fall nicht um den
Coregen herum?

Gruß,
Dirk
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity Block_ram is
   generic (
      RESET_ACTIVE   : std_logic := '1'
   );
   port (
      clk            : in  std_logic;
      en             : in  std_logic;
      ADRESSE        : in  std_logic_vector(13 downto 0);
      DB_I           : in  std_logic_vector(7 downto 0);
      DB_O           : out std_logic_vector(7 downto 0);
      we             : in  std_logic
   );

end entity Block_ram;

architecture RTL of Block_ram is
   constant BIT_DEPTH      : positive  := 16384;
   constant BIT_WIDTH      : positive  := 8;
   
   type ram_t is array(BIT_DEPTH-1 downto 0)
      of std_logic_vector(BIT_WIDTH-1 downto 0);

   -- infer RAM
   signal blockram   : ram_t; 

begin 

   process (clk)
   begin
  
      if rising_edge(clk) then  
       if(en = '1') then  
         if (we = '1') then
           blockram(conv_integer(ADRESSE)) <= DB_I;
           DB_O <= DB_I;
         else
           DB_O <= blockram(conv_integer(ADRESSE));
         end if;
       end if;
     end if;

   end process;

end RTL;

Autor: Thomas B. (paraglider)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dirk,

Statt

if (we = '1') then
   blockram(conv_integer(ADRESSE)) <= DB_I;
   DB_O <= DB_I;
else
   DB_O <= blockram(conv_integer(ADRESSE));
end if;

musst du schreiben:

if (we = '1') then
   blockram(conv_integer(ADRESSE)) <= DB_I;
end if;
DB_O <= blockram(conv_integer(ADRESSE));

Gruß,
Thomas

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mein Problem welches ich eiegentlich habe liegt wohl anderer Natur.


Ich hab das Problem das meine Daten richtig ins BRAM gespeichert
werden, aber wenn ich die Daten lese bekomme ich alle Daten um einen
Takt verschoben.

Mir wurde gestern erzaehlt das dieses an der inneren Pipelinestruktur
liegt und das ich ein Delay am Ram Output (1. Takt)brauche.

Ich verstehe das ueberhaupt nicht :(

Ich lege die Adresse an das BRAM und erwarte eigentlich in diesem Takt
auch die Daten. Ich dachte im ersten Moment das die Daten auch um einen
Takt falsch im BRAM liegen, aber Sie liegen richtig im RAM ,wenn ich mir
den Testbench anschaue.

Muss ich wirklich nach dieser Reihenfolge die Daten auslesen?

1. Takt Adresse anlegen
2. Takt Delay
3. Daten vom Ram an eine weitere Stufe geben?

Falls dem so ist wie realsiere ich soetwas und vorallendigen wieso ist
das so?

Gruß,
Dirk

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS.: Ich hab sogar extra nochmal das Design mit den Xilinx Templates
geprüft, weil ich vermutet hatte das es ein Distrubted RAM ist welches
ISE aus meinen Code synthesized.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

für eine bessere Hilfe befindet sich der Code im Anhang.
Ich würde mich drüber freuen, wenn sich jemand die Mühe machen würde
einmal über den Code zuschauen.

Oder kann jemand anderes mir seinen Erfahrungsbericht bei der Nutzung
des internen Blockram mitteilen?

Dirk

Autor: Dirk (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
sry zu schnell.

Autor: Thomas B. (paraglider)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dirk,

dein Problem ist in der Tat ein anderes. Lies mal in der xapp463 nach.
Es ist eigentlich ganz einfach:

Du legst eine Adresse (und ggf. Daten) an das BRAM an. Am Ausgang tut
sich jetzt erstmal nichts, unabhängig vom Modus!

Beim nächsten Takt geht der Datenausgang auf den Wert entsprechend der
Adresse, die VOR dem Takt an das BRAM angelegt wurde. Beim Schreiben
ist dieser Wert vom Modus abhängig: Bei Write First ist es bereits der
neue Wert, bei Read First ist es noch der alte Wert der Speicherstelle.
Bei No Change ändert sich der Ausgang zunächst nicht!

Dieses Verhalten nennt man "synchrones Lesen/Schreiben" oder
"registered". Mag sein, dass es dir in deinem Fall nicht entgegen
kommt, ein echtes Hindernis sollte es aber nicht sein. Das "verteilte
RAM" verhält sich übrigens so, wie du es vielleicht vermutest: Der
Ausgang folgt direkt der Adresse - der Takt gilt nur für das Schreiben.
Also "asynchron Lesen/synchron Schreiben".

Gruß,
Thomas

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich bedanke mich fuer die Information jetzt werde ich wohl weiter
kommen.

GRuß,
Dirk

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.