1-zu-4 Demultiplexer in VHDL

Gast #1495018
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?



1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5

6
entity Uebung1 is
7
    Port ( ADDRESS : in  STD_LOGIC_VECTOR(1 downto 0);
8
           E : in  STD_LOGIC;
9
           Y : out  STD_LOGIC_VECTOR (3 downto 0));
10
end Uebung1;
11

12
architecture Behavioral of Uebung1 is
13

14
begin
15
  Y(0) <= E when ADDRESS = "00" else
16
  Y(1) <= E when ADDRESS = "01" else
17
  Y(2) <= E when ADDRESS = "10" else
18
  Y(3) <= E when ADDRESS = "11";
19
end Behavioral;
Persönliche Seite
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:
1
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):
1
process(CLK)
2
begin
3
  if(CLK'event and CLK='1') then
4
    if(ADDRESS = "00") then
5
      Y(0) <= E;
6
    elsif(ADDRESS = "01") then
7
      Y(1) <= E;
8
    elsif(ADDRESS = "10") then
9
      Y(2) <= E;
10
    elsif(ADDRESS = "11") then
11
      Y(3) <= E;
12
    end if;
13
  end if;
14
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:
1
process(CLK)
2
begin
3
  if(CLK'event and CLK='1') then
4
    Y(To_Integer(ADDRESS)) <= E;
5
  end if;
6
end process;
Gast
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
1
begin
2
  Y(0) <= E when ADDRESS = "00" ;
3
  Y(1) <= E when ADDRESS = "01" ;
4
  Y(2) <= E when ADDRESS = "10";
5
  Y(3) <= E when ADDRESS = "11";
6
end Behavioral;

das scheint zu funktionieren.
Moderator (Firma: Titel) Persönliche Seite
>> 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:
1
begin
2
  Y(0) <= E; 
3
  Y(1) <= E; 
4
  Y(2) <= E;
5
  Y(3) <= E; 
6
end Behavioral;
Überleg dir das noch mal genau...  :-/

So wie du es geschrieben hast, hast du 4 Latches eingebaut. Willst du 
das?
Gast
>>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-zu-4-Demultiplexer.svg&filetimestamp=20080817150133

Wenn man aber davon ausgeht, das sie aud internen Analogschaltern 
bestehen müssten sie hochohmig sein. aber ehrlich gesagt weiß ich das 
nicht  :(
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
1
  Y(0) <= E when ADDRESS = "00" else 'Z';
2
  Y(1) <= E when ADDRESS = "01" else 'Z';
3
  Y(2) <= E when ADDRESS = "10" else 'Z';
4
  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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.