You are on page 1of 4

PDekoder

R O J E KRC5
TY

Dekoder RC5 z interfejsem


SPI, opisany w jzyku Verilog,
cz 2
AVT-545
W artykule przedstawiono
sprztowy dekoder protokou
RC5 z interfejsem rwnolegym
oraz szeregowym interfejsem
kompatybilnym z SPI, opisany w
jzyku Verilog i zrealizowany z
wykorzystaniem ukadw CPLD
firmy Xilinx.
Rekomendacje:
atyku polecamy wszystkim
zainteresowanym projektami
realizowanymi na ukadach
programowalnych. Oprcz tego,
e ostatecznym rezultatem
opisu jest kompletny projekt
dziaajcego dekodera
RC5, to dodatkowo jest tu
zaprezentowane projektowanie w
jzyku Verilog.

Elektronika Praktyczna 1/2005

Szeregowy interfejs SPI

Budujc sprztowy dekoder RC5


z wykorzystaniem ukadw PLD,
mona wyposay go w szeregowy
interfejs kompatybilny z SPI. Interfejs ten moe by przydatny w
przypadku wsppracy dekodera z
mikrokontrolerem (odciajc mikroprocesor z realizacji zadania dekodowania protokou RC5) lub innymi
urzdzeniami peryferyjnymi.
Szeregowy interfejs SPI (Serial
Peripheral Interface) do transmisji
danych wykorzystuje trzy linie: CS
wybr danego urzdzenia SPI (aktywny poziom niski), SCK sygna
zegarowy, SO wyjcie danych.
Za porednictwem interfejsu SPI
dane przesyane s w sposb synchroniczny. W pewnym uproszczeniu dziaanie interfejsu mona opisa nastpujco: transmisj danych
inicjuje ukad nadrzdny ustawiajc
lini CS ukadu podrzdnego w
stan niski. Ukad podrzdny ustawia wwczas lini wyjciow S0
w stan odpowiadajcy pierwszemu
transmitowanemu bitowi (bit najbardziej znaczcy przesyany jest jako
pierwszy). Stan linii S0 moe by
prbkowany przez ukad nadrzdny
podczas opadajcego zbocza sygnau
zegarowego SCK. Ukad podrzdny
moe zmienia stan linii wyjciowej tylko wwczas, gdy sygna SCK

generowany przez ukad nadrzdny


znajduje si w stanie niskim. Wygenerowanie impulsu na linii SCK
przez ukad nadrzdny powoduje
pojawienie si na linii S0 kolejnego
transmitowanego bitu, itd.
Na list. 3 przedstawiono kod w
jzyku Verilog opisujcy dziaanie
interfejsu szeregowego SPI dla ukadu sprztowego dekodera RC5.
Przedstawiona na list. 3 implementacja interfejsu szeregowego
wykorzystuje rejestr przesuwny z
wpisem rwnolegym. Jak wykazay
dowiadczenia, tego typu realizacja
interfejsu zajmuje relatywnie duo
zasobw sprztowych ukadu programowalnego (co jest istotne w przypadku implementacji na tanich uka-

Rys. 7. Alternatywna realizacja interfejsu SPI

31

Dekoder RC5
List. 3. Wirtualny komponent realizujcy interfejs SPI dla ukadu
podrzdnego
module spi_core(clk,data,cs,sck,s0);
input clk,cs,sck;
input [13:0] data;
output s0;
reg [15:0] sreg;
reg f1,f2;
always @(posedge clk)
begin
if(~cs)
begin
//jeeli linia CS znajduje si w stanie
niskim
end

if(~f1) begin f1=1; f2=0; sreg=data;

//rwnolegy wpis do rejestru przesuwnego sreg


//wartoci danych wejciowych podczas
opadajcego
//zbocza sygnau CS
if(~sck&&f2)
begin
sreg={sreg[12:0],sreg[13]};
f2=0; //zeruj ag f2
//rejestr przesuwny sreg przesuwany
jest podczas gdy
//SCK zmieni swj stan na niski
end
if (sck&&~f2) f2=1;
//jeeli SCK zmieni poziom na wysoki
ustaw ag f2
end
else f1=0;
// jeli CS=1, zeruj ag f1
end
end
assign s0=sreg[13];
//SO to najstarszy bit rejestru przesuwnego
endmodule

dach programowalnych klasy CPLD,


wyposaonych w niewielkie zasoby
logiczne). Mona jednak zastosowa
nieco prostsz konstrukcj interfejsu,
tak jak zilustrowano to na rys. 7.
Zamiast rejestru przesuwnego mona wykorzysta licznik sprzony z
multiplekserem. Wystpienie zbocza
opadajcego na linii CS spowoduje
wyzerowanie licznika. Wyjcia licznika poczone s z wejciami wyboru multipleksera. Pojawienie si
impulsw na wejciu zegarowym
licznika spowoduje zwikszanie wartoci licznika i odpowiadajce tej
wartoci poczenie wyjcia multipleksera z jednym z wej danych
multipleksera. Efekt kocowy bdzie
identyczny jak z uyciem rejestru
przesuwnego. Na list. 4 przedstawiono kod w jzyku Verilog opisujcy
tak realizacj interfejsu SPI.
Na rys. 8 przedstawiono ilustracj
sposobu dziaania interfejsu SPI zrealizowanego wedug opisu z list. 3.
Liczba bitw interfejsu jest dostosowana do dugoci ramki protokou RC5 i wynosi 14 bitw. Dlatego
te w przypadku, gdy na linii SCK
interfejsu wystpi wicej ni 14 impulsw, wwczas dane pojawiaj si
na wyjciu od pocztku (czyli po
najmniej znaczcym bicie kodu polecenia RC5 pojawia si pierwszy
bit startu, itd.).

32

Dziaanie interfejsu SPI z list. 4


jest analogiczne, przy czym po 14
bitach ramki danych RC5, w przypadku dalszego taktowania linii SCK,
pojawiajc si dwa bity, ktrych warto zawsze jest rwna 0 i dopiero wwczas kolejne bity ramki RC5
transmitowana jest od pocztku.
Dane z interfejsu SPI mog by
odczytywane w dowolnej chwili z
szybkoci wyznaczon przez ukad
nadrzdny (mikrokontroler). Jednak
w przypadku interfejsu z list. 3 maksymalna czstotliwo impulsw na
wejciu SCK musi by mniejsza ni
czstotliwo taktowania na wejciu
zegarowym (clk) interfejsu. W przypadku implementacji interfejsu wedug list. 4, czstotliwo impulsw
na linii SCK moe by znacznie
wiksza ni czstotliwo taktowania na wejciu clk (licznik, bdcy
gwnym elementem interfejsu, taktowany jest bezporednio impulsami z
linii SCK, podczas gdy pomocniczy
sygna taktujcy clk wykorzystywany
jest tylko do wykrywania opadajcego zbocza sygnau na linii CS).
Na list. 5 przedstawiono dodatkowo kod rdowy funkcji, napisanej w jzyku C dla mikrokontrolera,
dziki ktrej mona odczyta dane
z przedstawionego powyej interfejsu SPI. Funkcja zwraca pene 14 bitw ramki danych RC5.

Przykadowa aplikacja

Wykorzystujc opisane powyej


wirtualne komponenty dekoderw
RC5 oraz interfejsu SPI mona zbudowa rzeczywisty, sprztowy dekoder protokou RC5. Na rys. 9 przedstawiono przykadowy schemat elektryczny takiego ukadu, a na rys. 10
widok pytki drukowanej.
Jako ukad programowalny wybrano tutaj Xilinx CPLD z rodziny
XC9500XL typu XC9572XL w obudowie VQFP44. Ukad zasilany jest
napiciem 3,3 V, ale od strony wej
akceptuje napicia o standardzie
TTL. Jako stabilizator 3,3 V zastosowano typowy stabilizator uniwersalny typu LM317 z odpowiednio
dobranymi wartociami rezystorw
okrelajcymi warto napicia wyjciowego. W ukadzie wytwarzania
przebiegu taktujcego pracuje typowy, czterokocwkowy (w metalowej
obudowie) zintegrowany generator
zegara o czstotliwoci 2 MHz (mona zastosowa generator o innej
czstotliwoci, ale wwczas naley
odpowiednio zaprogramowa dzielni-

List. 4. Alternatywna implementacja interfejsu SPI


module spi_core(data,clk,cs,sck,s0);
input cs,clk,sck;
input [13:0] data;
output s0;
wire [3:0] qcntr;
cntr4 c1(.sck(sck),.clk(clk),.q(qcntr),.
cs(cs));
mux m1(.data(data),.sel(qcntr),.out(s0));
//denicja sposobu poczenia licznika i
multipleksera
//(konkretyzacja moduw licznika i multipleksera)
endmodule
//denicja moduu licznika
module cntr4(cs,clk,sck,q);
input sck,clk,cs;
output [3:0] q;
reg [3:0] q;
reg clrcnt,f;
wire rst;
always @(posedge clk)
begin
if(~cs&&f)
begin
f=0; clrcnt=1;
end
else clrcnt=0;
//sygna zerowanie clrcnt dla licznika
ustawiany
//w momencie wystpienia zbocza opadajcego na CS
if(cs&&~f) f=1;
end
assign rst=~clrcnt; //zmiana polaryzacji
always @(negedge sck or negedge rst)
begin
if(~rst) q=4d0;
//asynchroniczne zerowanie licznika
else
q=q+1;
//inkrementacja licznika
end
endmodule
//opis behawioralny moduu multipleksera
module mux(data,sel,out);
input [13:0] data;
input [3:0] sel;
output out;
reg out;
always @(sel or data)
begin
case (sel)
4d0: out=data[13];
4d1: out=data[12];
4d2: out=data[11];
4d3: out=data[10];
4d4: out=data[9];
4d5: out=data[8];
4d6: out=data[7];
4d7: out=data[6];
4d8: out=data[5];
4d9: out=data[4];
4d10: out=data[3];
4d11: out=data[2];
4d12: out=data[1];
4d13: out=data[0];
4d14: out=0;
4d15: out=0;
endcase
end
endmodule

List. 5. Funkcja odczytu danych z


interfejsu SPI, napisana w jzyku
C dla mikrokontrolera
unsigned int spi_rx(void)
{
char j, b;
unsigned int w;
w=0;

CS=0;
SCK=0;
for (j=0;j<14;j++)
{
SCK=1;
w<<=1; b=SO; w|=b;
SCK=0;
}
CS=1;
return w;

Elektronika Praktyczna 1/2005

Dekoder RC5
List. 6. Kompletny sprztowy dekoder RC5 z interfejsem SPI
module top(clock,in,cs,sck,s0,rdy,ld,C,A
,T);
//denicja portw we - wy
input clock,in,cs,sck;
output ld,s0,rdy,T;
output [4:0] A; // adres RC5
output [5:0] C; // kod polecenia
wire clk;
reg rc5ready;
wire [13:0] rc5code;

Rys. 8. Ilustracja dziaania interfejsu SPI

ki czstotliwoci dla ukadu dekodera RC5, ktry musi by taktowany


z czstotliwoci 1 MHz). Do przetwarzania sygnaw podczerwieni,
nadawanych przez pilota zdalnego
sterowania, wykorzystano zintegrowany odbiornik podczerwieni firmy
Vishay (TSOP1736). Na list. 6 przedstawiono kod rdowy w jzyku
Verilog moduu implementujcego
dekoder RC5 i interfejs SPI.
Po zaimportowaniu do rodowiska
EDA dla ukadw programowalnych
kodw rdowych z list. 5 moduu nadrzdnego w hierarchicznej
strukturze projektu oraz jednego
z moduw dekodera RC5 (ktrych
kody rdowe zamieszczono na
list. 1 i 2) i moduu interfejsu SPI
(list. 3 lub 4), i jeszcze przypisujc portom wejcia/wyjcia moduu
nadrzdnego odpowiednie numery
kocwek ukadu PLD kompletny
projekt mona podda kompilacji.
Jako rodowisko EDA wykorzystano tutaj pakiet Xilinx ISE w wersji
5.2i. W wyniku procesu kompilacji
(implementacji) otrzymuje si plik w

standardowym, dla ukadw CPLD,


formacie JEDEC, ktry suy do zaprogramowania nieulotnej pamici
konfiguracji w danym ukadzie PLD.
Zastosowany ukad PLD posiada
moliwo programowania w systemie ISP (In-System Programming),
poprzez intefejs JTAG, ktrego odpowiednie linie wyprowadzono na zcze JP2 pytki drukowanej. W celu
zaprogramowania ukadu mona wykorzysta uniwersalny programator
ISP opisany w Elektronice Praktycznej 1/2004 lub te prosty programator, ktrego schemat mona znale
w dokumentacji firmy Xilinx (programator ten by opisany rwnie w
Elektronice Praktycznej 4/2001).
Po zaprogramowaniu ukadu PLD
sprztowy dekoder RC5 jest gotowy
do pracy. Poprawne odebranie przez
dekoder ramki danych protoko u RC5 sygnalizowane jest krtkim
migniciem diody LED. Jednoczenie na wyjciu RDY (zcze JP3)
pojawia si w tym momencie stan
wysoki. Na zczu JP5 wystpuj
kolejne bity (C0...C5) kodu polece-

clock_divider cd1(.clock(clock),.
clk(clk));
//konkretyzacja moduu dzielnika czstotliwoci
//sygna clk ma teraz czstotliwo 1MHz
rc5decoder dec(.clk(clk),.in(in),.rdy(rdy),.rc5code(rc5code));
//konkretyzacja opisanego wczeniej moduu dekodera
assign ld=rdy; //dioda LED poczona z
sygnaem rdy
assign C={rc5code[5],rc5code[4],rc5code[3],rc5code[2],
rc5code[1],rc5code[0]};
//przypisanie do odpowiednich wyj kodu
polecenia RC5
assign A={rc5code[10],rc5code[9],rc5code[8],rc5code[7],rc5code[6]};
//przypisanie adresu urzdzenia RC5
assign T=rc5code[11];
//bit informujcy o przytrzymaniu klawisza w pilocie
spi_core spi1(.clk(clk),.cs(cs),.
sck(sck),.s0(s0),.data(rc5code));
//konkretyzacja moduu interfejsu SPI
endmodule
//modu dzielnika czstotliwoci
module clock_divider(clock,clk);
input clock;
output clk;
reg q;
always @(posedge clock)
begin
q=~q;
end
assign clk=q;
endmodule

Rys. 9. Schemat ideowy ukadu sprztowego dekodera RC5

Elektronika Praktyczna 1/2005

33

Dekoder RC5
to pokazano na list. 7.
W tym przypadku adres urzdzenia
RC5 odebrany z ramki danych porwnywany jest z adresem
odczytanym z zewntrznych kocwek
ukadu dekodera (stan
linii A0...A4 zcza
JP3). Jeeli oba adresy
s zgodne, wwczas
ustawiane jest wyjcie RDY (zcze JP3)
i na krtk chwil
Rys. 10. Schemat montaowy pytki drukowanej
zapala si dioda LED.
dekodera
Na wyjciach C0...C5
oraz T dostpne s
nia RC5 oraz bit T (informujcy o
wwczas odpowiednie dane. Dane
przytrzymaniu klawisza w pilocie),
odczytane za pomoc interfejsu SPI
a na zczu JP4 dostpne s bity
dostpne s niezalenie od tego,
adresu urzdzenia (A0...A4). Zdeczy oba adresy urzdze RC5 s
kodowane bity ramki danych RC5
zgodne, czy te nie.
mona rwnie odebra poprzez
Na kolejnych rysunkach przedwbudowany interfejs SPI (linie CS,
stawiono przebiegi czasowe w wySCK, SO zcza JP3).
branych punktach sprztowego deSprztowy dekoder RC5 mona
kodera RC5 otrzymane za pomoc
rwnie tak skonfigurowa, by odbieanalizatora stanw logicznych. Na
ra tylko ramk danych z okrelonym
rys. 11 pokazano przebiegi czasowe
adresem urzdzenia RC5 (podobnie
dla ukadu dekodera opisanego kojak robi to wycofany ju z produkdem z list. 1. Pierwszy kana anacji ukad SAA3049 firmy Philips). W
lizatora ilustruje stan sygnau wejtym celu wystarczy nieco zmieni
ciowego dekodera (wyjcie zintegrokod w module nadrzdnym tak jak
wanego odbiornika podczerwieni) w
momencie nadawania ramki danych
List. 7. Kod sprztowego dekodeRC5 z kodem polecenia rwnym
ra RC5 akceptujcego okrelony
01h oraz adresem urzdzenia 16h.
adres urzdzenia RC5
Drugi kana przedstawia zachowanie
module top(clock,in,cs,sck,s0,rdy,ld,C,A,T);
input clock,in,cs,sck;
sygnau onair (list. 1 sygna wyoutput ld,s0,rdy,T;
prowadzono na zewntrzne kocwinput [4:0] A;
output [5:0] C;
ki ukadu PLD). Sygna ten odpowire [4:0] rc5addr;
wiada sygnaowi z wyjcia monowireg [5:0] C;
wire clk;
bratora z rys. 3. Jego opadajce zboreg T,ready;
wire rdy;
cze wyznacza moment prbkowania
wire [13:0] rc5code;

WYKAZ ELEMENTW
Rezystory (SMD 1206)
R1: 240 V
R2: 390 V
R3: 820 V
R4: 120 V
Kondensatory (SMD 1206)
C1, C2: 100 nF
C3: 220 nF
Pprzewodniki
U1: XC9572XL-VQ44
U2: LM317 (TO-92)
U3: generator 2 MHz
U4: TSOP1736
D1: LED (SMD1206)
Inne
JP1: ARK-2/3,5 mm
JP2, JP3, JP4: gold pin

sygnau wejciowego przez rejestr


przesuwny (czyli stan dekodowanego
bitu). Trzeci kana analizatora ilustruje przebieg sygnau na wejciu
rdy. Poziom wysoki na tym wyjciu
oznacza pomylne zakoczenie dekodowania ramki danych RC5.
Na rys. 12 przedstawiono przebiegi czasowe w ukadzie sprztowego dekodera RC5 wykorzystujcego
ide automatu sekwencyjnego (kod
z list. 2). Kanay pierwszy i ostatni analizatora stanw logicznych
ilustruj zachowanie sygnaw wejciowego in oraz wyjciowego rdy.
Na pozostaych kanaach widoczne
s przebiegi sygnaw okrelajce
rodzaj zdarzenia dla automatu sekwencyjnego wykorzystywanego do
dekodowania protokou RC5 (sygnay: lg duga przerwa, sg krtka przerwa, lp dugi impuls, sp
krtki impuls).
Zbigniew Hajduk

clock_divider cd1(.clock(clock),.clk(clk));
rc5decoder dec(.clk(clk),.in(in),.rdy(rdy),.rc5code(rc5code));
spi_core spi1(.clk(clk),.cs(cs),.sck(sck),.
s0(s0),.data(rc5code));
assign rc5addr={rc5code[10],rc5code[9],
rc5code[8],rc5code[7],rc5c
ode[6]};
//wydzielenie adresu urzdzenia
always @(posedge clk)
begin
if(rdy)
begin
if(rc5addr==A)
begin
//jeeli zgadza si adres RC5 z adresem ustawionym
//na liniach zewntrznych ukadu PLD

Rys. 11. Przebiegi czasowe w ukadzie dekodera RC5 zaimplementowanego wedug kodu z list. 1

C={rc5code[5],rc5code[4],rc5code[3],
rc5code[2],
rc5code[1],rc5code[0]};
T=rc5code[11];
ready=1;
end
end
else ready=0;
end
assign ld=ready;
endmodule

34

Rys. 12. Przebiegi czasowe w ukadzie dekodera RC5 zaimplementowanego wedug kodu z list. 2

Elektronika Praktyczna 1/2005

You might also like