mikrocontroller.net

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


Autor: Ihevf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ihevf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ihevf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?:
process(rising_edge(clk))
begin
...
end process

oder kann man ein on/off signal senden?

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ihevf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brummer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Ihevf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
if (zahleins(1)=1) then
   stelle<=1
else if (zahleins(2)=1)
   stelle<=2
else if (zahleins(3)=1)
   stelle<=3
        ....

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;
:
signal z1,z2 : unsigned(7 downto 0);
signal stelle : unsigned(7 downto 0);
:
process (z1, z2)
variable g,k,s: integer;
begin
  if (z1>z2) then  -- Erst mal die grössere bzw. kleinere Zahl festlegen
     g := to_integer(z1);
     k := to_integer(z2);
  else
     g := to_integer(z2);
     k := to_integer(z1);
  end if;  

  s := 0;
  for i in 0 to 7 loop   -- max. 8 Stellen abklappern
     if (k<g) then       -- solange die kleinere Zahl noch kleiner ist 
        k := k*2;        -- verdoppeln
        s := s+1;        -- und mitzählen
     end if;
  end loop;
     
  stelle <= to_unsigned(s,8);

end process;

Autor: Ihevf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;
:
signal z1,z2,stelle: integer;
:
process (z1, z2)
begin
  if (z1>z2) then  -- Erst mal die grössere bzw. kleinere Zahl festlegen
     if    (z2*2 > z1) then stelle <= 1;
     elsif (z2*4 > z1) then stelle <= 2;
     elsif (z2*8 > z1) then stelle <= 3;
     :
  else
     if    (z1*2 > z2) then stelle <= 1;
     elsif (z1*4 > z2) then stelle <= 2;
     elsif (z1*8 > z2) then stelle <= 3;
     :
  end if;  
end process;

Autor: Ihevf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
if (z1(0) = '1') then stelle<="00000000";
elsif (z1(1) = '1') then stelle<="00000001";
elsif (z1(2) = '1') then stelle<="00000010";
...

mit 32-bit-Zahlen ist das ein sehr hübscher code...


Danke an alle

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Ihevf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ihevf schrieb:
> aber das reicht doch
Stimmt, das reicht... ;-)

Autor: Klaus T. (gauchi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Ihevf (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.