Datasheet分析
当然,下面是该接口表的中文翻译和相关解释。
Common Interface Signals
表 1: 常用接口信号
信号名 | 方向 | 宽度 | 描述 |
---|---|---|---|
AP_CLK | 输入 | 1 | 视频核心时钟 |
AP_RST_N | 输入 | 1 | 视频核心活低复位 |
INTERRUPT | 输出 | 1 | 中断请求引脚 |
说明:
-
AP_CLK 和 AP_RST_N 信号
这两个信号在核心、AXI4-Stream 数据接口,以及 AXI4-Lite 控制接口之间共享。所有与AXI4-Stream和AXI4-Lite接口有关的输入信号都在 AP_CLK 的上升沿被采样。所有 AXI4-Stream 接口的输出信号更改都会在 AP_CLK 的上升沿之后发生。 -
INTERRUPT 引脚
这个引脚目前没有支持,保留用于未来使用。 -
AP_CLK(视频核心时钟)
AXI4-Stream 和 AXI4-Lite 接口必须与核心时钟信号 AP_CLK 同步。所有 AXI4-Stream 接口输入信号和 AXI4-Lite 控制接口输入信号都在 AP_CLK 的上升沿上被采样。所有 AXI4-Stream 输出信号的更改都发生在 AP_CLK 的上升沿之后。 -
AP_RST_N(低电平复位)
AP_RST_N 引脚是一个低电平的同步复位输入,适用于 AXI4-Lite 和 AXI4-Stream 接口。当 AP_RST_N 设置为 0 时,核心将在下一个 AP_CLK 的上升沿进行复位。
Data Interface
重要说明!
在下面的表格中,TotalDataWidth = data_width * number_of_components * samples_per_clock
。这三个值分别对应IDE中的最大数据宽度、视频组件数量和每时钟周期的样本数。
表 2:AXI4-Stream 数据接口信号描述
信号名称 | 方向 | 宽度 | 描述 |
---|---|---|---|
s_axis_video_tdata | 输入 | (data_width * samples_per_clock + 7) / 8 * 8 | 输入视频数据 |
s_axis_video_tvalid | 输入 | 1 | 输入视频有效信号 |
s_axis_video_tready | 输出 | 1 | 输入就绪 |
s_axis_video_tuser | 输入 | 1 | 输入视频帧起始 |
s_axis_video_tlast | 输入 | 1 | 输入视频行结束 |
s_axi_video_tstrb | 输入 | s_axis_video_tdata / 8 | 输入视频数据选通,标示TDATA关联字节的处理方式 |
s_axi_video_tkeep | 输入 | s_axis_video_tdata / 8 | 输入视频字节限定符,标示TDATA关联字节的处理方式 |
s_axi_video_tid | 输入 | 1 | 输入视频数据流标识符 |
s_axi_video_tdest | 输入 | 1 | 输入视频数据路由信息 |
m_axis_video_tdata | 输出 | (TotalDataWidth + 7) / 8 * 8 | 输出视频数据 |
m_axis_video_tvalid | 输出 | 1 | 输出有效 |
m_axis_video_tready | 输入 | 1 | 输出就绪 |
m_axis_video_tuser | 输出 | 1 | 输出视频帧起始 |
m_axis_video_tlast | 输出 | 1 | 输出视频行结束 |
m_axi_video_tstrb | 输出 | m_axis_video_tdata / 8 | 输出视频数据选通,标示TDATA关联字节的处理方式 |
m_axi_video_tkeep | 输出 | m_axis_video_tdata / 8 | 输出视频字节限定符,标示TDATA关联字节的处理方式 |
m_axi_video_tid | 输出 | 1 | 输出视频数据流标识符 |
m_axi_video_tdest | 输出 | 1 | 输出视频数据路由信息 |
Video Data
AXI4-Stream 接口规范将 TDATA 宽度限制为 8 位的整数倍。因此,在连接到 s_axis_video_tdata 之前,任何位数据都必须在 MSB 上填充零,以形成 N*8 位宽的向量。填充不影响核心的大小。
可以看出当每个时钟周期输出多个像素时,对应的排序格式如表三所示。
可以推测出当四像素每时钟周期的时候的映射如下
119:110 | … | 29:20 | 19:10 | 9:0 |
---|---|---|---|---|
R9 | … | R0 | B0 | G0 |
Register Space
控制寄存器(Control Register at 0x0000)
- ap_start (Bit[0]): 从软件启动核心。写入1会开始视频帧生成。
- ap_done (Bit[1]): 表示当前事务中所有操作是否完成。逻辑1表示完成。
- ap_idle (Bit[2]): 表示IP是否处于空闲状态。逻辑1表示空闲。
- ap_ready (Bit[3]): 表示IP是否准备接受新输入。逻辑1表示准备好。
- auto_restart (Bit[7]): 启用自动重启模式。
有效宽度寄存器(ACTIVE_WIDTH at 0x0010)
- 存储每个扫描的有效像素数量。
- 支持的值为64或IDE中“最大列数”字段所提供的值。
有效高度寄存器(ACTIVE_HEIGHT at 0x0018)
- 存储每帧的有效扫描线数量。
- 支持的值在64和IDE中“最大行数”字段所提供的范围内。
拜尔相位寄存器(BAYER_PHASE at 0x0028)
- 规定了Bayer采样网格在哪种颜色像素(绿色、红色或蓝色)上开始。
VITIS demosaic代码示例
#include "xv_demosaic.h" // 引入deosaic模块的头文件
#include "config.h" // 引入配置文件
#include "demosaic.h" // 引入该源文件的头文件
// demosaic_init函数用于初始化deosaic模块
int demosaic_init() {
XV_demosaic demosaic; // 定义一个deosaic实例
XV_demosaic_Config *demosaic_config; // 定义一个指向deosaic配置的指针
// 通过设备ID查找deosaic模块的配置
if ((demosaic_config = XV_demosaic_LookupConfig(XPAR_V_DEMOSAIC_0_DEVICE_ID)) == NULL) {
xil_printf("XV_demosaic_LookupConfig() failed\r\n"); // 如果查找失败,输出错误信息
return XST_FAILURE;
}
// 使用查找到的配置来初始化deosaic实例
if (XV_demosaic_CfgInitialize(&demosaic, demosaic_config, demosaic_config->BaseAddress)
!= XST_SUCCESS) {
xil_printf("XV_demosaic_CfgInitialize() failed\r\n"); // 如果初始化失败,输出错误信息
return XST_FAILURE;
}
// 设置deosaic核心的各种参数
XV_demosaic_Set_HwReg_width(&demosaic, VIDEO_COLUMNS);
XV_demosaic_Set_HwReg_height(&demosaic, VIDEO_ROWS);
XV_demosaic_Set_HwReg_bayer_phase(&demosaic, 3);
// 检查deosaic核心是否就绪
if (!XV_demosaic_IsReady(&demosaic)) {
xil_printf("demosaic core not ready\r\n"); // 如果核心未就绪,输出错误信息
return XST_FAILURE;
}
// 启用deosaic核心的自动重启功能
XV_demosaic_EnableAutoRestart(&demosaic);
// 启动deosaic核心
XV_demosaic_Start(&demosaic);
// 输出成功初始化的信息
xil_printf("Demosiac module initialized\r\n");
return XST_SUCCESS; // 返回成功状态
}