conv_integer bei einem 8-bit Multiplexer

Gast #2895412
Lesenswert?

Hallo leute,
ich versuche gerade mich in VHDL einzuarbeiten. Es sollte einen Code für 
einen 8-bit Multiplexer geschriben, das wäre dann kein Problem. Aber 
laut der AUfgabenstellung sollte für für die Auswahl des Quellsignales 
die Funktion conv_integer verwendet werden!

Wenn ich den Code in GHDL mit diesen Befehl analysiere, kommen folgende 
Fehler Meldungen.

ghdl -a --ieee=synopsys mux81_2.vhdl

Hat jemand eine Idee, wo das Problem liegen könnte?


PS: Ich habe hier im Forum gelesen, dass es besser die Funktion 
to_integer und die ieee.numeric_std benutzt werden sollen.



mux81_2.vhdl:20:44: can't match function call with type std_ulogic
mux81_2.vhdl:20:32: (location of function call)
mux81_2.vhdl:21:44: can't match function call with type std_ulogic
mux81_2.vhdl:21:32: (location of function call)
mux81_2.vhdl:22:44: can't match function call with type std_ulogic
mux81_2.vhdl:22:32: (location of function call)
mux81_2.vhdl:23:44: can't match function call with type std_ulogic
mux81_2.vhdl:23:32: (location of function call)
mux81_2.vhdl:24:44: can't match function call with type std_ulogic
mux81_2.vhdl:24:32: (location of function call)
mux81_2.vhdl:25:44: can't match function call with type std_ulogic
mux81_2.vhdl:25:32: (location of function call)
mux81_2.vhdl:26:44: can't match function call with type std_ulogic
mux81_2.vhdl:26:32: (location of function call)
mux81_2.vhdl:27:44: can't match function call with type std_ulogic
mux81_2.vhdl:27:32: (location of function call)
/usr/lib/ghdl/bin/ghdl: compilation error

1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_arith.all;
4

5
entity mux81_2 is
6
port (  a:   in  std_logic_vector (0 to 7);
7
  sel: in  std_logic_vector (2 downto 0);
8
  y:   out std_logic);
9
end mux81_2;
10

11

12
architecture BEHAVIOR of mux81_2 is
13
begin
14

15
  process(a, sel)
16
  variable y_int: std_logic;
17
  begin
18
  
19
  case sel is  
20
  when "000"  => y_int := conv_integer(a(0));
21
  when "001"  => y_int := conv_integer(a(1));
22
  when "010"  => y_int := conv_integer(a(2));
23
  when "011"  => y_int := conv_integer(a(3));
24
  when "100"  => y_int := conv_integer(a(4));
25
  when "101"  => y_int := conv_integer(a(5));
26
  when "110"  => y_int := conv_integer(a(6));
27
  when "111"  => y_int := conv_integer(a(7));
28
  when others => null;
29
  end case;
30
  
31
  y <= y_int;
32

33
  end process;
34
end BEHAVIOR;
Moderator (Firma: Titel) Persönliche Seite #2895593
Lesenswert?

Shark schrieb:
> Hat jemand eine Idee, wo das Problem liegen könnte?
Welchen Datentyp hat y_int? Ist das ein integer? Falls nein: warum 
versuchst du einem std_logic einen integer zuzuweisen?

> PS: Ich habe hier im Forum gelesen, dass es besser die Funktion
> to_integer und die ieee.numeric_std benutzt werden sollen.
Gut gelesen!
Siehe den Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"
Und das da: http://www.lothar-miller.de/s9y/categories/16-Numeric_Std

Aber du brauchst hier weder die std_logic_arith noch die numeric_std, 
weil da gar nichts gerechnet werden muss! Schreib es einfach so:
1
  case sel is  
2
  when "000"  => y_int := a(0);
3
  when "001"  => y_int := a(1);
4
   : 
5
   :

Richtige Hacker würden das natürlich per Index und ohne Prozess 
erledigen:
1
use ieee.numeric_std.all;
2
:
3
:
4
   y <= a(to_integer(unsigned(sel));


BTW:
1
  when others => null;
Das gibt in der Simulation ein Latch. In der Hardware ist es zum Glück 
egal, denn da gibt es nur '0' und '1' in einer Abfrage...


BTW2:
wozu der unnötige Umweg über y_int?
Weise das Ergebnis doch direkt dem Signal y zu...
Zur unnötigen Verwendung von Signalen:
Beitrag "Variable vs Signal"

BTW3:
wenn du schon unbedingt die std_logic_arith verwenden 
willst/musst/sollst, dann muss da eigentlich auch die use 
std_logic_unsigned oder die std_logic_signed dabei sein, denn sonst hast 
du nichts gewonnen und musst alle Operationen von Hand casten...

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