Forum: FPGA, VHDL & Co. "Puls" in VHDL senden


von Ihevf (Gast)


Lesenswert?

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)

von Klaus (Gast)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

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.

von Ihevf (Gast)


Lesenswert?

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.

von Ihevf (Gast)


Lesenswert?

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?

von Christian R. (supachris)


Lesenswert?

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.

von Ihevf (Gast)


Lesenswert?

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.

von Falk Brummer (Gast)


Lesenswert?

>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

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


Lesenswert?

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

von Ihevf (Gast)


Lesenswert?

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

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


Lesenswert?

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;

von Ihevf (Gast)


Lesenswert?

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.

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


Lesenswert?

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;

von Ihevf (Gast)


Lesenswert?

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

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


Lesenswert?

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

von Ihevf (Gast)


Lesenswert?

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

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


Lesenswert?

Ihevf schrieb:
> aber das reicht doch
Stimmt, das reicht... ;-)

von Klaus T. (gauchi)


Lesenswert?

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.

von berndl (Gast)


Lesenswert?

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

von Ihevf (Gast)


Lesenswert?

uhm, ich glaub die zwei Vorschläge übersteigen meine derzeitigen 
VHDL/Digitalelektronik-Kenntnisse.

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.