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


von Karl (Gast)


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?



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;

: Verschoben durch Admin
von Niklas G. (erlkoenig) Benutzerseite


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:
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;

von Karl (Gast)


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

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


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:
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?

von Karl (Gast)


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-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  :(

von Hagen R. (hagen)


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

von Karl (Gast)


Lesenswert?

Oh, vielen Dank für die Erklärung

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.