www.mikrocontroller.net

Forum: FPGA, VHDL & Co. code synthetisierbar machen


Autor: Volker Racho (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Typ hat DATAIN_length?

Autor: Volker Racho (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
subtype DATAIN_length is std_logic_vector (15 downto 0);

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Der läuft und ist mit ISE synthetisierbar.
Ist DPIX statisch?
   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:
    Size of operands are different : result is <false>.

Probier mal das:
  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  ;-)

Autor: Volker Racho (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Volker Racho (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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


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

      sat3 := sat1 or sat2;
      
    end if;
    return sat3;
  end datain_sat1;


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.