一、发射模块设计思路:
- 首先将ARM处理器通过AXI总线传过来的一帧32位宽数据存入FIFO中;(数据类型:位宽32bit,只有最高位和最低位有效,最高位data[31]=0,表示不需要进行PIE编码(比如帧同步和前导);最高位data[31]=1,表示数据信号,需要进行PIE编码后经ASK调制输出。
- 从FIFO中读出数据,完成PIE编码。
- 将编码后信号与DDS产生的频率为1MHZ的正弦信号相乘,进行ASK数字载波调制,调制后数据经发射模块输出,后续连接D/A转换器或射频芯片发射输出。
二、简单描述PIE编码规则:
数据位data[0]= 0 时,PIE编码为 2 个 0.5tari 的 二进制数10,如果是数据位data[0]= 1 时,编码为 4 个 0.5tari 的 二进制数1110。不需要进行编码的部分直接根据数据位bit数值输出0.5tari,其中tari在实验中设置为0.8us。
三、调用DDS IP核实现ASK调制原理:
xilinx官方提供的DDS Compiler(6.0)IP核,内部集成了相位发生器和SIN/COS查找表(相位到正弦值的转换)组成。编译器核心实现了高性能、优化的相位生成和相位到正弦电路,具有axi4流兼容接口。DDS由这些部件可以单独使用或组合使用。DDS IP核基本原理和具体配置可参考文章DDS信号发生器实现(DDS Compiler 6.0)_蓝色的猫猫的博客-CSDN博客
输出数据通道设置:
在DDS中设置“sine and cosine”输出时,sin和cos会共用数据总线,sin使用高字节,cos使用低字节。选定输出字节宽度后,多余位用符号位扩充。
输出字节宽度设置为11时,格式如下:
assign sin_data = {dds_axi_data[26],dds_axi_data[26:16]};
assign cos_data = {dds_axi_data[10],dds_axi_data[10:0]};
DDS IP核几乎都是采用二进制补码带符号数。输入信号与本地载波混频时,要求输入信号保持带符号二进制补码形式。
输入信号与载波相乘实现方法:利用移位代替除法时,右移时高位补符号位(或者也可以调用乘法IP核实现)代码如下:
四、代码设计基本思路
模块端口设计:
接收ARM端传过来的data数据,进行PIE编码和ASK数字调制后输出i路信号dac_i_data。
实现PIE编码主要通过编写div_flag、rd_fifo_en和shift_data信号的时序代码,实现相互配合。通过控制读fifo使能信号,改变shift_data的初始数据(
1、若此时读出数据rd_fifo_dout[31]=0,shift_data[31]<=rd_fifo_dout[0],其余位填充1;
2、若此时读出数据rd_fifo_dout[31]=1同时d_fifo_dout[0]=1,shift_data[31:28]<={4'b110},其余位填充1;
3、若此时读出数据rd_fifo_dout[31]=1同时d_fifo_dout[0]=0,shift_data[31:30]<={2'b10},其余位填充1)。
然后在rd_fifo_en低电平周期内,对shift_data进行左移位,改变shift_data[31]的取值。shift_data[31]决定载波输出幅值大小。部分代码如下:
五、仿真结果测试:
从仿真结果中看出,正确实现了数据的PIE编码,且验证了DDS输出正弦信号为10MHZ(频率控制字为 429496729;系统时钟频率为100MHZ),实验设置的0.5个tari为0.4us,即shift_data[31]的数据持续时间内包含4个正弦信号波形。
文章均是个人日常学习总结,如有理解不正确地方,欢迎指正。