Dan schrieb:
> wait until rising_edge(Pulse);
Ganz, ganz üble Sache.
Der Encoder ist kein Taktgeber, der für einen Takt im FPGA verwendet
werden kann. Sondern die Encodersignale sind simple asynchrone Signale,
die auf den einen einzigen FPGA-Takt synchronisiert werden müssen, bevor
sie im FPGA weiter verarbeitet werden können.
Mit deinem Ansatz und der Verwendung von asynchronen Signalen wird dein
Design meistens (oder oft oder fast immer) das tun, was du willst, aber
manchmal (oder immer mal wieder oder dann und wann) wird es seltsame
Werte liefern.
Der Grund ist dort beschrieben:
http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren
Nach dem Einsynchronisieren kommt dann die das Entprellen (Stichworte
dazu: Kontaktprellen und EMV-Störungen), dann die Flankenerkennung, dann
die Auswertung mit den Zählern und dann kann man diese Zählerstände mit
der seriellen Schnitte versenden.
Dan schrieb:
> Ich will dies dann als UART auf die serielle Schnittstelle ausgeben.
Ist dein UART prinzipiell schnell genug, die Zählerstände zwischen zwei
Encoderflanken zu versenden? Oder brauchst du da noch einen Fifo zum
Puffern? Und ist die Schnittstelle schnell genug, dass sie bei höchster
Drehfrequenz die Daten langfristig übertragen bekommt?
Dan schrieb:
> jedoch weiß ich jetzt nicht, wo ich den cnt1 und cnt2 ausgeben soll.
Sinnvoll wäre das wohl an der Stelle bevor der jeweilige Zähler auf 0
gesetzt wird und damit den erreichten Zählerstand verliert.
Dan schrieb:
> Mir stellt sich nur die Frage, ob es dann nicht immer 0
> übertragen wird, da ja der cnt1 bzw. 2 auf 0 gesetzt wird.
Nein, das stimmt. Ich würde das in den vorgeschlagenen Code mal so
reinbasteln:
1 | process begin
|
2 | wait until rising_edge(clk);
|
3 | uart_start <= '0';
|
4 | If (Toggle = '1') then
|
5 | cnt1 <= cnt1 +1;
|
6 | if cnt2>0 then
|
7 | uart_data <= cnt2;
|
8 | uart_start <= '1';
|
9 | end if;
|
10 | cnt2 <= 0;
|
11 | else
|
12 | cnt2 <= cnt2 +1;
|
13 | if cnt1>0 then
|
14 | uart_data <= cnt1;
|
15 | uart_start <= '1';
|
16 | end if;
|
17 | cnt1 <= 0;
|
18 | end if;
|
19 | end process;
|
Aber sowas lässt sich ja ratzfatz simulieren... ;-)