Hallo!
Das ist mein erster, ernster Versuch mit VHDL ;)
Ich habe versucht den TWI- Prescaler der Mega AVRs (48/88/168- bestimmt
auch viele andere) nachzubauen.
Ich finde, dass das schon mal ganz toll aussieht, aber ist es das auch?
Ich würde sagen, da gibts erstmal nichts zu meckern.
Du solltest aber bei der Synthese mal nachschauen, was hieraus gemacht
wird:
> prescale_cmp <= 15 + 2 twbr_temp sub_prescale;
Da sub_prescale ja nur Zweierpotenzen als Wert annehmen kann, braucht es
hier ja keinen Multiplizierer - ich weiß nur nicht, ob das
Synthese-Programm das auch erkennt. Falls nicht, kannst du den Code
etwas umstellen um ihm auf die Sprünge zu helfen.
Jan M. wrote:
>> prescale_cmp <= 15 + 2 twbr_temp sub_prescale;> Da sub_prescale ja nur Zweierpotenzen als Wert annehmen kann, braucht es> hier ja keinen Multiplizierer - ich weiß nur nicht, ob das> Synthese-Programm das auch erkennt. Falls nicht, kannst du den Code> etwas umstellen um ihm auf die Sprünge zu helfen.
Ok, da habe ich noch nicht dran gedacht.
Wie wird denn ein "left shift" synthetisiert (Mux, Schieberegister oder
ganz anders)?
> Für den ersten Versuch sieht es echt gut aus.
Erster ernster Versuch ;)
Davor gab es auch schon so manchen Müll :)
> Hast Du auch eine> Testbench dazu, um den Block funktional verifizieren zu können?
Bin ich gerade dran, die ersten Versuche sehen schon brauchbar aus.
Danke,
Heiko.
Heiko Lechner wrote:
> Jan M. wrote:>>>> prescale_cmp <= 15 + 2 twbr_temp sub_prescale;>> Da sub_prescale ja nur Zweierpotenzen als Wert annehmen kann, braucht es>> hier ja keinen Multiplizierer - ich weiß nur nicht, ob das>> Synthese-Programm das auch erkennt. Falls nicht, kannst du den Code>> etwas umstellen um ihm auf die Sprünge zu helfen.>> Ok, da habe ich noch nicht dran gedacht.> Wie wird denn ein "left shift" synthetisiert (Mux, Schieberegister oder> ganz anders)?
Es muss nichts wirklich geschoben werden, nur die richtigen Bits
ausgewaehlt - es gibt also einen 4-zu-1-mux, der je nach Prescaler
entweder Bit0, 2,4 oder 6 von twbr_temp auf Bit0 von prescale_cmp legt
(zuzueglich Addition natuerlich).
Jan M. wrote:
> Es muss nichts wirklich geschoben werden, nur die richtigen Bits> ausgewaehlt - es gibt also einen 4-zu-1-mux, der je nach Prescaler> entweder Bit0, 2,4 oder 6 von twbr_temp auf Bit0 von prescale_cmp legt> (zuzueglich Addition natuerlich).
Es wird tatsächlich ein Multiplizierer generiert.
Ich habe es nun geändert zu:
@Heiko:
> Kann die case Anweisung denn zu weniger "optimierten" Synthetisierungen> führen (etwas übersichtlicher finde ich es schon)?
Ja, kann. Die Wege der Synthesetools sind manchmal unergründlich :-(
Ich würde nur auf Platz optimieren, wenn es triftige Gründe gibt. Sicher
muß man die Ressourcen nicht verschwenden, aber bei
Entwicklungsprojekten, wo es nicht auf Masse oder Platz, sondern auf
Zeit ankommt, hat man einfach keine Zeit ewig rumzuoptimieren.
Lieber lesebarer hinschreiben, da hat man später (manchmal) mehr davon.
Duke
> (etwas übersichtlicher finde ich es schon)?
Weil TWPS_I nur 4 Zustände hat und alle im case auscodiert wurden,
solltest du aber das
1
whenothers=>null;
aus dem case herauslassen. Sonst könnte man ja meinen, da gäbe es noch
andere (nicht abgedeckte) Zustände. Und das wäre dann doch etwas
unübersichtlich ... ;-)
> when "ZZ" => ...;> when "U1" => ...;> when "XU" => ...;> when "LZ" => ...;> when "LH" => ...;
Auf die Signalzustände wollte ich schon immer mal abfragen ;-)