Hallo Forum,
ich bemühe mich derzeit in meinem ersten VHDL Projekt einen Zähler in
einem Prozess zu implementieren. Ziel ist es zwei Encoder zu einem
Strang zu addieren, wobei die Encoderfrequenz verringert wird.
Der Zähler soll mit "100", also dezimal 4, initialisiert werden. Bei
"110", dezimal 6, wird ein Schritt vor erzeugt und der Zähler auf "100"
zurückgestellt. Bei "010", dezimal 2, wird ein Schritt zurück erzeugt
und dann zurück auf "100" gestellt.
Das sieht dann so aus:
-- zusammenfuehren der Kanaele: Es geht ein Schritt vor
27
ifcounter>="110"then
28
casestateis
29
when"10"=>A_out<='1';B_out<='1';state:="11";-- A high, B low => A high, B high
30
when"11"=>A_out<='0';B_out<='1';state:="01";-- A high, B high => A low, B high
31
when"01"=>A_out<='0';B_out<='0';state:="00";-- A low, B high => A low, B low
32
when"00"=>A_out<='1';B_out<='0';state:="10";-- A low, B low => A high, B low
33
whenothers=>null;
34
endcase;
35
counter:=counter-2;
36
endif;
37
-- zusammenfuehren der Kanaele: Es geht ein Schritt zurueck
38
ifcounter<="010"then
39
casestateis
40
when"10"=>A_out<='0';B_out<='0';state:="00";-- A high, B low => A low, B low
41
when"11"=>A_out<='1';B_out<='0';state:="10";-- A high, B high => A high, B low
42
when"01"=>A_out<='1';B_out<='1';state:="11";-- A low, B high => A high, B high
43
when"00"=>A_out<='0';B_out<='1';state:="01";-- A low, B low => A low, B high
44
whenothers=>null;
45
endcase;
46
counter:=counter+2;
47
endif;
48
49
endprocess;
Leider erhalte ich folgende Fehlermeldung:
Analyzing Entity <incremental_encoder_adder> in library <work>
(Architecture <behavioral>).
ERROR:Xst:827 -
"C:/Xilinx_Projects/EncoderAdder_02/incremental_encoder_adder.vhd" line
50: Signal counter cannot be synthesized, bad synchronous description.
The description style you are using to describe a synchronous element
(register, memory, etc.) is not supported in the current software
release.
Kann mir jemand sagen wie ich eine derartige Funktionalität
implementieren kann?
Gruß Reinhard
Am besten bei sowas niemals die komplette Entity posten, damit man auch
ja noch Arbeit hat, wenn man das selbst mal ausprobieren will.
Am besten auch nie irgendwelche Softwareversionen nennen, damit man
nicht evtl. bekannten Probleme nennen kann.
Am besten auch nie mal selbst eine bekannte Suchmaschine bemühen. Lieber
einfach fragen.
Ach! Hast Du ja schon. Na denn...
Hallo Gothaer,
erst mal Danke dass Du Dir das angeschaut hast. Nun zu Deinen Punkten:
Ich habe selbstverständlich bevor ich fragte auf einer Suchmaschine
gesucht und nichts gefunden, was ich verstehen konnte. Ferner bin ich
ohne Ergebnis durchs Forum gestreift. Da ich mit VHDL anfange mag ich
das eine oder andere nicht erkannt haben.
Ich nutze Xilinx ISE Design Suite 13.4.
Und den ganzen Code habe ich unten eingefügt.
Gruß Reinhard
Ergänzung:
Bei der um 11:57 eingefügten entity handelt es sich um eine component,
die wie unten gezeigt als COMP3 arbeiten soll. Bei den component-en
COMP1 und COMP2 handelt es sich um den VHDL Beispiel Code aus dem
Artikel Drehgeberhttp://www.mikrocontroller.net/articles/Drehgeber. Ich hoffe es wird
klar, was mir als mein erstes VHDL Projekt vorschwebt.
Hm, also erst mal wird das so nicht richtig klappen, da deine Prozesse
nicht mit dem Takt gesteuert werden, sondern mit dem CE des
Drehgeber-Dekoders.
Wäre es insgesamt nicht sinnvoller, zwei Zähler zu beschreiben, dann die
Summe auszurechnen und diese Summe dann im 2-Bit Gray-Code auszugeben?
Aber so 100% klar ist mir dein Vorhaben nicht, muss ich zugeben.
Hallo Christian,
Danke für die Antwort.
Du hast mein Vorhaben durchschaut. Ich will die steigenden Flanken der
CEs ausnutzen, um die Summe zu bilden und daraus ein neues
Drehgebersignal bauen.
Folgende Anwendung hatte ich bereits in AVR Assembler gebastelt:
1. Ein Zweiachsenteleskopantrieb mit zwei Motorencodereinheiten fahren
in die gleiche Richtung.
2. Beide bewegen sich manhmal zusammen und manchmal alleine.
3. Zur Positionsauswertung benötige ich aber eine Encoderpulsfolge, die
die Gesamtbewegung wiedergibt.
Mit AVRs komme ich bei schnellen Pulsraten ins Schlingern. Darum habe
ich die Anwendung auf mehrere AVRs verteilt.
Vom Artikel Drehgeberhttp://www.mikrocontroller.net/articles/Drehgeber. inspiriert versuche
ich nun mein Glück in VHDL. VHDL wird eine harte Nuss für mich.
Deinen Lösungsansatz mit den zwei Zählern verstehe allerdings nicht.
Vielleicht sollte die component COMP3 ADDER auch mit clk versorgen und
auf die CEs abfragen. In meiner Frage Fragen zum VHDL Drehgeber CodeBeitrag "Fragen zum VHDL Drehgeber Code" lernte ich, dass up_down
aus dem Drehgeberhttp://www.mikrocontroller.net/articles/Drehgeber
code für einen Takt auf '1' steht. Ich probiere das und beschreibe hier
das Ergebnis.
Mit meiner ursprünglichen Frage wollte ich eigentlich nur wissen, warum
ich den Fehler
ERROR:Xst:827 -
"C:/Xilinx_Projects/EncoderAdder_02/incremental_encoder_adder.vhd" line
50: Signal counter cannot be synthesized, bad synchronous description.
The description style you are using to describe a synchronous element
(register, memory, etc.) is not supported in the current software
release.
kassiere.
Gruß und nochmals Danke
Reinhard
Reinhard J. schrieb:> Du hast mein Vorhaben durchschaut. Ich will die steigenden Flanken der> CEs ausnutzen
das macht man Logikbausteinen nicht so. Der folgende Block erzeugt
einiges an kombinatorischer Logik (für den if - then - elseif Teil) und
führt das über ein taktflankengesteuertes Flipflop, das von ce_1
getaktet wird
(if rising_edge(ce1)).
Reinhard J. schrieb:> if ( rising_edge(ce_1) ) then> if (up_down_1 = '1' and error_1 = '0') then> counter := counter + 1;> elsif (up_down_1 = '0' and error_1 = '0') then> counter := counter - 1;> else> counter := counter;> end if;> end if;
Der darauf folgende Block
Reinhard J. schrieb:> if ( rising_edge(ce_2) ) then> if (up_down_2 = '1' and error_2 = '0') then> counter := counter + 1;> elsif (up_down_2 = '0' and error_2 = '0') then> counter := counter - 1;> else> counter := counter;> end if;> end if;
sagt dann, dass der Takteingang des Flipflops mit einem anderen Takt
(ce_2) zu verbinden ist. Das geht nicht (das Flipflop hat nur einen
Takteingang), daher die Meldung "bad synchronous design".
Such dir stattdessen eine einziges sauberes und hinreichend schnelles
Taktsignal (z.B. 50 MHz von einem Quarz) und Lass deine ganze Logik
synchron mit diesem Takt laufen.
Betrachte die Eingänge CE1 und CE2 nicht als Takt sondern als externe
Eingänge, die erst mit dem 50MHz Takt einsynchronisiert werden müssen,
bevor du sie weiter verwendest. Dann kannst du (wenn du das wirklich
willst) auf den einsynchronisierten Signalen z.B. eine Flankenerkennung
machen. Ich würde aber den Vorschlag von supachris folgen und zwei
unabhängig Zähler implementieren, deren Summe ausgewertet wird.
Wie soll den so ein Bauteil mit 2 Takteingängen aussehen?
Daher kommt übrigens auch deine Fehlermeldung:
> Signal counter cannot be synthesized, bad synchronous description.
Es ist prinzipiell ganz, ganz böse (und vor allem unnötig), zwei Takte
in einen Prozess reinzubringen...
Auch wenn deine Beschreibung "funktionieren" würde, hättest du laufend
Probleme mit metastabilen Zuständen und/oder unterschiedlichen
Laufzeiten im FPGA:
http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren
Und dann frei nach dem Motto "Viel hilft viel":
1
useIEEE.STD_LOGIC_1164.ALL;
2
useIEEE.NUMERIC_STD.ALL;
3
useIEEE.STD_LOGIC_UNSIGNED.ALL;
In den beiden Libs kommen so einige Definitionen doppelt vor (z.B. der
Datentyp unsigned), das kann eigenartige Effekte hervorrufen.
Und da hätten wir den Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"> Ich hoffe es wird klar, was mir als mein erstes VHDL Projekt vorschwebt.
Was hältst du denn davon, mit einer blinkenden LED anzufangen, dann ein
Lauflicht, dann ... und dann die Geberauswertung eines Gebers. Und dann
die Berechnung dessen, was du willst...
Ich kapiere übrigens meine Geberauswertung besser:
http://www.lothar-miller.de/s9y/categories/46-Encoder ;-)
> Ziel ist es zwei Encoder zu einem Strang zu addieren, wobei die> Encoderfrequenz verringert wird.> Das sieht dann so aus:
Zeig doch mal mit einem Bildchen, wie das aussehen könnte...
Welche Frequenzen kommen von deinen Gebern maximal? Kann mit die z.B.
mit 50MHz überabtasten und dann auswerten. Dann wäre die Sache nämlich
mit 1 Takt und ganz bequem zu erledigen. "Warum nur 1 Takt?" fragst du?
Such hier im Forum mal nach meinen Postulaten... ;-)