特電Artix-7ボードでHDTV1080pの表示に成功
昨日、Spartan-6ボードでHDMI表示に成功したので、今日はArtix-7ボードでやってみました。
まず、特電Artix-7ボードにピンヘッダを立てて、万能基板に乗せます。ちょっとスイッチを可愛くしてみました。
HDMIコネクタは千石電商で270円で売られていたものです。万能基板にドリルで穴をあけて裏側からラッピングワイヤで配線を引き出します。
TMDS信号のGNDは信号のリターンとして重要な意味を持つ配線なのでこんな処理方法でいいのかどうかは悩むところですが、後の実験では問題なくいきました。
SDAとSDLは4.7kΩでプルアップ。HPDは4.7kΩでプルダウン。CECはオープンです。
そして、XAPP495をArtix-7向けに書き換えます。XAPP495はSpartna-6向けに書かれたものなので、そのままではArtix-7でビルドできません。
変更すべき個所はいくつかあって、
- クロック入力部分のBUFIO2プリミティブを削除する
- OSERDES2プリミティブを使っているところをOSERDESE2に変える
(serdesstrobe信号は不要になる) - DCM_CLKGENは使えない。(MCMM_ADVとかを使うことになるのだろうけど未実装)
- PLL_BASE+BUFPLLの部分は削除して、CoreGenのクロックジェネレータに置き換える
です。
Spartan-6で使っていたDCM_CLKGENというのは何かというと、解像度に応じてPLLのMやDの値を動的に切り替えるためのDCMです。SPI通信を使ってPLLの比を変えられるというものです。ところがArtix-7には同じものはないので、今回は解像度固定で作りました。
あとはリセットボタンの極性などを直せば、Artix-7からSXGA(1280×1024)の60pが出力されました。
![]()
さて、次はいよいよFULL HDを動かします。
あらためてFPGAマガジンを読んでみたのですが、1920×1080pの場合のクロック周波数や、水平同期信号の幅や位置などに関する記述がまったくどこにもないですね。うーん。各解像度におけるクロック速度みたいな表はあったけど、なんか別のページにある表と違うし。筆者によってクロック速度が異なる!???
もうFPGAマガジンVOL1を解読するのはあきらめて、Interface2011年9月号を読みました。こちらにはちゃんとパラメータが書いてあります。
それを元に自分で書いてXAPP495に追加してみます。
//1920x1080@60HZ
parameter HPIXELS_HDTV1080P = 12'd1920; //Horizontal Live Pixels
parameter VLINES_HDTV1080P = 11'd1080; //Vertical Live ines
parameter HFNPRCH_HDTV1080P = 12'd88; //Horizontal Front Portch
parameter HSYNCPW_HDTV1080P = 12'd44; //HSYNC Pulse Width
parameter HBKPRCH_HDTV1080P = 12'd148; //Horizontal Back Portch
parameter VFNPRCH_HDTV1080P = 11'd4; //Vertical Front Portch
parameter VSYNCPW_HDTV1080P = 11'd5; //VSYNC Pulse Width
parameter VBKPRCH_HDTV1080P = 11'd36; //Vertical Back Portch
ところで、XAPP495の回路は水平カウンタが11bitで作られているので、12bitに拡張してあげなければなりません。結構たくさんの箇所があるので大変ですが、11bitの記述を全部つぶしていきます。
そして、HDTV1080P用のパラメータを定義したら、tc_hsblnkなどの信号を作るセレクタに、
SW_HDTV1080P:
begin
hvsync_polarity = 1'b0; // positive polarity tc_hsblnk = HPIXELS_HDTV1080P - 12'd1;
tc_hssync = HPIXELS_HDTV1080P - 12'd1 + HFNPRCH_HDTV1080P;
tc_hesync = HPIXELS_HDTV1080P - 12'd1 + HFNPRCH_HDTV1080P + HSYNCPW_HDTV1080P;
tc_heblnk = HPIXELS_HDTV1080P - 12'd1 + HFNPRCH_HDTV1080P + HSYNCPW_HDTV1080P + HBKPRCH_HDTV1080P;
tc_vsblnk = VLINES_HDTV1080P - 11'd1;
tc_vssync = VLINES_HDTV1080P - 11'd1 + VFNPRCH_HDTV1080P;
tc_vesync = VLINES_HDTV1080P - 11'd1 + VFNPRCH_HDTV1080P + VSYNCPW_HDTV1080P;
tc_veblnk = VLINES_HDTV1080P - 11'd1 + VFNPRCH_HDTV1080P + VSYNCPW_HDTV1080P + VBKPRCH_HDTV1080P;
end
という記述を追加します。
また、50MHzから148.5MHzを作るために、モジュールPCLK_GEN_INST内のPLLの比をM=37.125、D=6.25に設定します。もはや整数じゃありませんね。こんなすごい比に設定できるのがArtix-7のすごいところです。
そしてコンパイル。多少のタイミングエラーは気にしないでいきましょう。Artix-7のI/Oは本来1.4Gbpsの信号を出すようには作られていないのですから。
家庭用のテレビにつなぐと・・
はい。このとおり無事に1080pで表示されました。
オシロで同期信号をみてみると、確かに設計したとおり垂直60Hz、水平67.5kHzになっていました。
汎用I/Oから1450Mbpsの信号が出せるとは、なんとおそろしいFPGAでしょう。
| 固定リンク






コメント