FC2カウンター FPGAの部屋 PCI-Xバスへの出力信号のHDL記述
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

PCI-Xバスへの出力信号のHDL記述

前のPCI回路ではDEVSEL#などの制御信号の出力記述は、なるべく簡単化するように、DEVSEL#出力専用のステートマシンを作って、PCIターゲットのステートマシンがデコード・チェック・ステートだったら '0' に遷移というように書いていた。また、組み合わせ回路出力ではなく、必ずFF出力になるように書いていた。こんな感じ。
devsel_sm_070706.png

ハイ・インピーダンスにするためのトライステートバッファのイネーブルも必ずステートマシンのFF出力から入力できるように書いてあった。このように書くと、ステート数としては少ないが、一目見てわかりづらく間違いやすいし、他を修正したときに、影響があるのに気がつかないでバグになることが多かった。
そこで今回は論理合成ツールを信じてテーブルのように書いてみることにした。こんな感じ。

    process(clk, reset) begin
        if reset='1' then
            devselx <= 'Z';
        elsif clk'event and clk='1' then
            case mcs is
                when idle =>
                    devselx <= 'Z';
                when attribute_state =>
                    devselx <= 'Z';
                when Decode_check =>
                    if mydev='1' and tgt_busy='0' then
                        devselx <= '0';
                    end if; 
                when write_wait =>
                    devselx <= '0';
                when write_data =>
                    devselx <= '1'; -- データ転送したら非アクティブ
                when read_data_wait =>
                when read_data => 
                    devselx <= '1'; -- データ転送したら非アクティブ
                when tgt_discon_retry =>
                    devselx <= '1'; -- リトライ
                when turn_around =>
                    devselx <= 'Z';
                when bus_busy =>
                    devselx <= 'Z';
            end case;
        end if;
    end process;


そして、Synplify Proで合成し、RTL回路図を表示すると下のようになる。
devsel_synplify_cir_070705.png

上図を見ると、トライステートバッファへの入力、イネーブル入力ともにFF出力になっているのでOKだが、入力を見るとFF出力から、そのFFの入力の組み合わせ回路へフィードバックされている。これではIOBの構造上、IOB内のFFにアサインすることができない。
実際にインプリメントしてFPGA Editorで見てみると、やはりネットが2つに分かれている。(左端のピンクの矢印)
devsel_FPGAeditor_1_070705.png

やはりフィードバックしているようだ。これだとIOBにはいらない。
IOBの中をのぞいてみるとこのようになっている。
devsel_FPGAeditor_2_070705.png

緑の四角で囲ったのが、トライステートバッファの入力用のFFなどだ。
もう1つのトラーステートバッファのイネーブル入力はどうかと言うと、SynplifyのRTL回路図ではフィードバックがあるが、インプリメント後の下の図を見るとネットが1本だけある。
devsel_FPGAeditor_5_070705.png

さらに、アサインされているスライスを見るとFFだけを使用している。(緑の四角の中)
devsel_FPGAeditor_3_070705.png

これだとIOB内のFFにアサインすることができるかもしれない。
Constraints EditorでIOBをTRUEにするとトライステートバッファのイネーブル用のFFだけがIOBに入った。(”IOBの入力用FFを活用する”参照)
devsel_FPGAeditor_4_070705.png

緑の矢印がそうだ。
PCI-X 133MHzのセットアップ時間は1.2ns、出力時間は3.8nsなので、なるべくIOBのFFにアサインしたいと思っている。
今はVirtex2pro VP30-6でセットアップ時間、出力時間のマージンはTiming Analyzerで見る限りはあまり余裕が無い。セットアップ時間がオーバーしていたが、出力時間が比較的マージンがあったので、+0.7ns程度DCMでフェーズシフトしてタイミングを満足させている。
  1. 2007年07月05日 20:07 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/516-7a99039d
この記事にトラックバックする(FC2ブログユーザー)