日曜デジタル

Entries

Ads by Google

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • ▲
  • --------
  • スポンサー広告
  • コメント : -
  • トラックバック : -
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://geeklet.blog46.fc2.com/tb.php/8-ab926a1c

-件のトラックバック

[T1] PS/2キーボードインターフェース用テストベンチ(procedure使用)

procedure文を利用して、”日曜デジタル”の”PS/2に挑戦”のPS/2キーボード・インターフェースのテストベンチを書いてみた。 procedureは他でも use して使えるように、package として書くこと...
  • 2007-10-03
  • FPGAの部屋

-件のコメント

[C6]

非常にためになりました。わかりやすいです。
私も趣味で作ってみようと思います。
私はModelSimは単体で使っています。私のブログでやり方を書こうと思っています。
  • 2006-02-06
  • marsee
  • URL
  • 編集

[C7]

marseeさま
ModelSimの解説ぜひお願いします。
使いこなせれば便利そうな気はするんですが、なにができるのかどうも今ひとつ把握できなくて…。
  • 2006-02-07
  • geeklet
  • URL
  • 編集

[C41]

こんにちは。
お久しぶりです。
このページのps2readのテストベンチをprocedure文を使って、私のブログに書いてみました。
よろしかったらご覧ください。
http://marsee101.blog19.fc2.com/blog-entry-611.html
  • 2007-10-03
  • marsee
  • URL
  • 編集

[C42]

PS/2のタイミングチャートとキーボードのコードは
DOS/Vテクニカル・リファレンス・マニュアル (単行本)
芦達 剛 (著) ソフトバンク
に載っていると思います。
何年も前にこの本を見てAVRで作ってみたので…
それ以外のインターフェースのフォーマットも掲載されていたと思います
amazonではまだ売っているようです。
  • 2007-10-03
  • きぃたん@大阪
  • URL
  • 編集

[C44]

marseeさん、お久しぶりです。
例題に使っていただけたとは感激です!
さっそく見てみますね。
  • 2007-10-03
  • geeklet
  • URL
  • 編集

[C45]

きぃたんさん、はじめまして。
そんな本があったのですか…とAmazonを見てみましたが、さすがにマーケットプレイスでしか買えないみたいです。
この本が出たのは1994年…インターネット普及前夜ですね。
あのころはPCのI/Oを自作ソフトでたたこうと思ったら、雑誌か書籍が頼り(あとはパソ通とかfjのニュースで訊くとか)でしたね…。
今買うとしたらCQ出版のトラ技スペシャル「パソコン・インターフェース規格入門」あたりかと思います。
  • 2007-10-03
  • geeklet
  • URL
  • 編集

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

PS/2に挑戦

PS/2インタフェースについて一通りのことは分かったので、ためしに実装してみることにした。

なるべく簡単にできるように、回路は
「PS/2キーボードから送られてきたキーコードをそのまま8bitのLEDへ出力する」
というだけのもの。


PS/2の規格は、簡単にまとめるとこんな感じ。

  • 信号は「クロック」「データ」の2本で、クロックはデバイス側から送られる。
  • デバイスからのデータはクロックの立下りのタイミングで送られる。
  • データは、
    「1ビットの0(スタートビット)」
    「8ビットのデータ(LSBから送受信)」
    「1ビットのパリティ」
    「1ビットの1(ストップビット)」
    の合計11ビットで送られる。

また、キーボードに限っては

  • キーを押したときはキーコードを送り、キーを離したときは"F0"を送ってからキーコードを送る。

という決まりがある。

英語が苦にならないなら、Simple PS/2 Interfaceを一読するとよい。


なお、PS/2には電圧が5Vの規格と3.3Vの規格があるようだ。
Spartan3スタータキットのマニュアルによると、最近のPS/2デバイスは3.3Vでも動作するが、古いものだと5Vでなければ動作しないことがあるとのこと。

スタータキットの初期設定は3.3Vになっているが、PS/2コネクタのそばのジャンパで5Vに切り替えることができる。
私の手持ちのキーボードは3.3Vでは動作しなかったので、5Vの設定に変えた。


さて、回路のほうの動作はこんな感じだ。

  • PS/2クロックの立下りを検出する。
    回路全体をPS/2クロックに同期させてしまえば楽だが、外部クロックに同期して動かすのはよろしくないとこちらに書いてあったりしたので、システムクロックで動作させることにした。
    システムクロックを使ってPS/2クロックをサンプリングし、直前の状態と比較することで立下りを検出する。
  • 受信回路は二つの状態「受信中」「アイドリング」を遷移する。
  • アイドリングから受信中へ状態遷移するタイミングは、スタートビットが来た時、つまりクロックの立下りでデータが0という条件を満たしたとき。
  • 受信中はクロック信号に合わせてデータ信号をシフトレジスタに格納していく。データの送信順はLSBからなので、シフトは左から右。
  • 受信中からアイドリングへ状態遷移するタイミングは、ストップビットを確認したときだが、これはスタートビットを1ビット目として、11ビット目を受信したとき。また、その11ビット目は必ず1であるはず。



受信中→アイドリングの遷移の判断をするために、10ビット長のシフトレジスタを使った。
スタートビットが来た時点ではシフトレジスタの初期値を次のように設定する。

0111111111


これが、データを4ビット受信した時点ではこんな感じになり

XXXX011111


8ビットのデータとパリティ(P)を受信した時点では以下のようになる。

PXXXXXXXX0


つまり、LSBが0になったときにストップビットが来るはず。


というわけで実際に作ってみたものを最後に載せておく。
ストップビットが来なかったら? などの異常系の処理や、パリティのチェックなども全くしていないが、とりあえず動く様子は確認できる。

PS/2キーボードを接続してキーを押すと、それに応じて8個のLEDのパターンが変化する。
また、キーを離した瞬間、一瞬11110000が点灯しているのも目視できるはず。
キーのスキャンコードの一覧は、Spartan3スタータキットの薄いほうのマニュアルに載っている。(英語配列キーボード版だけど)

今回、デバッグにはModelSimもちょっと使った。
ソースコードの変更をModelSim側に反映させるやり方がわからなかったので、変更するたびにModelSimの終了→立ち上げを行ってすこぶる面倒くさい。
でも、デバッグには役立った。
テストベンチコードはスマートに書ければ良かったんだけど、11ビット分のデータを送るためのシステムクロック/PS/2クロック/PS/2データの代入文が延々と並んでいるだけなので、割愛する。


VHDLファイル:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity ps2read is
Port ( clk : in std_logic;
reset : in std_logic;
ps2clk : in std_logic;
ps2data : in std_logic;
scancode : out std_logic_vector(7 downto 0));
end ps2read;

architecture Behavioral of ps2read is

signal ps2clk_last1 : std_logic;
signal ps2clk_last2 : std_logic;
signal shift_reg : std_logic_vector(9 downto 0);
Type State_t is (Idle, Shifting);
signal state : State_t;

begin
process(clk, reset)
begin
if(reset = '1') then
state <= Idle;
scancode <= "00000000";
elsif(clk'event and clk = '1') then
ps2clk_last2 <= ps2clk_last1;
ps2clk_last1 <= ps2clk;

if (ps2clk_last2 = '1' and ps2clk_last1 = '0') then -- ps2clk fall edge

case state is
when Idle =>
if (ps2data = '0') then -- start bit has come
state <= Shifting;
shift_reg <= "0111111111";
end if;

when Shifting =>
if (shift_reg(0) = '0' and ps2data = '1') then -- stop bit has come
scancode <= shift_reg(8 downto 1);
state <= Idle;
else
shift_reg <= ps2data & shift_reg(shift_reg'high downto 1);
end if;

when Others =>
state <= Idle;
end case;
end if;
end if;
end process;
end Behavioral;




UCFファイル:

### Spartan-3 Clock Oscillator:
NET clk LOC=T9; # CLK - 50MHz oscillator

NET reset LOC=M13; # BTN1 (active high)

### Spartan-3 Discrete LEDs:
NET scancode<7> LOC=P11; # LD7 (active high)
NET scancode<6> LOC=P12; # LD6 (active high)
NET scancode<5> LOC=N12; # LD5 (active high)
NET scancode<4> LOC=P13; # LD4 (active high)
NET scancode<3> LOC=N14; # LD3 (active high)
NET scancode<2> LOC=L12; # LD2 (active high)
NET scancode<1> LOC=P14; # LD1 (active high)
NET scancode<0> LOC=K12; # LD0 (active high)

### Spartan-3 PS/2 Port:
NET ps2clk LOC=M16; # PS/2 port clock
NET ps2data LOC=M15; # PS/2 port data


  • ▲
  • 2006-02-06
  • FPGA
  • コメント : 6
  • トラックバック : 1
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://geeklet.blog46.fc2.com/tb.php/8-ab926a1c

1件のトラックバック

[T1] PS/2キーボードインターフェース用テストベンチ(procedure使用)

procedure文を利用して、”日曜デジタル”の”PS/2に挑戦”のPS/2キーボード・インターフェースのテストベンチを書いてみた。 procedureは他でも use して使えるように、package として書くこと...
  • 2007-10-03
  • FPGAの部屋

6件のコメント

[C6]

非常にためになりました。わかりやすいです。
私も趣味で作ってみようと思います。
私はModelSimは単体で使っています。私のブログでやり方を書こうと思っています。
  • 2006-02-06
  • marsee
  • URL
  • 編集

[C7]

marseeさま
ModelSimの解説ぜひお願いします。
使いこなせれば便利そうな気はするんですが、なにができるのかどうも今ひとつ把握できなくて…。
  • 2006-02-07
  • geeklet
  • URL
  • 編集

[C41]

こんにちは。
お久しぶりです。
このページのps2readのテストベンチをprocedure文を使って、私のブログに書いてみました。
よろしかったらご覧ください。
http://marsee101.blog19.fc2.com/blog-entry-611.html
  • 2007-10-03
  • marsee
  • URL
  • 編集

[C42]

PS/2のタイミングチャートとキーボードのコードは
DOS/Vテクニカル・リファレンス・マニュアル (単行本)
芦達 剛 (著) ソフトバンク
に載っていると思います。
何年も前にこの本を見てAVRで作ってみたので…
それ以外のインターフェースのフォーマットも掲載されていたと思います
amazonではまだ売っているようです。
  • 2007-10-03
  • きぃたん@大阪
  • URL
  • 編集

[C44]

marseeさん、お久しぶりです。
例題に使っていただけたとは感激です!
さっそく見てみますね。
  • 2007-10-03
  • geeklet
  • URL
  • 編集

[C45]

きぃたんさん、はじめまして。
そんな本があったのですか…とAmazonを見てみましたが、さすがにマーケットプレイスでしか買えないみたいです。
この本が出たのは1994年…インターネット普及前夜ですね。
あのころはPCのI/Oを自作ソフトでたたこうと思ったら、雑誌か書籍が頼り(あとはパソ通とかfjのニュースで訊くとか)でしたね…。
今買うとしたらCQ出版のトラ技スペシャル「パソコン・インターフェース規格入門」あたりかと思います。
  • 2007-10-03
  • geeklet
  • URL
  • 編集

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

  • «
  • ホームに戻る
  • »

Appendix

FC2カウンター

プロフィール

Author:geeklet
本業はソフト屋だけど趣味でハードをいじっています。

アクセス解析

Mozilla Firefox ブラウザ無料ダウンロード

最近の記事

  • ロボピース ストラップ (06/21)
  • intelドロップがやや改善? 今年のESEC (05/18)
  • 若松通商 会津 (05/10)
  • Gumstix (04/12)

人気の記事

  • あの鈴蘭堂が閉店してしまった
  • Spartan-3スタータキットにチャレンジ
  • PS/2に挑戦
  • VHDLでPS/2マウスコントローラ(1)
  • 続・Spartan3スタータキットにチャレンジ

広告

カテゴリー

  • デジタル生活 (2)
  • プログラミング (2)
  • 電子工作 (9)
  • FPGA (22)
  • 日記 (91)
  • HDL (1)
  • MAX II (1)
  • 未分類 (0)

月別アーカイブ

  • 2009年06月 (1)
  • 2009年05月 (2)
  • 2009年04月 (2)
  • 2008年11月 (2)
  • 2008年10月 (2)
  • 2008年08月 (2)
  • 2008年06月 (5)
  • 2008年05月 (3)
  • 2008年04月 (5)
  • 2008年03月 (1)
  • 2008年02月 (2)
  • 2008年01月 (2)
  • 2007年12月 (2)
  • 2007年11月 (2)
  • 2007年10月 (4)
  • 2007年09月 (5)
  • 2007年08月 (16)
  • 2007年07月 (5)
  • 2007年06月 (4)
  • 2007年05月 (3)
  • 2007年04月 (1)
  • 2007年03月 (1)
  • 2007年02月 (1)
  • 2007年01月 (4)
  • 2006年12月 (1)
  • 2006年11月 (2)
  • 2006年10月 (3)
  • 2006年09月 (3)
  • 2006年08月 (2)
  • 2006年07月 (3)
  • 2006年06月 (3)
  • 2006年05月 (1)
  • 2006年04月 (8)
  • 2006年03月 (11)
  • 2006年02月 (9)
  • 2006年01月 (5)

最近のコメント

  • geeklet:汎用Linuxボード (12/14)
  • きぃたん@大阪:汎用Linuxボード (12/10)
  • geeklet:汎用Linuxボード (11/27)
  • きぃたん@大阪:汎用Linuxボード (11/26)
  • geeklet:100 PC、Chumbyどっちも発売 (11/19)

RSSフィード

最新記事のRSS
FC2ブログ