logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Implementacja portu szeregowego w układach programowalnych

Kubald 10 Sie 2012 13:58 4056 3
  • Implementacja portu szeregowego w układach programowalnych

    Autor poprzednio opisywanego projektu zaproponował również sposób łączenia programowalnych układów logicznych z komputerem przez interfejs szeregowy RS232. Przykładowe urządzenie będzie odbierało kody ASCII wysyłane przez komputer i wyświetlało odpowiednie symbole na wyświetlaczu 7-seg. W układzie wykorzystano źródło sygnału zegarowego o częstości 25,175 MHz i układ MAX233A do translacji napięć interfejsu szeregowego na poziom logiki +5V.

    Implementacja portu szeregowego w układach programowalnych

    Na schemacie układu wyróżniono 4 podstawowe bloki: zasilacz +5V (układ zasilany jest z baterii 9-woltowej), konwerter MAX233A (do translacji napięć z poziomu +12V RS232 do poziomu +5V TTL), programowalny układ logiczny (EPM7182SLC84 Altery) i oscylator 25,175 MHz (taka wartość została wybrana „losowo”, każdy oscylator powyżej 10 MHz będzie odpowiedni do pracy w tym urządzeniu).

    Autor omówił również sposób działania portu szeregowego i przesyłania danych przez niego. Do zobrazowania, jak wyglądają przebiegi w czasie przesyłu danych - liczb „1” (dec 49, bin 0110001) i „5” (dec 53, bin 0110101) - użyto oscyloskopu. Standardowa transmisja RS232 składa się z bitu startowego, 8 bitów danych (kodu ASCII) i bitu stopu.

    W trakcie wysyłania znaku „1” i „5” przez port szeregowy paczka danych składa się z bitu startowego (+5V->0V), 8 bitów danych (LSB jako pierwszy bit), bitu stopu (0V) i znacznika końca transmisji (0V->+5V). Szczegółowy przebieg pokazano na poniższych obrazkach.

    Implementacja portu szeregowego w układach programowalnych

    Implementacja portu szeregowego w układach programowalnych

    Program dla układu CPLD składa się z dwu modułów: dekodera kodów ASCII i modułu odbierania danych. Obydwa moduły zostały napisane w języku VHDL.

    Moduł dekodera ASCII:
    Kod: VHDL
    Zaloguj się, aby zobaczyć kod


    Moduł odbierania danych:
    Kod: VHDL
    Zaloguj się, aby zobaczyć kod


    Na poniższym nagraniu pokazano działające urządzenie.




    Urządzenie jest prostym przykładem zaimplementowania interfejsu RS232 w układzie CPLD. Co prawda interfejs RS232 jest już przestarzałym sposobem komunikacji, ale wciąż można znaleźć komputery wyposażone w porty szeregowe i testować budowę urządzeń wyposażonych w odpowiednie dla nich interfejsy. Może to stanowić wstęp do implementowania trudniejszych protokołów komunikacji, jak IIC, SPI, USB czy CAN.

    Źródło

    Fajne? Ranking DIY
    O autorze
    Kubald
    Poziom 15  
    Offline 
    Specjalizuje się w: spektroskopia exafs/xanes, uc, it
    Kubald napisał 188 postów o ocenie 112. Mieszka w mieście Kraków. Jest z nami od 2004 roku.
  • #2 11198383
    ostrytomasz
    Poziom 24  
    Poprawcie mnie jeśli się mylę (VHDL od dawna nie używałem) ale ta implementacja wygląda naiwnie: próbkuje w momentach w których wypada zbocze (z dokładnością zegara procesu, ale to jednak najgorszy możliwy moment) i nie zapewnia jakiejkolwiek odporności na zakłócenia.
  • #3 11202887
    michal.bedzin
    Poziom 15  
    Fakt, ta implementacja jest bardzo nie odporna na zakłócenia w postaci impulsów. Wystarczy że taki impuls będzie trwał 2 okresy zegara i już na pewno rozpoczynamy odczyt danych. Ale tak mi się wydaje że nie miała to być najlepsza implementacja UART'u w VHDL'u tylko taka którą można wpakować do CPLD i jeszcze do tego transkoder z ASCII na 7-seg. Jeżeli miałaby być bardziej odporna na zakłócenia w postaci szpilek, należałoby albo uśredniać wartość wejścia (bardzo zasobożerne) albo zmiejszyć częstotliwość zegara próbkującego sygnał startu tak aby była >= niż f nyqusita sygnału. Tak mi się z góry wydaje, ale nie jestem pewien czy i to by było najlepsze rozwiązanie.
  • #4 11206275
    poorchava
    Poziom 18  
    Częstotliwość kwarcu nie może być jakakolwiek. Powinna to być całkowita wielokrotność 1.8432 MHz, aby umożliwić generację baud rate z zerowym błędem.

    Próbkowanie w środku impulsu tez jest prosto zrobić. Jak znany jest baud rate to czekamy na pierwsza zmianę stanu a następnie po upływie połowy przewidywanego okresu impulsu próbkujemy.

    Altera MAX to wcale nie takie małe CPLD :)
REKLAMA