FPGA基础设计(6)使用DAC的Interleaved模式

本文介绍DAC芯片的Interleaved模式的使用,或者叫交错模式。


硬件设计与接口协议

Interleaved模式即用一组数字接口控制两个模拟信号输出,比如ADI公司的AD9763/AD9765/AD9767系列,具有双路10/12/14比特输出,最高时钟125M,可以采用dual-port模式或Interleaved模式。双口模式的用法和本系列第5篇中的介绍基本相同,本文着重讲述一下交错模式。

Red Pitaya开发板搭载的便是AD9767芯片,主要是因为这款开发板使用的芯片是Zynq的7010系列,PL部分管脚资源不是很多,使用Interleaved模式可以节省一组数字信号接口。相关部分的原理图如下所示:
在这里插入图片描述
DAC芯片的MODE管脚接地,即为Interleaved模式(拉高为dual-port模式)。只使用DDA一组接口控制OUT1和OUT2两路信号输出。Interleaved模式下17-20号管脚启用第二功能,IQWRT、IQCLK、IQRESET和IQSEL。ADI的官方芯片手册中可以查阅到Interleaved模式下的控制时序:
在这里插入图片描述
IQWRT和IQCLK保持同步即可,或者IQWRT的上升沿要早于IQCLK的上升沿。在IQCLK的上升沿,数据会刷新到DAC输出端口。IQSEL控制数据的输出通道,但注意只有在IQCLK为低电平的时候才能改变状态。这样在IQCLK设置为最高的125MHz情况下,每路信号输出最高支持62.5Mhz的刷新率。IQRESET信号是高电平有效的复位信号。
在这里插入图片描述
芯片手册中还着重强调了数据与时钟之间的时序关系,两者一定不能保持同步变化关系。如上图所示,当两者同步变化时,SNR只有10dB左右,输出信号质量很差。两者的变化起码要错开1ns的时间,保证达到60dB以上的信噪比。


FPGA设计

编写Verilog代码时照着时序图设计即可。首先要理清设计思路,IQSEL本质上就是IQCLK的2分频时钟,但是带有一个初始相位,具体是多少可以根据时钟周期来计算。如果IQCLK工作在125Mhz,IQSEL即为62.5Mhz,初始相位设置为90°即可。使用一个Clock Wizard IP核,由主时钟生成这两个时钟。整体设计的框图如下:
在这里插入图片描述
这里主时钟由ZYNQ7 IP核的FCLK_CLK0提供。DAC驱动模块中,复位信号IQRESET无需多言,系统复位时为高、正常工作时为低即可。需要注意的便是数据信号的切换,根据上面的时序图可以看出两种切换方式:在IQCLK的下降沿切换、在IQSEL的双边沿切换。一般来说比较忌讳时钟的双边沿同时做逻辑(因为比较难保证时序),因此最好使用前一种方式。

如果不是在Zynq中,只要将主时钟和clock wizard模块放在RTL设计中即可。假设OUT1和OUT2的信号源是一个相同的正弦波,首先最好通过仿真来确实时序设计的正确性,然后在板子中测试,结果如下:
在这里插入图片描述
两路信号都正确输出,完成了一组数据控制两路输出的设计。当然,双时钟控制法只是博主根据时序图自己构思的方法,还不知道是否有更好的解决方案,如果有欢迎各位留言。

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
`av_interleaved_write_frame`是FFmpeg库中用于向输出文件写入音频/视频帧的函数。它的使用方法与以下步骤相似: 1. 创建一个AVPacket数据包,将待写入的音频/视频数据填充到该数据包中。可以使用函数`av_packet_alloc()`来创建一个AVPacket数据包,使用`av_packet_from_data()`函数将音频/视频数据填充到该数据包中。 2. 设置AVPacket数据包的时间戳和持续时间。这可以通过调用`av_packet_rescale_ts()`函数来完成,该函数将时间戳和持续时间从输入格式的时间基转换为输出格式的时间基。 3. 将AVPacket数据包写入输出文件。这可以通过调用`av_interleaved_write_frame()`函数来完成,该函数将AVPacket数据包写入输出文件。 以下是使用`av_interleaved_write_frame()`函数将音频/视频帧写入输出文件的示例代码: ```c AVFormatContext *output_format_context; AVStream *output_stream; AVCodecContext *output_codec_context; /* 创建AVPacket数据包 */ AVPacket *packet = av_packet_alloc(); if (!packet) { // 错误处理 } /* 将音频/视频数据填充到AVPacket数据包中 */ // ... /* 设置AVPacket数据包的时间戳和持续时间 */ packet->pts = av_rescale_q_rnd(packet->pts, input_stream->time_base, output_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX); packet->dts = av_rescale_q_rnd(packet->dts, input_stream->time_base, output_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX); packet->duration = av_rescale_q(packet->duration, input_stream->time_base, output_stream->time_base); packet->stream_index = output_stream->index; /* 将AVPacket数据包写入输出文件 */ int ret = av_interleaved_write_frame(output_format_context, packet); if (ret < 0) { // 错误处理 } /* 释放AVPacket数据包 */ av_packet_unref(packet); ``` 需要注意的是,使用`av_interleaved_write_frame()`函数写入音频/视频帧时,必须保证音频/视频帧已经被编码为输出格式所支持的编码格式,并且输出格式的AVCodecContext已经被正确地设置。否则,写入的音频/视频帧可能无法被输出文件所支持,并且可能会导致写入失败。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值