mikrocontroller.net

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


Autor: Jürgen Schneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jürgen Schneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jürgen Schneider (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Jürgen Schneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Merlodaua (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
I have to do a VGA controller for Spartan3.
Have you got some example?
merlodaua@aliceposta.it

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.