Forum: FPGA, VHDL & Co. Digitales MonoFlop


von Tilman (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

ich benötige ein digitales Monoflop, das ich in ein FPGA brennen möchte.
Das Monoflop soll auf eine positive Flange von Input triggern. 
Anschliessend soll es um einige Taktzyklen von Clk verzögern. Das machen 
I58 und I59.

Die Zeitverzögerung funktionieren. I59 bleibt allerdings auf High, so 
dass I67 nicht auf neue Flanken an Input triggert (bei t=7,3s).

Wie sieht ein vollständig funktionierendes Design aus ?
Danke

Tilman

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


Lesenswert?

> ich benötige ein digitales Monoflop, das ich in ein FPGA brennen möchte.
Monoflops (und eigentlich alles, was mit Zeiten zu tun hat) in FPGAs 
sind Zähler, die von einem Ereignis zurückgesetzt werden und dann eine 
bestimmte Zeit lang (=bestimmte Anzahl Takte) hochzählen.

> Wie sieht ein vollständig funktionierendes Design aus ?
Zeichne mal ein korrektes Timing-Diagramm und markiere wesentliche 
Punkte.
Welche Programmiersprache?

von Tilman (Gast)


Angehängte Dateien:

Lesenswert?

>Monoflops (und eigentlich alles, was mit Zeiten zu tun hat) in FPGAs
sind Zähler, die von einem Ereignis zurückgesetzt werden und dann eine
bestimmte Zeit lang (=bestimmte Anzahl Takte) hochzählen.
Ich habe es mit 2 Toogle-FlipFlops probiert, die nur dann ein Taktsignal 
erhalten, wenn I67 gesetzt ist. Nach dem Hochzählen der 2 ToggleFlip 
wird I67 zurückgesetzt.
Dann wäre I67  wieder bereit für einen neues Signal an Input -- wenn 
auch das Reset-Signal für I67, das im Timimg Diagram bei Pulse1 gezeigt 
wird, auf 0 zurückkehren würde.

Ich habe ein weiteres Timing Diagram angehängt. Grün sind die Anteile 
der Signale, die sich wie erwartet verhalten. Rot zeigt das 
Sollverhalten.

Progammiersprache: Entweder Gatterlogic (ich habe die im ersten Posting 
mit ispLever classig erzeugt) oder vhdl.

Danke

Tilman

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


Angehängte Dateien:

Lesenswert?

Du willst also asynchron ein FF sofort mit der steigenden Flanke eines 
externen Signals setzen, und nach 2 Takten wieder zurücksetzen?
Analog zur Impulsgewinnung von 
http://www.lothar-miller.de/s9y/archives/19-Kurzer-Spike-in-Puls-umgewandelt.html 
schlage ich das mal vor:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
entity Monoflop is
5
    Port ( clk : in  STD_LOGIC;
6
           input : in  STD_LOGIC;
7
           output : out  STD_LOGIC);
8
end Monoflop;
9
10
architecture Behavioral of Monoflop is
11
signal sr0    : std_logic := '0';
12
signal sr1    : std_logic := '0';
13
signal sr2    : std_logic := '0';
14
signal merkin : std_logic := '0';
15
begin
16
   -- Merker-FF -- so funktioniert das bombensicher, 
17
   -- allerdings ist der Eingang für 1 Takt blind: solange sr2='1' ist
18
   process (sr2, input) begin
19
      if (sr2 = '1') then 
20
         merkin <= '0';
21
      elsif rising_edge(input) then 
22
         merkin <= '1'; 
23
      end if;
24
   end process;
25
26
   -- Asynchrones Merker-FF eintakten
27
   process begin
28
      wait until falling_edge(clk);
29
      if(sr2='1') then 
30
         sr0 <= '0'; 
31
         sr1 <= '0'; 
32
         sr2 <= '0'; 
33
      else
34
         sr0 <= merkin; 
35
         sr1 <= sr0; 
36
         sr2 <= sr1; 
37
      end if;
38
   end process;
39
   
40
   -- Monoflop-Impuls ausgeben
41
   output <= merkin;
42
end Behavioral;
Was noch nicht ganz klar ist:
Soll das Monoflop retriggerbar sein? Aus deinem Timing-Diagramm geht 
hervor, dass das offenbar nicht gewünscht ist...
Aber was soll passieren, wenn (ziemlich) genau gleichzeitig das 
Eingangssignal weggeht und der Ausgang zurückgesetzt werden soll?

Fragen zum Bild: Warum wird bei der Markierung 1 das Monoflop nicht 
wieder gestartet? Was wäre, wenn der Puls bei Markierung 2 einen Hauch 
später käme? Warum müsste dann ein 2. Impuls ausgegeben werden?

Insgesamt: Es erschliesst sich (zumindest mir) der Sinn des Ganzen 
nicht.
Was willst du genau erreichen? Woher kommt das Signal und was soll 
daraus werden?

von Tilman (Gast)


Lesenswert?

Hallo

a) das Monoflop muss nicht retrigerbar sein
b) Markierung 1: Das ist ein Zeichenfehler meinerseits - das Monoflop 
soll entgegen meiner Zeichnung erneut getriggert werden.
c) Markierung 2: Das Monoflop würde wieder getriggert werden, wenn der 
Impuls am Input ein Hauch später kommen würde
d) Zum Sinn: Ich möchte ein FPGA-Logik für ein Businterface 
programmieren. Die Steuersignal (z.B.  CS) kommen kurz und relativ 
selten. Bei direkter Verbindung durch das FPGA mit Debug-LEDs würde ich 
die Signale nicht sehen -- deswegen die zeitliche Verlängerung.

Viele Grüsse

Tilman

von Christian R. (supachris)


Lesenswert?

Tilman schrieb:

> d) Zum Sinn: Ich möchte ein FPGA-Logik für ein Businterface
> programmieren. Die Steuersignal (z.B.  CS) kommen kurz und relativ
> selten. Bei direkter Verbindung durch das FPGA mit Debug-LEDs würde ich
> die Signale nicht sehen -- deswegen die zeitliche Verlängerung.

Sowas "debuggt" man in der Simulation. Für Testzwecke implementiere ich 
immer ein schreibbares Register, was die LEDs auf dem Testboard 
ansteuert und ein lesbares, was die Position der evtl. vorhandenen 
Schalter/Taster wiedergibt. Dafür braucht man kein Monoflop. Du kannst 
dann die LEDs mit einem Schreibbefehl steuern.

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


Lesenswert?

> a) das Monoflop muss nicht retrigerbar sein
Es schadet nichts, wenn es retriggerbar ist?
Du willst nur sichergehen, dass du einen einzelnen CS nicht übersiehst. 
Wenn aber 100 schnell nacheinander kommen, dann reicht es aus, wenn die 
LED 1x aufleuchtet?

von Tilman (Gast)


Lesenswert?

Es schadet nicths, wenn es regtriggerbar ist
Derzeit will ich sehen, ob überhaupt ein Signal kommt. Die Anzahl der 
Signale ist mehr erstmal nicht wichtig bzw. die kann ich über Lese- und 
Schreibzugriffe zeitlich steuern.

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


Lesenswert?

Wie wärs dann, wenn du mit dem oben erwähnten Spikedetektor einfach 
einen Zähler zurücksetzt, der dann bewirkt, dass solange der Endwert 
nicht erreicht ist eine LED leuchtet.

von Tilman (Gast)


Lesenswert?

Hallo Lothar

Der obige Code funktioniert gut (jedenfalls bisher :-))

Vielen Dank erstmal
Tilman

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.