2026年2月28日
基于"D:\Gongzige\1_imaging\prj\lesson1\lesson1\src\top.v"
图像显示通路:video - axi_stream - vdma - vga - hdmi
两大内容:
ps控制vdma 适合zynq板子
axi_master控制vdma 适合纯fpga板子 gongzige的是zynq7100板子+1080的hdmi显示屏
1 创建cpu BD,删除时钟 复位,添加GP0 HP0,选择实际DDR型号
2 添加ip video in to AXI4-stream
选择灰度Mono/sensor格式,fifo深度2048(按照实际情况)
独立时钟,一般两者四异步的时钟
aclk是axi总线的时钟
vid_io_in_clk是外部视频流的时钟
3 对video in to AXI4-stream ip的左侧接口进行make external
constant ip 可以生成一个位宽为1,电平为0/1的信号 utility vector logic 逻辑运算ip
把拉出的信号线重命名,设置时钟,设置复位(注意低有效复位和高有效复位)等
4 添加vdma ip 设置写/读突发长度
缓存深度 2048是根据分辨率确定的
位宽 8对应灰度图
帧缓存 3
s2mm 表示AXI4-stream转AXI总线,tuser 来了第一个像素就开始传输
VDMA的作用之一是:将AXI4-stream转为AXI总线,然后连接DDR
这是 Video In to AXI4-Stream IP 核的标准 AXI4-Stream 视频接口。它负责将并行视频数据转换为 AXI 流协议,以便在 FPGA 内部进行高速传输。 以下是接口含义的快速解释:
m_axis_video_tdata[7:0] (数据总线) 含义:携带实际的视频像素数据。 说明:根据你的截图,当前位宽为 8 bit(通常代表单通道亮度或红/绿/蓝中的一种颜色深度)。
m_axis_video_tvalid (有效信号) 含义:由发送方(Master)产生,表示当前 tdata 上的数据是有效的。 说明:只有当 tvalid 和 tready 同时为高时,数据才真正完成一次传输(即握手成功)。
m_axis_video_tready (准备就绪信号) 含义:由接收方(Slave)产生,表示下游模块已经准备好接收数据。 说明:这是一个反向流控信号。如果下游变慢,它会拉低,阻止数据继续发送。
m_axis_video_tuser (帧起始标志) 含义:在 AXI-Stream 视频标准中,它表示一帧数据的第一个像素 (Start of Frame, SOF)。 作用:下游模块(如视频分量转换或缩放 IP)利用这个信号来同步帧头,防止图像错位。
m_axis_video_tlast (行结束标志) 含义:表示一行数据的最后一个像素 (End of Line, EOL)。 作用:用于标识视频行边界。虽然 AXI-Stream 是连续流,但靠这个信号可以区分出行信息。
4 run connection automation 注意S_AXI_HP0的仲裁Bridge IP选interconnect
添加新的ip后就要run connect auto
5 添加AXI4-stream to video out ip
设置独立时钟 灰度格式 2048深度
6 添加video timing contrller ip
关闭 include axi4-lite interface
关闭 enable detection
选择video format 1280*1024p
为什么VTCip的clken是低有效,却连接高电平
7 添加clock wizard ip
108M时钟 是有规定的
8 添加concat ip 把三路8bit拼接为24bit
目前为止,数据流向是,视频流转AXI4-stream,经过VDMA转为AXI,通过HP口进入DDR,这是写数据; 再从DDR读出来,AXI转AXI4-stream,经过AXI4-stream to video out出去
9 最后检查validate design,successful之后 generate output products 使用per ip模式,最快编译,这样只要不改动BD,只需要generate一次
注意,要经常修改的东西最好不放在BD内,不然每次都要重新generate,流程繁琐
要管理好经常修改的东西放在BD外代码里,基本不变的放在BD内
10 generate之后,例化 creat HDL wrapper,让vivado帮我们管理wrapper和自动更新 然后,创建top顶层 在top中例化wrapper,手动添加一个clk_100M时钟 一个复位信号rst_n
img_gen
#(
.ACTIVE_IW (1280 ),
.ACTIVE_IH (1024 ),
.TOTAL_IW (1500 ),
.TOTAL_IH (1111 ),
.H_START (5 ),
.V_START (5 )
)
这部分计算why?
让后面SDK操作就看不懂了
本文章使用limfx的vscode插件快速发布