Aktualizacja: 2015-04-03

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.

 

Symulator bramek logicznych

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 .

 schemat sieci logicznej

Rys. Schemat sieci logicznej

Tablica prawdy układu przedstawia się następująco:

tablica prawdy układu

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.

Symulator bramek logicznych 

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.

Projekt PCB symulatora bramek logicznych 

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.

Wyślij komentarz