Forum: FPGA, VHDL & Co. VHDL Probleme und Glitches


von Jürgen Schneider (Gast)


Lesenswert?

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

von Jürgen Schneider (Gast)


Lesenswert?

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;

von Jörn (Gast)


Lesenswert?

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

von FPGA-User (Gast)


Lesenswert?

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

von Jürgen Schneider (Gast)


Angehängte Dateien:

Lesenswert?

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!

von FPGA-User (Gast)


Lesenswert?

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 ?

von Jürgen Schneider (Gast)


Lesenswert?

Das sieht man nicht auf dem Bild, ich habe an die unsauberen Signale
rangezoomt. Ich probiere es dann mal mit der Bibliothek!

Vielen Dank!

von Merlodaua (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.