www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Spartan3 SRAM Ansteuerung


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich besitze eine Spartan-3 Board und möchte den dazugehörigen SRAM
Speicher ansteuern. Ich hatte bisher keine großen Erfolge und nichts 
vernünftiges gefunden.
Vielleicht kann mir jemand helfen, wo ich etwas darüber finde oder 
vielleicht hat das jemand schon mal gemacht.

Danke

Martin

Autor: VHDL_Mensch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe sowas schon mal gemacht. Wo liegt denn das Problem?

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.sump.org/projects/analyzer/

Feines Einsteiger Tutorial für das Spartan3 Starterkit

http://www.derepas.com/fabrice/hard/

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau dir das Datenblatt des SRAMs an. Dort ist die Ansteuerung recht 
detailiert beschrieben.

MfG
Falk

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mittlerweile folgenden Code geschrieben.
Das Programm sollte über drei Leitungen (vid_clk, vid_data, vidakt) ein 
Videosignal von einem DSP Board einlesen im sram speichern und über die 
VGA Schnittstelle ausgeben (Schwarz Weiß ohne Grautöne 360x288).
Mit dem Block RAM hat alles funktioniert. Wenn ich das ganze aber aufs 
sRAM übertrage speichert er nur 16 bit die er dann die ganze Zeit 
Ausgibt (Als wären schreibe- und Leseadresse immer auf Null).
Ich habe keine Ahnung mehr wo ich den Fehler suchen soll.
______________________________________________________________________
rst <= swt(7);
-- Prozess zum generieren der Leseadresse
  process(clkdiv)
  begin
    if rising_edge(clkdiv) and vidon = '1' then

      vc_d <= vc;
      if vc /= vc_d then
        pixelcntr <= 0;
      end if;
      if pixelcntr < 360 and hc > "0100000000" and vc > "0010000000" 
then   -- hc...vertical counter, hc...horizontal counter
        pixelcntr <= pixelcntr + 1;
        if cntr = 14 then
          cntr <= cntr +1;
          adout <= adout + 1;
        end if;
        if cntr = 15 then
          cntr <= 0;
        else
          cntr <= cntr +1;
        end if;
        if vc_d <= vc and vc = "0000000000" then
          adout <= 00 & X"0000";
          pixelcntr <= 0;
          cntr <= 0;
        end if;
      end if;
    end if;
  end process;

-- Prozess zum generieren der Schreibeadresse und Speicherung der Daten.
process(vid_clk, vid_data, vidakt)
begin
  if falling_edge(vid_clk) then
    if vidakt = '1' then
      halb <= not halb;
      if halb = '0' then
        di(cntrin) <= vid_data;
        if cntrin = 15 then
          cntrin <= 0;
          adin <= adin + 1;
        else
          cntrin <= cntrin + 1;
        end if;
      end if;
    else
      adin <= 00 & X"0000";
      cntrin <= 0;
      halb <= '0';
    end if;
  end if;
end process;

-- sram Ansteuerung
process (mclk,rst)

type sram_state_type is (write_init, write1, read_init, read1);
variable sram_state, next_sram_state : sram_state_type;
variable lfsr, last_lfsr : std_logic_vector(18 downto 0);
variable last_io : std_logic_vector(15 downto 0);
variable address : std_logic_vector(17 downto 0);

begin
CE1 <= '0';
UB1 <= '0';
LB1 <= '0';
CE2 <= '1';
UB2 <= '1';
LB2 <= '1';
AD <= address;

if rst = '0' then
  address := "000000000000000000";
  lfsr := "0000000000000000001";
  sram_state := write_init;
  WE <= '1';
  IO1 <= "ZZZZZZZZZZZZZZZZ";
  led(4 downto 1) <= "1100";
elsif  rising_edge(mclk) then
  case sram_state is
    when write_init =>
      sram_state := write1;
      IO1 <= di;
      WE <= '1';
      OE <= '1';
      address := adin;
    when write1 =>
      if cntr = 14 then
        sram_state := read_init;
      end if;
      WE <= '0';
      IO1 <= di;

    when read_init =>
      OE <= '0';
       sram_state := read1;
      IO1 <= "ZZZZZZZZZZZZZZZZ";
      address := adout;
    when read1 =>
      sram_state := write_init;
      do <= IO1;
  end case;

end if;
end process;

--rgb definieren
Cred <= do(cntr);
Cgrn <= do(cntr);
Cblu <= do(cntr);

Autor: Ssss Ssssss (sssssss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich glaub da fehlt ein
WE <= '1';
im read init ;)

Bye, Simon

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal so ein paar Anmerkungen.

>   if rising_edge(clkdiv) and vidon = '1' then

Sowas ergibt eine gated clock -> böse, macht man nicht im FPGA
Besser ist

>   if rising_edge(clkdiv) then
      if vidon = '1' then

Ausserdem deutet die Bezeichnung clkdiv auf einen abgeleiteten Takt hin. 
Ist das so? Wenn ja, ebenfalls nicht gut.

Warum definierst du alles als Variablen und nicht als Signale? Damit 
sparst du keinen Logikresourcen und kannst dir bisweilen böse in Knie 
schiessen. Kennst du den Unterschied zwischn Signalen und Variablen 
WIRKLICH? Ich hab praktisch nie Variablen verwendet.

>     if pixelcntr < 360 and hc > "0100000000" and vc > "0010000000"

Diese Mischung aus dezimaler und binärer Darstellung ist unleserlich un 
unnötig.

Aus deinen Bezeichungen UB1 und UB2 schliesse ich mal, dass es ein sual 
port RAM ist. Was für ein Typ ist es denn genau?

Wenn es ein dual-port RAM ist, warum nutzt du dann nur einen Port?

Hast das ganze simuliert? RTL Simulation reicht völlig. Ist dein 
Signalspiel am RAM so wie du es willst?

        if cntr = 14 then
          cntr <= cntr +1;
          adout <= adout + 1;
        end if;
        if cntr = 15 then
          cntr <= 0;
        else
          cntr <= cntr +1;
        end if;

Was soll damit ausgedrückt werden? Ein 16er Zählzyklus wofür?

MfG
Falk


Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@martin

habe deinen source zwar nur kurz überflogen.
also die statemachine zum ansteuern/auslesen/schreibens des srams schaut 
zwar gut aus, aber du solltest zwischen read und read1 noch einen takt 
(platz) lassen. ansonsten solltest du die tipps von simon und falk 
berücksichtigen (kein gated clock, vorwiegend mit signalen statt 
variablen arbeiten)

@falk
das sram ist KEIN dual-port ram. ub1/ub2 kommt zustande da zwei 
getrennte ram-bausteine angeschlossen sind, welche upper/lower/both 
bytes direkt lesen/schreiben kÖnnen. daher hat man ub1/Lb1 und ub2/lb2.

gruß
rene

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum kein gated clock? Was genau bedeuted das überhaupt?
Was ist RTL Simulation? Wie geht das?

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Warum kein gated clock? Was genau bedeuted das überhaupt?

Hab grad im wiki einen Artikel dazu erstellt:

Taktung FPGA/CPLD oder

http://www.mikrocontroller.net/articles/Taktung_FPGA/CPLD

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RTL ist hier kein schlechter Fernsehsender ;-) sondern heisst

Register
Transfer
Level

Damit ist praktisch der VHDL-Code gemeint. Bzw. die Ebene der 
Hardwarebeschriebung. Wenn nun der VHDL-Compiler den VHDL-Code in 
elementare Logik zerlegt hat man die gleiche Schaltung nur einen Schritt 
hardwarenäher. Vergleichbar mit C und Assembler bzw. Maschinencode.

Die RTL-Simulation macht man mit Modelsim bzw. jedem anderen 
VHDL-Simulator.

@fpgakuechle

Naja, prinzipiell richtig, aber bissel schnell hingeschrieben. Ein Bild 
sagt mehr als tausend Worte. Sollte man unbedingt noch ergänzen, Gated 
clock inc. Timingdiagram sowie CE Methode.

MfG
Falk


Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@fpgakuechle

<Naja, prinzipiell richtig, aber bissel schnell hingeschrieben. Ein Bild
<sagt mehr als tausend Worte. Sollte man unbedingt noch ergänzen, Gated
<clock inc. Timingdiagram sowie CE Methode.


Wikis sind Teamarbeit, ich bin FPGA-VHDL Entwickler, nicht Zeichner. Da 
lass ich gerne andere ran.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
War das jetzt ein Wink mit dem Zaunspfahl? ;-)
Ich bin auch "nur" FPGA Entwickler.
Aber mal sehen, was sich in den nächsten Tagen machen lässt.

MfG
Falk

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kommt noch was?

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.