code synthetisierbar machen

Gast #1395964
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
Moderator (Firma: Titel) Persönliche Seite #1396058
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  ;-)
Gast #1396084
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.
Gast #1396469
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;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren