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


von Jan (Gast)


Angehängte Dateien:

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???

von Niklas G. (erlkoenig) Benutzerseite


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:
1
architecture Behav of s4counter is
2
  -- Internes Signal für den Counter; dies sind dann die Ausgänge der FFs
3
  -- Mit 0 initialisieren
4
  signal count_i : std_logic_vector (3 downto 0) := "0000";
5
begin
6
  process(clock,reset)
7
    ...
8
      count_i <= count_i + 1;
9
  end process;
10
  count <= count_i;
11
end Behav;
Auch wenn es mit deiner Schreibweise funktioniert (und das Problem 
woanders liegt), ist sie jedoch unüblich und potentiell verwirrend.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Jan (Gast)


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?

von J.H. (Gast)


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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

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
1
use IEEE.STD_LOGIC_ARITH.ALL;
2
use IEEE.STD_LOGIC_UNSIGNED.ALL;
besser die genormte
1
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:
1
use IEEE.STD_LOGIC_ARITH.ALL;
2
use IEEE.STD_LOGIC_SIGNED.ALL;


Mit numeric_std könnte das z.B. so aussehen (meine bevorzugte Variante):
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.numeric_std.ALL;
4
5
entity counter1 is
6
    Port ( clock : in std_logic;
7
           count_out : out std_logic_vector(3 downto 0));
8
end counter1;
9
10
architecture Behavioral of counter1 is
11
signal count_int : integer range 0 to 15 := 0;
12
begin
13
  process (clock)begin
14
     if clock='1' and clock'event then
15
         count_int <= count_int + 1;
16
     end if;
17
  end process;
18
  count_out <= std_logic_vector(unsigned(count_int,4));
19
end Behavioral;

Oder es könnte so aussehen:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.numeric_std.ALL;
4
5
entity counter1 is
6
    Port ( clock : in std_logic;
7
           count_out : out std_logic_vector(3 downto 0));
8
end counter1;
9
10
architecture Behavioral of counter1 is
11
signal count_int : unsigned (3 downto 0) := "0000";
12
begin
13
  process (clock)begin
14
     if clock='1' and clock'event then
15
         count_int <= count_int + 1;
16
     end if;
17
  end process;
18
  count_out <= std_logic_vector(count_int);
19
end Behavioral;

von Jan (Gast)


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ß

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.