Forum: FPGA, VHDL & Co. Verilog newbie Flankenerkennung/Johnsoncounter


von Ulrich K. (jesuz)


Lesenswert?

Hallo,

ich bin gerade dabei Verilog zu lernen, allerdings habe ich das Problem
das ich bisher noch nicht wirklich sehr viel in Digitaltechnik gelernt
habe. Es geht bei mir um ein BA Studium und der Betrieb verlangt von
mir Verilog zu lernen, wobei ich in meiner Theorie Phase bisher noch
nicht sehr viel in Digitaltechnik also mit Logik Gattern zu tun hatte.


Meine frage ist nun, wie man eine Flankenerkennung programmiert bzw.
Wie diese aufgebaut ist und welche Funktionsweise sie hat.  Das gleiche
moechte ich gern interessehalber fuer den Johnson Bit Counter wissen.
Ich habe quasi das problem das ich ein Schieberegister habe welches ich
in einer STate Machine betreiben muss. Im Zustand Shift moechte ich
genau 10 mal shiften und danach in einen anderen Zustand wechseln. Ich
moechte aber keine Integer Variable nutzen die ich einfach bis 8
Inkrementiere bzw. von acht auf null dekrementiere, da ich denke das
dies einen haufen logik erfordert und ich der meinung bin es muss auch
einfacher gehen. Deshalb moechte ich gerne etwas ueber den Johnson
Zaehler wissen :)

Die flankenerkennung wuerde mich auch sehr stark interessieren, auch
wenn ich weiss das Verilog dies schon automatisch macht mit posedge
clk... ich waere euch sehr sehr dankbar :)

vlg

der Ulrich

von Alban (Gast)


Lesenswert?

Ich gehe mal davon aus der Code soll synthesierbar sein und zur
Flankenerkennung geht es nicht darum die Flanke des Clocksignals zu
erkennen, sondern die irgendeines anderen Signals.

Ein Weg für die steigende Flanke ist dieser:

...

input signal;

reg   signal_reg;
wire  edge;

always @(posedge clk) begin
 signal_reg <= signal;
end

always edge = signal & ~signal_reg;


Das Signal edge signalisiert eine steigende Flanke des Eingangssignals
signal.

von Frank H. (hunkete)


Lesenswert?

Alban wrote:
> Ein Weg für die steigende Flanke ist dieser:
>
> ...
>
> input signal;
>
> reg   signal_reg;
> wire  edge;
>
> always @(posedge clk) begin
>  signal_reg <= signal;
> end
>
> always edge = signal & ~signal_reg;
>
>
> Das Signal edge signalisiert eine steigende Flanke des Eingangssignals
> signal.

Ich glaube, das funktioniert so nicht sicher.
Angenommen, signal steigt kurz vor einer postiven Taktflanke auf HIGH. 
Edge geht dann mit etwas Verzögerung erst nach der Taktflanke auf High 
und wird dann gleich wieder durch die Übernahme von signal in das 
Register signal_reg zurückgesetzt. Damit kann der HIGH-Pegel von edge 
nicht bei einer positiven Taktflanke berücksichtigt werden.
Wie man die Erkennung sicher durchführen kann, zeigt der Artikel 
http://www.mikrocontroller.net/articles/VHDL_Flankenerkennung

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.