0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

KV260でPLからHDMI出力(ベアメタル・JTAG実行)claude code使用

0
Posted at

はじめに

    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連携の基本的なパターンです。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?