おいふぉりーのぶろぐ

きっと趣味のブログに違いないです!!

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

[MAXII]シリアルポートでXXX 其の弐

さて、其の弐ってことですが、現段階で送受信の実機動作確認までしました。ソースコードは、私のホームページの方にUpしときましたので、見たいヒトは落としてみてください。
今日ファイルをUpするときに、ちょっと気になったことですが、ホームページのほうの領域のzipファイルとpdfファイルがいつの間にやら消されてたようで、特に利用規約に違反してるつもりは無いんですが、また消されてて404が出たヒトがいたら、連絡ください。私の勘違いであれば良いのですが。。。

まずは、送信側のシミュレーションについてです。↓ファイルサイズはでかくないけど、画像サイズがでかいので注意。
maxii_sim2.png
送信側も受信側と同様に、単バイト送信に続き、複数バイト送信の動作確認を行いました。まあ、ここまで、予定ではスムーズに進むつもりでしたが、そう甘くは無いってことで。。。送信モジュールでは、fStartとtrgStartという変数(いや、信号か?)を宣言しているんですが、一部ごっちゃになってしまったらしく。。。一発目のシミュレーションではうまく動かなかったり。変数名は分かりやすく!! 之、きっと基本です。ハイ、以後気をつけます。

ここで、一応、送受信モジュールの動作について、VHDLのソースを踏まえて解説というか、備忘録としてメモっときます。基本的な構造は、PICマイコンとかに載ってるUARTモジュールと似た感じです。最初に、前回の受信側から解説します。
-- uart.vhd の受信モジュールの定義
entity EzUartRc is
port (
--dbgRcBR : out std_logic_vector(6 downto 0);
--dbgRcStat : out std_logic_vector(3 downto 0);

iClock : in std_logic; -- Clock
iNReset : in std_logic; -- Reset
oData : out std_logic_vector(7 downto 0); -- Data (is enabled when oFull = '1')
iRead : in std_logic; -- Read from receive buffer
oFull : out std_logic; -- whether Receive buffer is Full
iRXD : in std_logic -- RXD
);
end EzUartRc;
信号についてですが、iClock、iNResetはクロック(32MHz)、非同期リセットです。oDataは受信データを出力します。受信後、受信バッファの状態を示すoFullがセットされます。その後、iReadを'1'にし、データを読み取ったことを知らせると、oFullがクリアされ、次の受信に備えることができます。iRXDはもちろん、受信用の端子です。
動作についてです。スタートビットを検出すると、iRXDを受信しながら、受信用シフトレジスタsregRcを右シフトしていきます。データ部の8ビットを受信後、ストップビットを検出し、そのとき受信バッファが空oFull=0ならば、sregRcからregRcBufにデータを転送し、oFullフラグをセットします。そして、受信データを外部のモジュールから読み取ることになります。今回の実装では、受信バッファが一杯oFull=0だったときは、そのデータを取りこぼすことになってしまいます。取りこぼした場合は、オーバーフローフラグをセットするようにしたほうが良いかもしれませんね。

さて、次は送信側です。
-- uart.vhd の送信モジュールの定義
entity EzUartTr is
port (
--dbgTrBuf : out std_logic_vector(7 downto 0);
--dbgTr : out std_logic_vector(7 downto 0);
--dbgTrBR : out std_logic_vector(6 downto 0);
--dbgTrStat : out std_logic_vector(3 downto 0);
--dbgStart : out std_logic;

iClock : in std_logic; -- Clock
iNReset : in std_logic; -- Reset
iData : in std_logic_vector(7 downto 0); -- Data
iWrite : in std_logic; -- Write to transmit buffer (when oEmpty = '1')
oEmpty : out std_logic; -- whether Transmit buffer is Empty
oTXD : out std_logic -- TXD
);
end EzUartTr;
送信側も、レジスタ等の構造は受信側と同じになっています。信号についてですが、iDataが送信データの入力、oEmptyが送信バッファの状態、oTXDが送信端子となっています。
動作のほうですが、上のほうの送信のシミュレーション結果を見てもらえば分かるように、送信モジュールにデータを書き込むと、送信データはまず送信バッファregTrBufに書き込まれます。このとき、fEmptyはクリアされます。次のサイクルで、送信中で無ければ、送信データはregTrBufから送信用シフトレジスタsregTrに転送されます。このとき、fEmptyはセットされ、外部のモジュールからさらにデータを書き込むことができるようになります。送信データがシフトレジスタsregTrに転送されると、スタートビットを送信した後、sregTrを右シフトしながらデータ部分を送信、最後にストップビットを送信して送信が完了します。
かなり、おおざっぱになってしまいましたが、おおまかな動作はこんな感じです。詳細は、ソースコード読んで。。(頼むから☆)あっ、Verilogなヒトはごめんなさいね。

テスト用のtopモジュールについても書いときます。topモジュールは、受信データのエコーを送信するだけです。一応、受信データを適当なポートに出力されています。

一通り、シミュレーションも終わり、実機で動作確認した後、気づきました。今回使ってるUSBシリアルのICは3Mbpsまで出るので、もっと速く転送できることに。クロックが32MHzなので、1/16に分周するとちょうど2Mbpsってことで、これ試してみました。2Mbps版のほうもUpしたファイルに入れときました。ちょこっと、ボーレートのカウンタをいじっただけですけどね。てゆ~か、2Mbps出るなら、PCM16ビット44.1kHzステレオサウンドが転送できるではないかとか思ったり。

最後に、PC側のプログラムです。TeraTermでテストしようとしても、256kbpsも2Mbpsもサポートされてないってことで、自前で書き起こしました。これも、UPしたファイルに入ってます。
maxii_test_with_pc.png
まあ、COM1開いて、abcって文字を送って、ちゃんとエコーが返ってきてるか確認するプログラムです。MAXIIにつながってるポートチェッカには、最後に送られた文字'c'の2進コード"01100011"が表示というか、LEDの点灯で示されます。

(ざっとこんなもんかなぁ~、疲れたぁ~。)
  1. 2006/03/29(水) 21:32:07|
  2. ハードウェア開発
  3. | トラックバック:0
  4. | コメント:0
<<ホームページのほう引っ越します。 | ホーム | [MAXII]シリアルポートでXXX 其の壱>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://tm86eublog.blog42.fc2.com/tb.php/64-1e0c5a00
この記事にトラックバックする(FC2ブログユーザー)

来客数

プロフィール

Euphorie

Author:Euphorie
"おいふぉりー"って呼んでくださいな☆
ハードウェアとかソフトウェアとかの開発に興味があったり。。。
連絡先は上の画像。

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。