36POB - 3. Projekt

Odečítání souřadnic pohybu myši (COM)

Zadání

Realizujte obvod, který bude snímat souřadnice myši připojené přes sériový port a bude je zobrazovat digitálně na displeji nebo binárně na LED.

Stručný popis komunikačního protokolu

Mouse Systems Mouse, tedy myš se třemi tlačítky, vyžaduje toto nastavení RS232:

Myš začne pracovat až po inicializaci signálem RTS. Úroveň RTS se musí z počáteční hodnoty log. 0 (+12 V) změnit na log. 1 (-12 V). Následně začne myš normálně fungovat. Třítlačítková myš nevysílá žádný identifikační kód.

Na vzniklou událost reaguje tato myš odesláním pěti slov. Jejich význam je následující:

  1. stav tlačítek,
  2. změna polohy ve směru zleva doprava od posledního vyslání dat,
  3. změna polohy ve směru shora dolů od posledního vyslání dat,
  4. *,
  5. *.
* Interpretace významu 5. a 6. slova je pro různé myši různá.

Struktura dat vysílaných třítlačítkovou myší je přehlednější, nežli je tomu v případě myši dvoutlačítkové, proto jsem si ji vybrali k realizaci. Schéma prvního slova je následující:

bit 7 6 5 4 3 2 1 0
1. slovo: 1 0 0 0 0 L M R

Symboly L, M a R reprezentují bity s informací o stavu tlačítek (levé, střední a pravé), přičemž 0 značí zmáčknuté tlačítko a 1 uvolněné (u dvoutlačítkové myši je tomu naopak). Jednotlivé bity ve druhém až pátém slově jsou uvedeny ve správném pořadí. Není tedy nutné žádné "sbírání odpovídajících bitů dohromady" jako u dvoutlačítkové myši, nýbrž čísla můžeme ihned přečíst. Pro úplnost, tabulka analogická těm předchozím bude pro 2.-5. slovo vypadat takto:

bit 7 6 5 4 3 2 1 0
2. slovo x7 x6 x5 x4 x3 x2 x1 x0
3. slovo y7 y6 y5 y4 y3 y2 y1 y0
4. slovo * * * * * * * *
5. slovo * * * * * * * *

Postup vypracování

Obvod jsme programovali pomocí jazyka VHDL. Hlavní entita, která zapouzdřuje další entity, má následující rozhraní:

        entity eMouse is
                port (
                        clk : in std_logic;
                        reset : in std_logic;
                        a, b, c, d, e, f, g, h : out std_logic;         --výstupy na displej
                        sel0, sel1, sel2, sel3 : inout std_logic;       --výběr segmentu
                        tx : out std_logic;                             --napájení myši
                        rx : in std_logic;                              --data
                        rts : out std_logic;                            --inicializace
                        tesled1, tesled2, tesled3, tesled4, tesled5, tesled6, tesled7,
                        tesled8 : out std_logic                         --testovací diody
                );
        end eMouse;

Tato entita obsahuje další 4 entity, které spolu komunikují pomocí signálů:

  1. Entita eReader - tato entita načítá data ze sérivého portu a vytváří číselný udaj o změně.
  2. Entita eDecoder - tato přebírá číselný udaj o změně, který akumuluje a vytváří číselný udaj o poloze.
  3. Entity eDisplay a eMulti - na základě číselného údaje z entity eDecoder vytvářejí signály pro displej.

Všechny entity až na eReader jsme otestovali bez vážnějších problémů. Bohužel entita eReader je stěžejní část a právě ta se nám nepodařila odladit. Problém je v načítání bitového toku ze sériové linky. Poslední verze entity eReader je postavená na automatu, jehož základ vypadá následovně:

        process (clk) begin
                if clk'event and clk = '1' then
                        case state is
                                when ... =>
                                        --akce pro daný stav
                                        --nastavení následujícího stavu:
                                        state <= ...
                                ...
                        end case;
        end process;

Pro vytvoření spoždění, potřebného při načítání posloupnosti bitů, jsme použili následující kontrukci (v rámci automatu, STATE je jedna konkrétní hodnota state ze všech možných, MAXCOUNT je konstanta pro příslušné čekání):

        ...
        when STATE =>
                                ...
                                counter <= 0;
                                state <= STATE + 1;
        when STATE + 1 =>
                                if counter < MAXCOUNT then
                                        counter <= counter + 1;
                                else
                                        state <= STATE + 2;
                                end if;
        when STATE + 2 =>
                                ...
        ...

Závěr

Úlohu se nám bohužel nepodařilo sprovoznit. Zásadní problém byl v načítání bitového toku dat ze sériovéhi portu. Nevýhodou byla nepřítomnost hodinového signálu, dále nemožnost použít konstrukci wait for jazyka VHDL, která by celý progrm usnadnila.

Při testování se stávalo, že se na displeji zobrazilo čislo, které se dále něměnilo. Z toho usuzujeme že chyba je někde v časování a automat se zastaví v místě, kde se čeká na konkrétní hodnotu bitu (start bit).

Rozdělení prací

Jméno Práce na entitách Dokumentace
eReader eDecoder eDisplay a eMulti
Robert Lufinka X ? ? X
Oldřich Nič ? ? X X
Milan Ptáček ? X X ?

Zdrojové texty pro Xilinx ISE

mouse.npl , soubor projektu
mouse.vhd , vlastní kód ve VHDL
emouse.ucf , soubor mapovaní portů