Spartan3 SRAM Ansteuerung

Gast #443181
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
Gast #447574
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);
Gast #447638
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

Gast #447643
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
Gast #448428
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

Gast #448730
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren