Forum: FPGA, VHDL & Co. conv_integer bei einem 8-bit Multiplexer


von Shark (Gast)


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;

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


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...

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.