Hi, ich bin neu bei VHDL und wollte fragen, ob man beispielsweise: reset<=1; wait 20 ns; reset<=0; gleich in einen Befehl machen kann und dann ein anderer Prozess auf die steigende flanke reagieren kann und etwas ausführt. Ich wollte keinen clock nutzen. Ich bräuchte es für einen Zähler (der immer bei steigender Flanke hochzählt). Dieser ist soweit auch schon fertig, ich muss nur ihn nur immer erst 1 setzen warten und dann wieder auf 0 zurück. Es soll synthetisierbar sein. (bei reset<=1; reset<=0; passiert nix)
Ihevf schrieb: > wait 20 ns; Das ist nicht synthetisierbar! Überleg mal, was das für einer Hardware entsprechen würde. Um das zu symthetisieren, müssten im FPGA frei justierbare Verzögerungsleitungen stecken. So etwas gibt es nicht ;-) Es wird dir also nichts anderes übrig bleiben, als deinen Puls min. eine Clockperiode lang zu machen.
Klaus schrieb: > Es wird dir also nichts anderes übrig bleiben, als deinen Puls min. eine > Clockperiode lang zu machen. P.S. Damit es nicht missverständlich ist: und zur Erzeugung des Pulses natürlich if rising_edge(clk) verwenden.
och schade, heißt das, dass man immer einen clock verwenden muss? Die Ausgabe darf zwischendurch auch ruhig falsche Angaben machen, sie muss nur gegen das richtige Ergebnis konvergieren. > Um das zu symthetisieren, müssten im FPGA frei > justierbare Verzögerungsleitungen stecken. So etwas gibt es nicht ;-) > > Es wird dir also nichts anderes übrig bleiben, als deinen Puls min. eine > Clockperiode lang zu machen. ich dachte man kann die Komponenten gleich mit nem kabel verbinden :) ohne Verzögerung.
Klaus schrieb: > P.S. Damit es nicht missverständlich ist: und zur Erzeugung des Pulses > natürlich if rising_edge(clk) verwenden. Zur Erzeugung "if"? oder meinst beim Prozessstart?:
1 | process(rising_edge(clk)) |
2 | begin
|
3 | ...
|
4 | end process |
oder kann man ein on/off signal senden?
Alles, was eine zeitliche Dauer oder eine zeitabhängigkeit haben soll, muss mit einem Takt geschehen. (Wenn man von solchen Schweinerein wie einem Ringoszillator mal absieht). Du brauchst also einen Takt. Für Anfänger ist ein Design, das synchronisierbar sein soll, immer komplett synchron und hat genau eine Takt. Nicht mehr und nicht weniger.
Christian R. schrieb: > Alles, was eine zeitliche Dauer oder eine zeitabhängigkeit haben soll, > muss mit einem Takt geschehen. (Wenn man von solchen Schweinerein wie > einem Ringoszillator mal absieht). Du brauchst also einen Takt. Für > Anfänger ist ein Design, das synchronisierbar sein soll, immer komplett > synchron und hat genau eine Takt. Nicht mehr und nicht weniger. Es soll ja eigentlich keine zeitliche Dauer haben. Er soll nur so lange hochzählen bis er eine 1 in der Zahl gefunden hat.
>Es soll ja eigentlich keine zeitliche Dauer haben. Er soll nur so lange >hochzählen bis er eine 1 in der Zahl gefunden hat. Ein Zähler macht nix anderes wie Ereignisse Zählen. Wenn du einen Zeitlichen bezug haben willst, brauchst du einen Takt, der dann gezählt wird. >Ich wollte keinen clock nutzen Theoretisch Möglich, aber definitiv nix für Anfänger
Falk Brummer schrieb: >>Ich wollte keinen clock nutzen > Theoretisch Möglich, aber definitiv nix für Anfänger Das ist so wie man mit einem Auto auch auf 2 Rädern fahren kann: Mit sehr viel Übung und Erfahrung könnte das klappen. Aber man muß dann mit jeden anderen Auto aufs Neue erst mal üben... > Falk Brummer? Falk, bist du das? ;-) Ihevf schrieb: > wait 20 ns; > : > Es soll synthetisierbar sein. Bisher ist nur wait until ... (teilweise) synthetisierbar, damit wird ja auf die Änderung eines Signals gewartet. Letzlich muß jede Hardware in Logik und FFs abgebildet werden, Verzögerungsglieder sind (wie schon erwähnt) im FPGA nicht verfügbar. > Es soll ja eigentlich keine zeitliche Dauer haben. Er soll nur so lange > hochzählen bis er eine 1 in der Zahl gefunden hat. Ich habe den Verdacht, dass du eigentlich gar keinen Zähler oder sonstwas brauchst, sondern nur z.B. eine führende '1' in einem Vektor finden willst. Das ist ein Prioritätencoder und damit reine Kombinatorik... Beschreib doch einfach mal dein eigentliches Problem und nicht irgendwelche halbgaren Lösungsansätze...
Danke für die vielen Antworten. Lothar Miller schrieb: > Ich habe den Verdacht, dass du eigentlich gar keinen Zähler oder > sonstwas brauchst, sondern nur z.B. eine führende '1' in einem Vektor > finden willst. Das ist ein Prioritätencoder und damit reine > Kombinatorik... Also ich habe zwei Zahlen und möchte wissen wievielfach größer die eine Zahl ist, d.h -wie oft ich die eine mit 2 multiplizieren muss bis eine max. 2mal größer ist (!=2). oder -wann die erste 1 kommt in beiden Zahlen und Differenz davon berechnen oder - 00101011 -> 3, 01000001 -> 2 => 1 (most significant bit links) ich wollt das nun mit
1 | if (zahleins(1)=1) then |
2 | stelle<=1 |
3 | else if (zahleins(2)=1) |
4 | stelle<=2 |
5 | else if (zahleins(3)=1) |
6 | stelle<=3 |
7 | ....
|
Ihevf schrieb: > -wie oft ich die eine mit 2 multiplizieren muss bis eine max. 2mal > größer ist (!=2). Ist immer die selbe der beiden Zahlen größer als die Andere? Oder kann mal die Eine größer sein, und mal die Andere? Sind das vorzeichenlose Zahlen? Hier eine Gedankenskizze:
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.numeric_std.ALL; |
4 | :
|
5 | signal z1,z2 : unsigned(7 downto 0); |
6 | signal stelle : unsigned(7 downto 0); |
7 | :
|
8 | process (z1, z2) |
9 | variable g,k,s: integer; |
10 | begin
|
11 | if (z1>z2) then -- Erst mal die grössere bzw. kleinere Zahl festlegen |
12 | g := to_integer(z1); |
13 | k := to_integer(z2); |
14 | else
|
15 | g := to_integer(z2); |
16 | k := to_integer(z1); |
17 | end if; |
18 | |
19 | s := 0; |
20 | for i in 0 to 7 loop -- max. 8 Stellen abklappern |
21 | if (k<g) then -- solange die kleinere Zahl noch kleiner ist |
22 | k := k*2; -- verdoppeln |
23 | s := s+1; -- und mitzählen |
24 | end if; |
25 | end loop; |
26 | |
27 | stelle <= to_unsigned(s,8); |
28 | |
29 | end process; |
hi Danke für deine Antwort, aber mir wurde gesagt, dass wir keine variablen nutzen können. Und es ist mal die eine und mal die andere größer. Es sind beide vorzeichenlose Zahlen.
Ihevf schrieb: > aber mir wurde gesagt, dass wir keine variablen nutzen können. Naja, halb so schlimm, dann musst du einfach die Schleife aufrollen und das Ganze von Hand machen...
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.numeric_std.ALL; |
4 | :
|
5 | signal z1,z2,stelle: integer; |
6 | :
|
7 | process (z1, z2) |
8 | begin
|
9 | if (z1>z2) then -- Erst mal die grössere bzw. kleinere Zahl festlegen |
10 | if (z2*2 > z1) then stelle <= 1; |
11 | elsif (z2*4 > z1) then stelle <= 2; |
12 | elsif (z2*8 > z1) then stelle <= 3; |
13 | :
|
14 | else
|
15 | if (z1*2 > z2) then stelle <= 1; |
16 | elsif (z1*4 > z2) then stelle <= 2; |
17 | elsif (z1*8 > z2) then stelle <= 3; |
18 | :
|
19 | end if; |
20 | end process; |
Hi Lothar, Lothar Miller schrieb: > if (z2*2 > z1) then stelle <= 1; > elsif (z2*4 > z1) then stelle <= 2; > elsif (z2*8 > z1) then stelle <= 3; das hat ich auch als Möglichkeit in betracht gezogen. Aber man hat da ja immer eine Multiplikation bzw. Verschiebung und einen Größenvergleich (alle bits werden überprüft) mit drin. ich habs jetzt so gemacht:
1 | if (z1(0) = '1') then stelle<="00000000"; |
2 | elsif (z1(1) = '1') then stelle<="00000001"; |
3 | elsif (z1(2) = '1') then stelle<="00000010"; |
4 | ...
|
mit 32-bit-Zahlen ist das ein sehr hübscher code... Danke an alle
Ihevf schrieb: > if (z1(0) = '1') then stelle<="00000000"; > elsif (z1(1) = '1') then stelle<="00000001"; > elsif (z1(2) = '1') then stelle<="00000010"; Das ist jetzt ja nur das führende Bit, danach muß auch noch ein Vergleich kommen. > Aber man hat da ja immer eine Multiplikation bzw. Verschiebung Da taucht in der Hardware keine einzige Multiplikation auf, denn eine Multiplikation mit 2 ist in der Hardware einfach eine etwas andere Verdrahtung der Bits... > und einen Größenvergleich (alle bits werden überprüft) mit drin. Den Vergleich brauchst du sowieso, und den bekommt der Synthesizer schon optimiert...
Lothar Miller schrieb: > Das ist jetzt ja nur das führende Bit, danach muß auch noch ein > Vergleich kommen. aber das reicht doch, oder nicht? Wenn ich von beiden Zahlen das führende Bit bestimmt habe und die Bit-Differenz "x" berechnet habe, weiß ich dass wenn ich die kleinere Zahl mit 2^x multipliziert habe, dass eine der beiden Zahlen weniger als das 2-fache der Anderen ist (und mehr als das einfache).
Wäre das nicht mit einem XOR mit nachgeschaltetem Prioriätsencoder sehr elegant zu lösen? Man bräuchte wohl noch etwas weitere Logik die hinterher sagt in welche Richtung geschoben werden muss.
Ihevf schrieb: > aber mir wurde gesagt, dass wir keine > variablen nutzen können. Und da du ja die Variablen nur als Zwischensignal, nicht als Speicher, verwenden wuerdest, koenntest du ja auch mit Signalen und concurrent Anweisungen arbeiten...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.