Symulator bramek logicznych
Cele
Zadaniem symulatora bramek logicznych będzie prezentacja działania prostego obwodu zbudowanego z bramki AND, NOT oraz OR. Za pomocą LED będzie sygnalizowany stan na wejściach i wyjściach z poszczególnych bramek. Układ przeznaczony jest do celów dydaktycznych, będzie uruchamiany przez zegar binarny w określonych porach dnia z uwagi na pracę w gablocie.
Kliknij by prześledzić przebieg realizacji projektu.
Rys. Symulator bramek logicznych
1. Projekt sieci logicznej
Symulacja działania sieci logicznej powinna być możliwie prosta i zarazem interesująca z dydaktycznego punktu widzenia. Przyjęto iż na wejściu sygnał logiczny będzie analizowany przez bramkę AND i bramkę NOT a ich wyjścia poddane zostaną analizie przez bramkę OR.
Układ zatem będzie realizował następującą funkcję logiczną (A&&B)||¬C .
Rys. Schemat sieci logicznej
Tablica prawdy układu przedstawia się następująco:
2. Projekt urządzenia
Urządzenie będzie symulować działanie układu poprzez zapalenie LED na wejściu i wyjściu bramek. Diody będą umieszczone w schemacie układu logicznego. Zapalenie LED oznaczać będzie stan wysoki (T) natomiast LED wyłączony oznaczał będzie stan niski (F). Urządzenie będzie symulować podanie na wejście wszystkich stanów logicznych z tabeli prawdy układu, prezentowane będą stany wewnątrz układu (między bramkami) oraz stan wyjścia z sieci bramek.
Rys. Projekt urządzenia
2.1. Projekt PCB
Urządzenie zostało zaprojektowane z zastosowaniem podzespołów montowanych metodą przewlekaną (THT). Płyta PCB jest z jedną warstwą ścieżek, jej rozmiar wynosi 78mm na 84mm.
Rys. Projekt płytki PCB urządzenia
2.3. Podzespoły urządzenia
Głównym podzespołem realizującym symulację sieci logicznej jest mikrokontroler PIC16F84A taktowany rezonatorem kwarcowym o częstotliwości 4 MHz. Wejście zasilające zostało zabezpieczone diodą prostowniczą. Stabilizację napięcia do poziomu 5V zapewnia układ LM7805 wraz z kondensatorami C1 i C2.
Tab. Wykaz podzespołów
Oznaczenie | Wartość |
R1 do R7 | 4,7kΩ |
C1 | 0,33uF |
C2 | 0,1uF |
C3, C4 | 22pF |
D1 do D6 | LED |
D7 | 1N4007 |
U1 | PIC16F84A |
X1 | 4 MHz (kwarc) |
2.4. Kod programu
Pojedyncze piny mikrokontrolera do których podłączono LED zostały nazwane zgodnie z nazwami LED z projektu PCB. Umożliwia to ich łatwiejszą identyfikację w kodzie.
#define LED1 PIN_B1
#define LED2 PIN_B2
#define LED3 PIN_B4
#define LED4 PIN_B6
#define LED5 PIN_B5
#define LED6 PIN_B7
Funkcja wyłączająca wszystkie LED została nazwana clear_led.
void clear_led(){
output_low(LED1);
output_low(LED2);
output_low(LED3);
output_low(LED4);
output_low(LED5);
output_low(LED6);
}
Funkcja testująca poprawne działanie wszystkich LED nosi nazwę test_led. Zapala ona wszystkie LED na 0,9s a następnie je wyłącza.
void test_led(){
output_high(LED1);
output_high(LED2);
output_high(LED3);
output_high(LED4);
output_high(LED5);
output_high(LED6);
delay_ms(900);
output_low(LED1);
output_low(LED2);
output_low(LED3);
output_low(LED4);
output_low(LED5);
output_low(LED6);
}
Włączenie lub wyłączenie LED (oznaczające stan logiczny) na wejściu bądź wyjściu bramki realizuje funkcja gate_pin_state. Przyjmuje ona jako parametr nazwę LED oraz stan jaki ma zostać wyświetlony (1 bądź 0).
void gate_pin_state(unsigned int Pin, boolean s){
if (s == 1) output_high(Pin);
if (s == 0) output_low(Pin);
}
Działanie bramki AND realizuje funkcja and_gate. Jako parametry przyjmuje stany na obu wejściach bramki, funkcja zwraca wynik logicznej funkcji mnożenia.
short int and_gate(short int a, short int b){
gate_pin_state(LED1, a);
gate_pin_state(LED2, b);
short int c = 0;
if (a == 1 && b == 1) c = 1;
gate_pin_state(LED4,c);
return c;
}
Działanie bramki NOT realizuje funkcja not_gate. Jako parametr przyjmuje stan na wejściu bramki, zwraca wynik logicznej funkcji negacji.
short int not_gate(short int a){
gate_pin_state(LED3, a);
short int c = 0;
if (a == 1) c = 0;
if (a == 0) c = 1;
gate_pin_state(LED5,c);
return c;
}
Działanie bramki OR realizuje funkcja or_gate. Jako parametr przyjmuje stany na obu wejściach bramki, zwraca wynik logicznej funkcji suma.
short int or_gate(short int a, short int b){
//gate_pin_state(LED4, a);
//gate_pin_state(LED5, b);
short int c = 0;
if (a == 1) c = 1;
if (b == 1) c = 1;
gate_pin_state(LED6,c);
return c;
}
Funkcja main() po podłączeniu zasilania do układu odczekuje 0,9 sekundy i wywołuje funkcję testującą LED. Po teście następuje oczekiwanie przez 0,9 sekundy.
delay_ms(900);
test_led();
delay_ms(900);
Następnie wewnątrz funkcji main zadeklarowano trzy zmienne z tablicami zawierającymi wszystkie możliwe kombinacje stanów, które mogą zostać podane na wejście symulowanego układu.
short int a[] = {1,0,1,0,1,0,1,0};
short int b[] = {1,1,0,0,1,1,0,0};
short int c[] = {1,1,1,1,0,0,0,0};
Następnie mikrokontroler wykonuje program w niekończącej się pętli while.
Pobiera on kolejno osiem stanów z tablic a[], b[] i c[] wartości wejściowe dla poszczególnych bramek; AND i NOT, zapisując wyniki operacji na tych bramkach w zmiennej an i no, by następnie przekazać je na wejście bramki OR. Po ukończeniu prezentacji ośmiu możliwych stanów wejściowych i dokonaniu symulacji, układ rozpoczyna ponownie pobieranie od początku danych z tablic stanów.
while(true)
{
int x;
for(x=0;x<8;x++){
delay_ms(DELAY);
clear_led();
short int an = and_gate(a[x],b[x]);
short int no = not_gate(c[x]);
or_gate(an,no);
delay_ms(DELAY);
}
}
3. Pliki
Pliki projektu.
Noty katalogowe.