Hi,
möchte nur bei enbale = 1 etwas verbinden lassen.
Es geht vielleicht mit einem process, aber bin mir noch nicht sicher wie
man das gewöhnlich macht mit einem Baustein.
Weil man muss dann alle signale in die sens. liste schreiben oder?
das kommt mir seltsam vor.
VHDL
Wie 'verbunden'? Du kannst nicht einfach im Betrieb Signale abhängen.
Due kannst sie höchstens unter bestimmten Umständen hochohmig schalten.
Zeig mal ein Beispiel, was du unter <Verbindung> verstehst.
Bliad B. schrieb:> Es geht vielleicht mit einem process, aber bin mir noch nicht sicher wie> man das gewöhnlich macht mit einem Baustein.
Ich glaube, das was du beschreiben möchtest ist ein Multiplexer (oft
auch kurz Mux genannt).
Einen Multiplexer kann man in VHDL ganz verschieden beschreiben, mit
prozess oder nebenläufig.
Bliad B. schrieb:> Weil man muss dann alle signale in die sens. liste schreiben oder?
Wenn es ein nur ein Mux ist, ohne Register/Flip-Flops, dann hast du eine
rein kombinatorische Beschreibung (ohne Clock) und dann muss auch alles
in die Sensitivitätsliste.
Dein Beispielcode zeigt aber Clock und Enable in der Sensitivitätsliste,
Clock wird aber gar nicht verwendet. Soll das jetzt ein synchroner
Prozess (mit rising_edge(Clock) und Flip-Flops) oder ein
kombinatorischer werden?
Dussel schrieb:> Zeig mal ein Beispiel, was du unter <Verbindung> verstehst.
Vielen Dank für die Antwort.
Also z.B. in Abhängigkeit von enbale wird der Ausgang vom IP-Core mit
dem Ausgang des Designs verbunden.
Ansonsten hier z.B. "111111111111"
Macht man das so?
Wenn nicht wie würde man es machen?
1
ENTITYtest_designIS
2
PORT(
3
4
test_output:OUTSTD_LOGIC_VECTOR(11downto0)
5
);
6
7
componentipcore
8
port(
9
ausgang1:outstd_logic_vector(5downto0);
10
ausgang2:outstd_logic_vector(5downto0)
11
);
12
endcomponent;
13
14
p_connector:process(enable)
15
16
begin
17
ifenable='1'
18
test_output(10downto6)<=ausgang1(5downto0);
19
test_output(5downto0)<=ausgang2(5downto0);
20
else
21
test_output(10downto0)<="111111111111";
22
endif;
23
endprocessp_connector;
Christoph Z. schrieb:> Dein Beispielcode zeigt aber Clock und Enable in der Sensitivitätsliste,> Clock wird aber gar nicht verwendet. Soll das jetzt ein synchroner> Prozess (mit rising_edge(Clock) und Flip-Flops) oder ein> kombinatorischer werden?
Danke.
Ja wäre ein MUX.
Ich möchte an meinen echten Board-Ports messen ob was ankommt. Deswegen
möchte ich dort einfach mal HIGH anlegen lassen.
Clock brauche ich dafür nicht.
War nur ein Überbleibsel.
Also wenn der FPGA angeht soll einfach entweder der Core verbunden sein
oder HIGH anliegen.
Weiß noch nicht wie ich das mit nem Schalter machen könnte oder wie ich
den FPGA sonst ansteuern kann xD
bilad schrieb:> Also wenn der FPGA angeht soll einfach entweder der Core verbunden sein> oder HIGH anliegen.
Wie du geschrieben hast, wäre das ein Multiplexer.
1
p_connector:process(enable)
2
begin
3
ifenable='1'
4
test_output(10downto6)<=ausgang1(5downto0);
5
test_output(5downto0)<=ausgang2(5downto0);
6
else
7
test_output(10downto0)<="111111111111";
8
endif;
9
endprocessp_connector;
Das sieht grundsätzlich erstmal gültig aus, kann man also so machen. Ob
es dann im Gesamtzusammenhang sinnvoll ist, ist eine andere Frage.
Die Sensitivityliste ist aber nicht vollständig. Da muss noch Ausgang1
und Ausgang2 rein.
Außerdem würde ich
test_output <= (others => '1');
schreiben. Dann musst du den Vektor nicht ändern, wenn sich die Länge
von test_output ändert.
Dussel schrieb:> Wie du geschrieben hast, wäre das ein Multiplexer. ....> Das sieht grundsätzlich erstmal gültig aus
... hat aber auf den zweiten Blick den Fehler, dass die Sensitivliste
nicht vollständig ist: ausgang1 und ausgang2 fehlen darin.
Mit einer nebenläufigen Schreibweise kann sowas gar nicht passieren.
Lothar M. schrieb:> Dussel schrieb:>> Wie du geschrieben hast, wäre das ein Multiplexer. ....>> Das sieht grundsätzlich erstmal gültig aus> ... hat aber auf den zweiten Blick den Fehler, dass die Sensitivliste> nicht vollständig ist: ausgang1 und ausgang2 fehlen darin.
Ich zitiere mich mal:
Dussel schrieb:> Die Sensitivityliste ist aber nicht vollständig. Da muss noch Ausgang1> und Ausgang2 rein.
;-)
Lothar M. schrieb:> Mit einer nebenläufigen Schreibweise kann sowas gar nicht passieren.
Das finde ich aber für einen Anfänger, der if kennt, schwerer
verständlich (weil es kryptischer ist). Ähnlich wie ich einem Anfänger
in C erstmal if-else statt den ?:-Operator beibringen würde.
Lothar M. schrieb:> test_output <= ausgang1&ausgang2 when enable='1' else (others => '1');
Hätte aber unterschiedliche/ mehrere Zuweisungen.
Dann muss ich öfters **when** schreiben.
Kann man das nicht zusammenfassen?
Lothar M. schrieb:> Ich würde diesen Multiplexer ohne Prozess ganz nebenläufig so schreiben:
Welche Vorteile hat das gegenüber einem Prozess?
Dankee :D
Dussel schrieb:> Das finde ich aber für einen Anfänger, der if kennt
Und dann C programmiert.
> schwerer verständlich (weil es kryptischer ist).
Ist es nicht einfach nur "neu".
Ich finde es sogar "natürlichsprachlicher" als das if-Gehampel.
Hat eigentlich schon wer erwähnt, dass die Sensitivliste nicht
vollständig ist? Und deshalb die Simulation nicht zur erzeugten Hardware
passt? ;-)
bilad schrieb:> Lothar M. schrieb:>> Ich würde diesen Multiplexer ohne Prozess ganz nebenläufig so schreiben:> Welche Vorteile hat das gegenüber einem Prozess?
Du hast sicher keine falsche Sensitivliste. Du sparst 8 Zeilen Code ein
und gewinnst Übersichtlichkeit. Mir reicht das als Vorteile.
bilad schrieb:> Lothar M. schrieb:>> test_output <= ausgang1&ausgang2 when enable='1' else (others => '1');>> Hätte aber unterschiedliche/ mehrere Zuweisungen.> Dann muss ich öfters **when** schreiben.> Kann man das nicht zusammenfassen?
Es gibt if-else, when-else und with-select. Welches man verwendet ist
meiner Meinung nach oft Geschmackssache. With-select verwende ich zum
Beispiel praktisch gar nicht.
Ich würde zum Beispiel eher
1
X<=Awhencmd/="00"else'0';
bei einer einzelnen Zuweisung und
1
process(cmd,A,B,C)
2
begin
3
X<='0';
4
Y<='0';
5
Z<='0';
6
ifcmd/="00"then
7
X<=A;
8
Y<=B;
9
Z<=C;
10
endif;
11
endprocess;
bei mehreren Zuweisungen schreiben. (Ich hoffe, da ist kein Fehler
drin...)
Man könnte aber auch
1
X<=Awhencmd/="00"else'0';
2
Y<=Bwhencmd/="00"else'0';
3
Z<=Cwhencmd/="00"else'0';
schreiben.
Lothar M. schrieb:>> schwerer verständlich (weil es kryptischer ist).> Ist es nicht einfach nur "neu".
Ja. Und damit ungewohnt. Für den Anfang würde ich persönlich gewohnte
Syntax bevorzugen. Aber das ist meine Meinung und man kann natürlich
anderer Meinung sein.
Dussel schrieb:> With-select verwende ich zum Beispiel praktisch gar nicht.
Es ist aber trotzdem einen Blick wert... ;-)
Hier mal die vier Varianten, vorneweg die von Programmierern so
beliebten "Freunde" aus den prozeduralen Sprachen:
1
-- 7 Segment Decoder
2
3
-- sequentiell im Prozess:
4
process(digit)begin
5
segments<="0111111";-- Defaultwert
6
ifdigit=0thensegments<="1000000";endif;
7
ifdigit=1thensegments<="1111001";endif;
8
ifdigit=2thensegments<="0100100";endif;
9
:
10
:
11
ifdigit=8thensegments<="0000000";endif;
12
ifdigit=9thensegments<="0010000";endif;
13
endprocess;
14
15
16
process(digit)begin
17
casedigitis
18
when0=>segments<="1000000";
19
when1=>segments<="1111001";
20
when2=>segments<="0100100";
21
:
22
:
23
when8=>segments<="0000000";
24
when9=>segments<="0010000";
25
whenothers=>segments<="0111111";
26
endcase;
27
endprocess;
28
29
30
-- nebenläufig:
31
segments<=
32
"1000000"whendigit=0else
33
"1111001"whendigit=1else
34
"0100100"whendigit=2else
35
:
36
:
37
"0000000"whendigit=8else
38
"0010000"whendigit=9else
39
"0111111";
40
41
42
withdigitselectsegments<=
43
"1000000"when0,
44
"1111001"when1,
45
"0100100"when2,
46
:
47
:
48
"0000000"when8,
49
"0010000"when9,
50
"0111111"whenothers;
Man sieht hier, dass die if-Abfragerei die Fehleranfälligste ist, weil
man sich da um den Defaultwert selbst kümmern muss und bei
Nichtbeachtung sofort ein Latch an der Backe hat. Zudem braucht dieser
Stil am meisten Platz (und das obwohl ich jede Abfrage in 1 Zeile
geschrieben habe).
Am knackigsten und zudem am besten leserlich ist die nebenläufige
WITH-SELECT-Variante dieses Multiplexers.
Messtechniker schrieb:> wie bekommt man denn bitte diesen Code so schön formatiert?
Man verwendet eine passende Indention.
Und das Syntax Highlighting gibts mit den [vhdl] Tokens um den
Sourcecode.