Forum: FPGA, VHDL & Co. if Abfrage others=>'0' nicht erlaubt


von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

1
 
2
   if mul_execute(mul_execute'high downto 1) /= (others=>'0') then

Ich will die Stelle universal schreiben und gegen ungleich 0 
vergleichen.
Die Bitbreite von mul_execute kann variieren. Ich wurde gerade belehrt, 
dass die Variante mit others an der Stelle nicht zulässig ist.

Bin auf Vorschläge gespannt.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Ok, GWBASIC ist es vermutlich eher nicht ...
Eine Geheinsprache ?

von Paul (Gast)


Lesenswert?

Joachim Drechsel schrieb:
> Eine Geheinsprache ?

Ich glaube, dass soll irgendwann mal VHDL werden.

von troll (Gast)


Lesenswert?

vhdl?

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

troll schrieb:
> vhdl?

Ja vhdl soll es werden.

von Paul (Gast)


Lesenswert?

René D. schrieb:
> if mul_execute(mul_execute'high downto 1) /= (others=>'0') then

Keine Ahnung, ob das überhaupt geht, aber woher soll die Synthese 
wissen, wie breit others=>'0' werden soll?

von Paul (Gast)


Lesenswert?

Warte mal bis der Lothar kommt. Der wird es schon richten.

Aber vielleicht geht sowas :(17 downto 0 => '0')

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Paul schrieb:
> René D. schrieb:
>> if mul_execute(mul_execute'high downto 1) /= (others=>'0') then
>
> Keine Ahnung, ob das überhaupt geht, aber woher soll die Synthese
> wissen, wie breit others=>'0' werden soll?


es weiss doch wie breit das Signal auf der anderen Seite des 
Relationszeichen ist. Es kann nur gleichbreite Signale bewerten.

von Paul (Gast)


Lesenswert?

Edit: 17 soll hier Deine Bit-Breite sein.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

> Aber vielleicht geht sowas :(17 downto 0 => '0')
1
     if mul_execute(mul_execute'high downto 1) /= (9 downto 1=>'0') then

Oh, das sieht gut aus. Geht erst einmal durch den Simulator.


Dann schreiben ich es erst einmal wie folgt.
1
   if mul_execute(mul_execute'high downto 1) /= (mul_execute'high downto 1=>'0') then


Lothar kann es bestimmt noch schöner schreiben.

von Fritz J. (fritzjaeger)


Lesenswert?

René D. schrieb:
>
1
>    if mul_execute(mul_execute'high downto 1) /= (others=>'0') then
2
>
>
> Ich will die Stelle universal schreiben und gegen ungleich 0
> vergleichen.
> Die Bitbreite von mul_execute kann variieren. Ich wurde gerade belehrt,
> dass die Variante mit others an der Stelle nicht zulässig ist.
>
> Bin auf Vorschläge gespannt.

Type definieren und damit signal und constant


1
--....
2
  type t_mul_execute is std_logic_vector(17 downto 1);
3
  signal mul_execute  : t_mul_execute;
4
  constant c_all_zero : t_mul_execute := (others => '0');
5
--...
6
begin 
7
8
    if mul_execute /= c_all_zero then
9
--...

von user (Gast)


Lesenswert?

also sowas geht

if mul_execute /= (mul_execute'range=>'0') then

oder auch so

if mul_execute /= 0 then

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

user schrieb:
> also sowas geht
>
> if mul_execute /= (mul_execute'range=>'0') then


Es ist aber nicht die range. Bit 0 soll nicht überprüft werden.

> if mul_execute /= 0 then

Geht auch nicht. Weil mul_execute von type std_logic_vector ist. 0 ist 
vom type integer. Somit muss noch eine Typumwandlung erfolgen.

von Freddy (Gast)


Lesenswert?

René D. schrieb:
> if mul_execute(mul_execute'high downto 1) /= (others=>'0') then

Prüfe doch einfach ob das Signal größer als 0 ist:
 if to_integer(unsigned((mul_execute(mul_execute'high downto 1))) > 0 
then

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


Lesenswert?

René D. schrieb:
>> Keine Ahnung, ob das überhaupt geht, aber woher soll die Synthese
>> wissen, wie breit others=>'0' werden soll?
> es weiss doch wie breit das Signal auf der anderen Seite des
> Relationszeichen ist. Es kann nur gleichbreite Signale bewerten.
Könnte er wissen. Aber dafür müsste er eine implizite Annahme treffen. 
Aber der Synthesizer geht her und rechnet erst die linke, dann die 
rechte Seite aus, und danach vergleicht er die beiden. Und dabei tritt 
die Gretchenfrage auf: wie breit soll denn der Vektor denn überhaupt 
sein?
http://www.lothar-miller.de/s9y/archives/28-Vektor-Vergleich.html

von dired (Gast)


Lesenswert?

1
if unsigned(mul_execute(mul_execute'high downto 1)) /= 0 then

finde ich die hübscheste variante

von Fritz J. (fritzjaeger)


Lesenswert?

dired schrieb:
>
1
> 
2
> if unsigned(mul_execute(mul_execute'high downto 1)) /= 0 then
3
> 
4
>
>
> finde ich die hübscheste variante

Ich nicht,

da IMHO unnötige Konvertierung in einem haüfig benutzten IF-Zweig 
benutzt wird, macht die Simu langsamer.

Und falls das interne zahlenformat irgendwann geändet wird (Umstellung 
auf signed bei Re-Use) dann ist an x-Stellen der Code zu ändern.

Besser Constant statt magic numbers verwenden und mit einem Typ intern 
arbeiten und möglichst nur am Übergang zum Reallife nach/von 
std_logic_vector konvertieren.

MfG,

von Andi (loopy83)


Lesenswert?

Was haltet ihr von
1
if or_reduce(mul_execute(mul_execute'high downto 1)) = 1 then
?

von Fritz J. (fritzjaeger)


Lesenswert?

Andreas B. schrieb:
> Was haltet ihr von
>
1
> if or_reduce(mul_execute(mul_execute'high downto 1)) = 1 then
2
>
?

Von der Logik her passend -> Or-Gatter; einfacher gehts net.

VHDL-mäßig gibt es aber einiges zu meckern:
 -Welches package wird benutzt? ("use" fehlt, wahrscheinlich ist das 
reduce_Pack gemeint)
 - return type passt nicht. Gemeint ist wohl std_logic ('1'), benutzt 
ist aber integer (1).

MfG,

von Andi (loopy83)


Lesenswert?

Hallo,

Fritz Jaeger schrieb:
> -Welches package wird benutzt? ("use" fehlt, wahrscheinlich ist das
> reduce_Pack gemeint)
1
USE ieee.std_logic_misc.ALL;

>  - return type passt nicht. Gemeint ist wohl std_logic ('1'), benutzt
> ist aber integer (1).
Korrekt - in der Schnelle die '' vergessen :)

Viele Grüße,
Andi

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.