ブログ - SCCのStart Bit検出回路の問題

SCCのStart Bit検出回路の問題

カテゴリ : 
デバイス
執筆 : 
dohi 2008-10-4 21:59
ASYNC controlerを作りなが、思い出しました。15年ほど前、ZilogのSCC Z85C30を使っていた際のトラブルです。

Asyncで、半二重モデムに繋いでいたのですが、受信に切り替わった際、先頭キャラクタがフレーミング・エラー(STOPビット位置のRXDが、本来レベル"1"であるべきところ、"0"を検出)になる場合があるのです。

HPのプロトコル・アナライザ4951でモニタしても、エラーの位置は異なりますが、同じ現象が出ます。(当時HPには、測定器部門がありました。現在はアジレント

現象から、STARTビット直前にゴミが出ているのだろうと、プロ・アナのエラー出力をトリガにして、ストレージ・オシロで観測するのですが、見あたりません。
長いレンジが取れる測定器で観測すると、ゴミは随分と前の位置にありました。
モデム屋さん曰く、「エキストラ・ビット」と格好言い名前を付けてるんですが、要はゴミです。半二重モデムの宿命のようです。

DCDがoff('1')の間は、秒の単位の時間です。更に、この間はSCCのレシーバをディぜーブルにしているはずなんですが・・・
どうやら、SCCのレシーバ回路は、こんな動作になっているみたいです。
    ・・・・・・・・・・・・・・・・・

process(RXCLK, STATE_REG) begin
    if (STATE_REG = idle) then
        COUNTER <= "0000";
    elsif (RXCLK'event and RXCLK = '1') then
        if (RXD = '0') then
            COUNTER <= COUNTER + 1;
        end if;
    end if;
end process;

process(RXCLK, RX_RESET) begin
    if (RX_RESET = '1') then
        STATE_REG <= idle;
    elsif (RXCLK'event and RXCLK = '1') then
        case (STATE_REG) is
        when idle =>
            if (RXD = '0' and RX_enable = '1') then
                STATE_REG <= hunt;
            end if;
        when hunt =>  -- Start bit検出
            if (RXD = '1') then            -- ゴミ判定
                STATE_REG <= idle;
            elsif (COUNTER = "1000") then  -- start bit?
                STATE_REG <= pending;
            end if;
        when pending =>
            if (COUNTER = "1111") then
                STATE_REG <= is_start_bit;
            end if;

    ・・・・・・・・・・・・・・・・・

RXDは、RXCLKの16倍でサンプルされており、7クロックぐらいの'0'を検出すると、StartBitと判定するんじゃないでしょうか。それ以下だとゴミと判定ですが、一度7クロックを超えてしまうと、RXD='0'が残りのクロック数に達するまで待つ。状態遷移のミスですね。
DCDがonになる毎(送信から受信に切り替わる毎)に、レシーバをリセットするよう、ファームウェアを変更して対応しました。
そして、HPのプロ・アナも、ZilogのSCCを使っていたんだと分かったトラブルでした。

トラックバック

トラックバックpingアドレス http://www.bedesign.jp/modules/d3blog/tb.php/5

新しくコメントをつける

題名
ゲスト名   :
投稿本文
より詳細なコメント入力フォームへ

コメント一覧