"Puls" in VHDL senden

Gast #2076709
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)
Gast #2076778
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.
Gast #2076812
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.
Gast #2076822
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?
#2076871
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.
Gast #2076894
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.
Gast #2077109
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
Moderator (Firma: Titel) Persönliche Seite #2077183
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...
Gast #2078181
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
        ....
Moderator (Firma: Titel) Persönliche Seite #2078377
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;
Moderator (Firma: Titel) Persönliche Seite #2078500
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;
Gast #2078531
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
Moderator (Firma: Titel) Persönliche Seite #2078538
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...
Gast #2078556
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren