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
> 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 ;-)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.