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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.