Calculatoare și Tehnologia Informației [606927]
– 1 –
UNIVERSITATEA TEHNICĂ „Gheorghe Asachi” din IAȘI
FACULTATEA DE AUTOMATICĂ ȘI CALCULATOARE
DOMENIUL: Calculatoare și Tehnologia Informației
SPECIALIZAREA: Calculatoare
Dezvoltarea unui controller de mouse care
funcționează conform protocolului PS /2
LUCRARE DE DIP LOMĂ
Absolvent: [anonimizat] – Alexandru
Coordonator științific ,
Ș.I.dr.ing. Monor Călin – Mircea
Iași, 2018
– 2 –
DECLARAȚIE DE ASUMARE A AUTENTICITĂȚII
LUCRĂRII DE DIPLOMĂ
Subsemnatul(a)______________________________ ______________ _______ ,
legitimat(ă) cu _____ seria _____ nr . _____ ,
CNP _________________ ________
autorul lucrării ______________ ______________________________________
__________________________________________________________ ______
elaborată în vederea su sținerii examenului de finalizare a studiilor de licență
organizat de către Facultatea de Automatică și Calculatoare din cadrul
Universității Tehnice „Gheorghe Asachi” din Iași , sesiunea ____________ a
anului universitar _______ , luând în considerare co nținutul Art . 34 din codul de
etică universitară al Universității Tehnice „Gheorghe Asachi” din Iași
(Manua lul Procedurilor , UTI.POM .02 – Funcționarea Comisiei de etică
universitară ), declar pe proprie răspundere , că această lucrare este rezultatul
proprie i activități intelectuale , nu conține porțiuni plagiate , iar sursele
bibliografice au fost folosite cu respectarea legislației române (legea 8/1996) și
a conven țiilor internaționale privind drepturile de autor .
Data Semnătura
________________
– 3 –
Cuprins
Capitolul 1. Rezumatul lucrării ………………………….. ………………………….. ………………………….. ……….. – 4 –
Capitolul 2 . Fundamentarea teoretică și documentarea bibliografică pentru tema propusă ………… – 6 –
2.1 Introducere ………………………….. ………………………….. ………………………….. …………………………. – 6 –
2.2. Tipuri de mouse -uri și de conectori ………………………….. ………………………….. ……………………. – 6 –
2.2.1 Mouse d e magistrală ………………………….. ………………………….. ………………………….. ………….. – 6 –
2.2.2 Mouse serial ………………………….. ………………………….. ………………………….. ……………………… – 7 –
2.2.3 Mouse PS/2 ………………………….. ………………………….. ………………………….. ………………………. – 7 –
2.2.4 Mouse USB ………………………….. ………………………….. ………………………….. ……………………….. – 7 –
2.2.5 Mouse wireless ………………………….. ………………………….. ………………………….. …………………. – 8 –
2.3 Interfa ța fizică ………………………….. ………………………….. ………………………….. ……………………… – 8 –
2.4. Interfața electrică ………………………….. ………………………….. ………………………….. ………………… – 8 –
2.5. Intrări , rezoluție și scalare ………………………….. ………………………….. ………………………….. …….. – 9 –
2.6. Pachetul de date ………………………….. ………………………….. ………………………….. ……………….. – 10 –
2.7. Moduri de funcționare ………………………….. ………………………….. ………………………….. ……….. – 10 –
2.8. Extensia Intellimouse ………………………….. ………………………….. ………………………….. …………. – 11 –
2.9. Setul de comenzi ………………………….. ………………………….. ………………………….. ……………….. – 13 –
2.10. Comunicarea – descriere generală ………………………….. ………………………….. …………………. – 15 –
2.10. Comunicarea : Dispozitiv – Gazdă ………………………….. ………………………….. ……………………. – 16 –
2.11. Comunicar ea : Gazdă – Dispozitiv ………………………….. ………………………….. ……………………. – 17 –
Capitolul 3 . Proiectarea aplicației ………………………….. ………………………….. ………………………….. . – 20 –
3.1. Structura hardware ………………………….. ………………………….. ………………………….. ……………. – 25 –
3.2. Structura software ………………………….. ………………………….. ………………………….. …………….. – 25 –
Capitolul 4 . Implementarea aplicației ………………………….. ………………………….. ……………………… – 30 –
Capitolul 5 . Testarea aplicației și rezultate experimentale ………………………….. ……………………… – 35 –
Capitolul 6 . Concluzii ………………………….. ………………………….. ………………………….. ………………… – 44 –
Bibliografie ………………………….. ………………………….. ………………………….. ………………………….. …. – 45 –
Anexe ………………………….. ………………………….. ………………………….. ………………………….. ………… – 46 –
1.Rezumatul lucrării
– 4 –
Capitolul 1 . Rezumatul lucrării
În decursul anilor , tehnologia s -a dezvoltat brusc determinând astfel înlocuirea , dar nu
dispariția perifericelor care folosesc protocolul PS /2 pentru realizarea comunicației dintre
acestea și un computer , cu periferice care folosesc magistrala serială universală(USB) pentru
realizarea comunicației . Acest proiect v a încerca să demonstreze faptul că perifericele care
utilizează protocolul PS /2 nu ar trebui să dispară complet , deoarece acestea au și unele
avantaje față de perifericele care folosesc USB . De exemplu , porturile PS /2 sunt folosite , din
motive de securitate în mediile corporatiste deoarece permit porturilor USB să fie
dezactivate , prevenind astfel conectarea device -urilor USB malițioase .
Acest proiect are ca scop realizarea co municării dintre un mouse PS2 și un FPGA din
familia Spartan -3 cu ajutorul unui mediu de proiectare folosit pentru sinteza și analiza
circuitelor hardware , Xilinx ISE Design Suite .
Pe parcursul acestui document , se va folosi termenul mai general „gazdă” pentru a se
face referire la FPGA -ul Spartan 3-E, la care se va conecta mouse -ul și termenul „dispozitiv”
pentru a se face referire la mouse .
Interfața mouse -ului PS /2 utilizează un protocol serial bidirecț ional pentru a transmite
mișcările mouse -ului și poziția butoanelor către gazdă . Gazda trimite un număr de comenzi
mouse -ului pentru a seta rezoluția , reseta mouse -ul, dezactiva mouse -ul etc . Interfața mouse –
ului PS /2 suportă următoarele intrări: mișcare pe axa X (stânga /dreapta ), mișcare pe axa Y
(sus/jos) , buton stânga , buton mijloc , buton dreapt a[1].
Când m ouse-ul se mișcă , trimite 3 oc teți de informați prin portul PS /2 către gazdă .
Mouse -ul poate trimite date către gazdă și gazda poate trimite date către mouse , dar gazda are
întotdeauna prioritate asupra magistralei de date și poate inhiba com unicarea oricând ,
menținând clock -ul pe LOW [1].
Xilinx ISE Design Suite : WebPack Edition este un mediu de proiectare aparținând
companiei Xilinx , fiind soluția ideală pentru proiectarea unui FPGA atât pe Linux , cât și pe
Windows . Acest mediu permite sint eză HDL(Limbaj de d escriere hardware) și simulare ,
implementare și programare JTAG . ISE WebPack oferă acces instant la caracteristicile și la
funcționalitățile de care dispune ISE fără niciun cost [2].
Am ales această temă pentru a demonstra că deși perif ericile ce funcționează conform
protocolui PS2 par învechite și nefolositoare , acestea ar putea avea un impact major asupra
viitorului tehnologiei . Controllerul de mouse PS2 va permite mous e-ului să funcționeze în
modul S tream și în modul Reset . Astfel , FPGA-ul utilizat va trebui să decodifice semnalele
primite de la mouse și să aprindă unul din cele opt led -uri de care dispune în funcție de
mișcările mouse -ului(stânga/ dreapta , sus/jos) și în funcție de butonul apăsat(click
stânga/click dreapta) . Pentru realizarea proiectului se va folosi limbajul de descriere
hardware , Verilog .
Antoniu Mihai – Alexandru
– 5 –
Inițial , gazda va reseta mouse -ul trecând linia de clock ”ps2c” pe LOW pentru 100
microsecunde și apoi cedează accesul liniei de clock ”ps2c” mouse -ului. De asemenea , gazda
trece li nia de date ”ps2d” pe LOW . Mouse -ul începe astfel să genereze clock -ul și FPGA -ul
trimite comanda 0xF4 serial pentru a reseta mouse -ul, la frontul negativ al liniei de clock
”ps2c” . După ce resetează mouse -ul, gazda cedează controlul liniei de date către m ouse și
astfel dispozitivul intră în modul implicit de func ționare , modul Stream . Apoi pe măsură ce
dispozitivul se mișcă , gazda va decodifica semnalele recepționate de la mouse . Schema
următoare prezintă funcționarea în asamblu a comunicări între FPGA și mouse.
Figura 1 .1 – Funcționarea în ansamblu a aplicației
2. Fundamentarea teoretică și documentarea bibliografi că pentru tema propusă
– 6 –
Capitolul 2 . Fundamentarea teoretică și documentarea bibliografică
pentru tema propusă
2.1 Introducere
Mouse -ul este unul dintre cele mai importante dispozitive periferice de introdus
comenzi ale computerului (calculatorului electronic) modern. A devenit aproape un "element"
hardware standard al oricărui computer. De obicei mouse -ul este un obiect mic echipat cu una
sau mai multe taste, modelat astfel încât să poată fi apucat și mânuit ușor cu mâna. Principiul
lui de funcționare se bazează pe recunoașterea de către computer a mișcării sale relativă la
suprafața plană pe care este așezat și deplasat[4].
Mișcarea mouse -ului este detectată de un senzor situat în partea sa inferioară,
preluată, dig italizată și apoi printr -o interfață adecvată transmisă computerului la care e
atașat. Informația de mișcare a mouse -ului în spațiul bidimensional (2D) este convertită tot în
mișcare bidimensională (2D) a unui cursor identificator -indicator grafic pe ecran ul unui
monitor. Altfel spus, mișcarea mouse -ului provoacă o mișcare corespunzătoare a cursorului
pe suprafața ecranului monitorului, atașat și el calculatorului. Datorită acestei funcțiuni
utilizatorul mouse -ului poate decide (alege) și indica pe ecranul monitorului orice poziție
dorită, ceea ce de obicei este interpretat de către computer drept o introducere de comandă,
un element major al interfeței grafice cu calculatorul (Graphic User Interface, GUI). De la
începutul anilor 1990 mouse -ul împreună cu ta statura și monitorul au devenit pe plan mondial
una din cele mai obișnuite interfață om -mașină, prezentă aproape la orice computer[4].
2.2. Tipuri de mouse -uri și de conectori
Mouse -ul este un periferic ce controlează mișcarea cursorului pe monitorul unu i
sistem de calcul . Unele mouse -uri vechi aveau două butoane , butonul din dreapta și butonul
din stânga , în timp ce mouse -urile moderne au un al treilea buton de ”scroll” între cele două
butoane . Mouse -ul este un periferic important al calculatorului deoar ece ajută utilizatorul să –
și realizeze mai ușor munca pe un sistem de calcul [3].
2.2.1 Mouse de magistrală
Acesta este primul tip de mouse ce a fost conectat la un sistem de calcul prin intermediul
unei magistrale . Se conecta la calculator cu ajutorul un ei interfețe de magistrală specializată
implementată cu un card ”ISA add -in”. Mouse -ul de magistrală a fost înlocuit de mouse -ul
serial [3].
Figura 2.1 – Adaptor ISA mouse pentru a conecta mouse -ul de magistral ă[3]
Antoniu Mihai – Alexandru
– 7 –
2.2.2 Mouse serial
Acest dispozitiv a fost conectat la sistemul de calcul prin intermediul unui port serial . Un
port serial este o interfață de comunicare fizică prin care informația este transferată în
interiorul calculatorului sau înafara calculatorului bit cu bit [3].
Figura 2.2 – Port se rial folosit de mouse -ul serial [3]
2.2.3 Mouse PS/2
Mouse -ul PS/2 a fost folosi t inițial în sisteme le PS/2 ș i a continuat să fie folosit în
noile proiecte chiar și după ce sistemele PS/2 nu au mai fost în producție . Codul de culoare
pentru portul PS/2 , pentru cele mai multe sisteme de calcul este de regul ă verde [3].
Figura 2.3 – Portul PS2, verde pentru mouse și mov pentru tastatură [3]
2.2.4 Mouse USB
Forma fizic ă și aspectul mouse -ului USB este similară cu a celorlalte mouse -uri.
Singura diferență e ste conectorul folosit pentru conectarea la un port USB din spatele
calculatorului . Portul USB de asemenea furnizează energie electrică dispozitivului atașat ,
eliminând așadar nevoie de energie electrică a conectorilor . Acest port a fost proiectat pentru
a standardiza conexiunea perifericelor calculatorului precum mouse , tastatură , camere
digitale , smartphones , console pentru jocuri video , hard disk extern etc [3].
Figura 2.4 – Porturi USB [3]
2. Fundamentarea teoretică și documentarea bibliografică pentru tema propusă
– 8 –
2.2.5 Mouse wireless
Acesta este ultimul tip de mouse ce nu necesită utilizarea unui cablu pentru
conectarea la portul din spatele calculatorului . Unele din mouse -urile wireless se pot conecta
prin intermediul unui receptor USB , în timp ce alte mouse -uri folosesc conexiunea Bluetooth .
Mouse -ul este alimentat de o p ereche de baterii , de obicei de tipul AA [3].
2.3 Interfa ța fizică
Figura 2.5 – Interfața fizică PS/ 2[5]
2.4. Interfața electrică
Mai întâi vom descrie interfața electrică a conectorului PS /2. VCC/GND furnizeaz ă
alimentarea mouse -ul. Acest dispozitiv nu ar trebui să extragă mai mult de 100 mA de la
gazdă pentru a evita supratensiunile tranzitorii . Aceste supratensiuni sunt cauzate de „hot-
plugging” o tastatură sau un mouse (conectez/deconectez dispozitivul cât timpul calculatorul
este pornit) . Se recoma ndă a nu se conecta/deconecta un mouse sau o tastatură cât timp
calculatorul este pornit . VCC –ul este cuprins între +4 .5V și +5 .5V, iar curentul maxim este
100 mA [5].
Liniile de Dată și de Clock sunt amândouă în ” open -collector” cu rezistențe de
”pullup ” la +5V. O interfață ” open -collector” are două stări posibile: LOW sau înaltă
impedanță . În starea de ”low”, un tranzistor trece linia la nivelul de masă . În starea de ” înaltă
impedanță” , interfața se comportă ca un circuit deschis și nu conduce linia low sau high . Mai
mult, o rezistență de „pullup” este conectată între magistrală și VCC astfel încât magistrala
este trecut ă pe high dacă niciu nul din dispozitivele de pe magistrală nu este trecut activ pe
low. Valoarea exactă a rezistenței nu este prea importa ntă(1 – 10 kOhm) , dar rezistențe mai
mari implică consum mai puțin al energiei în timp ce rezistențele mai mici implică un timp de
creștere mai rapid . O interfață generală de tipul „open -collector” este prezentată în figura de
mai jos [5]:
Antoniu Mihai – Alexandru
– 9 –
Figura 2.6 – Interfață generală „open -collector” [5]
Data și Clock -ul sunt citite de pe pinul A , respectiv pinul B . Ambele linii sunt în mod
normal menținute la +5V , dar pot fi trecute la masă prin inserarea valori ” 1” logic pe C și D .
Ca rezultat Data este egală cu D inv ersat, iar Clock -ul este egal cu C inversat [5].
2.5. Intrări , rezoluție și scalare
Mouse -ul standard PS2 suportă următoarele intrări: X deplasare(stânga/dreapta) , Y
deplasare(sus/jos) , buton stânga , buton mijloc și buton dreapta . Mouse -ul citește aceste
intrări la o frecvență regulată și updatează numero ase numărătoare și flag -uri pentru a reflecta
deplasarea și butoanele de stare . Mouse -ul standard are două numărătoare care țin evidența
deplasării: numărătorul pentru deplasarea pe axa X și numărătorul pen tru deplasarea pe axa
Y. Acestea sunt valori pe nouă biți în complement față de doi și fiecare are asociat un flag de
depășire . Conținutul lor , împreună cu starea celor trei butoane ale mouse -ului sunt trimise
către gazdă sub forma unui pachet de date pe t rei octeți . Numărătoarele de deplasare
reprezintă cantitatea de mișcare ce s -a realizat de la trimiterea către gazdă a ultimului pachet
de date [1].
Când mouse -ul își citește intrările , memorează starea curentă a butoanelor sale și
verifică pentru mișcare . Dacă mișcarea a avut loc se incrementează(pentru deplasări +X sau
+Y) sau se decrementează(pentru deplasări -X sau -Y) numărătoarele pentru deplasările pe
axa X și/sau pe axa Y . Dacă oricare di n cele două numărătoare au ajuns la depășire , se
setează flag-ul corespunzător de depășire . Parametrul care determină cantitatea prin care
numărătoarele de deplasare au fost incrementate sau decrementate este rezoluția . Valoarea
implicită a rezoluției este 4 numărări/milimetru și gazda ar putea schimba această valoa re
folosind comanda ” Set Resolution” (0xE8) . Există un parametru ce nu afectează
numărătoarele de deplasare , dar afectează valoarea raportată a acestor numărătoare . Acest
parametru este scalarea . Implicit , mouse -ul folosește scalarea 1 :1, care nu are nici un efect
asupra mișcării raportate a mouse -ului. Totuși , gazda ar putea selecta scalarea 2:1 prin
trimiterea comenzii ”Set scaling 2 :1”(0xE7) . Dacă scalarea 2 :1 este activată , mouse -ul va
aplica următorul algoritm numărătoarelor înainte ca acestea să trim ită conținutul lor gazdei [1]:
2. Fundamentarea teoretică și documentarea bibliografică pentru tema propusă
– 10 –
Numărător deplasare Deplasare raportată
0 0
1 1
2 1
3 3
4 6
5 9
N > 5 2 * N
2.6. Pachetul de date
Mouse -ul PS2 standard trimite gazdei informați i despre deplasare sau buton folosind
următorul pachet alcătuit din 3 oc teți[1]:
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Octet 1 Y
depășire X
depășire Y bit de
semn X bit de
semn Mereu 1 Buton
mijloc Buton
dreapta Buton
stânga
Octet 2 Deplasare pe axa X
Octet 3 Deplasare pe axa Y
Numărătoarele de deplasare sunt numere întregi pe nouă biți în complement față de
doi, unde bitul cel mai semnificativ are rolul de bit de semn în primul octet al pachetului de
date. Aceste numărătoare se modifică când mous e-ul își citește intrările și depistează că a
avut loc mișcare . Valoarea numărătoarelor este cantitatea de mișcare care a avut loc din
momentul în care ultimul pachet de date a fost trimis gazdei(după ce un pachet este trimis
gazdei , numărătoarele de mișcare sunt resetate) . Domeniul valorile numărătoarelor de
mișcare es te cuprins între -255 și +255 . Dacă domeniul este depășit , bit-ul corespunzător de
depășire este setat . De asemenea , numărătoarele de mișcare sunt resetate după ce mouse -ul a
recepționat orice comandă de la gazdă înafară de comanda „Resend”(0xFE) [1].
2.7. Moduri de funcționare
Mai departe , se prezintă cele patru moduri de funcționare a le mouse -ului PS /2. Data
raportată este manipulat ă în funcție de modul în care funcționează mouse -ul. Există patru
moduri de funcționare și anume :
Reset – Mouse -ul intr ă în m odul Reset la pornir e sau după ce primește comanda
”Reset”(0xFF) [1].
Stream – Acesta este modul implicit(după ce modul Reset și -a terminat execuția) și este
modul în care majoritatea programelor software folosesc mouse -ul. Dacă gazda a setat
anterior mouse -ul în modul Remote , acesta ar putea să reintre în modul Stream prin
trimiterea comenzi ”Set Stream Mode” (0x EA) la mouse [1].
Remote – Modul Remote este folositor î n unele situații și ar putea fi activat prin
trimiterea comenzi ”Set R emote Mode ”(0xF0) la m ouse [1].
Wrap – Acest mod nu este în particular folosit , cu excepția testări conexiuni între mouse
și gazda sa . Modul Wrap poate fi activat prin trimiterea comezi ”Set Wrap Mode”(0xEE)
la mouse . Pentru a părăsi modul Wrap , gazda t rebuie să inițializeze com anda
”Reset”(0xFF) sau comanda ” Reset Wrap Mode”(0xEC) . Dacă comanda ” Reset”(0xFF)
este recepționată , mouse -ul va intra în modul Reset . Dacă comanda ” Reset Wrap
Antoniu Mihai – Alexandru
– 11 –
Mode”(0xEC) este recepționată , mouse -ul va intra în modul care a fost anterior modului
Wrap [1].
A. Modul Reset – modul inițial , în care mouse -ul realizează inițializare și auto -diagnosticare
Mouse -ul intră în modul Reset la ”powe r-on” sau ca răspuns la comanda ” Reset”(0xFF) .
Când intră în acest mod , mouse -ul realizează un test de diagnosticare numit B AT(Basic
Assurance Test) și setează următoare le valori implicite: rată de eșantionare = 100
eșantio ane/secundă , rezoluția = 4 numărări/milimetru , scalare = 1:1, data raportată =
dezactivat . Apoi, mouse -ul trimite un cod de completare BAT și anume 0xAA(BAT reușit)
sau 0xFC(Eroare) . Răspunsul gazdei la un cod de completare înafară de 0xAA este nedefinit .
După codul de completare BAT(0xAA sau 0xFC) , mouse -ul trimite id -ul său de 0x00 . Gazda
nu ar trebui să trimită date până nu primește id -ul dispozitivului . Imediat după ce mouse -ul a
trimis id -ul său gazdei , aceasta intră în modul S tream [1].
B. Modul Stream – modul implicit de funcționare .
În acest mod , dispozitivul trimite date de mișcare când detectează mișcare sau când
detectează o schimbare în stare a unuia sa u a mai multor butoane a mouse -ului. Rata maximă
la care această data ar putea fi raportată este cunoscută drept rată de eșantionare . Domeniu l
acestui parametru este între 10 și 200 eșantioane/secundă . Valoarea implicită a acestu i
parametru este 100 eșanti oane/secundă . Gazda ar putea seta această valoare folosind
comanda ”Set Sample Rate” (0xF3) . Mouse -ul nu va emite orice pachete de date până când nu
recepționează comanda ” Enable Data Reporting”(0xF4) . Dispozitivul recunoaște primirea
comenzii 0xF4 cu coma nda 0xFA . Acesta este modul implicit de funcționare și poate fi setat
folosind c omanda ” Set Stream Mode”(0xEA) [1].
C. Modul Remote
În acest mod , mouse -ul își citește intrările după care își updatează numărătoare le sau flag –
urile la rata de eșantionare curent ă, dar nu emite automat pachete de date când deplasarea a
avut loc . În schimb , gazda trebuie să trimită mouse -ului comanda ” Read Data” . În momentul
în care mouse -ul a primit această comandă , va trimite un singur pachet de date și își va reseta
numărătoarel e de mișcare [1].
D. Modul Wrap
Acesta este un mod de ”echo” în care fiecare octet recepționat de mouse este trimis înapoi
gazdei sale . Chiar dacă octetul reprezintă o comandă validă , mouse -ul nu va răspunde la acea
comandă , doar va replica acel octet înapoi către gazdă . Sunt doar două excepții ale aspectului
prezen tat anterior și anume: comanda ”Reset” și comanda ” Reset Wrap Mode” . Mouse -ul
tratează aceste excepții drept comenzi valide și nu le replică înapoi către gazdă [1].
2.8. Extensia Intell imouse
O ex tensie populară a mouse -ului standard PS/2 este Microsoft Intellimouse . Acesta
include suport pentru un total de cinci butoane ale mouse -ului și trei axe de mișcare(stânga –
dreapta , sus-jos și o rotiță de derulare ). Aceste caracteristici adiționale au nevoi e de utilizarea
2. Fundamentarea teoretică și documentarea bibliografică pentru tema propusă
– 12 –
unui pachet de date format din patru octeți și nu de pachetul standard de trei octeți . Din
moment ce driverele mouse -ului standard PS/2 nu pot recunoaște formatul acestui pachet ,
Microsoft Intellimouse trebuie să funcționeze la fel ca mouse -ul PS/2 cu excepția cazului în
care știe că driverele suportă formatul extins al pachetului . În acest fel , dacă un Microsoft
Intellimouse este folosit la un calculator care suportă doar mouse -ul standard PS/2 , acesta va
continua să funcționeze , cu excepți a rotiței de derulare și a butoanelor patru și cinci [1].
După pornire sau reset , Microsoft Intellimouse funcționează la fel ca un mouse
standard PS/2(folosește un pachet de date format din 3 octeți , răspunde la toate comenzile în
același mod ca mouse -ul standard PS/2 și c omunică id -ul dispozitivului 0x00) . Pentru a intra
în modul ”rotiță de derulare” , gazda trebuie să trimită următoarea secvență de comenzi:
setează rata de eșantionare = 200, setează rata de eșantionare = 100, setează rata de
eșantionare = 80. Apoi, gazda trimite comanda ”Get device ID” și așteaptă pentru un răspuns .
Dacă un mouse standard PS/2 (nu este Intellimouse) este atașat , va răspunde cu id -ul
dispozitivului 0x00 . În acest caz , gazda va recunoaște faptul că mouse -ul are o rotiță de
derulare și va continua să -l trateze ca un mouse standard PS/2 . Totuși , dacă Microsoft
Intellimouse este atașat , va răspunde cu id -ul 0x03 . Acest lucru îi sugerează gazdei faptul că
dispozitivul atașat are o rotiță de derulare și gazda va aștepta ca mouse -ul să folosească
următorul pachet de mișcare format din patru octeți [1]:
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Octet 1 Depășire
pe axa Y Depășire
pe axa X Bitul de
semn
pentru
Y Bitul de
semn
pentru
X Mereu
1 Butonul
din
mijloc Butonul
din
dreap ta Butonul
din
stânga
Octet 2 Deplasare pe axa X
Octet 3 Deplasare pe axa Y
Octet 4 Deplasare pe axa Z
Deplasarea pe axa Z este un număr în complement față de doi ce reprezintă mișcarea rotiței
de derulare din momentul ultimului raport de date. Valori le valide sunt cuprinse în intervalul
-8 și +7 . Acest lucru semnifică faptul că numărul este de fapt , reprezentat doar de ultimii
patru biți mai puțin semnificativi . Cei patru biți mai semnificativi sunt folosiți doar pentru
extensia de semn [1].
Pentru a utiliza modul ”Scrolling wheel și five button” , gazda trimite următoarea
secvență de comandă: setează rata de eșantionare = 200, setează rata de eșantionare = 200,
setează rata de eșantionare = 80. Apoi gazda trimite comanda ”Get device ID” și așteaptă
pentru un răspuns . Microsoft Intellimouse va răspunde cu id -ul dispozitivului 0x04 , apoi va
folosi următorul pachet de date format din patru octeți [1]:
Antoniu Mihai – Alexandru
– 13 –
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Octet 1 Depășire
pe axa Y Depășire
pe axa X Bitul de
semn
pentru
Y Bitul de
semn
pentru
X Mereu
1 Butonul
din
mijloc Butonul
din
dreapta Butonul
din
stânga
Octet 2 Deplasare pe axa X
Octet 3 Deplasare pe axa Y
Octet 4 Mereu 0 Mereu 0 Butonul
5 Butonul
4 Z3 Z2 Z1 Z0
Informații suplimentare [1]:
Z0-Z3 sunt numere în complement față de doi ce reprezintă cantitatea de mișcare care s -a
acumulat de la ultimul raport de date . Valorile valide se încadrează în intervalul -8 și +7 .
Butonul 4: Valoarea 1 dacă butonul 4 este apăsat și Valoarea 0 dacă butonul 4 nu est e
apăsat .
Butonul 5: Valoarea 1 dacă butonul 5 este apăsat și Valoarea 0 dacă butonul 5 nu este
apăsat .
Dacă rotița de derulare pe verticală este folosită pentru derularea în sus , numărăto rul Z
este incrementat cu +1, iar dacă rotița este folosită pentru d erularea în jos , numărătorul Z
este decrementat cu -1. Aceasta este operația normală pentru o rotiță de derulare .
Dacă rotița de derulare pe orizontală este folosită pentru derularea în dreapta , numărăt orul
Z este incrementat cu +2, iar dacă rotița este fo losită pentru derularea în stânga ,
numărătorul Z este decrementat cu -2.
Modul de implementare a rotiței de derulare pe orizontală este mai ciudat , dar
funcționează deoarece modul de dispunere a celor două rotițe nu permite utilizarea lor
simultană .
2.9. Setul de comenzi
În continuare se prezenta setul de comenzi acceptate de către mouse -ul PS2 standard .
Dacă mouse -ul este în modul Stream , gazda ar putea dezactiva raportul de date trimițând
comanda 0xF5 înainte să trimită alte comenzi [1].
0xFF( ”Reset ”) – Mouse-ul răspunde acestei comenzi cu confirmarea 0xFA și intră în
modul Reset [1].
0xFE( ”Resend ”) – Gazda trimite această comandă oricând recepționează dată invalidă de
la mouse . Dispozitivul răspunde prin retrimirea ultimului pachet trimis către gazdă . Dacă
mouse -ul răspunde la comada „Resend” cu alt pachet invalid , gazda ar putea emite o altă
comandă „Resend” , să emite o comandă „Error” , să restarteze mouse -ul sau să inhibe
comunicarea(setând linia de Clock pe LOW) . Acțiunea întreprinsă depinde în totalita te de
gazdă [1].
0xF6( ”Set defaults ”) – Mouse -ul răspunde cu confirmarea(0xFA) apoi încarcă
următoarele valori implicite: rată eșationare = 100 , rezoluție = 4 numărări/mm , scalare =
1:1, dezactivare raport date . Apoi, mouse -ul își resetează numărătoarele de mișcare și
intră în modul Stream [1].
2. Fundamentarea teoretică și documentarea bibliografică pentru tema propusă
– 14 –
0xF5( ”Disable Data Reporting ”) – Mouse -ul răspunde cu confirmarea (0xFA) apoi
dezactivează raportul de date și își resetează numărătoarele de deplasare . Acest aspect
afectează doar raportul de date din modul Stream și nu dezactivează eșantionarea [1].
0xF4( ”Enable Data Reporting ”) – Mouse -ul răspunde cu confirmarea(0xFA) apoi
activează raportul de date și își resetează numărătoarele de mișcare . Acestă comandă
poate fi emisă cât timp mouse -ul este în modul Remote sau în m odul Stream , dar va
afecta raportul de date în modul Strea m[1].
0xF3( ”Set Sample Rate ”) – Mouse -ul răspunde cu confirmarea (0xFA) apoi citește încă
un octet de la gazdă . Dispozitivul salvează acest octet drept noua rată de eșantionare .
După ce recepționeaz ă rata de eșationare , mouse -ul răspunde din nou cu confirmarea
(0xFA) și își resetează numărătoarele de mișcare . Tabelul următor prezintă ratele de
eșantionare ale mouse -ului [6]:
Octetul citit de la gazdă Ratele de eșantionare
0x0A 10 eșatioane pe secund ă
0x14 20 eșantioane pe secundă
0x28 40 eșatioane pe secundă
0x3C 60 eșatioane pe secundă
0x50 80 eșatioane pe secundă
0x64 100 eșatioane pe secundă
0xC8 200 eșatioane pe secundă
După recepționarea celui de al doilea octet , mouse -ul trimite codul de confirmare din nou
și își resetează numărătoarele de mișcare [6].
0xF2( ”Get device ID ”) – Mouse -ul răspunde cu confirmarea(0xFA) urmată de id -ul
dispozitivului(0x00 pentru mouse PS2 standard) . Mouse -ul ar trebui să -și reseteze
numărătoarele de mișcare [1].
0xF0( ”Set Remote Mode ”) – Mouse -ul răspunde cu confirmarea(0xFA) apoi își resetează
numărătoarele de mișcare și intră în modul Remote [1].
0xEE( ”Set Wrap Mode ”) – Mouse -ul răspunde cu confirmarea(0xFA) apoi își resetează
numărătoarele de mișcare și intră în modul Wrap [1].
0xEC( ”Reset Wrap Mode ”) – Mouse -ul răspunde cu confirmare(0xFA) apoi își resetează
numărătoarele de mișcare și intră în modul , în care a fost anterior modului Wrap(modul
Stream sau modul Remote) [1].
0xEB( ”Read Data ”) – Mouse -ul răspunde cu confirmarea(0xFA) apoi trimite un pachet
de date . Aceasta este singura cale pentru a citi date în modul Remote . După ce pachetul a
fost trimis cu succes , dispozitivul își resetează numărătoarele de mișcare [1].
0xEA( ”Set Strea Mode ”) – Mouse -ul răspunde cu confirmare , apoi își resetează
numărătoarele de mișcare și intră în modul Stream [1].
0xE9( ”Status Request ”) – Mouse -ul răspunde cu confirmare , apoi trimite următorul
pachet de status format din trei octeți [1]:
Antoniu Mihai – Alexandru
– 15 –
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Octet 1 Mereu 0 Modul Activare Scalare Mereu 0 Buton
stânga Buton
mijloc Buton
dreapta
Octet 2 Rezoluția
Octet 3 Rată eșantionare
Observații [1]:
Butonul stânga , mijloc și dreapta = 1 , dacă butonul este apăsat; 0 , dacă butonul nu este
apăsat .
Scalarea = 1 , dacă scalarea este 2:1; 0 , dacă scalarea este 1:1 . Mai multe detalii sunt
prezentate la comenzile 0xE7 și 0xE6 .
Activare = 1 , dacă raportul de date este activat; 0 , dacă raportul de date este dezactivat .
Mai multe detalii sunt prezentate la come nzile 0xF5 și 0xF4 .
Modul = 1, dacă modul Remote este activat; 0 , dacă modul Remote este dezactivat . Mai
multe detalii sunt prezentate la comenzile 0xF0 și 0xEA .
0xE8( ”Set Resolution ”) – Mouse -ul răspunde cu confirmarea(0xFA), apoi citește un octet
de la g azdă și din nou răspunde cu confirmarea(0xFA) . La final își resetează
numărătoarele de mișcare . Octetul citit de la gazdă determină rezoluția după cum
urmează [1]:
Octetul citit de la gazdă Rezoluția
0x00 1 numărare/milimetru
0x01 2 numărări/milimetru
0x02 4 numărări/milimetru
0x03 8 numărări/milimetru
0xE7( ”Set Scaling 2:1 ”) – Mouse -ul răspunde cu confirmarea(0xFA) , apoi activează
scalarea 2:1 [1].
0xE6( ”Set Scaling 1:1 ”) – Mouse -ul răspunde cu confirmarea(0xFA) , apoi activează
scalarea 1:1 [1].
În conti nuare , se vor prezenta singurele comenzi ce pot fi trimise de un mouse PS /2 către
gazdă [6].
0x00 – Id-ul mouse -ului;
0xAA – Testul de bază al siguranței la pornire a trecut;
0xFC – Testul de bază al siguranței la pornire a eșuat;
0xFA – Confirmare ;
0xFE – Retrimitere , în momentul recepționării acestui cod , controller -ul PS /2 va
retransmite octetul anterior .
2.10. Comunicare a – descriere generală
În continuare , vom prezenta o descriere generală a transmisiei PS/2. Mouse -ul PS /2
implementează un protocol ser ial bidirecțional . Magistrala de date este în starea „idle” când
ambele linii sunt HIGH ( ”open -collector ”). Aceasta este singura stare unde mouse -ului îi este
permis să înceapă transmiterea de date . Gazda are control total asupra magistralei și ar putea
inhiba comunicarea în orice moment trecând linia de Clock pe LOW [5].
Dispozitivul întotdeauna generează semnalul de clock . Daca gazda vrea să trimită
date, trebuie mai întâi să inhibe comunicarea de la dispozitiv trecând linia de Clock pe LOW .
2. Fundamentarea teoretică și documentarea bibliografică pentru tema propusă
– 16 –
Gazda setează Data pe LOW și eliberează Clock -ul. Aceasta este starea „Request -to-Send” și
semnalizează dispozitivului să înceapă generarea pulsurilor de clock . În următorul tabel vor fi
prezentate toate stările posibile ale magistralei [5].
Data Clock Stări
HIGH HIGH Idle
HIGH LOW Inhibarea comunicării
LOW HIGH Gazdă – „Request -to-Send”
Toate datele sunt transmise ca un octet , la un moment dat și fiecare octet este trimis într –
un cadru format din 11 -12 biți . Acești biți sunt [5]:
1 bit de start . Acesta este mereu 0 .
8 biți de date . Primul este bitul cel mai nesemnificativ(LSB) .
1 bit de paritate . Paritatea este impară .
1 bit de stop . Mereu este 1 .
1 bit de acknowledge . Doar la comunicarea Gazdă – Dispozitiv .
Bitul de paritate este set(1) dacă există un număr par de biți de 1 în biți de date și reset(0)
dacă există un număr impar de biți de 1 în biți de date . Numărul biților de 1 în biți de date
adunat cu bitul de paritate întotdeauna are ca rezultat un număr impar(paritate impară) .
Această informație se folosește la detecția erorilor . Mouse -ul trebuie să verifice acest bit și
dacă este incorect , ar trebui să răspundă ca și cum ar fi primit o comandă invalidă [5].
Precizări suplimentare [5]:
Data trimisă de la dispozitiv la gazdă este citită la frontul negativ al semnal ului de clock .
Data trimisă de la gazdă la dispozitiv este citită la frontul pozitiv al semnalului de clock .
Frecvența clock -ului trebuie să fie între 10 și 16 .7 kHz .
Semnalul de clock trebuie să fie pe HIGH pentru 30 -50 microsecunde și pe LOW pentru
30-50 microsecunde .
Sincronizarea este deosebit de crucial ă.
2.10. Comunicarea : Dispozitiv – Gazdă
În continuare , se va detalia comunicarea Dispozitiv – Gazdă . Liniile de Dată și de
Clock funcționează în ”open -collector ”. O rezistență este conectată între fie care linie și +5V ,
astfel starea „idle” a magistralei de date este HIGH [5].
Atunci când mouse -ul vrea să trimită informații , mai întâi verifică linia de Clock
pentru a se asigura că este la nivelul logic HIGH . Dacă nu este , gazda poate inhiba
comunicarea și dispozitivul trebuie să buffereze orice dată care ar trebui trimisă până când
gazda eliberează Clock -ul. Linia de clock trebuie să fie continuu pe HIGH pentru cel puțin 50
de microsecunde înainte ca dispozitivul să înceapă să transmită date [5].
Mouse -ul folosește un protocol serial cu cadre de 11 biți . Acești biți sunt [5]:
1 bit de start . Acesta este mereu 0 .
8 biți de date . Primul este bitul cel mai nesemnificativ(LSB) .
1 bit de paritate . Paritatea este impară .
Antoniu Mihai – Alexandru
– 17 –
1 bit de stop . Mereu este 1 .
Mouse -ul scr ie câte un bit pe linia de Dată când clock -ul este pe HIGH și este citit de
către gazdă când clock -ul este pe LOW . Acest aspect este ilustrat în următoarea figur ă[5]:
Figura 2.7 – Comunicarea Dispozitiv – Gazdă . Linia de Dată își schimbă starea când Clo ck-
ul este pe HIGH și acea data este validă când Clock -ul este pe LOW [5].
Gazda ar putea inhiba comunicarea în orice moment trecând linia de Clock pe LOW
pentru cel puțin 100 de microsecunde . Dacă o transmisi e este inhibată înainte de al 11 -lea
puls de cl ock, dispozitivul trebuie să renunțe la transmisi a curentă și să se pregatească , să
retransmită „chunk -ul” (fragment ul de informație ) curent de date când gazda eliberează
Clock -ul. Un „chunk” de date poate fi id -ul dispozitivului , pachetul de mișcare , etc. Dacă
gazda setează clock -ul pe LOW înainte de prima tranziție de la HIGH la LOW sau după
frontul negativ al ultimului puls de clock , mouse -ul nu trebuie să retransmită date . Totuși ,
dacă o nouă dată creată trebuie transmisă atunci aceasta va trebui să fie bufferată până când
gazda eliberează Clock -ul. Mouse -ul stochează doar cel mai curent pache t de mișcare pentru
transmisie [5].
2.11. Comunicarea : Gazdă – Dispozitiv
În continuare , se va prezenta cum se realizează comunicarea Gazdă – Dispozitiv .
Astfel pa chetul de date este trimis puțin diferit în comunicarea Gazdă – Dispozitiv [5].
Dispozitivul PS /2 întotdeauna va genera semnalul de clock . Dacă gazda vrea să trimită
date atunci trebuie mai întâi să seteze liniile de Dată și de Clock într -o stare de „Reques t-to-
send” după cum urmează [5]:
Inhibă comunicarea trecând Clock -ul pe LOW pentru cel puțin 100 de microsecunde .
Aplică „Request -to-send” trecând linia de Dată pe LOW , apoi se eliberează clock -ul.
Dispozitivul ar trebui să verifice pentru acestă stare ca intervale le să nu depășească 10
milisecunde . Când dispozitivul detectează această stare , va începe să genereze semnale de
Clock și clock în 8 biți de date și un bit de stop [5].
Gazda schimbă linia de Dată doar când linia Clock -ului est LOW și data este ci tită de
dispozitiv când clock -ul este HIGH . Acest aspect este opusul a ceea ce se întâmplă în
comunicarea Dispozitiv -Gazdă [5].
După ce bitul de stop este primit , dispozitivul va confirma octetul primit trecând linia de
Dată pe LOW și va genera un ultim pul s de clock . Astfel , dacă gazda nu eliberează linia de
Dată după al 11 -lea puls de clock , dispozitivul va continua să genereze pulsuri de clock până
când linia de Dată este eliberată(dispozitivul va genera apoi o eroare) . Gazda ar putea renunța
la transmisi e oricând înainte de al 11 -lea pu ls de clock(bitul de confirmare ) menținând Clock –
2. Fundamentarea teoretică și documentarea bibliografică pentru tema propusă
– 18 –
ul pe LOW pentru cel puțin 100 de microsecunde [5]. Mai departe , se prezintă pașii ce
trebuiesc urmați de gazdă pentru a trimite date unui dispozitiv PS /2[5].
1. Trece linia d e Clock pe LOW pentru cel pu țin 100 de microsecunde ;
2. Trece linia de Dată pe LOW;
3. Eliberează linia de Clock;
4. Așteaptă ca dispozitivul să treacă linia de Clock pe LOW;
5. Setează/Resetează linia de Dată pentru a trimite primul bit de date;
6. Așteaptă dispozitivul să treacă linia de Clock pe HIGH;
7. Așteaptă dispozitivul să treacă linia de Clock pe LOW;
8. Repetă pașii 5 -7 pentru ceilalți biți de date și pentru bitul de paritate;
9. Eliberează linia de Dată;
10. Așteaptă dispozitivul să treacă linia de Dată pe LOW;
11. Așteaptă di spozitivul să treacă linia de Cloc k pe LOW;
12. Așteaptă dispozitivul să elibereze linia de Dată și de Clock .
Următoarea figură prezintă comunicarea Gazdă – Dispozitiv .
Figura 2.8 – Comunicarea Gazdă – Dispozitiv . Linia de Dată își schimbă starea când Cloc k-ul
este LOW și acea dată este validă când Clock -ul este HIGH [5].
Următoarea figură ilustrează care semnale sunt generate de gazdă și care semnale sunt
generate de dispozitivul PS /2.
Figura 2.9 – Comunicarea Dispozitiv – Gazdă detaliată [5].
Antoniu Mihai – Alexandru
– 19 –
Observații privind figura anterioară [5]:
(a) reprezintă timpul necesar dispozitivului pentru a începe să genereze pulsurile Clock –
ului, după ce iniț ial gazda a trecut Clock -ul pe LOW . Acest timp nu trebuie să fie mai
mare de 15 milisecunde .
(b) reprezintă timpul nec esar pachetului pentru a fi trimis . Acest timp nu trebuie să fie
mai mare de 2 milisecunde .
Dacă niciunul din cele două timpuri limită nu sunt îndeplinite , atunci gazda ar trebui să
genereze o eroare . Imediat după ce bitul de confirmare (ACK) este primit , gazda ar putea
să treacă linia de clock pe LOW pentru a inhiba comunicarea cât timp procesează data .
Dacă comanda trimisă de gazdă necesită un răspuns , atunci acest răspuns trebuie
recepționat nu mai târziu de 20 de milisecunde după ce gazda a eliberat lini a de clock .
Dacă nu se întamplă acest lucru , atunci gazda generează o eroare .
3. Proiectarea aplicației
– 20 –
Capitolul 3 . Proiectarea aplicației
Un FPGA (Field Programmable Gate Array) este un circuit integrat digital
configurabil, de către utilizator, după ce a fost fabricat (spre de osebire de dispozivele a căror
funcție este implementată in procesul de fabricație). Configurarea FPGA se face, în general,
cu ajutorul unui limbaj de descriere hardware HDL, similar cu cel folosit pentru dispozivele
ASIC, dezvoltându -se recent și compilat oare care traduc instrucțiuni din limbajul C în
limbaje HDL. Un astfel de compilator este Impulse C. FPGA -urile sunt alcătuite din blocuri
logice configurabile (programabile) legate între ele de o serie de conexiuni configurabile la
rândul lor [12].
Cea ma i comună arhitectură pentru FPGA este constituită dintr -o matrice de blocuri
logice configurabile (CLB -configurable logic blocks), pads I/O și canale de rutare. În general
toate canalele de rutare au aceași lățim e (același numar de conexiuni) [12].
Un bloc logic FPGA clasic este alcătuit dintr -un tabel de căutare cu 4 intrări, un flip -flop și
un multiplexor care selectează fie ieșirea tabelului de căutare, fie ieșirea sincronizată a
acestuia (trecută prin flip -flop) [12].
Figura 3.1 – Structura tipică a un ui bloc logic [12].
După tehnologia folosită în procesul de fabricare e xistă mai multe tipuri de FPGA [12]:
SRAM – au la bază celule SRAM. Pot fi programate/reprogramate odată instalate în
sistem. Sunt volatile.
Antifuse – pot fi programate doar în laborat or, cu un dispozitiv special. Nu pot fi
reprogramate. Nu sunt volatile.
Fuse – pot fi programate doar în laborator, cu un dispozitiv special. Nu pot fi
reprogramate. Nu sunt volatile.
EPROM -Erasable Programmable Read -Only Memory – în mod obișnuit sunt prog ramate
doar o dată. Conținutul lor poate fi șters sub acțiunea razelor ultraviolet. Nu sunt volatile.
EEPROM -Electrically Erasable Programmable Read -Only Memory – similare EPROM
doar că pot fi reprogramate.
Flash – au la bază celule Flash care sunt mai mic i decât cele EEPROM, ceea ce le face
mai ieftine. Sunt reprogramabile. Nu sunt volatile.
Antoniu Mihai – Alexandru
– 21 –
Figura 3.2 – FPGA Spartan 3 -E[8]
Principalele caracteristici ale platformei de dezvoltare sunt [7]:
100-pin Hirose FX2 connector
16-pin header pentru module LCD opționale
16MB Numonyx StrataFlash
2MB ST Microelectronics Serial Flash
64MB Micron DDR SDRAM
DB15HD VGA
JTAG & SPI Flash programare cu cablu paralel sau cu cablu USB JTAG
JTAG programare prin intermediul portului on -board USB2
Linear Technology Power Supplies
Tastatură/Mouse PS/2
RJ-45 Ethernet
SMA connector pentru clock de mare viteză
SMSC LAN83C185 Ethernet PHY
Texas Instruments TPS75003 Triple -Supply Power Management IC
3 porturi 6 -pin Pmod
2 conectori DB9 RS -232
Xilinx Spartan -3E(500K porți) XC3S50 0E FPGA
Platformă Flash Xilinx XCF04 pentru stocarea configurărilor FPGA
Numeroase opțiuni suplimentare pentru configurare
Platforma de dezvoltare Spartan 3E conține un port PS/2 mouse/tastatură și conectorul
standard cu 6 pini mini -DIN, etichetat J14 pe placa de dezvoltare . Figura următoare prezintă
conectorul PS/2 .
3. Proiectarea aplicației
– 22 –
Figura 3.3 – Locația și semnalele conectorului PS2 [8]
Mai departe , vor fi prezentate semnalele de pe conector . Doar pinii 1 și 5 ai
conectorului sunt atașați la FPGA [8].
Pinii conectorulu i PS2 sunt prezentați în următorul tabel [8].
PS/2 Pin Semnal FPGA Pin
1 DATA(PS2_DATA) G13
2 Rezervat G13
3 GND GND
4 +5V –
5 CLK(PS2_CLK) G14
6 Rezervat G13
Mouse-ul un ui PC împreună cu o tastatură folosesc o magistrală serial ă PS/2 cu două
fire pentru a comunica cu dispozitivul gazdă , în ca zul nostru FPGA Spartan 3E . Magistrala
PS/2 include clock -ul, respectiv data [8].
Semnalele de clock și de date sunt conduse doar când transferul de date a avut loc ,
altfel cele două semnale sunt menținute în starea ”idle” , la valoarea logică HIGH .
Sincronizarea definește cerințele semnalului pentru comunicarea mouse – gazdă . După cum
este prezentat în următoarea figură , mouse -ul scrie un bit pe linia de date când sem nalul de
clock este HIGH și gazda citește linia de date când semnalul de clock este LOW [8].
Antoniu Mihai – Alexandru
– 23 –
Sincronizarea pentru magistrala PS/2 este prezentată î n următorul tabel și în figura
3.4[8].
Simbol Parametru Min Max
Timp clock High sau
Low 30 microsecunde 50 microsecunde
Timp Setup data
către clock 5 microsecunde 25 microsecunde
Timp Hold clock
către dată 5 microsecunde 25 microsecunde
Figura 3.4 – Forme de undă pentru sincronizarea magistralei PS/2 [8]
Transferul de date se face atunci când mouse -ul este mișcat sau se când se apasă
butoanele acestuia . În acest caz sunt trimise trei cuvinte . Primul cuvânt indică starea , al
doilea cuvânt indică rata deplasării pe axa X , iar al treilea cuvânt indică rata deplasării p e axa
Y. Semnificația celor trei oc teți este prezentată în figura 3.5 . Dacă mouse -ul este deplasat în
continuu , un set de trei cuvinte este transmis la fiecare 50 de milisecunde [8].
Figura 3.5 – Cuvinte de date transmise de către mouse -ul PS2 [8]
Mous e-ul PS/2 folosește un sistem de coordonate relativ la poziția curentă. Acest
aspect este prezentat în figura 3.6 . O mișcare la stânga a mouse -ului este codificată cu o
valoare negativă, iar o mișcare la dreapta a mouse -ului este codificată cu o valoare po zitivă
pentru axa X. Asemănător, mișcarea în jos a mouse -ului este codificată cu o valoare negativă,
iar mișcarea în sus a mouse -ului este codificată cu o valoare pozitivă pentru axa Y [8].
3. Proiectarea aplicației
– 24 –
Figura 3.6 – Sistemul relativ de coordinate al mouse -ului [8]
În continuare , se va prezenta semnificația biților din cuvântul de stare . L și R indică
apăsarea butoanelor mouse -ului(L –butonul din stânga , R–butonul din dreapta) , iar valoarea
de ”1” logic sugerează apăsarea unui buton al mouse -ului. XS, respective XY ind ică sensul
deplasării pe axa X și pe axa Y . La final , XV și YV indică dacă rata deplasării pe axa X ,
respectiv pe axa Y a dep ășit limita maxim ă(overflow) [8].
Portul PS/2 de pe platforma de dezvoltare , Spartan 3E este alimentat la 5V . Chiar
dacă FPGA -ul Sp artan 3E nu este un dispozitiv tolerant la 5V , poate comunica un dispozitiv
alimentat la 5V folosind o serie de rezistențe limitatoare de curent [8].
Platforma de dezvoltare este compatibilă cu toate versiunile de Xilinx ISE , ce include
și Webpack . După c e s-a analizat , s-a ajuns la concluzia că pentru implementarea aplicației
propuse este nevoie de mediul de dezvo ltare Design Suite ISE ce conține Webpack [2].
Aplicația va fi compusă din modulele de recepție și de transmisie ce vor sta la baza
realizări protocolului PS/2 . Un alt modul important este cel de mouse care va com unica cu
modulul ce realizează protocolul PS/2 pentru implementarea mouse -ului PS/2 . În final ,
modulul ce controlează led -urile discrete de pe platforma hardware va comunica cu modulul
de mouse PS/2 pentru realizarea aplicației propuse .
Metoda aleasă prezintă avantajul implementării accesibile a protocolului de
comunicare , PS/2 și ușurința programării plăcuței de dezvoltare , Spartan 3 -E cu ajutorul
mediului de dezvoltare ISE Design Suit e.
Metoda aleasă prezintă dezavantajul folosiri din ce în ce mai puțin a dispozitivelor ce
funcționează pe baza protocolului PS/2 , acestea fiind înlocuite aproape în totalitate de
dispozitivele ce funcționează pe baza protocolului USB .
Antoniu Mihai – Alexandru
– 25 –
3.1. Structura hardware
Această aplicație este implementată cu ajutorul unui FPGA din familia Spartan -3 și anume
Spartan -3E la care , prin intermediul portului PS /2 se conectează un mouse PS/2. De
asemenea se va folosi pentru alimentare un încărcător și pentru progra marea FPGA -ului un
cablu USB A la B .
Figura 3.7 – Schema bloc ce reflectă interconectarea componentelor principale
3.2. Structura software
Implementarea protocolului PS2 a fost împărțită în subsitemul de recepție și în
subsistemul de transmisie .
Ogani grama funcțională pentru subsistemul de rece pție este prezentată în figura 3.8.
Inițial , subsistemul de recep ție se află în starea idle . Se observă în oganigramă un semnal de
control rx_en , folosit pentru a activa sau dezactiva operația de recepție . În mom entul în care
rx_en este setat pe 1 și fall_edge(frontul negativ) este setat tot pe 1 se shiftează bitul de start
și se trece în starea dps(8 biți de date , 1 bit de paritate și 1 bit de stop) . Starea dps a fost
folosită deoarece data recepționată este în f ormat fix , astfel se shiftează cei 10 biți într -o
singură stare în loc să se creeze câte o stare pentru dată , paritate și stop . Se trece în starea
load, în ca re se furnizează o periodă în plus de clock pentru a completa shiftarea bitului de
stop. Semnalul rx_done_tick a fost introdus pentru o perioadă suplimentară de clock .
Oganigrama funcțională pentru partea de transm isie este prezentată în figura 3.9. Spre
deosebire de subsistemul de recepție , semnalele ps2c și ps2d comunică în ambele
direcții (bidirecțio nale). În consecință pentru fiecare semnal este adăugat câte un buffer tri –
state. Semnalele tri_c si tri_d sunt semnale de activare cu ajutorul cărora sunt controlate
bufferele tri -state. Inițial , subsistemul de transmisie se află în starea idle . Pentru a începe să
transmită , gazda setează wr_ps2 p e 1 și se introduc datele pe magistrala de date . Astfel s unt
încărcate în registrul b (registru de shiftare) data de intrare “din” și bitul de paritate “parity” ,
apoi se încarcă în registrul c valoarea ”0x1FFF ”. În continuare , se trece în starea rts(request
to send) în care ps2c_out devine 0 și tri_c activează buffer -ul tri -state corespunzător .
Registrul c este un numărător pe 13 biți folosit pentru a genera o întârziere de 164
microsecunde . Urmează starea start , în care linia de clock PS /2 este dezactivată și linia de
date este setată pe 1 . Acum , dispozitivul PS /2(în acest caz , mouse -ul) preia controlul și
generează un semnal de clock peste linia ps2c . După detectarea frontului negativ al
semnalului ps2c prin inter mediul semnalului fall_edge se trece în starea data și se shiftează
cei 8 biți de date și bitul de paritate .
Valori implicite: ps2c_out = 1 , ps2d_out = 1 , tri_c = 0 , tri_d = 0 .
3. Proiectarea aplicației
– 26 –
Figura 3.8 – Subsistemul de recepție a protocolului PS2
Antoniu Mihai – Alexandru
– 27 –
Figura 3.9 – Subsistemul de transmisie a protocolului PS2
3. Proiectarea aplicației
– 28 –
Pentru realizarea interfeței bidirecționale PS2 s -au combinat subsistemele de recepție
și de transmisie . În acest caz , s-au folosit semnalele tx_idle și rx_en pentru a coordona
operațiile de transmisie și de recep ție. În cazul protocolului PS2 , operația cea mai prioritară
este cea de transmisie . Când subsis temul de transmisie este în desfășurare , semnalul tx_idle
este dezactivat , ceea ce dezacti vează subsistemul de recepție . Astfel , în momentul în care
subsi stemul de transmisie este în starea idle, subsistemul de recepție poate procesa intrările
primite . În figura 3.10 este prezentată interfața bidirecțională PS2 cu semnale le aferente .
Figura 3.10 – Interfața bidirecțională PS /2.
Următorul tabel va ilustra format ul datelor trimise de către mouse [1].
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Octet 1 Y
depășire X
depășire Y bit de
semn X bit de
semn Mereu 1 Status
buton
mijloc Status
buton
dreapta Status
buton
stânga
Octet 2 Deplasare pe axa X
Octet 3 Deplasare pe axa Y
Observație: În timpul transmisiei , Octet ul 1 este transmis primul , iar Octet ul 3 este transmis
ultimul .
Antoniu Mihai – Alexandru
– 29 –
Cele dou ă funcții de bază ale mouse -ului PS /2 sunt să activeze modul STREAM și să
reasambleze cei 3 octeți (octet ul 1, octet ul 2, octet ul 3) de date . Ieșirea circuitului este x_mov
și y_mov ce reprezintă deplasarea pe axa X , respectiv pe axa Y , iar button_mov reprezintă
semnalul de status al butonului apăsat . În momentul în care data asamblată este validă ,
semnalul mov_done_tick devi ne 1. Interfața pentru mouse este formată din șapte stări . Stările
init1, init2, init3 sunt executate o dată după ce semnalul de reset devine 1 . În aceste stări este
executată comanda 0xF4 și se așteaptă pentru finalizarea transmisiei , urmând apoi să se
așteaptă pentru pachetul ACK(confirmare ). Astfel , mouse -ul este în modul STREAM .
La final , sunt obținute și asamblate următoarele trei pachete în stările pack1 , pack2 , pack3 și
se activează semnalu l mov_done_tick în starea done .
Pentru testarea interfaț ei PS2 am folosit un mouse ce controlează cele opt led -uri
discrete de pe Spartan3 -E. Doar poziția unuia din cele opt led -uri urmărește mișcarea pe axa
X a mouse -ului. Dând click pe butonul di n stânga se mută poziția către led-ul cel mai din
stânga „F9” (poziția led-ului din foaia de catalog) , iar când dăm click pe butonul din dreapta
se mută poziția către led -ul cel mai din dreapta „F12” (poziția led -ului din foaia de catalog) .
Pentru a monitoriza poziția curentă pe axa X s -a folosit un numărător pe 10 biț i.
Numărătorul se modifică când semnalul m_done_tick este setat pe 1 . Numărătorul este resetat
la 0 când butonul din stânga este apăsat sau este setat pe maxim când butonul din dreapta este
apăsat . Altfel se incrementează cu numărul de poziții parcurse pe axa X .
Capitolul 4 . Implementarea aplicației
– 30 –
Capitolul 4 . Implementarea aplicației
Pentru realizarea implementării aplicației s -a folosit mediul de dezvoltare ISE Design
Suite , mai precis ISE WebPack Design c are aparține companiei Xilinx. Implementarea
aplicației a avut la bază implementarea unor module în limbajul de descriere hardware,
Verilog pentru realizarea comunicării între platforma FPGA Spartan 3 -E și mouse -ul PS/2
prin intermediul protocolului de comunicare PS/2. Comunicarea are loc cu succes atunci
când , în funcție de mișcările mouse -ului se aprind led -uri discrete puse la dispoziție de
platform a de dezvoltare.
În implementarea aplicației au fost detectate probleme mai speciale la mediul de
dezvoltare utilizat , ISE Design Suite 14.1 . Acest software pus la dispoziție de compania
Xilinx are suport pentru următoarele sistemele de operare : Linux , Windows XP și Windows
7. Aplicați a însă, a fost realizată pe un sistem de calcul ce funcționează cu sistemul de
operare Windows 10 . Astfel pentru funcționarea core ctă a mediului de dezvoltare au trebuit
urmați următorii pași [9]:
Se deschide directorul : <cale_instalare> \Xilinx \14.1\ISE_DS \ISE\lib\nt64\
Se redenume ște fișierul ”libPortability.dll” în ”libPortability.dll.orig”
Se copiază fișierul ”libPrtabilityNOSH.dl l” în același director și se redenumește în
”libPrtabilityNOSH.dll”
Se repetă primi trei pași pentru următorul director
<cale_instalare> \Xilinx \14.1\ISE_DS \commom \lib\nt64\
Acești pași înlocuiesc fișierul inițial ”libPortability.dll” cu un fișier ”libPor tability.dll”
care are dezactivat ”SmartHeap” și anume versiunea NOSmartHeap(NOSH). SmartHeap -ul
se ocupă de gestionarea alocări memoriei din sistemul de operare la o aplicație , în funcție de
necesități. O altă problemă întâlnită la acest mediu de dezvolta re a fost atunci când se dorea
programarea platformei de dezvoltare folosind unealta inclusă, iMPACT. Problema era că
versiunea 13.4_2 a mediului de dezvoltare nu recunoștea cablul USB de tip A la tip B utilizat
pentru scrierea bitstream -ului pe FPGA , chiar dacă era instalat driver -ul corect pentru cablu.
Această problemă s -a rezolvat în momentul în care s -a trecut la ISE Design Suite versiunea
14.6. Pe parcursul realizării aplicației a apărut o problemă la această versiune și anume în
momentul generării bi tstream -ului, etapa de Map nu se mai termina de rulat. Această
problemă a fost rezolvată prin instalarea altei versiuni și anume versiunea 14.1.
O altă problemă întâlnită a fost conectarea unui mouse mai nou la platforma de
dezvoltare. S -a putut observa că aplicația realizată nu poate realiza conexiunea cu acel
mouse. Ca și soluție pentru această problemă s -a hotărât înlocuirea mouse -ului cu un alt
mouse PS/2 mai vechi.
În continuare, se vor prezenta câteva capturi de ecran ce reprezintă funcționarea pe
scurt a sistemului. Aceste capturi de ecran conțin bucăți de cod realizate în limbajul de
descriere hardware, Verilog. În figura 4.6 se va prezenta fișierul de constrângeri furnizat de
foaia de catalog a platformei de dezvoltare. Fișierul a fost modificat pentru a respecta
condițiile necesare funcționării aplicației . Astfel s -a înlocuit ”CLK_50MHZ” cu ”clock”,
deoarece în aplicație semnalul de ceas a fost definit clock. Sursa de clock are nevoie de două
tipuri diferite de constrângeri. Constrângerea de loc ație stabilește asignarea pinilor de I/O și
standardele de I/O. Constrângerea de perioad ă stabilește perioada , frecvența clock -ului și
Antoniu Mihai – Alexandru
– 31 –
factorul de umplere al următorului semnal de clock . Platforma de dezvoltare dispune de trei
clock -uri și anume: generator ul de oscilații cu frecvența de 50 MHZ, generatorul auxiliar de
oscilații și conectorul SMA de clock, care poate fi de intrare sau de ieșire. S -a ales utilizarea
generatorului de oscilații cu frecvanța de 50 MHZ deoarece îndeplinește condițiile necesare
funcționării aplicației. Pentru asignarea pinului de clock s -a folosit LOC = ”C9”, iar pentru
setarea jumper -ului JP9 să funcționeze la 3.3V s -a folosit IOSTANDARD = LVCMOS33 [8].
Formula după care se calculează perioada este următoarea :
De unde rezultă că perioada este egală cu:
Astfel se obține:
Din calculele de mai sus rezultă ca perioada clock -ului este de 20 ns. Factorul de umplere
variază între 40% și 60%. Pentru simplitate s -a păstrat va loarea din foaia de catalog și anume
40% [8].
Apoi s -a înlocuit ”BTN_NORTH” cu ”reset” deoarece în modulul principal se
folosește semnalul reset pentru resetarea aplicației. Se putea alege orice buton pentru reset dar
s-a hotărât folosirea butonului ce are asignat pinul LOC = ”V4”. Butoanele de apăsare au o
rezistență internă de tip ”pulldown” [8]. Astfel s -a păstrat constrângerea inițială din foaia de
catalog.
Mai departe, s -a înlocuit ”LED<7>”…..”LED<0>” cu ” blink_ led[7]” ….
”blink_ led[0]” din aceleaș i considerente menționate anterior. Astfel fiecare led are o parte
conectată la masă și cealaltă parte conectată la un pin de pe Spartan 3 -E prin intermediul unei
rezistențe de 390 Ω. Pentru a aprinde un anumit led se trece semnalul de control asociat
FPGA -ul pe High. Pentru simplitate s -a decis mai întâi să fie declarat blink_ led[0] (cel mai
din dreapta led) cu pinul ”F12” , iar final a fost declarat blink_ led[7] (cel mai din stânga led)
cu ”F9” [8].
În final, s -a înlocuit ”PS2_CLK” cu ”ps2c” și ”PS2_DATA” cu ”ps2d” deoarece în
aplicație pentru clock -ul și data perifericului PS /2 s-au folosit semnalele ”ps2c” și ”ps2d”.
Pinul asociat clock -ului PS2 pe platforma de dezvoltare este ”G14”, iar pinul asociat datei
PS2 este ”G13”. Constrângerea pentru portul PS2 in clude asignarea pinilor de I/O și
standardul I/O folosit [8].
Capitolul 4 . Implementarea aplicației
– 32 –
Figura 4.1 – Implementarea subsistemului de recepție
Figura 4.2- Implementarea subsistemului de transmisie
Antoniu Mihai – Alexandru
– 33 –
Figura 4.3 – Implementarea protocolului PS/2
Figura 4.4 – Implementarea mouse -ului PS/2
Capitolul 4 . Implementarea aplicației
– 34 –
Figura 4.5 – Case -ul pentru led -uri
Figura 4.6 – Constrângeri pentru funcționarea mouse -ului PS/2
Pentru această aplicație, interfața cu utilizatorul constă în mouse -ul PS/2 și vizual în
cele 8 led -uri puse la dispoz iție de platforma de dezvoltare, Spartan 3 -E. În funcție de cum
deplasează mouse -ul, utilizatorul poate observa modul în care se aprind led -urile. Totuși
deoarece platforma de dezvoltare dispune de 8 led -uri dispuse pe orizontală, utilizatorul va
putea obs erva doar mișc area mouse -ului la stânga, dreapta și apăsarea butoanelor din stânga
și din dreapta .
Pentru calibrarea hardware s -a încercat conectarea la platforma de dezvolta re a unui
mouse PS/2 ce funcționează cu 1200 dpi. S -a constatat că nu se poate r ealiza conexiunea între
periferic și FPGA. Astfel s -a renunțat la mouse -ul ce funcționează cu 1200 dpi și s -a conectat
la platforma de dezvoltare un alt mouse PS/2 ce funcționează cu un dpi mai mic. Această
înlocuirea a avut loc cu succes realizându -se con exiunea între perif eric și FPGA.
Antoniu Mihai – Alexandru
– 35 –
Capitolul 5 . Testarea aplicației și rezultate experimentale
Pentru lansarea aplicației se deschide mai întâi mediul de dezvoltare Design Suite
ISE. După deschiderea mediului de dezvoltare se selectează modulul Verilog m ouse_leds și
se dă click dreapta pe el, apoi se selectează ”Set as Top Module” . Mai departe, se dă din nou
click dreapta pe modul și de data asta se selectează ”Implement Top Module” .
După îndeplinirea pașilor de mai sus se lansează în execuție etapa d e sinteză (în
mediul de dezvoltare se numește ”Synthesize – XST”). Tehnologia de sinteză a celor de la
Xilinx(XST), sintetizează limbajele de descriere hardware VHDL, Verilog sau alte limbaje
mixte pentru a crea fișiere netlist specifice celor de la Xilinx , cunoscute ca fișiere NGC.
Aceste fișiere conțin proiectarea logică și constrângeri [10].
După terminarea sintezei, se lansează în e xecuție implementarea design -ului care
cuprinde următori pași:
”Translate” – combină fișierele netlist și constrângerile î ntr-un fișier Xilinx design [11].
”Map” – potrivește design -ul în resursele disponibile ale dispozitivului țintă și optional,
plasează design -ul[11].
”Place and Route” – plaseaz ă și trasează design -ul la constrângerile de timp [11].
”Generate Programming F ile” – crează fișierul bitstream ce poate fi programat pe
FPGA [11].
După îndeplinirea cu succes a acestor pași se dă dublu click pe ”Configure Target
Device” și se lansează în execuție unealta ISE iMPACT , ce este încorporată în mediul de
dezvoltare ISE D esign Suite . Mai departe se dă dublu click pe ”Boundary Scan” și în
fereastra deschisă se apasă click dreapta, unde se selectează ”Initialize Chain”. După
recunoașterea cablului USB A la B se deschide o noua fereastră în care se precizează că
platforma de dezvoltare a fost recunoscută cu success. Următoarea captură de ecran prezintă
acest lucru.
Figura 5.1 – Identificarea cu s ucces a platformei de dezvoltare
Capitolul 5 . Testarea aplicației și rezultate experimentale
– 36 –
În continuare, pentru programarea FPGA -ului cu bitstream -ul generat în etapa
”Generate Progr amming File” se selectează FPGA xc3s500e și se va apasa click dreapta pe
el. Mai departe vor apărea mai multe opțiuni dar pentru alegerea bitstream -ului generat
trebuie selectat ”Assign New Configuration File” ce va deschide o nouă fereastră pentru
alege rea bitstream -ului generat . După selec tarea bitstream -ului dorit, la FPGA xc3s500e în
loc de ”bypass” va apărea bitstream -ul cu extensia .bit. Acest lucru este ilustrat în următoarea
captură de ecran.
Figura 5.2 – Selectarea bitstream -ului generat
Mai departe urmează programarea propriu -zisă a platformei de dezvoltare. Pentru
realizarea programării se selectează din nou xc3s500e și se va apăsa click dreapta pe el. De
aici se va selecta ”Program”. Următoarea captură de ecran va ilustra programarea cu su cces a
platformei de dezvoltare.
Figura 5.3 – Programarea cu succes a platformei de dezvoltare, Spartan 3 -E
Antoniu Mihai – Alexandru
– 37 –
Următoarea captură de ecran va prezenta ansamblul aplicației.
Capitolul 5 . Testarea aplicației și rezultate experimentale
– 38 –
Pentru testarea sistemului s-a folosit unealta ISim ce aparține mediului d e dezvoltare ISE
Design Suite. Mai departe se vor prezenta formele de undă obținute cu ajutorul uneltei ISim.
Figura 5.4 – Testarea protocolului PS/2
Figura 5 .5 – Testarea mouse -ului PS/2
Antoniu Mihai – Alexandru
– 39 –
Figura 5.6 – Testarea modulului cu led -uri
Figura u rmătoare va reprezenta gradul de încărcare a FPGA -ul folosit, Spartan 3 -E. Această
figură a fost obținută cu ajutorul mediului de dezvoltare ISE Design Suite.
Figura 5.7 – Gradul de încărcare
În continuare, se vor prezenta datele de test folosite pen tru aplicație.
Capitolul 5 . Testarea aplicației și rezultate experimentale
– 40 –
Figura 5.8 – Secvența de test pentru modulul de recepție PS/2
Figura 5.9 – Secvența de test pentru modulul de transmisie PS/2
Antoniu Mihai – Alexandru
– 41 –
Figura 5.10 – Secvența de test pentru protocolul PS/2
Figura 5. 11 – Secvența de test pentru mouse -ul PS/2
Capitolul 5 . Testarea aplicației și rezultate experimentale
– 42 –
Figura 5.12 – Secvența de test pentru led -uri
Rezultatele experimentale vor fi prezentate în următoarele capturi de ecran.
Figura 5.13 – Poziția inițială
Figura 5.14 – Mișcarea cu o poziție la dreapta
Antoniu Mihai – Alexandru
– 43 –
Figura 5.15 – Mișcarea la stânga cu două poziții
Figura 5.16 – Click stânga (aprinderea led -ului cel mai din stânga)
Figura 5.17 – Click dreapta (aprindere a led -ului cel mai din dreapta)
Concluzii
– 44 –
Capitolul 6 . Concluzii
Tema propusă de realizare a unui controller de mouse ce funcționează conform
protocolului PS/2 a fost implementată cu succes . Pentru realizarea aplicației s -a respectat
modul de funcționare a protocolului de transmisie, PS/2 și modurile în care poate funcționa
un mouse PS/2.
Un proiect similar, de realizare a unei conexiuni între un mouse PS/2 și o placuță de
dezvoltare a fost realizat de compania Arduino . Pentru implementarea acelui proiect s -a
folosit mediul de dezvoltare Arduino IDE. Proiectul a fost implementat folosind librările
proprii ale mediului de dez voltare. Limbajul de programare folosit a fost C, care este un
limbaj procedural, în timp ce aplicația de comunicare între un FPGA și un mouse PS/2 a fost
implementată folosind Verilog, care este un limbaj de descriere hardware.
O posibi lă dezvoltare cons tă în îmbunătățirea aplicației pentru a permite mouse -ului
să folosească rotița de derulare. Acest lucru ar însemna implementarea Micr osoft
Intellimouse despre care s -a aminti t în capitolul 2, subcapitolul 7 din cadrul acestei lucrări. O
altă posibilitate de dezvoltare presupune conectarea platformei FPGA la un monitor prin
intermediul conectorului VGA existent. În momentul porniri monitorului, cursorul mouse –
ului ar urma să apară pe display și s-ar deplasa în funcție de mișcările mouse -ului. Acest
aspect a r putea fi dezvoltat și mai mult prin implementarea unei aplicații în stilul Paint. O
ultimă posibilitate de dezvoltare ar presupune folosirea unei matrici de led -uri de 4×4 dispuse
pe un breadboard. Aceste led -uri ar urma să fie conectate la FPGA și ar de monstra
funcționalitatea mai precisă a mouse -ului PS/2.
Bibliografie
– 45 –
Bibliografie
[1] The PS/2 Mouse Interface . http://users.utcluj.ro/~baruch/sie/labor/PS2/P S-
2_Mouse_Interface.htm
[2] ISE WebPACK Design Software. https://www.xilinx.com/products/design -tools/ise –
design -suite/ise -webpack.html
[3] Types of Mouse and M ouse Connectors. https://turbofuture.com/computers/Mouse –
Connectors
[4] Maus. https://ro.wikipedia.org/wiki/Maus
[5] PS/2 Mouse/Keyboard P rotocol. http://www.burtonsys.com/ps2_chapweske.htm
[6] PS2 Commands. https://techdocs.altium.com/display/FPGA/PS2+Commands
[7] Digilent Spartan -3E Starter Board. https://www.xilinx.com/products/boards -and-kits/1 –
elhacw.html
[8] Spartan -3E FPGA Starter Kit Board User Guide.
https://www.xilinx.com/support/documentation/boards_and_kits/ug230.pdf
[9] Xilinx ISE 14.7 installation instructions for Windows 10. https: //www.micro –
nova.com/xilinx -ise-win10/
[10] XST Synthesis Overview.
https://www.xilinx.com/support/documentation/sw_manuals/xilinx11/ise_c_us ing_xst_for_sy
nthesis.htm
[11] Implementation Overview for FPGAs .
https://www.xilinx.com/support/documentation/sw_manuals/xilinx14_4/ise_c_i mplement_fp
ga_design.htm
[12] FPGA . https://ro.wikipedia.org/wiki/FPGA
Antoniu Mihai – Alexandru
– 46 –
Anexe
Schemele bloc realizate cu ajutorul mediului de dezvoltate ISE Design Suite :
Anexe
– 47 –
Antoniu Mihai – Alexandru
– 48 –
Codul sursă :
modul e ps2_TX(clock,
reset,
start_tx_ps2,
data_in,
ps2d,
ps2c,
tx_idle,
tx_done_tick
);
input clock;
input reset;
input start_tx_ps2; // semnal de start pentru transmisie
input [7 : 0] data_in;
inout ps2d;
inout ps2c;
output tx_idle; // indicator de idle pentru transmisie
output tx_done_tick; // indicator sfarsit de transmisie
reg tx_idle;
reg tx_done_tick;
// declararea starilor simbolice
// idle – starea de asteptare a subsistemului de transmisie
// request_to_send – starea pentru cererea de transmisie
// start – starea in care se insereaza bitul de start
// data – starea care contine 8 biti de date si un 1 bit de paritate
// stop – starea in care se opreste transmisia
localparam [2 : 0] idle = 3'b000,
request_to_send = 3'b001,
start = 3'b010,
data = 3'b011,
stop = 3'b100;
// declarare semnale intermediare
reg [2 : 0] state_register, next_state;
reg [7 : 0] filter_register;
wire [7 : 0] next_filter;
reg filter_ps2c_register;
reg next_filter_ps2c;
reg [3 : 0] counter_register, next_counter; // numaratorul de biti
reg [8 : 0] buffer_register, next_buffer; // bufferul de date
reg [12 : 0] counter_rts_register, next_counter_rts; // numarator de timp pentru request to send
wire parity_bit;
wire fall_edge;
reg ps2c_out, ps2d_out;
reg tri_c, tri_d;
///////////////////////////////////////////////////
// filtru pentru ps2c folosit pentru detectarea frontului negativ
///////////////////////////////////////////////////
always @(posedge clock)
if (reset == 1'b1)
begin
filter_register <= 8'b0;
filter_ps2 c_register <= 1'b0;
end
else
begin
filter_register <= next_filter;
filter_ps2c_register <= next_filter_ps2c;
end
Anexe
– 49 –
assign next_filter = {ps2c, filter_register[7 : 1]};
always@*
begin
if(filter_register == 8'b11111111)
next_filter_ps2c = 1'b1;
else if(filt er_register == 8'b00000000)
next_filter_ps2c = 1'b0;
else
next_filter_ps2c = filter_ps2c_register;
end
// detectarea frontului negativ al clock -ului ps2c
assign fall_edge = filter_ps2c_register & (~next_filter_ps2c);
// generarea bitului de paritate
// se aplica operatorul xor asupra tuturor bitilor variabilei de intrare, din
// apoi asupra rezultatului obtinut se aplica operator not
assign parity_bit = ~(^data_in);
/////////////////////////////////////////////////////
// Starile pentru oganigrama functi onala
// Registri cu date
/////////////////////////////////////////////////////
always @(posedge clock)
if (reset == 1'b1)
begin
state_register <= idle;
buffer_register <= 9'b0;
counter_register <= 4'b0;
counter_rts_register <= 13'b0;
end
else
begin
state_register <= next_state;
buffer_register <= next_buffer;
counter_register <= next_counter;
counter_rts_register <= next_counter_rts;
end
/////////////////////////////////////////////////////
//Logica pentru starea urmatoare in oganigramei functionala
/////////////////////////////////////////////////////
always @*
begin
// setez valorile implicite
next_state = state_register;
next_counter_rts = counter_rts_register;
next_counter = counter_register;
next_buffer = buffer_register;
tx_done_tick = 1'b0;
ps2c_ou t = 1'b1;
ps2d_out = 1'b1;
tri_c = 1'b0;
tri_d = 1'b0;
tx_idle = 1'b0;
case (state_register)
// astept pentru wr_ps2
idle:
begin
tx_idle = 1'b1;
if (start_tx_ps2 == 1'b1)
begin
Antoniu Mihai – Alexandru
– 50 –
next_state = request_to_send;
next_counter_rts = 13'h1fff; // 2^13 -1
next_buf fer = {parity_bit, data_in};
end
end
// cerere de transmisie
request_to_send:
begin
ps2c_out = 1'b0;
tri_c = 1'b1;
next_counter_rts = counter_rts_register – 1;
if (counter_rts_register == 0)
next_state = start;
end
// pornesc transmisia de biti
start:
begin
ps2d_out = 1'b0;
tri_d = 1'b1;
if (fall_edge == 1'b1)
begin
next_state = data;
next_counter = 4'b1000;
end
end
// trimit biti de date si bitul de paritate
data:
begin
ps2d_out = buffer_register[0];
tri_d = 1'b1;
if (fall_edge == 1)
begin
next_buffer = {1'b0, buffer_register[8 : 1]};
if (counter_register == 0)
next_state = stop;
else
next_counter = counter_register – 1;
end
end
// sfarsitul transmisiei
stop:
if (fall_edge == 1'b1)
begin
next_state = idle;
tx_done_tick = 1'b1;
end
// implicit ma afl u in starea de idle a subsistemului de transmisie
default:
begin
next_state = idle;
end
endcase
end
// bufferele tri -state
assign ps2c = (tri_c) ? ps2c_out : 1'bz;
assign ps2d = (tri_d) ? ps2d_out : 1'bz;
endmodule
Anexe
– 51 –
module tb_ps2_TX;
// intrari
reg clock;
reg reset;
reg start_tx_ps2;
reg [7:0] data_in;
// iesiri
wire tx_idle;
wire tx_done_tick;
// date bidirectionale
wire ps2d;
wire ps2c;
integer i;
// instantiez modulul ps2_TX pentru testare
ps2_TX my_transmitter(.clock(clock),
.reset(reset),
.start_tx_ ps2(start_tx_ps2),
.data_in(data_in),
.ps2d(ps2d),
.ps2c(ps2c),
.tx_idle(tx_idle),
.tx_done_tick(tx_done_tick)
);
initial
begin
#0 clock = 1'b1;
end
always #5 clock = ~clock;
initial
begin
#0 reset = 1'b1;
#10 reset = 1'b0; start_tx_ps2 = 1'b0;
#10 star t_tx_ps2 = 1'b1;
for(i = 0; i < 256; i = i + 1)
begin
#10 data_in = i;
end
// 2500 ns pentru for -ul de mai sus
#10 start_tx_ps2 = 1'b0;
for(i = 0; i < 256; i = i + 1)
begin
#10 data_in = i;
end
#10 reset = 1'b1;
#10 reset = 1'b0;
end
initial
begin
#510 0 $finish;
end
endmodule
module ps2_RX(clock,
reset,
ps2d,
Antoniu Mihai – Alexandru
– 52 –
ps2c,
rx_enable,
data_out,
rx_done_tick
);
input clock; // clock -ul principal
input reset; // resetul sistemului
input ps2d; // PS/2 data
input ps2c; // PS/2 clock
input rx_enable; // Receptor activat/dezactivat
output [7:0] data_out; // data de iesire din subsistemul de receptie
output rx_done_tick; // indicator sfarsit de receptie
reg rx_done_tick;
// declarare stari simbolice
// idle – starea initiala de asteptare a subsistemu lui de receptie
// data_parity_stop – starea pentru cei 8 biti de date, 1 bit de paritate si 1 bit de stop
// load – starea care marcheaza sfarsitul receptiei
localparam [1 : 0] idle = 2'b00,
data_parity_stop = 2'b01,
load = 2'b10;
// declarare semnale in termediare
reg [1 : 0] state_register, next_state;
reg [7 : 0] filter_register;
wire [7 : 0] next_filter;
reg filter_ps2c_register;
reg next_filter_ps2c;
reg [3 : 0] counter_register, next_counter;
reg [10 : 0] buffer_register, next_buffer;
wire fall_e dge;
///////////////////////////////////////////////////////////
// filtru pentru ps2c folosit pentru detectarea frontului negativ
///////////////////////////////////////////////////////////
always @(posedge clock)
begin
if (reset == 1'b1)
begin
filter_r egister <= 8'b0;
filter_ps2c_register <= 1'b0;
end
else
begin
filter_register <= next_filter;
filter_ps2c_register <= next_filter_ps2c;
end
end
assign next_filter = {ps2c, filter_register[7 : 1]};
always@*
begin
if(filter_register == 8'b11111111)
next_f ilter_ps2c = 1'b1;
else if(filter_register == 8'b00000000)
next_filter_ps2c = 1'b0;
else
next_filter_ps2c = filter_ps2c_register;
end
Anexe
– 53 –
// detectarea frontului negativ al clock -ului ps2c
assign fall_edge = filter_ps2c_register & (~next_filter_ps2c);
/////////////////////////////////////////////////////////////
// Starile pentru oganigrama functionala
// Registri cu date
/////////////////////////////////////////////////////////////
always @(posedge clock)
begin
if (reset == 1'b1)
begin
state_register <= idle ;
buffer_register <= 11'b0;
counter_register <= 4'b0;
end
else
begin
state_register <= next_state;
buffer_register <= next_buffer;
counter_register <= next_counter;
end
end
///////////////////////////////////////////////////////////////////
//Logica pent ru starea urmatoare in oganigrama functionala
///////////////////////////////////////////////////////////////////
always @*
begin
// setez valorile implicite
next_state = state_register;
rx_done_tick = 1'b0;
next_buffer = buffer_register;
next_counter = co unter_register;
case (state_register)
// starea de asteptare a subsitemului de receptie
idle:
if (fall_edge == 1'b1 & rx_enable == 1'b1)
begin
next_state = data_parity_stop;
next_counter = 4'b1001;
// shiftez bitul de start
// incarc bitii in buffer
next_ buffer = {ps2d, buffer_register[10 : 1]};
end
// 8 biti de date, 1 bit de paritate, 1 bit de stop
data_parity_stop:
if (fall_edge == 1'b1)
begin
next_buffer = {ps2d, buffer_register[10 : 1]};
if (counter_register == 4'b0)
next_state = load;
else
next_cou nter = counter_register – 1;
end
// un clock suplimentar pentru a completa ultima shiftare
// sfarsitul receptiei
load:
begin
next_state = idle;
rx_done_tick = 1'b1;
end
Antoniu Mihai – Alexandru
– 54 –
// implicit ma aflu in starea de idle a subsistemului de receptie
default:
begin
next_state = idle;
end
endcase
end
// Iesirea subsitemului de receptie
// Biti de date
assign data_out = buffer_register[8 : 1];
endmodule
module tb_ps2_RX;
// intrari
reg clock;
reg reset;
reg ps2d;
reg ps2c;
reg rx_enable;
// iesiri
wire rx_done_tick ;
wire [7:0] data_out;
// instantiez modulul ps2_RX pentru testare
ps2_RX my_receiver(.clock(clock),
.reset(reset),
.ps2d(ps2d),
.ps2c(ps2c),
.rx_enable(rx_enable),
.rx_done_tick(rx_done_tick),
.data_out(data_out)
);
initial
begin
#0 clock = 1'b1;
end
always #5 clock = ~clock;
initial
begin
#0 reset = 1'b0;
#10 reset = 1'b1;
#20 reset = 1'b0;
#10 rx_enable = 1'b1;
#10 ps2d = 1'b0; ps2c = 1'b1; rx_enable = 1'b0;
#10 rx_enable = 1'b1;
#10 ps2d = 1'b1; ps2c = 1'b0; rx_enable = 1'b0;
#10 rx_enable = 1'b1;
#10 ps2d = 1'b1; ps2c = 1'b1; rx_enable = 1'b0;
#30 rx_enable = 1'b1;
#10 rx_enable = 1'b0;
#10 reset = 1'b1;
#10 reset = 1'b0;
end
initial
begin
Anexe
– 55 –
#250 $finish;
end
endmodule
module ps2_RXTX(clock,
reset,
start_tx_ps2,
ps2d,
ps2c,
data_in,
data_out,
rx_done_tick,
tx_done_tick
);
input clock; // clock -ul principal
input reset; // resetul sistemului
input start_tx_ps2; // semnal de start pentru transmisie
inout ps2d; // PS/2 data bidirectional
inout ps2c; // PS/2 clock bidirectional
input [7:0] data_in; // data de intrare in subsitemul de transmisie
output [7:0] data_out; // data de iesire din subsistemul de receptie
output rx_done_tick; // indicator sfarsit de receptie
output tx_done_tick; // indicator sfarsit de transmisie
// declarare semnal intermediar
// indicator de idle pentru transmisie
wire tx_idle;
// instantiez modulul ps2 de receptie
ps2_RX my_ps2_receiver(.clock(clock),
.reset(reset),
.rx_enable(tx_idle),
.ps2d(ps2d),
.ps2c(ps2c),
.rx_done_tick(rx_done_tick),
.data_out(data_out)
);
// instantiez modulul ps2 de transmisie
ps2_TX my_ps2_transmitter(.clock(clock),
.reset(reset),
.start_tx_ps2(start_tx_ps2),
.data_in(data_in),
.ps2d(ps2d),
.ps2c(ps2c),
.tx_idle(tx_idle),
.tx_done_tick(tx_done_tick)
);
endmodule
module tb_ps2_protocol;
// intrari
reg clock;
reg reset;
reg start_tx_ps2;
reg [7:0] data_in;
// iesiri
wire rx_done_tick;
wire tx_done_tick;
Antoniu Mihai – Alexandru
– 56 –
wire [7:0] data_out;
// date bidirectionale
wire ps2d;
wire ps2c;
integer i;
// instantierea modului de recept ie-transmisie
ps2_RXTX my_protocol(.clock(clock),
.reset(reset),
.start_tx_ps2(start_tx_ps2),
.ps2d(ps2d),
.ps2c(ps2c),
.data_in(data_in),
.rx_done_tick(rx_done_tick),
.tx_done_tick(tx_done_tick),
.data_out(data_out)
);
initial
begin
#0 clock = 1'b1;
end
always #5 clock = ~clock;
initial
begin
#0 reset = 1'b0; start_tx_ps2 = 1'b0; data_in = 8'b0;
#10 reset = 1'b1;
#10 reset = 1'b0;
#10 start_tx_ps2 = 1'b1;
for(i = 0; i < 256; i = i + 1)
begin
#10 data_in = i;
end
#10 start_tx_ps2 = 1'b0;
#10 reset = 1'b 1;
#10 reset = 1'b0;
end
initial
begin
#5100 $finish;
end
endmodule
module mouse(clock,
reset,
ps2d,
ps2c,
x_axis_movement,
button_click_status,
movement_done_tick
);
input clock;
input reset;
inout ps2d;
inout ps2c;
output [8 : 0] x_axis_movement;
output [2 : 0] button_click_status; // click dreapta sau click stanga
output movement_done_tick;
reg movement_done_tick;
Anexe
– 57 –
wire [7 : 0] mouse_mode;
// declarare mod functionare mouse (STREAM mode)
localparam stream_mode=8'hF4;
localparam reset_mode=8'hFF;
// declarare parametri pentru starile mouse -ului
localparam [2:0]
state0 = 3'b000,
state1 = 3'b001,
state2 = 3'b010,
packet1 = 3'b011,
packet2 = 3'b100,
packet3 = 3'b101,
done = 3'b110;
// declarare semnale necesare pentru functionarea mouse -ului
reg [2:0] state_register, next_state;
wire [7:0] rx_data;
reg start_tx_ps2;
wire rx_done_tick, tx_done_tick;
reg [8:0] x_axis_register, next_x_axis;
reg [2:0] button_register, next_button;
// setez modul de functionare al mouse -ului
assign mouse_mode = (reset == 1 'b0)? stream_mode : reset_mode;
// instantiez modulul ps2 receptie – transmisie
ps2_RXTX my_ps2_protocol(.clock(clock),
.reset(reset),
.start_tx_ps2(start_tx_ps2),
.data_in(mouse_mode),
.data_out(rx_data),
.ps2d(ps2d),
.ps2c(ps2c),
.rx_done_tick(rx_done_t ick),
.tx_done_tick(tx_done_tick)
);
//////////////////////////////////////////////////////////////
// Starile pentru oganigrama functionala
// Registri cu date
//////////////////////////////////////////////////////////////
always @(posedge clock)
if (res et == 1)
begin
state_register <= state0;
x_axis_register <= 9'b0;
button_register <= 3'b0;
end
else
begin
state_register <= next_state;
x_axis_register <= next_x_axis;
button_register <= next_button;
end
////////////////////////////////////////////////// ////////////////
// Logica pentru starea urmatoare in oganigrama functionala
//////////////////////////////////////////////////////////////////
always @*
begin
// setez valorile implicite
next_state = state_register;
Antoniu Mihai – Alexandru
– 58 –
start_tx_ps2 = 1'b0;
movement_done_tick = 1'b0;
next_x_axis = x_axis_register;
next_button = button_register;
case (state_register)
state0:
begin
start_tx_ps2 = 1'b1;
next_state = state1;
end
// astept ca operatia de trimitere sa fie completa
state1:
if (tx_done_tick == 1'b1)
next_state = sta te2;
// astept pachetul de confirmare
state2:
if (rx_done_tick == 1'b1)
next_state = packet1;
// astept primul pachet
packet1:
if (rx_done_tick == 1'b1)
begin
next_state = packet2;
next_x_axis[8] = rx_data[4];
next_button = rx_data[2 : 0];
end
// astept al doilea pachet
packet2:
if (rx_done_tick == 1'b1)
begin
next_state = packet3;
next_x_axis[7 : 0] = rx_data;
end
// astept al treilea pachet
packet3:
if (rx_done_tick == 1'b1)
begin
next_state = done;
end
// am receptionat ultimul pachet
done:
begin
next_state = packet1;
movement_done_tick = 1'b1;
end
// implicit ma aflu in starea state0
default :
begin
next_state = state0;
end
endcase
end
// iesire pentru miscarea pe axa X
// iesire pentru butonul apasat
assign x_axis_movement = x_axis_register;
assign button_click_status = button_register;
Anexe
– 59 –
endmodule
module tb_mouse_ps2;
// intrari
reg clock;
reg reset;
// iesiri
wire [8:0] x_axis_movement;
wire [2:0] button_click_status;
wire movement_done_tick;
// date_bidirectionale
wire ps2d;
wire ps2c;
// instantiez modulul de mouse pentru testare
mouse uut (
.clock(clock),
.reset(reset),
.ps2d(ps2d),
.ps2c(ps2c),
.x_axis_movement(x_axis_movement),
.button_click_status(button_click_status),
.movement_done_tick(movement_done_tick)
);
initial
begin
#0 clock = 1'b1;
end
always #5 clock = ~clock;
initial
begin
#0 reset = 1'b0;
#10 reset = 1'b1;
#10 reset = 1'b0;
#7500 reset = 1'b1;
end
initial
begin
#7800 $finish;
end
endmodule
module mouse_leds(clock,
reset,
ps2d,
ps2c,
blink_led
);
input clock;
input r eset;
inout ps2d;
inout ps2c;
output [7 : 0] blink_led;
reg [7 : 0] blink_led;
Antoniu Mihai – Alexandru
– 60 –
// declarare semnale intermediare
reg [9 : 0] buffer_register;
reg [9 : 0] next_buffer;
wire [8 : 0] x_axis_movement;
wire [2 : 0] button_click_status;
wire movement_done_tick ;
// instantierea modulului de mouse
mouse ps2_mouse(.clock(clock),
.reset(reset),
.ps2d(ps2d),
.ps2c(ps2c),
.x_axis_movement(x_axis_movement),
.button_click_status(button_click_status),
.movement_done_tick(movement_done_tick)
);
// numarator
always @(po sedge clock)
if (reset == 1'b1)
buffer_register <= 10'b0;
else
buffer_register <= next_buffer;
always@*
begin
if(movement_done_tick == 1'b0) // nu avem activitate din partea mouse -ului
next_buffer = buffer_register;
else if(button_click_status[0] == 1'b1) // buton stanga
next_buffer = 10'b0;
else if(button_click_status[1] == 1'b1) // buton dreapta
next_buffer = 10'h3ff;
else // miscare pe axa X
next_buffer = buffer_register + {x_axis_movement[8], x_axis_movement};
end
always @*
case (buffer_register[9 : 7 ])
3'b000: blink_led = 8'b10000000;
3'b001: blink_led = 8'b01000000;
3'b010: blink_led = 8'b00100000;
3'b011: blink_led = 8'b00010000;
3'b100: blink_led = 8'b00001000;
3'b101: blink_led = 8'b00000100;
3'b110: blink_led = 8'b00000010;
default: blink_led = 8 'b00000001;
endcase
endmodule
module tb_mouse_leds;
// intrari
reg clock;
reg reset;
// iesiri
wire [7:0] blink_led;
// date bidirectionale
wire ps2d;
wire ps2c;
// instantiez modulul mouse_leds pentru testare
mouse_leds my_mouse_blink(.clock(clock),
.reset(reset),
.ps2d(ps2d),
.ps2c(ps2c),
Anexe
– 61 –
.blink_led(blink_led)
);
initial
begin
#0 clock = 1'b1;
end
always #5 clock = ~clock;
initial
begin
#0 reset = 1'b0;
#10 reset = 1'b1;
#20 reset = 1'b0;
#5000 reset = 1'b1;
#10 reset = 1'b0;
end
initial
begin
#5050 $finish;
end
endmodule
Scheme din foaia de catalog:
Antoniu Mihai – Alexandru
– 62 –
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Calculatoare și Tehnologia Informației [606927] (ID: 606927)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
