Hallo, mit dem kleinen VHDL Code oben versuche ich ein y cb cr Signal in RGB zu wandeln. Grundsätzlich funktioniert es schon, nur stören mich dabei zwei Sachen: Meine timing Analyse sagt mir 14.31ns für den schlechtesten Fall vorraus: Wie kann ich hier oprimieren? Welche Aussage hat diese Zeit überhaupt? Zweitens: Ich habe oben die Festkommaberechnung etwas unelegant umschifft, da ich den Überblick über VHDL2008 und den Packeten, die man entsprechend ergänzen kann und Altera Quartus, dass VHDL2008 nicht vollständig unterstützt verloren habe. Kann man den Code dahingehend "schöner" schreiben?
Stefan R. schrieb: > Welche Aussage hat diese Zeit überhaupt? Ich habe deine Datei mal mit einem S3 synthetisiert. Dann kommt heraus:
1 | Maximum combinational path delay: 17.804ns |
Das ist jetzt aber die Zeit vom FPGA-Pin bis zum FPGA-Pin! Du kannst in der satischen Timinganalyse dann sehen, wieviel Zeit tatsächlich in der Logik und in der Verdrahtung draufgeht. Alternativ kannst du einfach mal einen Takt einfügen, dann gibt dir die Synthese einen ersten Vorschlag zur erreichenbaren Taktfrequenz ab. Dazu bastle ich mir gern einen Wrapper, der das Design taktet (siehe Anhang). Damit kommt dann die Synthese auf
1 | Minimum period: 12.666ns (Maximum Frequency: 78.952MHz) |
2 | Minimum input arrival time before clock: 1.521ns |
3 | Maximum output required time after clock: 5.531ns |
Und das gibt dann also:
12,8 ns für die Berechnungslogik +
1,5 ns für die Eingangslaufzeit +
5,5 ns für die Ausgangsverzögerung
= 19,8 ns (weil ja das Routing etwas anders sein wird)
> Kann man den Code dahingehend "schöner" schreiben?
Passt doch. Schreib die Original-Formel als Kommentarblock dazu und
fertig... ;-)
Die Idee mit dem wrapper ist natürlich genial. Vielen Dank. Wenn ich aber am Rechenaufwand nichts optimieren kann, muss ich wohl mit dem Ergebnis leben. D.h. ich werde beim Einlesen mit 27Mhz die Wandlung durchführen, auch wenn ich damit Speicherplatz verschenke. Die SDRAM Frequenz von 100MHz scheidet völlig aus und bei der Ausgabe mit 50MHz zum Monitor bleiben, im besten Fall, wenig Reserven.
Stichwort: pipelining => adhoc: 8.683ns mit S3, Nachteil: 1 Takt latenz.
1 | ARCHITECTURE behaviour OF rgb_rechner IS |
2 | |
3 | SIGNAL r_tempreg1, r_tempreg2 : unsigned (15 DOWNTO 0); |
4 | SIGNAL g_tempreg1, g_tempreg2, g_tempreg3 : unsigned (15 DOWNTO 0); |
5 | SIGNAL b_tempreg1, b_tempreg2 : unsigned (15 DOWNTO 0); |
6 | |
7 | BEGIN
|
8 | |
9 | process (clock) |
10 | begin
|
11 | if rising_edge(clock) then |
12 | r_tempreg1 <= (1596 * (unsigned(cr) - 128)); |
13 | r_tempreg2 <= (1164 * (unsigned(y) - 16)); |
14 | g_tempreg1 <= (0813 * (unsigned(cr) - 128)); |
15 | g_tempreg2 <= (0392 * (unsigned(cb) - 128)); |
16 | g_tempreg3 <= (1164 * (unsigned(y) - 16)); |
17 | b_tempreg1 <= (2017 * (unsigned(cb) - 128)); |
18 | b_tempreg2 <= (1164 * (unsigned(y) - 16)); |
19 | end if; |
20 | end process; |
21 | |
22 | PROCESS (y, cb, cr, r_tempreg1, r_tempreg2, g_tempreg1, |
23 | g_tempreg2,g_tempreg3, b_tempreg1, b_tempreg2) |
24 | |
25 | VARIABLE r_lang, g_lang, b_lang : unsigned (15 DOWNTO 0); |
26 | |
27 | BEGIN
|
28 | r_lang := r_tempreg2 + r_tempreg1; |
29 | g_lang := g_tempreg3 - g_tempreg2 + g_tempreg1; |
30 | b_lang := b_tempreg2 + b_tempreg1; |
31 | r <= std_logic_vector(r_lang (14 DOWNTO 5)); |
32 | g <= std_logic_vector(g_lang (14 DOWNTO 5)); |
33 | b <= std_logic_vector(b_lang (14 DOWNTO 5)); |
34 | END PROCESS; |
35 | |
36 | END behaviour; |
Da fehlt noch ordentliche Rundung vor dem "downto5" und ein Taktkonstrukt um die r,g,b- da die sonst glitchen, falls sie nach aussen gehen. Zudem ist es eh besser, eine oder zwei FF-Stufen mehr zu spendieren.
Ich habe das Modul extra ohne Eingangs und Ausgangsregister geschrieben. Diese werden eine Hierachieebene über diesem Baustein eingesetzt, da ich kleine Module mit überschaubarer Funktion bevorzuge. Deshalb war mir die zeitliche Betrachtung auch so wichtig. Wenn ich die Bearbeitungszeit deutlich unter 20ns gebracht hätte, würde ich mir etwas Speicherplatz sparen, könnte mit SVGA Freuquenz von 50MHz rechnen und hätte halt einen Takt Latenz. Und zu den Rundungsfehlern: Eingelesen wird ein Wärmebild. Deshalb mache ich mir (noch) wenig Sorgen über die Farbtreue. Sollte diese in der Praxis nicht mehr akzeptabel sein, werde ich hier noch ein paar Schritte weiterdenken müssen. @bko Danke. Ich werde gleich mal ausprobieren, wie schnell dein Code auf meiner Zielplattform ist. Vielleicht komme ich ja sogar darauf, warum :-)
Bildverarbeiter schrieb: > Da fehlt noch ordentliche Rundung vor dem "downto5" Was, wenn diese Rundung schon in den Faktoren versteckt ist? > und ein Taktkonstrukt um die r,g,b- da die sonst glitchen, > falls sie nach aussen gehen. Das ist allerdings komplett irrelevant, wenn sie innerhalb des FPGAs weiterverarbeitet werden. Die Signale müssen nur rechtzeitig vor dem nächsten Takt mit dem Glitchen fertig sein. Stefan R. schrieb: > Vielleicht komme ich ja sogar darauf, warum :-) Es fiel schon das >> Stichwort: pipelining => adhoc: 8.683ns mit S3, Nachteil: 1 Takt latenz. Und etwas ausführlicher: die Rechenkombinatorik wird an strategisch günstigen Stellen durch ein Register "unterbrochen". Damit dauert zwar 1 einzelne Rechnung immer noch gleich lang (bzw. ein wenig länger), aber durch die Speicherglieder können gleichzeitig mehrere (Teil-)Operanden verarbeitet werden. Ich habe das schon mal im Beitrag "Re: failed paths im Timing analyzer" aufgezeigt.
@Bildverarbeiter: bist Du in dem Umfeld tätig? ich hätte ein paar Fragen bzgl. Bildverarbeitung, da ich auch vor habe in diesem Bereich etwas zu machen. (da kannst du mich kontaktieren dummy80@gmx.net)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.