if Abfrage others=>'0' nicht erlaubt

OP (Firma: www.dossmatik.de) #2915524
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.
OP (Firma: www.dossmatik.de) #2915556
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.
#2915595
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
--...
OP (Firma: www.dossmatik.de) #2915866
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.
Moderator (Firma: Titel) Persönliche Seite #2915901
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
#2922444
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,
#2923550
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,

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