基于AXI模块的视频流传输(硬件基础篇)

从上次搭建熟悉SDK平台到现在已经几天了,这几天在学习zynq的ps+pl这种开发方式,现在以已有资料为原型,来重构一下单目摄像头的视频流传输的硬件部分。

在zynq中将不再以纯粹的verilog+ip核形式来做这个项目,而是通过block design直接将各模块的接口直接连接即可。但是也要我们自己懂各种协议,在此项目中AXI各组件协议会被用到,并且我看了在之后这些模块也会被大量频繁地使用,于是了解他们是怎么运行的而不是简单的像搭玩具一样地连接各模块显得尤为重要。

这里以记录的方式重温一下各模块的功能,以及各配置吧。

这里先说一嘴,下面的资料上网都能搜到,而且更齐全准确率更高更客观,慎看。以及视频流传输包含HDMI,ov5640,axi各模块,ddr3,我不会过多展示和介绍hdmi相关模块,甚至有的不讲,没必要,会用就行。

1、Processor System Reset

这是他的接口信号以及内部配置。这个只需要注意一下in就是输入,out输出,以及resetn就是低电平有效,reset是高电平有效即可,我感觉没什么需要赘述的,甚至你可以直接用一个输出复位来控制全部(除了一些EMIO口上的复位信号)。这里分了很多个复位可能是为了大项目方便控制吧,在当前项目无特殊作用。

2、AXI Interconnect

这是AXI互联模块,这个最主要作用是可以设置多主机多从机的模式,然后还有将axi3协议转向AXI4接口的能力,例如GP就是一个比较典型的AXI3接口,但是这里基本都是用AXI4,所以都得转。

3、AXI Video Direct Memory Access

这个模块简称AXI VDMA,是专门为视频流传输开辟的模块,从DMA演变过来的,要介绍这个得先讲讲AXI DMA模块,AXI DMA也有转协议的功能,对于视频流来说肯定要满足AXI Stream协议的,但是我们ps通信是用AXI4与AXI3进行通信,所以无法直接接收视频流数据存进DDR3,所以需要这个模块连接在他们中间进行协议转换,具体转换逻辑是视频流数据输入然后进入fifo,达到一定长度后以axi4协议突发传输出去(包含突发长度),因为fifo缓冲区能存储视频流数据(只要一直发一直发到溢出),一般不会出现这种情况的,因为有消隐时间,不会说真的无穷无尽发送数据。

上图是AXI DMA的配置部分。

不会很难,不过多赘述。

VDMA接口和DMA挺像的,vivado提供的配置简单很多。

这里的auto配置是等你连线后才会显示的莫慌。然后这里是M_AXI_S2MM本质是是M:主机,AXI:AXI4协议,S2MM:slave to memory map,被作为主机接口时,就是要发送数据给ddr3的,被作为从机接口时,就是一个中转站,接口数据然后传给ddr3的。

frame buffer是帧缓冲,这里写1就是每次只存一帧就显示了,一般缓存3帧比较好(别问我我不知道)。这里的s2mm_introut就是数据传给ddr3后就会发生中断,不过这里也没用到。

4、Video Timing Controller

这个模块顾名思义,就是控制视频输出输出时机的(可以直接通过接口信号看出)

ctrl是外界输入的接口(axi4),vtc作为从机,fsync_in应该是有关帧同步的信号,这里不需要连接他不做解释,vtiming_out接口是hdmi显示的控制接口,内部有行场同步信号和视频有效信号以及消隐信号(就是无效时间就拉高,暂时可以这样理解)。

5、AXI4-Stream Subset Converter

这个是可以改变数据位宽的模块,怎么改变可以进去写公式。

信号名字跟着他来就行了,然后由于我们的ov5640输入是8比特(设置下),我们需要人为将这两个八比特数据拼接起来然后发送出去(也就是说这个模块接收到16位宽的数据),遵循RGB565协议,然后由于我们是用HDMI输出,要求RGB888输出,所以需要我们去改变,改变方法遵循把RGB565对应数据放在高位即可,具体看红色箭头指向。

6、alinx ov5640

这是厂商自己给的ip核,可以直接用,但是也是通过调用ip核和verilog实现的,介绍一下由来

这是标准的视频输入转AXI4-Stream模块,但是ov5640的输入是这样的

其中两位数据还是无效数据,也就是说一次传输1字节数据,还有行场同步信号,但是接口要求输入消隐信号,以及不间断的2字节信号,这样之后,才能给我们去转stream协议,厂商估计觉得太麻烦了,所以干脆自己写了一个,刚好我翻到源代码,我讲一下实现方法:先将2字节的数据拼接好然后写入fifo,然后一有数据读使能就拉高就行了(虽然你可能觉得这不就是一个一个慢慢传吗,那没办法啊,人家写了那直接用就行了,会个fifo真能走天下了)。

这是他们自己创建的ip核,直接用即可。

7、AXI GPIO

这个不介绍。

8、时钟动态分频器

这个模块很不错,可以通过ps端去配置时钟,具体逻辑我不知道,但是不影响使用。

好了文章到这里结束了,下一期我将用这些模块连接成视频流传输的基本通路。祝您生活愉快。

### 关于Vivado VTC自定义配置或使用 #### Vivado中的VTC IP核概述 在Xilinx的FPGA设计流程中,Vivado提供了多种IP核来简化复杂功能模块的设计,其中包括用于监控芯片内部环境参数(如温度和电压)的VTC(Voltage and Temperature Control)IP核[^2]. 这种IP允许开发者实时监测并响应这些物理量的变化。 #### 创建与配置VTC IP实例 为了实现VTC的功能,通常会采用Block Design的方式将其加入项目。具体操作如下: 1. 打开Vivado IDE后进入目标工程; 2. 添加新的IP Block至当前设计; 3. 搜索`AXI VTC`,这是专门针对Zynq系列器件优化过的版本控制组件之一; 4. 完成向导设置过程,包括指定接口模式(例如AXI Lite)、使能特性选项等; 对于更高级别的定制化需求,则可以通过修改TCL脚本来自动生成所需配置: ```tcl set_property CONFIG.VOLTAGE_MONITOR {true} [get_ips axi_vtc_0] set_property CONFIG.TEMPERATURE_MONITOR {true} [get_ips axi_vtc_0] ``` 上述命令片段展示了如何启用电压和温度监视器,并应用到名为`axi_vtc_0`的具体IP实例上[^3]. #### 数据读取与处理方法 一旦完成了硬件层面的基础构建工作之后,下一步就是考虑怎样有效地利用所收集的数据了。一种常见做法是在Verilog代码里面直接调用相应的原语来进行即时查询;另一种则是借助外部软件工具完成更加复杂的析任务。比如可以使用XADC IP Core配合特定算法计算实际测量值: ```verilog // Verilog example to read temperature from XADC core connected with VTC IP. wire [15:0] temp_raw; // Raw data output from ADC channel associated with temperature sensor assign temperature_celsius = (temp_raw * 503.975 / 65536.0 - 273.15); // Convert raw value into Celsius degree using given formula ``` 此段Verilog代码实现了从XADC核心关联通道读取原始数据(`temp_raw`)并通过给定公式转换为摄氏度表示形式(`temperature_celsius`).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值