Čeština / English
Login

Firmware / Řadič PS/2

Autor: Zdeněk Vašíček ()
Update: 20.3.2009

1. Protokol PS/2

PS/2 rozhraní (zkratka pochází z Personal System/2) je nízkorychlostní sériové rozhraní typu master-slave. V dnešní době se používá výhradně k připojení vstupních zařízení k PC a sice klávesnice a myši. Rozhraní umožňuje obousměrnou point-point komunikaci řízenou tzv. master (nadřazeným) zařízením s jedním (slave) zařízením připojeným ke sběrnici. Rozhraní tvoří kromě napájení pouze dva datové signály:

  • CLK (clock) - hodinový signál, který určuje okamžik, kdy dochází k vzorkování dat. Tento signál v zásadě generuje master a jeho kmitočet se pohybuje kolem 20kHz. Pokud právě neprobíhá přenos dat, je signál ve stavu logické 1 (ve skutečnosti je ve stavu vysoké impedance, na log. 1 jej drží PULL-UP rezistory). Slave může hodinový signál stáhnout do logické 0, čímž oznamuje zařízení na druhé straně, aby neposílal další data.

  • DATA - datový signál. Na fyzické úrovni se opět využívá otevřený kolektor a PULL-UP rezistor, neboť tento signál mohou ovládat obě komunikující strany.

ps2_con.png

Obrázek 1.1: Připojení PS/2 rozhraní (pohled na konektor v PC).

Jak již bylo uvedeno výše, o řízení hodinového signálu se stará master zařízení. PS/2 protokol se vyznačuje tím, že master je nikoliv řadič uvnitř PC ale koncové zařízení (klávesnice, myš). Možnou výhodou tohoto přístupu je fakt, že periferie si sama udává tempo přenosu. Nevýhodou je obtížnější řízení a absence potvrzení správného přijetí dat při čtení. Popis kódů a příkazů, které posílá klávesnice a myš bude uveden v samostatném dokumentu věnujícím se jednotlivým zařízením. Detaily je možné nalézt v 1 a 2. V následujících dvou odstavcích si pouze uvedeme komunikační schemata pro čtení a zápis jednoho byte.

1.1. Přenos dat z koncového zařízení

Přenos dat z koncového zařízení směrem k řadiči je oproti opačnému směru mnohem jednodušší, neboť řadič nemusí generovat žádný signál. Řadič pouze naslouchá a na sestupnou hranu hodinového signálu CLK vzorkuje signál DATA. Protokol PS/2 využívá běžný synchronní seriový osmi bitový přenos následovaný paritním bitem (lichá parita). Každý datový přenos je zahájen start bitem (log 0) a ukončen stop bitem. Byte se posílá od nejméně významného po nejvíce významový bit.

ps2_rd.png

Obrázek 1.2: Časový diagram přenosu dat z koncového zařízení (čtení).

1.2. Zápis dat do koncového zařízení

Zápis dat inicializuje řadič stáhnutím signálu DATA do logické 0. Před touto operací je však nutné alespoň po dobu jednoho hodinového cyklu stáhnout hodinový signál CLK na logickou 0 a tím znemožnit zařízení zahájit další datový přenos. Po zahájení komunikace úvodním start bitem uvolní řadič hodinový signál, čímž informuje koncové zařízení o o požadavku na generování hodinového signálu. Po přenosu všech datových bitů a paritního bitu následuje přenos stop bitu. V případě, že byl přenos úspěšný, je potvrzen koncovým zařízením (Ack).

ps2_wr.png

Obrázek 1.3: Časový diagram přenosu dat z řadiče do koncového zařízení (zápis).

2. Implementace řadiče PS/2

PS/2 řadič je jednoduchá komponenta, která má za úkol realizovat převod sériového protokolu PS/2 na paralelní a naopak. Základem řadiče je konečný automat, který řídí veškerou činnost. Kromě automatu obsahuje řadič také čítač, který slouží k počítání počtu přijatých případně odeslaných bitů. Abychom ušetřili zdroje, používá se čítač také při zápisu do koncového zařízení, kdy slouží k určení potřebného počtu taktů (kvůli zajištění správného časování).

ps2_ctrl.png

Obrázek 2.1: Rozhraní PS/2 řadiče.

Popis rozhraní PS/2 řadiče:

  • RST : std_logic

    Signál, který uvádí řadič do výchozího stavu

  • CLK : std_logic

    Hodinový signál, kterým jsou vzorkovány signály sběrnice PS/2. Aby byly dodrženy požadavky na časování, je vhodné použít hodinový signál SM_CLK.

  • DATA_IN: std_logic_vector(7 downto 0), WRITE_EN: std_logic

    Zápis datového bytu do periferie.

  • DATA_OUT: std_logic_vector(7 downto 0), DATA_VLD: std_logic

    Data, která byla zaslána periferií. Platnost dat určuje signál DATA_VLD.

  • DATA_VLD : std_logic

    Tento signál určuje platnost dat na sběrnici DATA_OUT a je generován poté, co dojde k přijetí datového slova z periferie. Tento signál je možné s výhodou použít pro generování žádosti o přerušení.

  • DATA_ERR : std_logic

    Signál detekuje chybu při přijetí bytu. To se může stát tehdy, pokud nesouhlasí parita, případně zařízení nepotvrdilo zápis.

  • PS2_CLK, PS2_DATA : std_logic

    Signály PS/2 rozhraní.

2.1. Instancování řadiče

Z důvodu šetření zdroji jsou v SVN uloženy dvě varianty řadiče. Obě varianty mají stejné rozhraní avšak odlišnou architekturu. Jednodušší varianta (architektura half) umožňuje pouze jednosměrný přenos dat (čtení ze zařízení). Tento typ přenosu může být pro většinu aplikací dostačující, navíc umožní ušetřit značné množství zdrojů, neboť není nutné řešit poměrně komplikovanou obsluhu zápisu. Složitější varianta řadiče (architektura full) umožnuje čtení i zápis.

Instancovat řadič PS/2 můžeme dvěma způsoby. První způsob využívající klíčového slova entity je pohodlnější a umožňuje přímo specifikovat požadovanou architekturu.

begin
  ps2kb: entity work.PS2_controller(half)
    port map (
      ...
    );
end architecture;

Druhým, komplikovanějším, avšak mnohem čistějším způsobem je instancování pomocí klíčového slova component. Pro výběr příslušné architektury je pak nutné použít kontrukci for - use entity v deklarační části implementované architektury:

  component PS2_controller is
    port (
      ...
    );
  end component;
  for ps2kb: PS2_controller use entity work.PS2_controller(full);
begin
  ps2kb: PS2_controller
    port map (
      ...
    );
  ...
end architecture;

Pokud nespecifikujeme při instancování architekturu, použije se architektura full.

Zobrazeno: 7405x Naposledy: 29.11.2023 04:03:51