www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Stratix blockram


Autor: some guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe einen Stratix EP1S80 geschenkt bekommen und wollte es benutzen 
für einen Logic Analyzer.

Ich bin noch nicht sicher ob ich einen minila oder sump nachbauen werde, 
jedoch sicher ist das ich den blockram des Stratix benutzen werde.

Es sind immerhin 7427520 bit verfgbar, so könnte ich 128k sample ram 
machen (4194304 bit) und es würden immer noch genug ram blocks bleiben 
für andere sachen.

So weit so gut, allerdings wenn ich im Quartus die RAM MegaFunction 
benutze, kann ich maximal 'nur' 2mbit addressieren.

Ich kann zwar mit VHDL einen RAM module bauen, mit 4 mbit, allerdings 
bin ich nicht sicher ob das wirklich geht (warum dann eine begrenzung im 
Quartus auf 2mbit).

Ich habe zwar gemerkt das die RAM MegaFunction mir eine 65536*64 statt 
32 bit erlaubt, damit würde ich dann auf 4 mbit kommen, nur wie kann ich 
dann 64bit RAM mit einem 32bit bus ansteuern (ohne extra verzögerungen, 
sonst macht der schnelle blockram wenig sinn)?

Autor: Iulius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Block Ram wird wohl intern mit 16 bit Adresse angebunden sein, 
deswegen geht nicht mehr.
Eine andere Begründung fällt mir jedenfalls nicht ein.


Sehe aber dein Problem nicht... wenn ich dich richtig verstanden habe 
bekommst du immer 32bit die du schreiben willst.

Also speicherst du die 32bit einfach schon im high/low teil des 64bit 
Registers was einen Takt später mit den nächsten 32bit komplett 
geschrieben wird.

Klar ist das ein wenig mehr Logikverbrauch, aber bei so einem Riesenchip 
spielt das wohl keine Rolle.

Autor: Thomas R. (tinman) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
EP1S80 für einen LA ?

urgs, verkaufe es oder benutze es für was vernünftiges.

Der sollte doch paar hundert euro wert sein - dafür kannst du dir 10 kg 
minila's kaufen/bauen - mit 2mbit/kanal ZBT ram.

Es sei den du baust spectrum analyzer/LA/Digiscope. Dann kann ich mir 
sowas vorstellen aber nur wegen den ram.

Autor: some guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Thomas

ich bin ein FPGA anfänger daher sind komplexe sachen noch nicht drin. LA 
sources sind da, fehlt nur RAM. Spectrum Anlyser brauche ich nicht, für 
digitales oscilloskop brauche ich AD wandler, das kann doch der FPGA 
nicht.
Verkaufen will ich nicht,mit so einem riesen chip eröfnen sich so viele 
möglichkeiten, gut ich weiss noch nciht welche aber schadet nciht etwas 
reserve zu haben.



@Iulius

wenn ich high/low die 32bit speichere und die nacheinander auslese 
entsteht doch eine verzögerung.
takt - high 32 lesen (in time)
takt - low 32 lesen (1 takt verzögert)
takt - address couter erhöhen (gehört zu design sowieso)
takt - high 32 lesen (1 task schon verögert durch low 32 von 
voraddresse)
takt - low 32 lesen (2 takte schon verzögert)

oder ist das total falsch und die low32 sind nur jedesmal einen takt 
verzögert?

Geht sowas auch bei jeder taktflanke?

Kannst du bitte das als vhdl beispiel zeigen? Ich habe mir paar vhdl 
memory controller angeguckt, nur wie ich die high/low ohne zeit verlust 
buffern soll verstehe ich nicht ganz.

Autor: Iulius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mal ein beispiel für 32bit lesen und 64bit schreiben.


eingang_32bit : in STD_LOGIC_VECTOR (31 downto 0); 
ausgang_64bit : out STD_LOGIC_VECTOR (63 downto 0);
writeenable : out STD_LOGIC;
eingang_adresse : out STD_LOGIC_VECTOR (15 downto 0);
ausgang_adresse : out STD_LOGIC_VECTOR (15 downto 0);
...
SIGNAL puffer : STD_LOGIC_VECTOR (31 downto 0);
SIGNAL addr_puffer_eingang : STD_LOGIC_VECTOR (15 downto 0);
SIGNAL addr_puffer_ausgang : STD_LOGIC_VECTOR (15 downto 0);
SIGNAL write_wait : STD_LOGIC := '0';
...

schreiben: process(takt,write_wait)
begin
 IF RISING_EDGE(takt) THEN
  
  IF write_wait='0'
   writeenable <= 1; -- hier : low aktiv
   puffer <= eingang_32bit;
  else
   ausgang_64bit <= puffer & eingang_32bit;
   ausgang_adresse <= addr_puffer_ausgang;
   writeenable <= 0;
   addr_puffer_ausgang <= addr_puffer_ausgang +'1'
  end if;  

  write_wait <= not write_wait;

  eingang_adresse <= addr_puffer_eingang;
  addr_puffer_eingang <= addr_puffer_eingang +'1';

 end if;
end process schreiben;


hoffe das ist verständlich.


das mit dem 64bit register war etwas unglicklich formuliert oben...du 
speicherst natürlich nur den einen teil zwischen und brauchst demzufolge 
auch nur einen 32bit puffer.


so hast du aber 64bit in 2 takten, also wieder 32bit pro takt.


Falls du was anderes meinst, beschreib es bitte mal genauer.

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.