www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Einfaches VHDL-Problem: LATTICE FPGA


Autor: ITSE (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, ich hab ein kleines Testboard mit nem FPGA und 4 LEDs.... Die 
leuchten auch wenn man ihnen ne '1' zuweist und gehen aus bei ner '0'. 
Nun habe ich es geschafft mittels eines externen Quartzoszillators (16 
MHz) alle 4 LEDs zum blinken zu bringen. (Blinken alle zusammen). Dazu 
habe ich folgenden Code geschrieben. Ich möchte jedoch ein Lauflicht 
machen und das geht einfach nicht. Die LEDs bleiben aus.... Dafür muss 
ich nur eine Zeile auskommentieren und die andere rein tun... siehe die 
einzigste auskommentierte Zeile.... Hat jemand eine Ahnung?

Danke schon mal...


SIGNAL intern : std_logic_vector(3 DOWNTO 0);

...

led0 <= intern(3);
led1 <= intern(2);
led2 <= intern(1);
led3 <= intern(0);

 

 p1: PROCESS (clk)
 VARIABLE zaehl : integer := 0;
 VARIABLE beg : boolean := true;
 

 BEGIN
 IF beg = true THEN
  intern <= "1010";
  beg := false;
 ELSE

 IF clk'EVENT AND clk = '1' THEN

  IF zaehl < 10000000 THEN
   zaehl := zaehl + 1;
   
  ELSE
--   intern <= NOT intern;  -- das hier funktioniert, es blinken alle 4                          LEDs
   intern <= intern(0) & intern(3 DOWNTO 1); --funktioniert nicht... why?
   zaehl := 0;
  END IF;

 END IF;
 END IF;
 END PROCESS p1;

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du verwendest die Variable beg zum Initialisieren der Signale. Benutze 
doch lieber einen richtigen Reset.
Schau mal ob im Synthesebericht was mit dem Signal passiert ist.

Autor: ITSE (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

danke für deine Antwort...

Meinst du es liegt an der Initialisierung mit meiner Variable "beg"? 
Kann sein, ich weiss aber nicht was du mit "verwende doch einen Reset" 
meinst. Kenne mich zwar ein bisschen mit VHDL aus, aber nicht mir 
FPGAs...

Ich nehme an, dass es eine bessere Methode für die Initialisierung des 
internen Signals "intern" gibt, das wirst du auch meinen.... aber wie?

Grüße

Bernd

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
FPGAs haben einen externen Reset. Den führt man im Toplevel des Designs 
auf und weißt ihm den entsprechenden Pin zu.
Ein asynchroner Reset sieht dann so aus
process(reset_n, clk)
begin
  if(reset_n = '0')then
       --Signale initialisieren
  elsif(rising_edge(clk))then
      --signale verwenden
  end if;
end process;

Achte darauf das der Reset low_aktiv ist.

Autor: ITSE (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DANKE, es funktioniert...

Noch eine Frage:

Ich benutze ja als externen Takt einen 16MHz Quarzoszillator. Deswegen 
hab ich den riesigen Zähler eingebaut um das Lauflicht/Blinklicht mit 
normalem Auge noch wahrzunehmen. Verbraucht dieser Zähler nicht sehr 
viele Hardware-Ressourcen im FPGA? Geht das nicht besser?

Kann ich evtl. eine der eingebauten PLLs benutzen anstatt den externen 
Takt? Ich weiss so gut wie nichts über die Lattice-PLLs...

Thx..

Bernd

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit den PPLs wird es bei 16MHz Eingangstakt nicht gehen. Die PPLs 
brauchen mindestens 25MHz.
Wenn Du die 25 hättest, weiß ich allerdings auch nicht ob man weit genug 
runterteilen könnte für einen so kleinen Takt.
Kannst Dir ja eine mit IPExpress generieren und mal schauen.
Aber der Zähler ist schon ne gängige Methode. Der Verbrauch ist nicht so 
hoch wie Du denkst. Ein 25 Bit breiter Zähler zählt bis 2^25-1. Das 
reicht für eine Frequenz von 0,5Hz. Und in einem modernen FPGA sind das 
nix.

Vg,
 Mathi

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ripple-Carry-Zaehler wie in diesem Fall lassen sich sehr effizient 
aufbauen: Pro Bit braucht es genau eine LUT und ein FF.

PLLs bringen nicht viel, da diese eine gewisse Mindestfrequenz (meist 
ueber 1MHz) haben muessen.

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.