y cb cr in RGB wandeln

OP #1968793
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?
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #1968907
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... ;-)
Angehängte Dateien:
OP #1969007
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.
Gast #1970075
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;
Gast #1970325
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.
OP #1970421
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 
:-)
Moderator (Firma: Titel) Persönliche Seite #1970454
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.
Gast #1971906
@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)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.