Forum: FPGA, VHDL & Co. Setzen einzelner Stellen eines std_logic_vector


von Student (Gast)


Lesenswert?

Hallo,

kann ich in einem langen std_logic_vector einzelne Bits bzw. Stellen 
zuweisen?
Ein 240 Stellen langer Vektor mit ausschließlich Nullen soll an Position 
23-16 Einsen bekommen.
Meine Idee war (die offensichtlich falsch ist):
VEKTOR(23 downto 16) <= x"ff";

Oder muß ich eine Zuweisung für den gesamten Vektor machen?

Grüße

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


Lesenswert?

Student schrieb:
> Meine Idee war (die offensichtlich falsch ist):
> VEKTOR(23 downto 16) <= x"ff";
Passt doch.
Wer sagt, dass das falsch ist? Welcher Teil der Toolchain meldet bei 
welchem Code welchen Fehler?

von Duke Scarring (Gast)


Lesenswert?

Student schrieb:
> Ein 240 Stellen langer Vektor mit ausschließlich Nullen soll an Position
> 23-16 Einsen bekommen.

Na, dann mach doch:
1
VEKTOR <= ( 23 downto 16 => '1', others => '0');

Duke

von Student (Gast)


Lesenswert?

Danke euch beiden für die Antworten.

Duke Scarring schrieb:
> Student schrieb:
>> Ein 240 Stellen langer Vektor mit ausschließlich Nullen soll an Position
>> 23-16 Einsen bekommen.
>
> Na, dann mach doch:1VEKTOR <= ( 23 downto 16 => '1', others => '0');
>
> Duke

Der Code ist für meine Projektarbeit und möchte ihn nicht im Netz 
posten. Aber das ist was ich gesucht hatte. Ich habe mehrere Bücher, 
aber nirgends steht diese Schreibeweise drin…
Danke, das hat geholfen.
Das Problem lag nicht an meiner Schreibeweise, aber so konnte ich es 
dann wenigstens ausschließen.

Grüße

von Bastler (Gast)


Lesenswert?

Student schrieb:
> Aber das ist was ich gesucht hatte. Ich habe mehrere Bücher,
> aber nirgends steht diese Schreibeweise drin…

Das steht deshalb "nirgends" drin, weil man sich das erschlussfolgern 
kann, wenn man den Konstrukt an sich ansieht. Würde man komplette 
Vektoren zuweisen können oder müssen, dann würde man nur sehen :  y <= x 
und es brächte kein "downt to" und die Zahlen. :-)

von Fred Focus (Gast)


Angehängte Dateien:

Lesenswert?

Student schrieb:
> Aber das ist was ich gesucht hatte. Ich habe mehrere Bücher,
> aber nirgends steht diese Schreibeweise drin…

Doch schon, aber manche eben so sperrig, das ein "Student" das nicht 
wahrnimmt. Insbesonders wenn er das Buch nur nach Syntaxbeispielen 
überfliegt, statt die Erläuterungen da neben zu lesen.

Anhang aus ISBN: 3-69959-163-1 . Der Autor dieser Dissertationsschrift 
lehrt im Hamburg und hat dort einiges zu VHDL veröffentlicht, was man 
auch beachten sollte: 
https://tams-www.informatik.uni-hamburg.de/vhdl/vhdl.html

von Student (Gast)


Lesenswert?

Fred Focus schrieb:
> Student schrieb:
>> Aber das ist was ich gesucht hatte. Ich habe mehrere Bücher,
>> aber nirgends steht diese Schreibeweise drin…
>
> Doch schon, aber manche eben so sperrig, das ein "Student" das nicht
> wahrnimmt. Insbesonders wenn er das Buch nur nach Syntaxbeispielen
> überfliegt, statt die Erläuterungen da neben zu lesen.

Das ist quatsch. Aber deine Vorschläge nehme ich gerne mit. Wenn ich nur 
lange genug nach einem Fehler suche, zweifle ich an allem und brauchte 
einfach eine Bestätigung. Hat ja auch geholfen.

Bastler schrieb:
> Student schrieb:
>> Aber das ist was ich gesucht hatte. Ich habe mehrere Bücher,
>> aber nirgends steht diese Schreibeweise drin…
>
> Das steht deshalb "nirgends" drin, weil man sich das erschlussfolgern
> kann, wenn man den Konstrukt an sich ansieht. Würde man komplette
> Vektoren zuweisen können oder müssen, dann würde man nur sehen :  y <= x
> und es brächte kein "downt to" und die Zahlen. :-)

Ja ist so. Ich hatte einen Konflikt aufgrund zweier Prozesse, wo in 
beidem versucht wurde dem Vektor einen Wert zuzuweisen. In dem einen die 
Nullen und im anderen die Einsen an genannter Stelle. Das hätte eig. nie 
gleichzeitig passieren können, hatte mir in der Simulation aber trotzdem 
für den Stellen 23-16 „XX“ ausgegeben. Das konnte ich nun lösen.

von Fred Focus (Gast)


Lesenswert?

Student schrieb:
>  Wenn ich nur
> lange genug nach einem Fehler suche, zweifle ich an allem und brauchte
> einfach eine Bestätigung. Hat ja auch geholfen.

Noch so ne Bockmistige Studenteneransgehensweise.

Erst mal Mist schreiben und dann den Fehler suchen (lassen). Anstatt ab 
Start zu lernen wie man es richtig macht, bevor man mit Code 
losstochert.

VHDL als standardisierte Sprache hat den Vorteil, das es ein zugängliche 
Language Reference Manual (LRM) gibt, in dem nachschlagen kann wie es 
korrekt lautet: https://edg.uchicago.edu/~tang/VHDLref.pdf S.106

von Student (Gast)


Lesenswert?

Fred Focus schrieb:
> Student schrieb:
>>  Wenn ich nur
>> lange genug nach einem Fehler suche, zweifle ich an allem und brauchte
>> einfach eine Bestätigung. Hat ja auch geholfen.
>
> Noch so ne Bockmistige Studenteneransgehensweise.
>
> Erst mal Mist schreiben und dann den Fehler suchen (lassen). Anstatt ab
> Start zu lernen wie man es richtig macht, bevor man mit Code
> losstochert.
>
> VHDL als standardisierte Sprache hat den Vorteil, das es ein zugängliche
> Language Reference Manual (LRM) gibt, in dem nachschlagen kann wie es
> korrekt lautet: https://edg.uchicago.edu/~tang/VHDLref.pdf S.106

Ganz ehrlich, das ist nicht wahr. Ich habe den Fehler nicht suchen 
lassen, sondern eine einfache Frage gestellt. Ihr habt euer Forum wieder 
für euch. Hier sind scheinbar nur Profis erwünscht. Wenn es so wäre wie 
du behauptest dürfte es kein Stackoverflow oder sonst irgendein Forum 
geben, weil man sich alles irgendwie herleiten kann… Ich lese hier viel 
mit und hatte befürchtet angehatet zu werden und frage hier nicht mehr 
nach.
Danke nochmal, Ciao

von Achim S. (Gast)


Lesenswert?

Student schrieb:
> Ganz ehrlich, das ist nicht wahr.

Ist es auch nicht. Lass dich nicht von Fred Focus provozieren. Der hat 
die Angewohnheit, (unter verschiedenen Namen) nach Threads zu suchen, 
die er zur Selbstdarstellung nutzen kann. Seine Methode: er listet 
irgendwelche Formalien und Trivialitäten auf, und behauptet dann ins 
Blaue, dass der Fragesteller zu dumm oder zu faul oder zu sonstwas sei. 
Fred Focus würde es wahrscheinlich anders formulieren, aber in der 
Sprache des Rests der Menschheit ist es genau das, was er tut.

Die anderen Dikussionspartner hier sind konstruktiv auf deine Frage 
eingegangen. Ignoriere den Selbstdarsteller einfach - ich mach es 
jedenfalls so.

Student schrieb:
> Ich hatte einen Konflikt aufgrund zweier Prozesse, wo in
> beidem versucht wurde dem Vektor einen Wert zuzuweisen. In dem einen die
> Nullen und im anderen die Einsen an genannter Stelle. Das hätte eig. nie
> gleichzeitig passieren können

Lass mich raten - du hattest ein Konstrukt der folgenden Art:
1
  a: process(clk,reset)
2
  begin
3
     if reset='1' then
4
       vektor<=(others =>'0');
5
    elsif rising_edge(clk) then
6
       ...
7
    end if;
8
  end process;
9
  
10
  b: process(clk,reset)
11
  begin
12
     if reset='1' then
13
       .....
14
    elsif rising_edge(clk) then
15
       if bedingung then
16
                      vektor(23 downto 16) <= x"FF";
17
                   end if; 
18
    end if;
19
  end process;

Und du dachtest, Prozess A treibt das Signal nur im Reset auf 0 und 
"gibt es sonst frei"?

Das ist aber nicht der Fall: Im Reset setzt Prozess a das Signal auf 0. 
Und weil es ansonsten in Prozess a nicht mehr geändert wird, speichert 
er das Signal und treibt er es dauerhaft auf 0. Deswegen der Konflikt, 
sobald Prozess b das Signal auf 1 setzen will.

von Fred Focus (Gast)


Lesenswert?

Student schrieb:

> Ganz ehrlich, das ist nicht wahr. Ich habe den Fehler nicht suchen
> lassen, sondern eine einfache Frage gestellt.

Mit der keiner was anfange konnte, weil der behauptete "Fehler" nicht 
sichtbar war: Beitrag "Re: Setzen einzelner Stellen eines std_logic_vector"

Diesbezügliche Nachfragen wurden mit Hinweis auf 
"Nicht-Veröffentlichung" abgebügelt.

> Ich lese hier viel mit und hatte befürchtet angehatet zu werden

Jetzt ist also schon der Verweis auf Verständnisslücken und die Angabe 
von drei Literaturquellen (davon 2 online) eine Form vom "Hate-speech") 
?!?

https://de.wikipedia.org/wiki/Hasskommentar

Kopfschüttel ...

von Fred Focus (Gast)


Lesenswert?

Achim S. schrieb:

> Fred Focus provozieren. Der hat
> die Angewohnheit, (unter verschiedenen Namen) nach Threads zu suchen,
> die er zur Selbstdarstellung nutzen kann. Seine Methode: er listet
> irgendwelche Formalien und Trivialitäten auf, und behauptet dann ins
> Blaue, dass der Fragesteller zu dumm oder zu faul oder zu sonstwas sei.
> Fred Focus würde es wahrscheinlich anders formulieren, aber in der
> Sprache des Rests der Menschheit ist es genau das, was er tut.

Pups.
und Verweis auf die Nutzungsbedingungen: Der Zweck dieses Forums ist der 
Austausch über Themen aus dem Bereich Elektronik, Informatik, sowie 
Technik und Wissenschaft im weiteren Sinne."

Also, was regst Du dich auf, wenn man hier einen Frage auf das Lehrbuch 
verweist, wo die Antwort die Frage steht.
Und erst recht wenn der Frager behauptet, das würde nicht in den Büchern 
stehen ?!?!

von Student (Gast)


Lesenswert?

Achim S. schrieb:
> Und du dachtest, Prozess A treibt das Signal nur im Reset auf 0 und
> "gibt es sonst frei"?
>
> Das ist aber nicht der Fall: Im Reset setzt Prozess a das Signal auf 0.
> Und weil es ansonsten in Prozess a nicht mehr geändert wird, speichert
> er das Signal und treibt er es dauerhaft auf 0. Deswegen der Konflikt,
> sobald Prozess b das Signal auf 1 setzen will

Das trifft es fast genau. Ich habe eine Timed Moore State Machine nach 
dem Vorbild von 
https://www.amazon.de/-/en/Orhan-Gazi/dp/3030617009/ref=sr_1_1?crid=1E7I5BJ0M1Y49&keywords=state+machines+using+vhdl&qid=1673690407&sprefix=state+machines+using+vhdl%2Caps%2C76&sr=8-1
geschrieben. Der Takt und Reset ruft nur Prozess 1 auf, während darin 
der aktuelle Status den des nächsten annimmt, abhängig von der Zeit 
eines Timers.
Prozess 2 wird aufgerufen, sobald das passiert.
Ja, ich wollte den Vektor bei einem Reset oder nach Signalende im 
Prozess a auf 0 setzen und in Prozess b wieder in den definierten 
Ausgangszustand bringen.
Das auf 0 setzen konnte ich mir mit dem Konstrukt oben nun sparen und 
(fast) alles läuft wie es soll.

Ich dachte, da nur RST und CLK den ersten Prozess aufruft, kann ich es 
so machen. Nach RST und zwischen den positiven Taktflanken wird der 
Prozess nicht aufgerufen und ja ich dachte das Signal wäre freigegeben.

Am digitalen Ausgang (erstmal einer später auch mehrere) wird ein Signal 
mit unterschiedlichen Pegellaufzeiten ausgegeben und beginnt nachdem 
Ende oder einem Reset wieder von vorn.

Ich arbeite mit Vivado und experimentiere mit dem Basys 3 (Artix-7) 
Board von Digilent. Darauf wird auch mein Projekt laufen.

Grüße

von Achim S. (Gast)


Lesenswert?

Student schrieb:
> Ich dachte, da nur RST und CLK den ersten Prozess aufruft, kann ich es
> so machen. Nach RST und zwischen den positiven Taktflanken wird der
> Prozess nicht aufgerufen und ja ich dachte das Signal wäre freigegeben.

Der erste Prozess beschreibt ja ein taktflankengesteuertes FlipFlop 
(bzw. Register). Und das speichert den Wert (0), der beim Reset gesetzt 
wurde. Der Ausgang des FlipFlops treibt diesen Wert immer, nicht nur 
während der Ausführung des Prozesses. (Im implementierten Design gibt es 
sowieso keinen Prozess mehr sondern nur noch das FlipFlop, das durch den 
Prozess beschrieben wird).

Student schrieb:
> Ich arbeite mit Vivado und experimentiere mit dem Basys 3 (Artix-7)
> Board von Digilent. Darauf wird auch mein Projekt laufen.

Spätestens bei der Synthese hättest du die Meldung bekommen, dass der 
Ausgangs des Registers nicht aus zwei Prozessen heraus getrieben werden 
kann ("signal has multiple sources..").

Der Simulator kann damit umgehen: wenn von einem Prozess eine 0 kommt, 
vom anderen eine 1, dann wird nach der Auflösungsfunktion von std_logic 
daraus ein X.

von Fred Focus (Gast)


Lesenswert?

Student schrieb:
> Ich dachte, da nur RST und CLK den ersten Prozess aufruft, kann ich es
> so machen. Nach RST und zwischen den positiven Taktflanken wird der
> Prozess nicht aufgerufen und ja ich dachte das Signal wäre freigegeben.

Ein signal in VHDL ist kein wie in C (dynamisch) verwalteter Speicher.
Ein process(clk,reset) wird durch die Toolchains zu FlipFlops umgesetzt, 
die permanent ein Signal treiben.
Und falls hier jemand FliFlop nur vom Strandurlaub kennt: 
https://de.wikipedia.org/wiki/Flipflop

Auch wenn es mancher nicht hören will, Analogien zwischen C und VHDL zu 
ziehen führt eben sehr wahrscheinlich Falschannahmen. Deshalb sollte mn 
erst VHDL als "Hardwarebeschreibungssprache" lernen. Dann versteht man 
auch, das ein process ein (Leitungs-)treiber im hardwaretechnischen 
Sinne ist.

https://en.wikipedia.org/wiki/Device_driver
https://en.wikipedia.org/wiki/Driver_circuit

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


Lesenswert?

Student schrieb:
> Ich habe den Fehler nicht suchen lassen, sondern eine einfache Frage
> gestellt. Ihr habt euer Forum wieder für euch. Hier sind scheinbar nur
> Profis erwünscht.
Diese sehr sensible Seite musst du dir für später noch abgewöhnen.

Denn natürlich stimmt es: der Code, den du gepostet hast, erzeugt keinen 
Fehler. Wie soll man dir dann bei der Fehlersuche helfen?

Student schrieb:
> Der Takt und Reset ruft nur Prozess 1 auf
Du hast eine völlig falsche Denkweise von VHDL. Das geht am Anfang den 
meisten so, die vorher "nur" Software gemacht haben. Der Witz ist 
nämlich der: du musst dich schlau machen, welche Teile eines FPGAs du 
für deinen Zweck verwenden kannst. Und das sind allem voran die 
Logikblöcke, in denen es die LUTs für Logik und die Flipflops als 
Speicherelemente gibt. Nur diese Bauteile stehen für dein Hardwaredesign 
zur Verfügung. Und wenn du das betrachtest, dann gibt es in diesen 2 
Bauelementen nichts, was mit einem Takt oder einem Reset "aufgerufen" 
werden könnte. Und deshalb ist die Betrachtungsweise, dass da über die 
Sensitivliste irgendwelche Prozess irgendwie "aufgerufen" werden, 
grundlegend falsch. Die Sensitivliste sagt lediglich dem Simulator, bei 
welcher Signaländerung er deiner Meinung nach(!!) den Prozess neu 
berechnen sollte.

Student schrieb:
> aber nirgends steht diese Schreibeweise drin…
Noch ein Tipp: der Synthesizer schert sich einen feuchten Kehrricht um 
die Sensitivliste. Die ist nur für den Simulator da! Die Synthese 
"nimmt" sich einfach alle Signale her, die sie zur Umsetzung deiner 
Beschreibung in Hardware braucht. Und meldet das dann hinterher lapidar 
in einer Info im Sinne von "simulation results may not match generated 
hardware".

Student schrieb:
> Der Code ist für meine Projektarbeit und möchte ihn nicht im Netz
> posten.
Dann extrahiere dein Problem in einen "Dreizeiler", der die selbe 
Fehlermeldung bringt. Meine Erfahrung: oft ist ein Nachfragen danach gar 
nicht mehr nötig, weil du bei dieser Extraktion selber auf die 
Problemösung kommst.

: Bearbeitet durch Moderator
von Student (Gast)


Lesenswert?

Danke für die Erklärungen. Ich werde mich neben dem Code schreiben in 
die Dokumentation von Xilinx einlesen und hoffentlich genug dabei 
mitnehmen. Habe einen User Guide zur Synthese von Xilinx gefunden, der 
mir sicher helfen wird. Bis jetzt beschäftigte ich mich überwiegend mit 
Büchern zu VHDL/Digitaltechnik und der der Referenz zum Board von 
Digilent.
Ich wußte das eigentlich schon, dass man in Hardware usw. denken muss. 
Es fällt mir allerdings noch recht schwer.
Sollte ich wieder ein Problem haben werde ich zukünftig einen 
Beispielcode posten.
Ihr habt mir auf jeden Fall sehr geholfen.
Grüße

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.