4
5 KV260(Kria KV260 Vision AI Starter Kit)のPL側でVGAタイミングの映像
を生成し、PS内蔵のDisplayPortコントローラ経由でHDMIモニターに表示し
ます。
6
7 ベアメタル(standalone)で動作し、JTAG経由で実行します。Vivado/Vitis
2025.1、Ubuntu環境です。
8
9 ## 完成イメージ
10
11 青い背景に白い矩形が表示されます。
12
13 ## 構成
14
15 ```
16 PL (Verilog) PS 外部
17 ┌──────────────┐ ┌──────────────────────┐ ┌──────────┐
18 │ VGAタイミング │───→│ dp_live_video_in_* │ │ │
19 │ 矩形描画 │ │ ↓ │ │ STDP4320 │──→ HDM
I
20 │ 1280x720@60 │ │ AVBuf(映像パイプライン) │ │ (DP→HDMI) │
モニター
21 │ │ │ ↓ │ │ │
22 │ │ │ DPコントローラ │───→│ │
23 └──────────────┘ │ ↑ │ └──────────┘
24 │ TrainLink(AUX通信) │
25 └──────────────────────┘
26 ```
27
28 PL側でVGAタイミング(水平・垂直同期、データイネーブル、ピクセルデー
タ)を生成し、PSのDisplayPortユニットに入力します。PSのAVBuf(映像パ
イプライン)を通り、ボード上のSTDP4320チップでDP→HDMI変換されてモニ
ターに出力されます。
29
30 ## クロック構成
31
32 | クロック | 周波数 | 用途 |
33 |---------|--------|------|
34 | pl_clk0 | 100MHz | clk_wiz_0の入力 |
35 | clk_wiz_0/clk_out1 | 100MHz | PL側ロジック用 |
36 | dp_video_ref_clk | 74.25MHz | 映像タイミング生成・PS映像入力 |
37
38 `dp_video_ref_clk`はPSが720p60用に生成するクロックで、PL側のVGAタイ
ミング生成と、PSのDP映像入力クロック(`dp_video_in_clk`)の両方に接
続します。
39
40 ## PL側の設計
41
42 ### ファイル構成
43
44 | ファイル | 役割 |
45 |---------|------|
46 | rtl_top.v | トップモジュール。矩形描画、RGB24→RGB36変換 |
47 | vga_iface.v | VGAタイミング生成(H/Vsync, DE, H/Vカウンタ) |
48 | cdc_synchronizer.v | クロックドメイン間同期 |
49 | shift_register.v | パイプライン遅延用シフトレジスタ |
50
51 ### rtl_top.v のポイント
52
53 ```verilog
54 // 矩形描画(ビデオクロックで動作)
55 always @(posedge clkv) begin
56 if ((count_h >= 200) && (count_h < 600) &&
57 (count_v >= 150) && (count_v < 450)) begin
58 // 白い矩形
59 color_r <= 8'd255;
60 color_g <= 8'd255;
61 color_b <= 8'd255;
62 end else begin
63 // 青い背景
64 color_r <= 8'd0;
65 color_g <= 8'd0;
66 color_b <= 8'd128;
67 end
68 end
69 ```
70
71 水平・垂直カウンタの値に応じて色を切り替えるだけのシンプルな構成です
。
72
73 RGB24bit を DisplayPort の RGB36bit(12bit/色)に変換して出力します
。
74
75 ```verilog
76 // 24bit RGB -> 36bit: {B[7:0],B[3:0], R[7:0],R[3:0], G[7:0],G[3:0]}
77 assign video_color = {vga_color_out[7:0], {4{vga_color_out[0]}},
78 vga_color_out[23:16], {4{vga_color_out[16]}},
79 vga_color_out[15:8], {4{vga_color_out[8]}}};
80 ```
81
82 ### VGAタイミングパラメータ(1280x720@60)
83
84 | パラメータ | 値 |
85 |-----------|-----|
86 | 水平トータル | 1650 |
87 | 垂直トータル | 750 |
88 | アクティブ幅 | 1280 |
89 | アクティブ高さ | 720 |
90 | 水平同期開始 | 1390 |
91 | 水平同期終了 | 1430 |
92 | 垂直同期開始 | 725 |
93 | 垂直同期終了 | 730 |
94
95 ## Vivadoブロックデザイン
96
97 ### プロジェクト作成
98
99 - パーツ: Kria KV260 Vision AI Starter Kit SOM
100 - Board Connections の設定(GUIにないためTclコンソールで実行):
101
102 ```tcl
103 set_property board_connections {som240_1_connector xilinx.com:kv260_
carrier:som240_1_connector:1.3} [current_project]
104 ```
105
106 ### Zynq PS の設定
107
108 Board Preset適用後、以下を確認・変更:
109
110 | 設定項目 | 値 |
111 |---------|-----|
112 | AXI HPM0 FPD | 無効(不要) |
113 | AXI HPM1 FPD | 無効(不要) |
114 | Display Port → Video | Live |
115 | IRQ0 | 0(無効) |
116 | PL Fabric Clocks PL0 | 100MHz(有効) |
117
118 AXI GPIOなどは使わないため、AXI Master ポートは全て無効にします。
119
120 ### Clocking Wizard
121
122 | 設定項目 | 値 |
123 |---------|-----|
124 | Input Source | Global buffer |
125 | Reset Type | Active Low |
126
127 ### 配線
128
129 手動で接続します。Run Connection Automationは出ません(AXIバス接続が
ないため)。
130
131 | 接続元 | 接続先 |
132 |--------|--------|
133 | zynq.../pl_clk0 | clk_wiz_0/clk_in1 |
134 | zynq.../pl_resetn0 | clk_wiz_0/resetn |
135 | clk_wiz_0/clk_out1 | rtl_top_0/clk |
136 | clk_wiz_0/locked | rtl_top_0/resetn |
137 | zynq.../dp_video_ref_clk | rtl_top_0/clkv |
138 | zynq.../dp_video_ref_clk | zynq.../dp_video_in_clk |
139 | rtl_top_0/video_color | zynq.../dp_live_video_in_pixel1 |
140 | rtl_top_0/video_de | zynq.../dp_live_video_in_de |
141 | rtl_top_0/video_hsyncn | zynq.../dp_live_video_in_hsync |
142 | rtl_top_0/video_vsyncn | zynq.../dp_live_video_in_vsync |
143
144 :::note warn
145 `video_color` の接続先は `dp_live_video_in_pixel1` です。似た名前の
`dp_live_gfx_pixel1_in` はグラフィックスオーバーレイ用なので間違えな
いよう注意してください。
146 :::
147
148 ### タイミング制約
149
150 `timings.xdc` は実装(Implementation)のみに適用します(合成では使用
しない)。
151
152 ```
153 create_clock -period 13.468 -name clk_video -waveform {0.000 6.734}
\
154 [get_pins design_1_i/zynq_ultra_ps_e_0/inst/PS8_i/DPVIDEOREFCLK]
155
156 set_clock_groups -asynchronous \
157 -group [get_clocks clk_video] \
158 -group [get_clocks -of_objects [get_pins design_1_i/clk_wiz_0/cl
k_out1]]
159 ```
160
161 ## PS側ソフトウェア(main.c)
162
163 DisplayPortの初期化・リンクトレーニング・映像出力を行います。
164
165 ### 処理の流れ
166
167 ```
168 main()
169 ├─ キャッシュ無効化
170 ├─ InitDP() ... DP/AVBuf初期化、映像パイプライン設定
171 ├─ sleep(1) ... モニターのHPD安定待ち
172 ├─ RunDP()
173 │ ├─ 接続確認
174 │ ├─ モニター起動(AUX通信)
175 │ ├─ TrainLink() ... リンクトレーニング(2レーン, 2.7Gbps)
176 │ └─ SetupVideoStream()
177 │ ├─ MSA設定(1280x720@60, RGB, 8bit)
178 │ ├─ ピクセルクロック設定(74.25MHz)
179 │ └─ メインリンク有効化 → 映像出力開始
180 ├─ HPD割り込み設定 ... ケーブル抜き差し対応
181 └─ while(1) ... イベント待ち
182 ```
183
184 ### 主要な設定値
185
186 ```c
187 /* 映像パイプライン */
188 XAVBuf_SetInputLiveVideoFormat(&AVBuf, RGB_12BPC); // PL入力: RGB
12bit/色
189 XAVBuf_SetOutputVideoFormat(&AVBuf, RGB_8BPC); // 出力: RGB 8
bit/色
190 XAVBuf_InputVideoSelect(&AVBuf, XAVBUF_VIDSTREAM1_LIVE, XAVBUF_VIDST
REAM2_NONE);
191
192 /* 解像度・色 */
193 XDpPsu_CfgMsaUseStandardVideoMode(&DpPsu, XVIDC_VM_1280x720_60_P);
194 XDpPsu_SetColorEncode(&DpPsu, XDPPSU_CENC_RGB);
195 XDpPsu_CfgMsaSetBpc(&DpPsu, XVIDC_BPC_8);
196
197 /* クロックソース */
198 XAVBuf_SetAudioVideoClkSrc(&AVBuf, XAVBUF_PS_CLK, XAVBUF_PL_CLK);
199 ```
200
201 `XAVBUF_VIDSTREAM1_LIVE` がPL側からの映像を受け取る設定です。
202
203 ## Vitisの設定
204
205 - プラットフォーム: standalone, psu_cortexa53_0
206 - **stdout/stdin: psu_uart_1** に変更(デフォルトのpsu_coresight_0で
はUART出力されない)
207 - BSP設定の `standalone_stdin` / `standalone_stdout` を `psu_uart_1`
に変更
208
209 ## JTAG実行
210
211 KV260の電源を入れてLinuxが起動した後、以下を実行します。
212
213 ターミナル1(UART確認用):
214 ```bash
215 tio -b 115200 /dev/ttyUSB1
216 ```
217
218 ターミナル2(JTAG実行):
219 ```bash
220 source ~/fpga/tools_settings/env_2025.1.sh
221 xsdb run_jtag.tcl
222 ```
223
224 `run_jtag.tcl` の内容:
225 ```tcl
226 connect
227 after 1000
228 fpga design_1_wrapper.bit
229 after 1000
230 targets -set -filter {name =~ "*APU*"}
231 rst -cores -stop
232 after 500
233 targets -set -filter {name =~ "*A53*#0"}
234 rst -processor -clear-registers
235 after 500
236 source psu_init.tcl
237 psu_init
238 after 1000
239 dow kv260_hdm_app.elf
240 after 500
241 con
242 ```
243
244 `rst -cores -stop` でLinux(APU)を停止し、PSU初期化後にベアメタルEL
Fを実行します。
245
246 ## UART出力例
247
248 ```
249 KV260 Rectangle Display Start
250 Connected
251 Training: 2 lanes, rate 0xA
252 Training OK
253 Video stream started
254 Running. Waiting for HPD events...
255 ```
256
257 Training OKが出た後、HDMIモニターに青背景+白矩形が表示されます。
258
259 ## ハマりポイント
260
261 ### video_color の接続先
262
263 `dp_live_video_in_pixel1`(映像用)と `dp_live_gfx_pixel1_in`(グラ
フィックスオーバーレイ用)を間違えやすいです。Vivado GUIでドラッグ接
続する際、ピン名をよく確認してください。間違えると映像が出ません。
264
265 ### Board Connections
266
267 Vivado 2025.1ではGUI上にBoard Connections設定が見当たらないことがあ
ります。Tclコンソールから設定してください。
268
269 ### stdout/stdin の設定
270
271 Vitis 2025.1のデフォルトは `psu_coresight_0` です。UART経由でデバッ
グ出力を見るには `psu_uart_1` に変更が必要です。
272
273 ## 環境
274
275 | 項目 | 値 |
276 |------|-----|
277 | ボード | Kria KV260 Vision AI Starter Kit |
278 | Vivado/Vitis | 2025.1 |
279 | ホストOS | Ubuntu 24.04 LTS |
280 | 実行方法 | JTAG (xsdb) |
281 | モニター接続 | KV260 HDMI ポート |
282
283 ## ソースコード
284
285 https://github.com/douhaku1115/kv260
286
287 ## まとめ
288
289 KV260のPL側でVGAタイミング映像を生成し、PS内蔵DisplayPort経由でHDMI
モニターに表示できました。PLで映像を生成しPSで出力制御するという、KV
260のPS-PL連携の基本的なパターンです。