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???
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.
> 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.
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?
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?
> 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; |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.