Hallo! ich will einen Zwischenspeicher mit 32 Einträgen zu je 64 bit implementieren in einem CycloneII von Altera (Quartus Web Edition 5.0). Ich bin blutiger Anfänger und habe mich mit VHDL rumgeschlagen, jetzt funktioniert der Cache einigermaßen, aber es sind noch Fragen offen: 1. Was mache ich, wenn ich ein Signal toggeln will? s <= not s; meldet combinational loop! if s = '1' then s <= '0'; else s <= '1'; end if; meldet, dass man keine 2 verschiedenen Treiber an ein Signal hängen kann. Muss man da über variablen gehen? 2. Warum bekomme ich solche Glitches beim Ausgangssignal? Ich habe den RAM-Ausgang als registered deklariert, und gehofft, dass die Daten dann clocksynchron und sauber ausgegeben werden. Ich hänge mal mein Projekt an, über Hilfe würde ich mich freuen! Vielen Dank! Jürgen Schneider
Tut mir, leid, das Hochladen des Anhangs klappt nicht. Hier dann mein Quelltext: library IEEE; use IEEE.std_logic_1164.all; USE ieee.std_logic_arith.all; entity cache is port ( CLK : in std_logic; --Der Takt datenin : in std_logic_vector(63 downto 0);--zu schreibende Daten datenout: out std_logic_vector(63 downto 0);--gelesene Daten wr_en : in std_logic; --wenn high werden die Daten geschrieben, ansonsten gelesen start : in std_logic --aktiviert den schreibe/leseprozess ); end entity cache; architecture verhalten of cache is signal addresse : std_logic_vector( 4 downto 0);--Die Adresse im Cache component ram IS PORT ( address : IN STD_LOGIC_VECTOR (4 DOWNTO 0); clock : IN STD_LOGIC ; data : IN STD_LOGIC_VECTOR (63 DOWNTO 0); wren : IN STD_LOGIC ; q : OUT STD_LOGIC_VECTOR (63 DOWNTO 0) ); end component ram; begin --Einstllungen für das RAM --64 bit Wortbreite --32 Einträge --single clock --registered output port ram_inst : ram PORT MAP ( --Die Leitungen mit dem RAM verbinden address => addresse, clock => clk, data => datenin, wren => wr_en, q => datenout ); startbehandlung: process(start) variable adr : integer :=31; begin if start = '0' and start'event then --bei der negativen Flanke sind ide Daten schon gelatcht, deswegen kann die Adresse inkrementiert werden adr := adr +1; addresse <=CONV_STD_LOGIC_VECTOR(adr,5); end if; end process startbehandlung; end architecture verhalten;
Hallo Jürgen, zu 1) um ein Signal mit s <= not s toggeln zu lassen, brauchst du ein ein Register dazwischen. process s_reg(reset,clk) begin if (reset='1') then s_reg<='0'; elsif rising_edge(clk) then s_reg<=s_reg_nxt; end if; end process; s_reg_nxt<=not s_reg; Das resultierende Signal togglt mit der halben Taktfrequenz. Gruß Jörn
vorschlag für deinen adresscounter: signal adr_q : std_logic_vector(4 downto 0); process(start) begin if falling_edge(start) then adr_q <= adr_q +1; -- zaehlt 0, 1 .. 31, 0, 1... end if; end process; adr_out <= adr_q; -- adr_out = ext. signal, z.B. in Entity
Danke für die Antworten. Ich habe jetzt mal probiert, den adressvektor direkt um 1 zu erhöhen, aber da kommt die Meldung: "can't determine definition of operator "+"". Muss da noch ne library eingebunden werden? Ich habe auch mal die Wellenformen angehängt, der Ausgang braucht einige Zeit, um sich einzupendeln (und auch noch mitten innerhalb einer Taktperiode), obwohl der über ein Register gelatcht wird. Ist das immer so, oder liegt da noch ein Fehler vor? Vielen Dank!
binde mal die folgende lib ein : use ieee.std_logic_unsigned.all; dann sollte die addition +1 kein problem mehr sein. zum bild: es kann schon sein, dass der Datenbus 2 ns braucht, bis alle Signale stabil sind, das ist bei 64 bit schon OK! allerdings kann ich die ursache für die änderung nicht sehen, weder clk noch start bewegen sich, oder sieht man das nur nicht auf dem bild ?
Das sieht man nicht auf dem Bild, ich habe an die unsauberen Signale rangezoomt. Ich probiere es dann mal mit der Bibliothek! Vielen Dank!
I have to do a VGA controller for Spartan3. Have you got some example? merlodaua@aliceposta.it
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.