Hi,
Ich bin immer noch mit meinem hobbyprojekt (CCD Kamera Interface auf
DE1-SoC) nicht fertig.
Die Anzahl der Bugs wird aber immer weniger:)
Das aktuelle Problem liegt jetzt (hochwahrscheinlich) an der
Multiplikation.
Ich konvertiere die Daten aus dem YCrCb Format ins RGB, und dafür
brauche ich einige Multiplikationen.
Dafür habe ich ein PROCEDURE geschrieben. Das (die?) Procedure liegt im
Process mit 27Mhz Taktrate.
1 | PROCEDURE YCRCB_to_RGB (Cr,Cb,Y: IN STD_LOGIC_VECTOR(7 downto 0);ENABLE: IN STD_LOGIC;SIGNAL R,G,B: OUT STD_LOGIC_VECTOR(7 downto 0);SIGNAL DATAVALID:OUT STD_LOGIC)IS
|
2 | VARIABLE Rv,R1,Gv,Bv: INTEGER RANGE 0 to 255:=0;
|
3 | VARIABLE EN0,EN1,EN2,EN3: STD_LOGIC;
|
4 | VARIABLE Temp_CrG1,Temp_CrG2,Temp_CrR1,Temp_CrR2,Temp_CbG1,Temp_CbG2,Temp_CbB1,Temp_CbB2: INTEGER RANGE 0 TO 255;
|
5 | BEGIN
|
6 |
|
7 | for i in 0 to 3 loop----pipleline consctruction
|
8 | case i is
|
9 | when 0=>
|
10 | Temp_CrR1:=to_integer(unsigned(Cr)-128)*11;
|
11 | EN0:=ENABLE;
|
12 | when 1=>
|
13 | Temp_CrR2:=Temp_CrR1/8;
|
14 | EN1:=EN0;
|
15 |
|
16 | when 2=>
|
17 | Rv:=to_integer(unsigned(Y))+Temp_CrR2;
|
18 | EN2:=EN1;
|
19 | when 3=>
|
20 |
|
21 |
|
22 | IF(Rv<255)THEN
|
23 | R<=STD_LOGIC_VECTOR(to_unsigned(Rv,8));
|
24 | ELSE
|
25 | R<=(others=>'1');
|
26 | END IF;
|
27 | DATAVALID<=EN2;
|
28 |
|
29 |
|
30 | when others=> NULL;
|
31 | end case;
|
32 | end loop;
|
Wie man sieht, ich habe eine Art Pipeline Konstruktion.
Das Problem ist jetzt folgendes: manchmal sind die RGB Daten noch nicht
bereit, obwohl das "Datavalid" Signal schon TRUE ausgibt. Das erkenne
ich daran, dass die nebeneinander stehende Pixel den gleichen Wert
haben. Ich vermute das liegt daran, dass die Multiplikation noch nicht
bereit ist, und es wird einfach der alte Wert übergeben.
Wie kann ich sicherstellen, dass mit Datavalid-Signal auch die richtige
Daten bereit stehen?
PS
Nach der Kompilierung wird jeweils ein DSP Block pro Farbe benutzt
(ich verwende nur die rote Farbe, da das Bild S/W ist)