mikrocontroller.net

Forum: FPGA, VHDL & Co. 1-zu-4 Demultiplexer in VHDL


Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich versuche grad einen Demultiplexer mittels bedingter Signalzuweisung 
in VHDL zu realisieren, aber der Compiler meckert

"...Type of Y is incompatible with type of <="

Hat jemand eine Idee was der Grund sein könnte?



library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Uebung1 is
    Port ( ADDRESS : in  STD_LOGIC_VECTOR(1 downto 0);
           E : in  STD_LOGIC;
           Y : out  STD_LOGIC_VECTOR (3 downto 0));
end Uebung1;

architecture Behavioral of Uebung1 is

begin
  Y(0) <= E when ADDRESS = "00" else
  Y(1) <= E when ADDRESS = "01" else
  Y(2) <= E when ADDRESS = "10" else
  Y(3) <= E when ADDRESS = "11";
end Behavioral;

: Verschoben durch Admin
Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hast du eher einen Denkfehler. Du hast geschrieben, dass Y(0) auf E 
gesetzt werden soll, wenn ADDRESS einen bestimmten Wert hat. Aber was 
soll mit Y(0) passieren, wenn ADDRESS einen anderen Wert hat? Auf 0 
gehen? Dann schreibst du:
Y(0) <= E when ADDRESS = "00" else '0';
Soll Y(0) den Wert aber behalten, brauchst du ein FlipFlop, um ihn zu 
speichern, sowie einen Takt, an dessen Flanke der Wert im FlipFlop 
gespeichert wird. Ein solches Flipflop beschreibt man üblicherweise in 
einem getakteten Process (CLK ist der Takt):
process(CLK)
begin
  if(CLK'event and CLK='1') then
    if(ADDRESS = "00") then
      Y(0) <= E;
    elsif(ADDRESS = "01") then
      Y(1) <= E;
    elsif(ADDRESS = "10") then
      Y(2) <= E;
    elsif(ADDRESS = "11") then
      Y(3) <= E;
    end if;
  end if;
end process;
Das sind dann gleich 4 Flipflops für alle Kanäle.
Alternativ könnte das folgende auch gehen (bin mir nicht ganz sicher und 
kanns grad nicht testen), ist in Hardware exakt das selbe, sieht nur 
etwas schöner aus:
process(CLK)
begin
  if(CLK'event and CLK='1') then
    Y(To_Integer(ADDRESS)) <= E;
  end if;
end process;

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zunächst mal vielen Dank für deine schnelle Antwort und sorry, dass ich 
im falschen Unterforum gepostet hab. Vielleicht kann das mal einer 
verschieben.

>>Da hast du eher einen Denkfehler. Du hast geschrieben, dass Y(0) auf E
>>gesetzt werden soll, wenn ADDRESS einen bestimmten Wert hat. Aber was
>>soll mit Y(0) passieren, wenn ADDRESS einen anderen Wert hat?

Ist das bei einem Demultiplexer nicht egal? Die nicht adressierten 
Ausgänge sind dann halt nicht definiert. Aber du hast natürlich Recht, 
dass wenn ich "else" benutze muss ich auch sagen, was dann passieren 
soll.

Ich hab den Block jetzt wie folgt definiert
begin
  Y(0) <= E when ADDRESS = "00" ;
  Y(1) <= E when ADDRESS = "01" ;
  Y(2) <= E when ADDRESS = "10";
  Y(3) <= E when ADDRESS = "11";
end Behavioral;

das scheint zu funktionieren.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Aber was soll mit Y(0) passieren, wenn ADDRESS einen anderen Wert hat?
> Ist das bei einem Demultiplexer nicht egal?
Ja, wenn dir das egal ist, dann könntest du doch auch so schreiben:
begin
  Y(0) <= E; 
  Y(1) <= E; 
  Y(2) <= E;
  Y(3) <= E; 
end Behavioral;
Überleg dir das noch mal genau...  :-/

So wie du es geschrieben hast, hast du 4 Latches eingebaut. Willst du 
das?

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>So wie du es geschrieben hast, hast du 4 Latches eingebaut. Willst du
>>das?

Stimmt, ist mir gar nicht aufgefallen.

Aber wie verhalten sich dann die nichtselektieren Ausgänge bei einem 
Mulitplexer?

Laut dem hier gehen sie auf low:

http://de.wikipedia.org/w/index.php?title=Datei:1-...

Wenn man aber davon ausgeht, das sie aud internen Analogschaltern 
bestehen müssten sie hochohmig sein. aber ehrlich gesagt weiß ich das 
nicht  :(

Autor: Hagen Re (hagen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unterscheide digitale und analoge Multiplexer. Analoge Multiplexer sind 
offen wenn nicht selektiert. Digitale Multipexer nehmen immer einen 
definierten Zustand an, also 0,1 oder Z.

Der FPGA kann einen analogen Multiplexer nicht nachbauen. Du kannst 
höchstens hochohmig oder Bushold einstellen. Für hochohmig dann so
  Y(0) <= E when ADDRESS = "00" else 'Z';
  Y(1) <= E when ADDRESS = "01" else 'Z';
  Y(2) <= E when ADDRESS = "10" else 'Z';
  Y(3) <= E when ADDRESS = "11" else 'Z';

Beachte dann aber das Y() mit einem Pin verbunden wird. Ist es ein 
internes Signal erzeugt die Synthese daraus einen Tristate Bus per 
Logik.

Möchtest du Bushold haben dann musst du das in den meisten Fällen mit 
spezifischen Cores machen, ist also FPGA spezifisch. Damit würde sich 
das Design so verhalten als würdest du Latches intern benutzen nur wird 
das dann über die Ausgangstreiber der FPGA Pins ohne interne Latches 
synthetisiert.

Naja und dann wäre noch die Option "Open Drain" zu erwähnen, auch das 
können viele FPGAs. Sie ziehen also nur gegen Masse.

Gruß Hagen

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, vielen Dank für die Erklärung

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.