Współczesne układy cyfrowe zdominowane zostały przez mikroprocesory oraz w mniejszym stopniu przez układy FPGA lub inne sekwencyjne automaty stanów. Przez taki stan rzeczy prawie w każdym cyfrowym urządzeniu spotkać można jakąś postać przemysłowej lub dedykowanej magistrali systemowej. Magistral te mają ma kluczowe wpływ na wydajność opartych na nich systemach. Bardzo często są wąskim gardłem systemu i to najczęściej one określają czy dany układ scalony zostanie zastosowany w projektowanym systemie. W tym artykule poddano analizie zagadnienia związane z magistralami oraz dostarczono wskazówek umożliwiających na wybór najlepszej opcji przy projektowaniu systemów opartych o układy FPGA.
Do wyboru jest wiele magistral. Aby przybliżyć problem przedstawiono ogólne informacje o magistralach używanych w sprzęcie elektronicznym.
Magistrale w zależności od zastosowań można podzielić na wiele kategorii. Jedną nich jest podział na magistrale zewnętrzne i wewnętrzne.
Wewnętrzne magistrale systemowe to magistrale używane w układzie scalonym lub w modelu wgranym w układ FPGA. Używa się ich do wymiany danych pomiędzy blokami wewnątrz układu takimi jak procesor, kontroler VGA czy USB. Istnieje wiele typów magistral. Na początku magistrala miała charakter zbliżony do klasycznych magistral równoległych używanych w komunikacji między układami. Jednak z czasem, w celu poprawienia osiągów układów scalonych nastąpiło wyraźne oddzielenie się magistral wewnątrz układowych od standardów używanych na zewnątrz układu.
Jedną z cech ułatwiająca łączenie magistral wewnątrz układów jest niewymuszony ale jednak brak bramek trójstanowych. Takie samo podejście można przyjąć w przypadku magistral zewnętrznych jednak dwukrotne poszerzenie magistrali danych na ogół jest zbyt kosztowne. W przypadku magistral bez buforów trójstanowych, w układach scalonych, dostęp realizuje się poprzez dwa oddzielne jednokierunkowe porty. Inna cecha to szerokość magistrali. Nierzadko zdarza się, że magistrala ma ponad 100 linii danych i adresowych. W układach scalonych szerokość magistrali nie jest krytycznym problemem przy tworzeniu struktury krzemowej dlatego też wiele standardów opiera się właśnie na szerokiej magistrali. Jednak coraz częściej zaczyna się obserwować trend minimalizowania szerokości połączeń wewnątrz układu. Spowodowane jest to tym, że przy dużych układach szeregowy interfejs zajmuje stosunkowo mało powierzchni krzemu więc niewielkim kosztem można znacznie ułatwić tworzenie całego układu.
Za przykład magistral wewnętrznych może posłużyć magistrala AMBA firmy ARM czy magistrala Wishbone bardzo popularna w darmowych modelach dostępnych na stronie
www.opencores.org. Podczas tworzenia prostych projektów nie ma potrzeby używania żadnej skomplikowanej magistrali komunikacyjnej wewnątrz układu FPGA.
Wybierając magistralę jaką należy zastosować w prostym układzie trzeba określić kilka czynników. Dopiero po dokładnej analizie można określić jaki interfejs będzie najlepszy. Pewne pomocne wskazówki umieszczono poniżej:
W przypadku magistral zewnętrznych ilość standardów umożliwiających połączenie układów jest dużo większa niż w przypadku magistral wykorzystywanych wewnątrz układów scalonych czy układów FPGA. Prawie każdy elektronik słyszał o magistralach ISA, PCI, RS232, USB czy SPI. Od początku istnienia cyfrowych układów elektronicznych istniały magistrale wymiany danych pomiędzy modułami. Bardzo szybko okazało się że standardy w tym przypadku są bardzo opłacalne. Standaryzacja magistral, czyli sposoby wymiany danych, poziomów napięć, ograniczeń czasowych bardzo przyśpieszyła rozwój elektroniki. Jest to sprawa oczywista. Niestety na przestrzeni lat nie udało się stworzyć jednej uniwersalnej magistrali wymiany danych, W prawdzie na rynku istnieją wiodące standardy takie jak PCI jednak w tym przypadku każda z nich nadaje się do innych zastosowań. Analizując obecny trend w zewnętrznych magistralach systemowych zauważyć można rozwój ukierunkowany na szybkie szeregowe interfejsy oparte na wspólnej warstwie fizycznej, będącej rozwinięciem standardu LVDS czy CML. Dotyczy to rynku multimediów czyli obejmuje standardy DVI, HDMI czy nowy Display Port oraz inne standardy lub dziedziny gdzie coraz częściej stosuje się serializery/deserializery zwane serdes’ami. We wspomnianych interfejsach często występuje kilka linii szeregowych, jednak nie będzie nadużyciem jeśli magistrale te zostaną zakwalifikowane do magistral szeregowych [2].
W przypadku wolnozmiennych sygnałów nadal popularnych jest wiele typów przeróżnych interfejsów.
W przykładowym układzie jako magistralę zewnętrzną, łączącej mikroprocesor z FPGA i modułem USB, zdecydowano się na klasyczną synchroniczną magistralę adresowo-danych z dodatkowym sygnałem zerującym. Omawianym układem jest system lpc_xc2s_ftdi którego wygląd i schemat blokowy przedstawiono na rysunkach 1 i 2:
Jak widać jest to prosta i wydajna magistrala. Jedyną jej wadą jest stosunkowo duża ilość zajmowanych bitów co może niekiedy być źródłem problemów. Jako alternatywę można użyć prostego interfejsu SPI i komunikację z modułem oprzeć na wbudowanym w mikrokontroler kontrolerze Host-SPI. Jednak zaprojektowanie Device-SPI wewnątrz układu FPGA wcale nie jest takie łatwe, a ze względu na szeregowy charakter magistrali prędkości transmisji również nie należy do najszybszych. Godnym uwagi pomysłem jest połączenie magistrali danych i adresowej na zasadach podobnych jak to ma miejsce w modułach LCD 2x16 i układach pamięciowych takich jak NAND-Flash [1]. Przez takie połączenie uzyskiwane jest zmniejszenie ilości zajmowanych bitów przy jednocześnie niewielkim spadku prędkości.
W tym przypadku najlepszym połączeniem okazało się rozwiązanie z osobną magistralą adresową i danych. Za tym rozwiązaniem przemawia również fakt, że magistrala danych jest współdzielona z układem odpowiedzialnym za transmisję USB, co przy połączeniu z magistralą adresową utrudniłoby transmisje DMA pomiędzy modelem a układem USB. Zrealizowany na tym urządzeniu przykładowy układ okresomierza i częstościomierza nie wymaga dużych transferów danych, jednak projektując system postawiono na uniwersalność rozwiązania. Innym czynnikiem który zadecydował o wyborze magistrali jest duży zapas niewykorzystanych pinów w układach mikrokontrolera i układu FPGA.
Główna magistrala danych systemu przedstawiona została na rysunku:
Jak widać na rysunku 3, do komunikacji mikrokontrolera LPC2148 z FPGA użyto następujących linii sterujących:
W zaprojektowanym układzie mikrokontroler może komunikować się z układem odpowiedzialnym za wymianę danych pomiędzy urządzeniem pomiarowym a komputerem PC. W układzie użyto układu FT245BM firmy FTDI o asynchronicznym interfejsie wymiany danych. Znaczenie sygnałów modułu USB jest następujące:
Na rysunku 4 przedstawiono przebieg sygnałów przy zapisie i odczycie danych do i z układu USB FT245BM przez mikrokontroler:
Zależności czasowe przedstawionych przebiegów dostępne są w dokumentacji układu FT245BM [3].
Fragment kodu źródłowego umożliwiającego komunikację mikrokontrolera
z rejestrami modelu urządzenia pomiarowego przedstawiono na listingu 1:
always@(posedge uc_clk)
begin
if (sys_rst == 1'b1)
begin
//resetowanie_sygnalow_wewnetrznych
end
else
case (uc_adr)
Adres_A:
begin
dane_dla_uc <= rejestr_wewnetrzny_X;
end
Adres_B:
begin
dane_dla_uc <= rejestr_wewnetrzny_Y;
if (uc_wr_n == 1'b0)
begin
rejestr_wewnetrzny_Z <= dane_z_uc;
end
end
endcase
end
Poza znanymi już konstrukcjami języka Verilog komentarza wymagają konstrukcje ściśle powiązane z przykładowym interfejsem przedstawionym na listingu 1.
Zasadę zaprezentowanego modułu można opisać w następujący sposób:
Kod części odpowiedzialnej za komunikację modułu po stronie mikrokontrolera przedstawiono poniżej:
//Stan poczatowy w modelu. Reset modelu
void CoreResetFpga(void){
FIOSET1 = uc_rst | uc_wr | uc_rd;
FIOCLR1 = uc_clk;
FIOSET1 = uc_clk;
FIOCLR1 = uc_rst;
FIOCLR1 = uc_clk;
FIOSET1 = uc_clk;
}//Zapis do rejestru modelu
void CoreWriteByteToFpga(unsigned char address, unsigned char value){
SYS_DATA_DIR = sys_data_out;
UC_ADR_PIN = address;
SYS_DATA_PIN = value;
FIOSET1 = uc_rd;
FIOCLR1 = uc_rst | uc_wr | uc_clk;
FIOSET1 = uc_clk;
FIOSET1 = uc_wr;
SYS_DATA_DIR = sys_data_in;
}//Odczyt z rejestru modelu FPGA
void CoreReadByteFromFpga(unsigned char address, unsigned char *value){
SYS_DATA_DIR = sys_data_in;
UC_ADR_PIN = address;
FIOSET1 = uc_wr | uc_rd;
FIOCLR1 = uc_rst | uc_rd | uc_clk;
FIOSET1 = uc_clk;
*value = SYS_DATA_PIN;
FIOSET1 = uc_rd;
}
W powyzszych przykładach pojawiaja się przypisania zawierające FIOCLR1, UC_ADR_PIN itd. Okreslaja one rejestry mikroprocesora i kryja pod soba definicje:
#define UC_ADR_PIN (*((volatile unsigned char *) 0x3FFFC036))
#define FIOCLR1 (*(volatile unsigned long *) (0x3FFFC03C))
Odpowiednie adresy znajduja się w specyfikacji procesora LPC2148
W przypadku wartości uc_clk, uc_rd itd. ich prawdziwe znaczenie to definicje:
#define uc_clk 0x01000000
#define uc_rd 0x10000000
i oznaczają bit w rejestrze który należy ustawić lub wyzerować
W przypadku wymiany danych pomiedzy mikrokontrolerem a modułem USB przydatne okazują się funkcje:
//Odczytanie pojedynczego bajtu z USB
unsigned char ReadByteFromUsb (void){
unsigned char tmp;
SYS_DATA_DIR = sys_data_in;
while(FIOPIN0 & usb_rxf);
FIOCLR0 = usb_rd;
FIOCLR0 = usb_rd;
FIOCLR0 = usb_rd;
FIOCLR0 = usb_rd;
FIOCLR0 = usb_rd;
tmp = SYS_DATA_PIN;
FIOSET0 = usb_rd;
return tmp;
}//Zapisanie pojedynczego bajtu do USB
void WriteByteToUsb (unsigned char byte){
SYS_DATA_DIR = sys_data_out;
while(FIOPIN0 & usb_txe);
FIOSET0 = usb_wr;
FIOSET0 = usb_wr;
SYS_DATA_PIN = byte;
FIOCLR0 = usb_wr;
FIOCLR0 = usb_wr;
SYS_DATA_DIR = sys_data_in;
}
Podsumowanie i literatura
Nie da się uciec przed magistralami w cyfrowych układach elektronicznych. Stanowią one szkielet prawie każdego zaawansowanego jak i prostego urządzenia. Ich zaprojektowanie wymaga w przypadku dużych projektów wyjątkowej wiedzy, gdyż to właśnie one tworzą szkielet konstrukcji i zapewniają przepływ informacji bez szkodliwych dla systemu wąskich gardeł. Dobrą wiadomością jest to, że bez względu na stopień złożoności projektowanego często to nie one stanowią wyzwanie konstruktora a w przypadku prostych układów są nawet niezauważalne.
Pozycje wykorzystane bezpośrednio do opracowania treści artykułu:
Autorem artykułu jest mgr inż. Krzysztof Fijak