Zanim przejdę do omówienia budowy i zasady działania licznika, omówię podstawowy element z którego się je buduje, przerzutnik D.
Przerzutnik typu D (data lub delay) występuje w dwóch wersjach, LATCH oraz FLIP-FLOP. Różnica polega na tym że LATCH jest wyzwalany poziomem a FLIP-FLOP zboczem.
LATCH w momencie podania sygnału wysokiego na wejście CLK (często jest zwane E od enable), przerzutnik jest przeźroczysty, każda zmiana stanów logicznych na wejściu D jest przekazywana na wyjście Q. W momencie zmiany sygnału zegarowego (CLK lub E) na niski, stan przerzutnika zostaje zatrzaśnięty i nie zmienia się w momencie zmiany stanu logicznego na wejściu D.
FLIP-FLOP ustala swój stan tylko w momencie zmiany sygnału zegarowego CLK z niskiego na wysoki, nazywa się to wyzwalanie zboczem narastającym. W tym momencie stan z wejścia D jest przekazywany na wyjście Q.
Obydwa przerzutniki posiadają dodatkowe wyjście QN, na tym wyjściu jest zanegowany stan wyjścia Q, czyli odwrotny, jeśli na Q jest 1, to na QN jest 0 i odwrotnie jak na Q jest 0 to na QN będzie 1.
Poniżej przedstawiam przerzutnik D FLIP-FLOP na bramkach NAND oraz wykres z symulacji.
Do budowy układów nie polecam samodzielnie wykonanych przerzutników z bramek, odpowiednie przerzutniki są w bibliotekach Quartusa dla układów Altery oraz XILINX ISE/VIVADO dla układów Xilinxa.
Poniżej przerzutnik D-FF z biblioteki oraz wykres z symulacji.
Do budowy liczników i rejestrów przesuwnych, stosuje się przerzutniki D typu FLIP-FLOP, czyli tych wyzwalanych zboczem. Należy tylko przerobić taki przerzutnik na dzielnik częstotliwości, Wykonuje to się podłączając do wejścia D wyjście QN, takie sprzężenie zwrotne powoduje że przy każdym narastającym zboczu przerzutnik zmieni stan na przeciwny. Działa to tak, jeśli na wyjśiu Q mamy 1 to na wyjściu QN mamy 0 które jest podawane na wejście D, w momencie pojawienia się zbocza narastającego, stan z wejścia D (w tym momencie 0) jest przekazywany na wyjście Q. Skoro na wyjściu Q jest 0 to na QN będzie 1, ta jedynka będzie przekazywana na wejście D. W momencie pojawienia się kolejnego zbocza narastającego, jedynka z wejścia D będzie przekazana na wyjście Q... itd... itd...
Kilka przerzutników można połączyć w jeden większy n bitowy licznik, każdy przerzutnik odpowiada za jeden bit, poniższy schemat i symulacja 4 bitowego licznika powinna rozwiać wszelkie wątpliwości.
[FPGA] MAXimator - Licznik
[FPGA] MAXimator - Licznik
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Gott weiß ich will kein Engel sein.
Re: [FPGA] MAXimator - Licznik
Poniżej załączam przykład licznika w VHDL'u dla MAXimatora, do wejścia pdłączony jest przycisk L expandera, do wyjścia 4 diody LED na płycie głównej.
Mała UWAGA, nie jest zastosowany debouncer, każde naciśnięcie przycisku generuje kilka, kilkanaście impulsów przez co licznik nie jest w stanie zliczać pojedynczych naciśnień. Kod w VHDL generuje identyczny układ jak wyżej pokazany licznik z przerzutników D FF.
Mała UWAGA, nie jest zastosowany debouncer, każde naciśnięcie przycisku generuje kilka, kilkanaście impulsów przez co licznik nie jest w stanie zliczać pojedynczych naciśnień. Kod w VHDL generuje identyczny układ jak wyżej pokazany licznik z przerzutników D FF.
Kod: Zaznacz cały
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity counter is
Port ( x : in STD_LOGIC;
y : out STD_LOGIC_VECTOR(3 downto 0)
);
end counter;
architecture logic of counter is
begin
process(x)
variable counter: STD_LOGIC_VECTOR (3 downto 0);
begin
if rising_edge(x) then
counter := counter + 1;
end if;
y <= counter;
end process;
end logic;
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Gott weiß ich will kein Engel sein.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości