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?:
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
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
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.numeric_std.ALL;
4
:
5
signalz1,z2:unsigned(7downto0);
6
signalstelle:unsigned(7downto0);
7
:
8
process(z1,z2)
9
variableg,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
endif;
18
19
s:=0;
20
foriin0to7loop-- max. 8 Stellen abklappern
21
if(k<g)then-- solange die kleinere Zahl noch kleiner ist
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
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.numeric_std.ALL;
4
:
5
signalz1,z2,stelle:integer;
6
:
7
process(z1,z2)
8
begin
9
if(z1>z2)then-- Erst mal die grössere bzw. kleinere Zahl festlegen
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')thenstelle<="00000000";
2
elsif(z1(1)='1')thenstelle<="00000001";
3
elsif(z1(2)='1')thenstelle<="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...