FC2カウンター FPGAの部屋 BUFR でクロックを分周する場合は制約を追加する必要がある(ビットマップ・ディスプレイ・コントローラ IP のHDMI 出力)

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

FPGAの部屋

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

BUFR でクロックを分周する場合は制約を追加する必要がある(ビットマップ・ディスプレイ・コントローラ IP のHDMI 出力)

Zynq のビットマップ・ディスプレイ・コントローラのHDMI 出力では、VGA, SVGAは安定して出力できるが、XGA以上になると時々プチプチ切れる現象が続いていた。(”ZYBOにビットマップ・ディスプレイ・コントローラを追加する1(仕様)”参照)

並列ステレオカメラによる距離の測定5(ZYBO 0 のハードウェア4)”でもHDMI 出力のXGA 画像が時々消えてしまっていた。

Digilent 社のDigilentInc/vivado-library を Download ZIP して見ていた時に、ip\rgb2dvi_v1_2\src を見ていたら制約のXDCファイルがある。制約を見るとHDMI の周波数がピクセルクロックの5倍のSerDes 用クロックは、ピクセルクロックのクロック周波数の 5 倍の周波数であるという記述だった。

もしかしてこの記述が重要なのか?と思い、自分のMMCM の制約として付けてみることにした。取りあえずは、ビットマップ・ディスプレイ・コントローラ IPの制約ではなく、プロジェクト全体への制約として付加することにする。

MMCM回りのVHDL記述を下に示す。

MMCM_BASE_PIXEL : MMCME2_BASE generic map (
BANDWIDTH => "OPTIMIZED",
    CLKOUT4_CASCADE     => FALSE,
    STARTUP_WAIT        => FALSE,
    CLKFBOUT_MULT_F => MMCM_CLKFBOUT_MULT,
CLKIN1_PERIOD => MMCM_CLKIN_PERIOD,
CLKOUT0_DIVIDE_F => MMCM_CLKOUT0_DIVIDE,
DIVCLK_DIVIDE => 1
) port map (
CLKFBOUT => mmc_fb_out,
CLKOUT0 => pixel_clkx5,
LOCKED => mmcm_locked,
CLKFBIN => mmc_fb_in,
CLKIN1 => clk25,
PWRDWN => '0',
RST => '0'
);
mmcm_locked_n <= not mmcm_locked;
mmc_fb_in <= mmc_fb_out;
-- BUF_FB : BUFG port map(
-- I => mmc_fb_out,
-- O => mmc_fb_in
-- );
BUFIO_pixel_clkx5 : BUFIO port map (
O => pclkx5_buf,
I => pixel_clkx5
);
BUFR_pixel_clk_io : BUFR generic map(
BUFR_DIVIDE => "5",
SIM_DEVICE => "7SERIES"
) port map (
O => pclk_buf,
CE  => '1',
CLR => mmcm_locked_n,
I => pixel_clkx5
);
CLK_OUT_BUFG : bufg port map (
O => pclk_buf_out,
I => pclk_buf
);
pclk_out <= pclk_buf_out;
pclk_locked <= mmcm_locked;


上のVHDL ソースコードで pclkx5_buf がOSERDESE2 用の出力データシフト用クロックだ。OSERDESE2 のモードはDDR となっている。ピクセルクロックはBUFR で 5 分周されたpclk_buf_out だ。(BUFRに関しては、”AR# 465057 シリーズ FPGA デザイン アシスタント - クロック バッファーの使用”を参照)

そこで、Flow Navigator のImplementation -> Implemented Desgin をクリックして、Implemented Desgin 画面を起動した。

Flow Navigator のImplementation -> Implemented Desgin -> Edit Timing Constraints をクリックしてタイミング制約を編集した。
もうすでに入っているが、Create Generate Clock に pclkx5_buf クロックを元に1/5 してpixclk を作っているという制約が入っている。
StereoCam_48_151121.png

StereoCam_49_151121.png

制約の記述を示す。

create_generated_clock -source [get_pins ZYBO_0_i/bitmap_disp_cntrler_axi_master_1/inst/dvi_disp_i/hdmi_tx_i/pclkx5_buf] -divide_by 5 [get_pins ZYBO_0_i/bitmap_disp_cntrler_axi_master_0/inst/dvi_disp_i/pixclk]


これで、”並列ステレオカメラによる距離の測定5(ZYBO 0 のハードウェア4)”をもう一度、論理合成、インプリメント、ビットストリームの生成を行ったところ、XGA 解像度のHMDI 出力が安定した。

通常は、MMCMやPLL で異なる周波数のクロックを出力しても自動的に新しいクロックの制約を自動生成してくれると思うのだが、BUFR に関してはやってくれないのかもしれない?
ビットマップ・ディスプレイ・コントローラ IP の制約として一緒にIP したほうが良いと思う。
  1. 2015年11月21日 05:51 |
  2. 制約
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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