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.