Danke für die Antworten. Ich habe es jetzt so gelöst:
1 | elsif Bla_DP(I) /= x"FFFFFFFF" then
|
was ich eigentlich sehr unschön finde, da die Bitbreite jetzt nicht mehr
über den Generic änderbar ist.
1 | elsif Bla_DP(I) < unsigned((others => '1')) then
|
werde ich noch ausprobieren.
Ich bin im selben Code noch auf ein ähnlich gelagertes Problem
gestossen:
1 | if ((signed(ADC_D) > signed(Limit_D)) OR (-signed(ADC_D) > signed(Limit_D))) then
|
Mein Ziel ist es, zu überprüfen ob der ADC-Wert (signed integer)
innerhalb eines gültigen Bereichs liegt (gegeben durch Limit_D, wird von
einer CPU in ein 16 Bit Register geschrieben). Eigentlich wollte ich
Limit_D als unsigned verwenden. Allerdings erlabut VHDL keine
grösser/kleiner Vergleich zwischen signed und unsigned.
Beim obigen Code sieht man (Testbench sei Dank), dass der Vergleich
schiefgeht wenn ADC_D den kleinsten negativen Wert annimmt: 0x8000 (16
bit). Das ergibt für mich Sinn: die erste Bedingung ist ohnehin erfüllt
(negativer Wert ist kleiner als positives Limit_D. Bei der zweiten
Bedingung wird ADC_D negiert, was zum Overflow führt und somit -0x8000
-> 0x8000. Somit sind beide Bedingungen falsch, obwohl der ADC am
negativen Rand klebt.
Gelöst habe ich das dann so:
1 | if ((signed(ADC_D) > signed(Limit_D)) OR (signed(ADC_D) < -signed(Limit_D))) then
|
Was in der Testbench mit den Extremwerten zu funktionieren scheint. Ist
das akzeptabel oder habe ich das Problem jetzt einfach an eine andere
Stelle verschoben? Das Limit_D nun positiv sein muss ist klar (die CPU
darf keinen unsgined Wert in das Limit_D Register schreiben der zu gross
ist, da das dann als negative Zahl interpretiert wird). Mir kommt die
Lösung erneut unsauber vor.
Wir synthetisiert der Synthesizer in Vivado eigentlich einen
grösser/kleiner Vergleich? Wird da ein Subtrahierer erzeugt und die
Zahlen voneinander abgezogen um anhand des Vorzeichens des Resultats zu
entscheiden?