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
http://www.sump.org/projects/analyzer/ Feines Einsteiger Tutorial für das Spartan3 Starterkit http://www.derepas.com/fabrice/hard/
Schau dir das Datenblatt des SRAMs an. Dort ist die Ansteuerung recht detailiert beschrieben. MfG Falk
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);
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
@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
Warum kein gated clock? Was genau bedeuted das überhaupt? Was ist RTL Simulation? Wie geht das?
>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
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
@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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.