Markus Hi schrieb:
> Bisher folge ich etwa der Logik:
> VARIABLE counter : unsigned(6 downto 0);
Wozu eine Variable?
> Bisher folge ich etwa der Logik:
> countOut := std_logic_vector( ( unsigned(input) / 10000 ) MOD 10 );
> uartData <= "0110000" OR countOut(6 downto 0);
Warum muss dieser countOut in einem Takt(!) berechnet sein, wenn
hinterher ein schnarchlangsamer UART sitzt?
Das ist die Logik, die du verfolgen musst:
Welche Signale müssen in einem Takt fertig berechnet sein, und welche
dürfen locker mal 50 Takte brauchen? Eine Anzeige muss nicht
100tausendmal pro Sekunde aktualisiert werden. so schnell kann keiner
schauen.
Und dann musst du dich fragen: welche Ressourcen kann ich zeitversetzt
doppelt verwenden? Und diese dann mit Multiplexern verteilen.
Markus Hi schrieb:
> Vllt. optimiert der Compiler die „elsif“s automatisch zu „case“s?
Ist jetzt Ratestunde?
Natürlich "optimiert" der SYNTHESIZER die elsif-Kette. Aber nicht zu
einem case-Konstrukt, sondern er optimiert es einfach. Und heraus kommt
das selbe wie bei einem case, weil sich die elsif-Bedingungen nicht
überschneiden.
Lattice User schrieb:
> Und dividieren ist Aufwand!
Und: vergiss mal Divisionen in einer HDL-Beschreibung. Die sind entweder
langsam und/oder ressourcenfressend.
Siehe auch Beitrag "Re: Rechnen mit unsigned vs. signed und einer division"
Un wenn du schon durch einen festen Wert dividieren musst, dann überleg
dir, ob du diese Division nicht ausreichend genau durch eine
Multiplikation ersetzen kannst.
Eine Division durch 10 könnstest du also z.B. durch eine Multiplikation
mit 1/10 erreichen. Und weil 1/10 so natürlich nicht in einen Integer
passt, multiplizierst du den Wert mit 2048 und erhältst den Wert 204,8.
Das aufgerundet auf 205 sieht die Division durch 10 also so aus:
1 | ergebnis <= (wert*205)/2048; -- 205/2048 ist hinreichend genau 1/10
|
Ja, da kommst du und sagst: da ist ja immer noch die Division!
Und jetzt kommt der Trick: man muss sich nur klar machen, dass
unsigned-Divisionen durch Zweierpotenzen (2,4,8,16,32...) weder Zeit
noch Ressourcen kosten, weil sie nur eine Umverdrahtung der Hardware
sind: die unteren Bits werden einfach nicht verwendet und wegoptimiert.
Also wird der Synthesizer einfach die unteren 11 Bit der Multiplikation
nicht verwenden und mitnichten einen Divider aufbauen.
Markus Hi schrieb:
> Dass ein Counter als State-Machine durchgeht find ich gut.
Ein Zähler ist ein Zustandsautomat. Oder andersrum: jeder
Zustandsautomat ist ein Zähler. Nur hat er machmal eine etwas schräge
Zählreihenfolge...