Forum: FPGA, VHDL & Co. Spartan3 SRAM Ansteuerung


von Martin (Gast)


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

von VHDL_Mensch (Gast)


Lesenswert?

Habe sowas schon mal gemacht. Wo liegt denn das Problem?

von Dirk (Gast)


Lesenswert?

http://www.sump.org/projects/analyzer/

Feines Einsteiger Tutorial für das Spartan3 Starterkit

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

von Falk (Gast)


Lesenswert?

Schau dir das Datenblatt des SRAMs an. Dort ist die Ansteuerung recht 
detailiert beschrieben.

MfG
Falk

von Martin (Gast)


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);

von Ssss S. (sssssss)


Lesenswert?

ich glaub da fehlt ein
WE <= '1';
im read init ;)

Bye, Simon

von Falk (Gast)


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


von TheMason (Gast)


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

von Martin (Gast)


Lesenswert?

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

von Fpgakuechle K. (Gast)


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

von Falk (Gast)


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


von Fpgakuechle K. (Gast)


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.

von Falk (Gast)


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

von Hans (Gast)


Lesenswert?

Kommt noch was?

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.