
我所使用的硬件如封面图为XILINX公司的SPARTAN6系列芯片型号XC6SLX92FTG256C,是256脚的FBGA封装。使用的编程软件为ISE14.7、仿真软件为Modelsim SE-64 10.4
数字调制所需的载波主要由DDS进行移位相加,输出地址在ROM中查询相应的值输出正弦波,信源序列由伪随机序列即m序列产生。其序列码的频率与波形频率成整数倍实现同步调制。按键来选择移位相加的初始值和步进值实现调幅、调频、调相。最终输出的数字信号通过DA传递模块将值反码处理,最终通过软件无线电上的DA模块实现波形输出实验板的芯片的工作频率为40M,整体实验计算以50M为基础。(整个系统框图如下)

系统框图

RTL级电路

键控三种同步调制
m序列的产生m序列使用的码为prbs15,其公式为X^15+X^14+1,使用移位寄存器实现。需要确定码的频率,规定一个码长为的时长为81920ns(正弦波周期)。需要分频产生周期81920ns的m序列。即将硬件主时钟50M进行4096分频

代码
正弦波数据提取 使用matlab产生正弦的参数,使用了4096个点即所产生波形的频率满足以下公式

代码
ASK、FSK、PSK实现 1.振幅键控是由设置DDS模块中的频率控制字来实现,频率控制字可随伪随机序列变化,以实现将伪随机序列作为调制信号。当FreqCtrl = 1时,累加器以步长为1累加,输出地址可产生幅度为1的正弦波,当FreqCtrl = 0时,累加器输出值始终为0,故输出地址可一直寻址ROM查找表的第一个值,该值为0,输出正弦波幅度为0。故此实现了振幅键控。2.频移键控也是由设置DDS模块中的频率控制字来实现,频率控制字可随伪随机序列变化,以实现将伪随机序列作为调制信号。因为由时钟为50MHZ,则产生正弦波的4096个点需要81920ns,当FreqCtrl = 1时,累加器以步长为1累加,输出地址可在一个81920ns内产生一个正弦波,当FreqCtrl = 2时,累加器以步长为2累加,以2累加可在查找ROM表时将数减少一半,以实现在一个81920ns内产生两个正弦波。故此实现了频移键控。3.移频键控是由改变输出地址的初始相位来实现的,也就是改变phase的初始累加值。phase = 0时,累加输出从0开始累加,从ROM表第一个地址开始寻址,初相位0。phase = 2047时,累加器输出从2047开始累加,从ROM表第2047个地址开始寻址,初相位为180度。

频移键控代码
DA转换模块 最终的信号需要经过数模转换模块,我所使用的DA模块是双通道10位125MSPS高速DAC数据转换,能够直接产生一个高频率的中频信号,高阻抗输出,适用于单终端或不同模拟输出配置。需要FPGA输出10位数字信号和DA模块所需要的工作时钟和写时钟。需要把输入数据首位取反,因为让波形的中心点为0V,而且DA转化为有符号的数。

取反仿真图
总结 整个基于数字调制系统的仿真结果基本满足要求三种按键实现2ASK、2FSK和BPSK以及与信源的同步和信源的产生(m序列),但是硬件调试部分的工作没有很好的完成程序里步进值模块单独写出来但是初始值没有实现分离,导致程序可读性和可修改性较差和相位累加模块较为臃肿。程序中大量使用里if-else 的语句也不太好对于FPGA的编程。应该由case语句代替。整个系统做的好的地方是同步问题的处理,例如信源的码率的选择,以及一个信源帧头的load信号,可以时载波再信源开始时候同步调制,实现同步。最后感谢一起编程的队友和指导老师的帮助
(部分程序参考网络资源)