www.mikrocontroller.net

Forum: FPGA, VHDL & Co. CPLD Anfängerfrage zum XC9572XL


Autor: Jan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allerseits,

habe den Einstieg in die Welt der cplds mit dem XC9572XL und VHDL 
gewagt.
Mein 1. Programm sollte ein Binärzähler(4Bit)sein. Hab mich also durch 
mehrere Tutorials gearbeitet und so mein erstes Programm 
zusammengezimmert...

Die ISE Software von Xilinx hat keine Fehler mehr erkennen können, die 
Pinbelegung ist gemacht, sollte also funktionieren.

Die reale Zählfolge ist nun aber nicht wie zu erwarten 
1(dez),2(dez),3(dez)...usw sondern ein wildes durcheinander ... siehe 
Tabelle unten

c3  c2  c1  c0
1  1  1  1
0  0  0  0
0  0  0  1
1  1  1  0
0  0  1  1
1  1  0  0
0  1  0  1
1  0  1  0
0  1  1  1
1  0  0  0
1  0  0  1
0  1  1  0
1  0  1  1
0  1  0  0
1  1  0  1
0  0  1  0

hat jemand von euch ne idee wo ich was falsch gemacht habe oder was ich 
ändern muss???

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man darf auch VHDL-Files direkt anhängen, Screenshot davon ist doof :)

Mir ist folgendes aufgefallen, bin mir aber nicht sicher, ob XST das 
nicht vielleicht automatisch korrigiert hat:
Du schreibst count <= count + 1; das bedeutet, dass count gelesen wird, 
dann 1 addiert und dann in count geschrieben wird. Aber woher wird count 
gelesen? Da es ein inout signal ist, von außen, und was liegt da an? 
Wenn es reale I/O-Pins sind, das, was angeschlossen ist.
Du willst aber wohl dass der aktuelle Counter-Wert in FF's gespeichert 
wird, und auf diesen gespeicherten Wert soll dann immer 1 addiert 
werden, und dieser Wert soll dann ausgegeben werden. Das geht dann so:
architecture Behav of s4counter is
  -- Internes Signal für den Counter; dies sind dann die Ausgänge der FFs
  -- Mit 0 initialisieren
  signal count_i : std_logic_vector (3 downto 0) := "0000";
begin
  process(clock,reset)
    ...
      count_i <= count_i + 1;
  end process;
  count <= count_i;
end Behav;
Auch wenn es mit deiner Schreibweise funktioniert (und das Problem 
woanders liegt), ist sie jedoch unüblich und potentiell verwirrend.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die ISE Software von Xilinx hat keine Fehler mehr erkennen können, die
> Pinbelegung ist gemacht, sollte also funktionieren.
Was verwendest du als Takt? Einen Taster?
Woran erkennst du den Bitzustand? An LEDs?

Das mit dem inout ist unschön und sollte vermieden werden. Statt dessen 
solltest du den Zähler als lokales Signal definieren und dem Port 
zuweisen. Allerdings wird das inout hier keinen Fehler hervorrufen.

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab jetzt mit den Änderungsvorschlägen von Niklas mal nen neuen 
Zähler geschrieben (ganz simpel 4bit(bin)), an der Zählreihenfolge hat 
sich jedoch leider nicht viel geändert. Immernoch durcheinander.

Der Clock ist mit nem guten alten NE555 realisiert (1Hz)
Die Bitzustände werden per LED angezeigt. (an=0 & aus=1)
Hier noch mal der Code:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity counter1 is
    Port ( clock : in std_logic;
          count_out : out std_logic_vector(3 downto 0));
end counter1;

architecture Behavioral of counter1 is
signal count_int : std_logic_vector(3 downto 0) := "0000";

begin
   process (clock)
  begin
     if clock='1' and clock'event then
         count_int <= count_int + 1;
     end if;
   end process;
count_out <= count_int;
end Behavioral;

Sollte der Code jetzt so funktionieren?

Autor: J.H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich bin sicher der falsche Ansprechpartner wenn es um syntax 
Probleme oder Denkblockaden, Nebeneffekte geht.
Aber bei blöden Fehlern kenne ich mich aus: klappt die Simulation nicht, 
oder sind leds angeschlossen, die falsch "zählen"?
Falls leds dann die Idee: einfach falsch verdrahtet, bzw. Pins 
zugewiesen?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
> Sollte der Code jetzt so funktionieren?
Der Code hat auch vorher schon funktioniert (Screenshot 
RTL-Schematic)...
Das Problem liegt irgendwo in der Hardware. Kontrollier nochmal deinen 
Takt (Überschwinger, Flankensteilheit...).

> Falls leds dann die Idee: einfach falsch verdrahtet...
Das wäre zu einfach, aus der geposteten Reihe ist keine (einfache) 
Vertauschung zu erkennen.

Verwende statt der herstellerabhängigen
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
besser die genormte
use IEEE.numeric_std.ALL;
Bei der ersten Variante könnten sich Doppeldeutigkeiten ergeben, wenn du 
mal einen Prozess in ein anderes VHDL-File kopierst, das z.B. so 
beginnt:
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_SIGNED.ALL;


Mit numeric_std könnte das z.B. so aussehen (meine bevorzugte Variante):
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

entity counter1 is
    Port ( clock : in std_logic;
           count_out : out std_logic_vector(3 downto 0));
end counter1;

architecture Behavioral of counter1 is
signal count_int : integer range 0 to 15 := 0;
begin
  process (clock)begin
     if clock='1' and clock'event then
         count_int <= count_int + 1;
     end if;
  end process;
  count_out <= std_logic_vector(unsigned(count_int,4));
end Behavioral;

Oder es könnte so aussehen:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

entity counter1 is
    Port ( clock : in std_logic;
           count_out : out std_logic_vector(3 downto 0));
end counter1;

architecture Behavioral of counter1 is
signal count_int : unsigned (3 downto 0) := "0000";
begin
  process (clock)begin
     if clock='1' and clock'event then
         count_int <= count_int + 1;
     end if;
  end process;
  count_out <= std_logic_vector(count_int);
end Behavioral;

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab das Problem gefunden, es lag am ISEWebPack selber.
Weiß auch nicht was version 7.1 da zusammengeeiert hat, hab grad mal die 
9.2 drauf gemacht, gleicher code....und läuft auf Anhieb, so wies soll.
Danke für die schnelle Hilfe.
Gruß

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.