免责声明:
本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。
读者在使用本文信息时,应自行验证其准确性和适用性,并对其使用结果负责。本文内容不构成专业技术咨询或建议,具体的技术实现和应用应根据实际情况和需要进行详细分析和验证。
本文所涉及的任何商标、版权或其他知识产权均属于其各自的所有者。若本文中引用了第三方的资料或信息,引用仅为学术交流目的,不构成对第三方内容的认可或保证。
若有任何疑问或需进一步信息,请联系本文作者或相关专业人士。
一、Color Space Conversion Only
The following table provides the register map of Color space conversion registers in video
processing subsystem.
二、422-444 Chroma Resampling Only
三、420-422 Chroma Resampling Only
四、Deinterlace Only
五、Full Fledged
Full fledged mode uses all the register maps of deinterlacer only, scaler only, 420-422 chroma
resampling, and 422-444 chroma resampling only registers mentioned above.
注:
-
Bit[0] - ap_start:
- 功能:启动 IP 核的操作。
- 描述:当你写入 1 到这个位时,IP 核开始生成一个视频帧,即开始处理当前事务。
-
Bit[1] - ap_done:
- 功能:指示当前事务是否完成。
- 描述:当该位为 1 时,表示 IP 核已经完成了当前事务中的所有操作。
-
Bit[2] - ap_idle:
- 功能:指示 IP 核的空闲状态。
- 描述:当该位为 1 时,表示 IP 核处于空闲状态,没有正在进行的操作。当 IP 核开始操作时,该位会变为低电平;当 IP 核完成操作并进入空闲状态时,该位会恢复为高电平。
-
Bit[3] - ap_ready:
- 功能:指示 IP 核是否准备好接收新的输入。
- 描述:当该位为 1 时,表示 IP 核已准备好接收新输入,并且已经完成了当前事务中的所有输入读取。如果 IP 核的流水线中没有操作,该位会保持低电平,直到下一次事务开始。
-
Bit[7] - auto_restart:
- 功能:启用自动重启模式。
- 描述:当你写入 1 到这个位时,IP 核会在每次事务结束后自动重新启动。这样可以连续处理多个事务,而不需要手动启动每次操作。
六、General Design Guidelines
Scaling
视频缩放是将输入颜色图像从原始的尺寸(Xin
像素 × Yin
行)转换为目标尺寸(Xout
像素 × Yout
行)的过程。在这个过程中,IP 核会将指定的输入数字视频图像的矩形区域,从原始的采样网格转换为所需的目标采样网格。这意味着缩放器需要根据输入和输出的分辨率对图像进行重采样,以适应新的网格尺寸。
工作原理
- 流模式:在 Scaler Only Mode 下,缩放器在流模式(streaming mode)下工作,这意味着数据处理是实时的,不需要使用存储器(内存)来缓存输入或输出数据。这种模式适用于需要高效实时处理的视频应用。
- 缩放比:在流模式下,只要保证缩放器的性能被正确配置,任何缩放比都可以工作。这涉及到每个时钟周期处理的像素数(pixels per clock)和处理的频率(clock frequency),这两者都与输入和输出的最大分辨率有关。
配置缩放器的基本原则
-
选择分辨率基准:
- 下缩放(downscaling):选择最大输入分辨率作为基准。
- 上缩放(upscaling):选择最大输出分辨率作为基准。
-
像素吞吐量计算:
- 像素吞吐量由分辨率和帧率决定。计算公式为:
分辨率 × 帧率 = 像素吞吐量
。 - 例如,从 1080p60 上缩放到 4K60 的情况下,最大分辨率为 4K60,因此所需的吞吐量为
4320 × 2160 × 60 = 530 MHz
。
- 像素吞吐量由分辨率和帧率决定。计算公式为:
-
添加安全裕量:
- 为了确保系统的稳定性,建议在计算的吞吐量基础上增加至少 10% 的裕量。以 4K60 为例,最终所需的吞吐量为
530 MHz + 10% ≈ 600 MHz
。
- 为了确保系统的稳定性,建议在计算的吞吐量基础上增加至少 10% 的裕量。以 4K60 为例,最终所需的吞吐量为
-
配置输入时钟频率和像素数:
- 缩放器需要配置为支持上述吞吐量。假设输入时钟频率为 300 MHz,那么每个时钟周期需要处理 2 个像素 (
pixels per clock = 2
)。
- 缩放器需要配置为支持上述吞吐量。假设输入时钟频率为 300 MHz,那么每个时钟周期需要处理 2 个像素 (
数据格式要求
- 输入图像格式:输入图像必须以光栅扫描格式提供,即从左到右、从上到下的顺序进行扫描。这是标准的视频数据格式,确保缩放器能够正确处理输入数据。
- 有效输出顺序:输出图像的数据也必须按同样的顺序给出,即从左到右、从上到下。
In this equation, x and y are discrete locations on a common sampling grid; Pixout (x, y) is an
output pixel that is being generated at location (x, y); Pixin (x, y) is an input pixel being used as
part of the input scaler aperture; Coef (i, j) is an array of coefficients that depend upon the
application; and HTaps and VTaps are the number of horizontal and vertical taps in the filter,
respectively.
Features
-
Bilinear Scaling:
- 实现成本最低:使用双线性插值(bilinear interpolation)来计算像素。
- 图像质量:双线性插值可能会产生更多的插值伪影,例如混叠、模糊和边缘光晕。
- 处理范围:考虑的是 2x2 像素区域。
-
Bicubic Scaling:
- 实现成本较高:比双线性缩放更加复杂。
- 图像质量:提供更平滑的图像,减少伪影。与双线性插值不同,双立方插值(bicubic interpolation)考虑的是 4x4 像素区域。
- 处理范围:考虑的是 4x4 像素区域。
-
Polyphase Scaling:
- 实现成本最高:这种缩放方式涉及多相滤波器(polyphase filter),其资源使用和图像质量取决于所使用的滤波器 tap 数量和滤波器阶段(phases)数量。
- 图像质量:提供最高的图像质量,但资源使用也最高。
- 处理范围:根据滤波器的 tap 数量和阶段数来决定。
The following list is a summary of the supported features:
• Polyphase, bicubic, or bilinear scaling modes
• 6, 8, 10, or 12-tap 64 phase polyphase scaling
• Support for and conversion between RGB, YUV 4:4:4, YUV 4:2:2, and YUV 4:2:0
• 8, 10, 12, or 16 bits per video component
Chapter 4: Designing with the Core
Polyphase Scaling
在图像缩放过程中如何根据输入像素来计算输出像素值。可以这样理解:
-
不同的采样网格:在缩放过程中,输入图像和输出图像的采样网格通常是不相同的。输入采样网格是原始图像的像素点网格,而输出采样网格是经过缩放后图像的像素点网格。
-
确定输出像素的位置:为了计算输出像素的值,需要知道这个输出像素在输入像素网格上的位置。这意味着你需要确定在输入图像中哪些像素最接近当前计算输出像素的位置。
-
算法近似输出像素值:知道了输出像素相对于输入像素的位置之后,算法会使用一个滤波器来近似计算输出像素值。滤波器的系数会根据输出像素与输入像素的相对位置进行加权。
-
滤波器的 tap:滤波器的 tap 是指从输入图像中选取的连续数据点。换句话说,在计算输出像素时,滤波器会使用一组从输入图像中选择的像素点,通过这些点及其对应的系数来加权计算最终的输出像素值。
在图像缩放过程中管理不同的滤波器系数阶段(phase),以及如何在滤波器架构中实现这些阶段。可以这样理解:
-
像素空间划分:
输入图像中的像素空间在每个维度上被概念性地划分为多个小区间(bins 或 phases)。这些小区间帮助确定输出像素的位置。 -
输出像素的位置与阶段:
每个输出像素的位置总是落在这些小区间中的一个,这个位置决定了使用的滤波器系数的阶段(phase)。因此,每个输出像素的计算可能涉及不同的滤波器系数。 -
滤波器架构:
滤波器架构需要能够处理这些不同的阶段。也就是说,滤波器需要能够根据每个样本的具体情况动态地切换不同的系数阶段,以便准确地计算输出像素的值。 -
单维示例:
在单维的情况下(如水平或垂直维度),可以将输出像素的不同阶段表示为 0, 1, 2, 3, 0 等。这表明,不同的输出像素可以对应不同的阶段,这些阶段会影响系数的选择,从而影响最终输出的像素值。
SF
-
缩放因子的定义:
缩放因子(SF)是输入图像尺寸与输出图像尺寸之间的比率。在这里,Xin/Xout
和Yin/Yout
分别表示水平和垂直方向上的缩放比率。 -
比例示例:
例子:假设图像的水平缩放因子和垂直缩放因子均为 5/4。这意味着输入图像的每个方向的尺寸都是输出图像尺寸的 5/4 倍。例如,如果输入图像的水平和垂直尺寸分别为 500 和 400 像素,那么缩放后输出图像的水平和垂直尺寸将分别为 400 和 320 像素。 -
不同方向上的缩放因子:
水平和垂直缩放因子的不同:水平和垂直方向上的缩放因子可以不同,这在实际应用中是常见的。例如,在广播行业中,有时需要将 720p(1280 x 720 像素)的画面缩放到 1080p(1920 x 1080 像素)。在这种情况下,水平和垂直的缩放因子都是 2/3。这意味着图像在水平和垂直方向上都缩小了 2/3 的比例。
-
水平下采样(Horizontal Down-Scaling):
- 条件:当输入图像的水平分辨率 Xin 大于输出图像的水平分辨率 Xout。
- 缩放因子(SF):在这种情况下SF > 1。
- 解释:由于输入图像的分辨率更高,水平下采样指的是将图像从一个较大的水平分辨率缩小到较小的水平分辨率。这通常涉及减少水平像素的数量。
-
水平上采样(Horizontal Up-Scaling):
- 条件:当输入图像的水平分辨率 Xin 小于输出图像的水平分辨率 Xout。
- 缩放因子(SF):在这种情况下, SF < 1。
- 解释:由于输入图像的分辨率较低,水平上采样指的是将图像从一个较小的水平分辨率放大到较大的水平分辨率。这通常涉及增加水平像素的数量。
A general guideline is to use 4 taps per number of scaling ratio for scaling down to get good quality. The following are some recommendations for how many taps to use:
-
直接实现的复杂度:
直接实现:直接根据方程(Equation 1: A)进行实现时,每个输出像素都需要 VTaps×HTapsVTaps \times HTapsVTaps×HTaps 次乘法操作,这涉及到大量的计算,可能会消耗较多的资源。 -
分离滤波器的使用:
可分离滤波器:AMD 视频缩放器支持可分离滤波器,这意味着二维滤波操作被分解为两个一维阶段:垂直滤波器(V-filter)和水平滤波器(H-filter)。这将二维操作转换为两个一维操作的序列处理,能够减少计算复杂度。 -
垂直滤波器阶段:
处理步骤:在垂直滤波器阶段,滤波器只在垂直方向上进行处理。对于每个递增的水平扫描位置 X,生成一个中间结果 VPix。这个阶段将输入图像在垂直方向上进行滤波,得到一个中间结果。 -
水平滤波器阶段:
后续处理:垂直滤波器阶段的输出 VPix 被输入到水平滤波器阶段。水平滤波器对中间结果进行进一步处理,完成最终的缩放操作。这个阶段同样涉及适当的四舍五入操作来调整结果。 -
资源节省:
操作复杂度:通过将二维滤波操作分解为两个一维滤波阶段,计算复杂度降低,从而节省了 FPGA 资源。具体而言,这种分离的处理方式减少了所需的乘法操作数,提高了资源使用效率。
七、Phases Control Structure
Color Mode
Frame Size
列数必须是每个时钟的样本数的倍数。如果视频格式为4:2:2或4:2:0,则列数必须为偶数。如果视频格式为4:2:0,则行数必须为偶数。
Line Rate
where, STEP_PRECISION = 2^16 = 65,536
Filter Coefficients
滤波器系数布局
-
内存布局:
- 二维数组:滤波器系数在内存中以二维数组的形式布局,格式为
[PHASE][TAP]
。- PHASE:表示滤波器的不同阶段,每个阶段使用不同的系数。
- TAP:表示滤波器的系数数量,即每个阶段包含的系数数量。
- 二维数组:滤波器系数在内存中以二维数组的形式布局,格式为
-
数据格式:
- 16位系数:每个滤波器系数是 16 位的。
- S4.11 格式:
- S:表示有符号数(signed)。
- 4:整数位数(4 位)。
- 11:小数位数(11 位)。
- 解释:S4.11 格式表示系数采用 4 位整数部分和 11 位小数部分的定点格式。这种格式允许高精度的计算,同时能处理负值。
驱动程序要求
- 滤波器类型:驱动程序需要提供内置的系数表,用于不同数量的滤波器 taps(滤波器系数的个数)。支持的滤波器 taps 数量为 6、8、10 或 12。
八、AXI Video Direct Memory Access Engine
视频 DMA 引擎使用 AMD 提供的 AXI Video DMA IP 设计,旨在实现 AXI4-Stream 视频接口和 AXI4-MM(内存映射)接口之间的高效、高带宽数据访问。这种设计允许高效地在视频数据流和内存之间进行数据传输,支持大规模视频处理应用的需求。
用途:帧缓冲用于处理视频应用中的帧速率变化或图像尺寸变化。比如,当需要调整视频的帧速率(例如从 30 fps 调整到 60 fps)或对图像进行缩放或裁剪时,帧缓冲可以暂存和管理这些图像数据,确保数据的正确处理和流畅播放。
Features
视频处理子系统IP的完整配置中的视频DMA引擎用于实现帧率转换和更高级的缩放用例,如裁剪、缩放和缩放到图中图。
DMA 引擎与帧缓冲的工作原理
-
帧缓冲:
- 四个帧缓冲:DMA 引擎使用四个帧缓冲进行循环写入。这意味着写操作会依次填充这四个缓冲区,以实现连续的数据流。
- 循环写入:在帧缓冲写入时,写指针会在四个缓冲区之间循环移动。
-
读指针和写指针:
- 读指针:在视频数据流的读取部分,读指针总是比写指针落后一帧。这样可以确保读取到的数据总是来自于完整的一帧。
- 帧跳过:当输入帧率高于输出帧率时,写指针移动速度较快,因此在视频数据流中会跳过一些帧。
- 帧重复:当输出帧率高于输入帧率时,写指针比读指针前进,因此会重复显示一些帧,以达到所需的输出帧率。
Crop and Zoom
视频DMA引擎的另一个用途是支持高级缩放用例,如裁剪和缩放,以及按图对图缩放。在不使用内存的情况下,只能执行从一种分辨率到另一种分辨率的基本缩放,如下图所示。
使用视频路径中的视频DMA引擎,可以通过从内存中裁剪来启用裁剪和缩放功能,如下图所示。
Picture in Picture
Memory Requirement
DDR内存用于全配置模式下存储视频帧缓冲区。子系统使用5个帧缓冲器用于渐进输入,3个字段缓冲器用于隔行输入。您可以使用以下公式计算子系统所需的内存量:
- 5:表示使用了五个帧缓冲。
- MAX_WIDTHp:进阶输入视频的最大宽度(像素)。
- MAX_HEIGHTp:进阶输入视频的最大高度(像素)。
- NUM_VIDEO_COMPONENTS:视频组件的数量(例如,Y、Cb、Cr)。
- BytesPerComp:每个视频组件的数据字节数。
Memory Bandwidth
-
去交错器在处理 1080i 分辨率的 8 位 RGB 数据时的带宽需求为:
- 写入:178 MB/秒
- 读取:356 MB/秒
-
视频 DMA 引擎在处理 4K 分辨率的 8 位 RGB 数据时的带宽需求为:
- 写入:1424 MB/秒
- 读取:1424 MB/秒