Forum: FPGA, VHDL & Co. Multiplikation mit DSP Block auf Cyclone V


von GS (chromosoma)


Lesenswert?

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)

von FPGA-Pongo (Gast)


Lesenswert?

Wenn der MUL noch nicht "fertig" ist, dann sollte das in der Synthese 
ausgegeben werden.

Spendiere mal ein FF - auch für die anderen zeitgleichen Signale ...

von Uwe (Gast)


Lesenswert?

Hallo,

wenn ich das richtig sehe, ist das keine Pipeline Konstruktion. Das for 
i in 0 to 3 loop generiert lediglich konkurrente Anweisungen (reine 
statische Gatterlogik) und ist praktisch redundant. Der Code wir 
reduziert auf:

  Temp_CrR1:=to_integer(unsigned(Cr)-128)*11;
  EN0:=ENABLE;
  Temp_CrR2:=Temp_CrR1/8;
  EN1:=EN0;
  Rv:=to_integer(unsigned(Y))+Temp_CrR2;
  EN2:=EN1;
  IF(Rv<255)THEN
    R<=STD_LOGIC_VECTOR(to_unsigned(Rv,8));
  ELSE
    R<=(others=>'1');
  END IF;
  DATAVALID<=EN2;

Frage:

1. Ich würde nicht erwarten, dass durch die Multiplikation mit 11 
tatsächlich ein DSP-Block synthetisiert wird. Ich kenne das nur, dass 
man eine DSP-Entity einsetzen muss. Vielleicht werden zwei Additionen 
(das 8-fache mit dem Doppelten + das 1-fache) synthetisiert?

2. Die Synthese von Temp_CrR1/8 würde ich auch als Shift-Operation bzw. 
3 Bit versetzten Abgriff von Temp_CrR1 erwarten.

Im Grunde sind die ersten beiden Anweisungen lediglich zwei Additionen.

Passiert bei dir was anderes?

Grüße, Uwe

von GS (chromosoma)


Lesenswert?

Also bei mir wird nach der Kompilierung genau  1 DSP block verwendet.

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
Noch kein Account? Hier anmelden.