PC用ディスプレイにパターンを表示
以下にアップしています。。。
3bit RGBのカラーパレットで色を8種の表現
3'b000 → 黒 (0,0,0)
3'b001 → 青 (0,0,255)
3'b010 → 緑 (0,255,0)
3'b011 → シアン (0,255,255)
3'b100 → 赤 (255,0,0)
3'b101 → マゼンタ (255,0,255)
3'b110 → 黄 (255,255,0)
3'b111 → 白 (255,255,255)
全体の動作まとめ
次のような流れで動作している:
- pckgen が 25.175 MHz のピクセルクロックを生成
- syncgen がこのクロックを基に VGAタイミング(水平/垂直カウンタと同期信号)を生成
- pattern がカウンタ値に応じた RGB パターンを生成(縦ストライプ+上下で反転)
- HDMI 用の rgb2dvi IP に信号を渡し、HDMI 出力として信号を生成
- ディスプレイにパターンが表示される
表示されるパターンについて
- 水平方向に 8 段階(80ピクセルごと)で色が変化
- 奇数行と偶数行でカラー順序が反転(アップカウント・ダウンカウント切り替え)
- 色の表現:rgb_1 は3ビット値で、各ビットがそれぞれRGBのON/OFFに対応
- 例: 3'b101 → 赤と青が最大輝度 → 紫
ソース解説
pattern_hdmi (トップモジュール)
- 機能:HDMI出力付きのパターン表示システムの最上位モジュール。
- 構成:pattern モジュールでRGBデータと同期信号を生成
- rgb2dvi モジュール (HDMI変換IP) によりRGB信号をTMDS (HDMI) 信号に変換
pattern (パターン生成モジュール)
- 機能:VGA規格(640x480)の解像度で、縦縞模様を上下交互に反転させたパターンを生成
- 内部構成:syncgen モジュール: 垂直/水平同期信号とピクセルクロックを生成
- VGA画面表示領域内 (disp_enable) で、HCNT(水平位置) に基づいてカラーが変化するストライプ模様を生成
- 垂直位置 (VCNT) に応じて奇数/偶数行ごとにカラーの並び順を反転
pckgen (ピクセルクロック生成モジュール)
- 機能:125 MHz のシステムクロックから VGA 用の 25.175 MHz ピクセルクロックを生成。
- 実装:Xilinx FPGA の MMCME2_BASE IPコアを使用
syncgen (同期信号生成モジュール)
- 機能1: VGAのタイミングに従い、水平/垂直カウンタを制御し、同期信号を生成
- 機能2: pckgen を使用して PCK を得る
vga_param.vh (パラメータファイル)
- 内容:VGA 640x480(60Hz)のタイミングパラメータ定義
- 水平 総周期: 800クロック 表示期間: 約640クロック (計算より)
- 垂直 総周期: 525ライン 表示期間: 約480ライン
EBAZ4205での変更点
- pckgen.vのみ変更
- CLKINの周期を実際のクロックに合わせる
MMCME2_BASE #(
.BANDWIDTH("OPTIMIZED"), // Jitter programming (OPTIMIZED, HIGH, LOW)
.CLKFBOUT_MULT_F(36.0), // 乗数M(2.000-64.000)
.CLKFBOUT_PHASE(0.0), // 位相(-360.000-360.000)
.CLKIN1_PERIOD(20.0), // CLKINの周期 @yaku 20.0
// CLKOUT0_DIVIDE - CLKOUT6_DIVIDE: Divide amount for each CLKOUT (1-128)
.CLKOUT1_DIVIDE(1),
.CLKOUT2_DIVIDE(1),
.CLKOUT3_DIVIDE(1),
.CLKOUT4_DIVIDE(1),
.CLKOUT5_DIVIDE(1),
.CLKOUT6_DIVIDE(1),
.CLKOUT0_DIVIDE_F(35.75), // 除数Q(1.000-128.000)
// CLKOUT0_DUTY_CYCLE - CLKOUT6_DUTY_CYCLE: Duty cycle for each CLKOUT (0.01-0.99).
.CLKOUT0_DUTY_CYCLE(0.5), // デューティ比
.CLKOUT1_DUTY_CYCLE(0.5),
.CLKOUT2_DUTY_CYCLE(0.5),
.CLKOUT3_DUTY_CYCLE(0.5),
.CLKOUT4_DUTY_CYCLE(0.5),
.CLKOUT5_DUTY_CYCLE(0.5),
.CLKOUT6_DUTY_CYCLE(0.5),
// CLKOUT0_PHASE - CLKOUT6_PHASE: Phase offset for each CLKOUT (-360.000-360.000).
.CLKOUT0_PHASE(0.0),
.CLKOUT1_PHASE(0.0),
.CLKOUT2_PHASE(0.0),
.CLKOUT3_PHASE(0.0),
.CLKOUT4_PHASE(0.0),
.CLKOUT5_PHASE(0.0),
.CLKOUT6_PHASE(0.0),
.CLKOUT4_CASCADE("FALSE"), // Cascade CLKOUT4 counter with CLKOUT6 (FALSE, TRUE)
.DIVCLK_DIVIDE(2), // 除数D(1-106) @yaku 2
.REF_JITTER1(0.0), // Reference input jitter in UI (0.000-0.999).
.STARTUP_WAIT("FALSE") // Delays DONE until MMCM is locked (FALSE, TRUE)
)