Datum: 06.05.2008 20:48
Hallo Leute Bin langsam echt am verzweifeln hier :( Ich versuch schon lange diesen Zähler zum laufen zu bringen. Und zwar wird auf Tastendruck KEY(1) ein Schalterarray SW(7 downto 0) eingelesen und in X gespeichert. Soweit so gut, funktioniert auch! Nun soll aber beim ersten Tastendruck von KEY(1) der wert von X in A gespeichert werden, beim zweiten mal in B und dann wieder in A usw. Es wird aber weder in A noch in B irgendwann mal was gespeichert und ich komm einfach nicht dahinter wieso. Kann mir mal jemand sagen wo mein Überlegungsfehler steckt?
... U0 : flipflop generic map(wide) port map (SW(wide-1 downto 0), KEY(1), X); process(X) variable count : integer := 0; begin if (count = 0) then A <= X; else B <= X; end if; count := count + 1; if (count = 2) then count := 0; end if; end process; ... |
Datum: 06.05.2008 21:24
variable count : integer := 0; |
Warum machst Du sowas? Verwende signale dafür! Rick
Datum: 06.05.2008 21:31
Weil die erste Bedingung (if (count = 0)...) sonst eh nie erfüllt würde da die letzte Zuweisung an das signal count ja count+1 wäre was 1 entsprechen würde!
Datum: 06.05.2008 22:13
Flasch. Wenn count = 2 ist, wird die letzte Zuweisung count <= 0. Hast Du eine Testbench? Simuliere das mal! Rick
Datum: 07.05.2008 00:06
> U0 : flipflop generic map(wide) port map (SW(wide-1 downto 0), KEY(1), > X); Keine gute Idee, beschreib lieber das Verhalten als von Hand Hardware zu instanziieren. > process(X) > variable count : integer := 0; > begin > if (count = 0) then > A <= X; > else > B <= X; > end if; > count := count + 1; > > if (count = 2) then > count := 0; > end if; > end process; Ich fürchte du bist völlig auf dem Holzweg. Du brauchst einen getakteten Prozess um zu zählen. Fang am besten mal mit den VHDL Grundregeln an.
Datum: 07.05.2008 00:12
Hallo Dark_Force,
1. Ersetze die Variable durch ein Signal
(sonst werden die Events ja nicht mitgezählt !!!!)
2. Wenn schon, dann ersetze "if Count = 2 then" durch
"if Count = 1 then"
3. Ersetze den Counter durch ein Flag
(Du brauchst ja nur 2 Zustände, spart also einen Addierer!!)
4. Agiere nur auf Rising-Edges von Key(1)
(sonst wird ja bei jedem Key(1)-Event der Counter weitergezählt,
ausserdem ist ein solches Verhalten -- aggieren bei beiden Edges --
kaum synthetisierbar)
if rising_edge(Key(1) then
.. Dein (modifizierter) Counter-Code ...
end if;
viel Spass
Datum: 07.05.2008 06:32
@Andreas Ist es nicht so, dass der Prozess sowieso erst bei einer Veränderung von X (also allg. Ausdrücke in der Sensitivity List) durchlaufen wird? Dies würde ja in diesem Fall bedeuten, dass der Prozess nur ausgeführt wird, wenn das Flipflop das Signal X verändert hat (Gewissermassen getaktet?) ?!
Datum: 07.05.2008 11:47
Nein, das gilt nur für die Simulation, aber nicht für die Synthese.
Datum: 07.05.2008 12:48
Ok, das war mir nicht bewusst! Bin immer noch am Lernen von VHDL und habs jetzt mal nachgeschlagen im Reference Manual. Jetzt ist's mir klar. Ich werde mich heute Abend nochmals daran setzen und eure Vorschläge umsetzen. Mal schauen ob ich's hinkriege :) Vielen Dank für eure Tipps. Sehr kompetentes Forum hier!
Datum: 07.05.2008 19:51
Also, hab's hingekriegt:
... signal count : integer := 0; ... process(CLK) begin if(rising_edge(CLK) then if (count = 0) then A <= SW(7 downto 0); count <= 1; elsif (count = 1) then B <= SW(7 downto 0); count <= 0; end if; end if; end process; |
- 'signal' anstatt 'variable' für counter - FF direkt in der Top entity anstatt über component instantiation, dadurch konnte ich ein Flag einbauen für die Modulo-2 Funktion. Danke nochmals für eure Tipps!
Datum: 07.05.2008 22:22
.. jetzt ersetze nur noch integer durch std_logic und passe Deinen Code so an, das count ein Flag ist.
Datum: 07.05.2008 22:33
Was mir beim kurzen Überfliegen Deines Codes nur unbewust aufgefallen ist: Du toggelst ja bei jedem Taktzyklus, wolltest aber eigentlich bei jedem Key-Pressed rsp. key-Released toggeln. Entprelle doch Key per Clock und leite dann ein Signal für Pressed/Released ab, das nur für ein Zyklus gesetzt ist. Dann benutze in Deinem neuen Code einfach dieses Pressed-Flag rsp. Released-Flag..
Datum: 08.05.2008 12:58
Hallo Jürg Was meinst du mit "code anpassen, sodass count ein flag ist"? Gibt's da eine spezielle definition dafür? BTW: Da der Taster den Clock darstellt, wird auch nur bei Tastendruck getoggelt ;)
Datum: 08.05.2008 13:32
Dark_Force wrote: > Hallo Jürg > Was meinst du mit "code anpassen, sodass count ein flag ist"? Gibt's da > eine spezielle definition dafür? std_logic, oder integer range 0..1, was dir lieber ist. > BTW: Da der Taster den Clock darstellt, wird auch nur bei Tastendruck > getoggelt ;) Böse! VHDL Flankenerkennung
Datum: 08.05.2008 14:11
Wieso Böse?? Ich hab ja nur dieses eine Taktsignal im ganzen System, und die ganze Schaltung reagiert nur auf den Tastendruck, ansonsten macht das System nichts! Ich seh nicht ein warum ich das System mit XX MHZ takten muss, nur um einen Event zu verarbeiten der vielleicht einmal pro 5 Sekunden auftritt!
Datum: 08.05.2008 15:26
Sorry, habe CLK für ein Clock-Signal und nicht für Key(1) interpretiert, für CLK = Key(1) wird natürlich korrekt getoggelt. Überarbeite Deinen Code aber trotzdem komplett. Entprelle z.B. Key(1) und leite dabei ein Key-Pressed-Flag ab. Teste Signal je Taktzyklus und toggle bei gesetzten Flag. Dann hast Du einen vollständig synchronen Ablauf, der sich ohne Probleme in andere Komponenten einbinden lässt.
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [vhdl]VHDL-Code[/vhdl]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel