Forum: FPGA, VHDL & Co. code synthetisierbar machen


von Volker Racho (Gast)


Lesenswert?

Hallo,
habe folgenden Code:

  function datain_sat1 (
    DPIX   : std_logic_vector(3 downto 0);
    DATAIN : DATAIN_length)
    return std_logic is
    variable sat1 : std_logic;
  begin
    if DPIX = "1111" and DATAIN(0) = '1' then
      sat1 := '1';
    else
      if DATAIN = (conv_integer(DPIX)-1 downto 0 => '1') then
        sat1 := '1';
      else
        sat1 := '0';
      end if;
    end if;
    return sat1;
  end datain_sat1;

Der läuft und ist mit ISE synthetisierbar. Synopsys dagegen bricht ab. 
Synopsys kann mit dem Ausdruck einer variablen im
(conv_integer(DPIX)-1 downto 0
nichts anfangen.

Wie könnte ich das in einer Schleife schreiben?

Ich habe folgendes angefangen:

  function datain_sat1 (
    DPIX   : std_logic_vector(3 downto 0);
    DATAIN : DATAIN_length)
    return std_logic is
    variable sat1 : std_logic;
  begin
    if DPIX = 0 then
      if DATAIN = (DATAIN'range => '1') then
        return '1';
      else
        return '0';
      end if;
    else
      sat1 := '1';
      for i in DATAIN'range loop
        if i > DPIX then
          if DATAIN(i) = '0' then
            sat1 := '0';
          end if;
        end if;
      end loop;
    end if;
    return sat1;
  end datain_sat1;

Aber da erkennt man nicht, ob bei einer DPIX von "1000" alle unteren 
bits, also DATAIN = 0x00FF sind, und somit auch in Sättigung sind.

Wäre über Hilfe sehr dankbar.

Volker

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Welchen Typ hat DATAIN_length?

von Volker Racho (Gast)


Lesenswert?

subtype DATAIN_length is std_logic_vector (15 downto 0);

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Der läuft und ist mit ISE synthetisierbar.
Ist DPIX statisch?
1
   if DATAIN = (conv_integer(DPIX)-1 downto 0 => '1') then
Damit willst du also einen Teil des Vektors vergleichen?
Eigentlich sollte dir auch XST auf die Finger klopfen, denn die 
Vektorbreiten passen nie.
Bei mir kommt eine Warnung:
1
    Size of operands are different : result is <false>.

Probier mal das:
1
  if DATAIN(conv_integer(DPIX)-1 downto 0) = (conv_integer(DPIX)-1 downto 0 => '1') then

BTW:
conv_integer
Denk mittel- bis langfristig mal über die numeric_std nach  ;-)

von Volker Racho (Gast)


Lesenswert?

Danke.

Was bezwecke ich mit der Funktion:

DPIX gibt an, wie breit der DATAIN Vektor ist.
Beispiel:
DPIX = 0000 entsprechen DATAIN von 16 bit
DPIX = 1000 entsprechen DATAIN von  8 bit, die MSB werden mit '0' 
gefüllt

Kommen jetzt input pixel an DATAIN bei bspw. DPIX = 1000, die

a) entweder 0x01FF sind

oder

b) 0x00FF soll die Funktion erkennen, und das Sättigungsflag setzen.

von Volker Racho (Gast)


Lesenswert?

so, habe es nach vielem hin und her doch hingebracht. anbei der code, 
der meinen wünschen entspricht..
der sollte auch bei synopsys zu synthetisieren sein

1
  function datain_sat1 (
2
    DPIX   : std_logic_vector(3 downto 0);
3
    DATAIN : DATAIN_length)
4
    return std_logic is
5
    variable sat1 : std_logic;
6
    variable sat2 : std_logic;
7
    variable sat3 : std_logic;
8
  begin
9
    if DPIX = 0 then
10
      if DATAIN = (DATAIN'range => '1') then
11
        return '1';
12
      else
13
        return '0';
14
      end if;
15
    else
16
      sat1 := '1';
17
      sat2 := '1';
18
      sat3 := '0';
19
      
20
      for i in DATAIN'range loop
21
        if i > DPIX then
22
          if DATAIN(i) = '0' then
23
            sat1 := '0';
24
          end if;
25
        end if;       
26
       end loop;                
27
        
28
      for i in DATAIN'range loop        
29
        if i <= 15-DPIX then
30
          if DATAIN(i) = '0' then
31
            sat2 := '0';
32
          end if;
33
        end if;
34
      end loop;
35
36
      sat3 := sat1 or sat2;
37
      
38
    end if;
39
    return sat3;
40
  end datain_sat1;

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.