前几天,临危受命,帮几个初学者的学生写一个简易am信号的fpga实现,以帮助他们搭建一个相对完整的系统,测试他们的低速adc,高速dac,agc控制等等模块。本文的fpga代码已经经过上板测试,由于时间紧急没有保存图片,所以文章只有仿真图片。
首先,为什么是am信号的调制过程,是因为在短时间情况下,am信号的实现相对简单,而且上述提到的几个模块都可以得到使用和验证。因为fpga的价格因素,做课设/比赛使用最多的还是altera的cyclone系列板。所以,本文使用quartus ii 13.1 作为verilog代码综合实现工具。am信号调制过程就不做过多介绍了,简单来说,就是基带信号和一个直流信号相加,然后与载波相乘。那么,在实现过程中,做了些许改变,先让基带信号与载波相乘,然后将截位后的信号与载波相加。如果想要实现更精细的am信号调制(变更调制深度等参数),可以修改这个地方的先后顺序。am公式表达如下:
为直流信号,是基带信号,是载波信号。
实现过程如上图,顶层文件使用bsf文件,更为直观。由上图可以看出,基带信号和载波信号是由nco(dds)产生,在上板验证中,低频部分的nco被删去,由低速adc采样外部信号替换这部分的低频信号。所以在刚开始搭建模块时,低速nco输出信号位宽就兼容了低速adc的16位位宽。根据资料1可得,altera提供的nco是根据32位输入信号phi_inc_i而输出对应的频率的正弦波。公式为:
是nco预设输出正弦波频率,是输入时钟频率,是nco的相位精度。这里的设置是32位。nco(dds)的本质是rom表,rom表存储着正弦波的波形数据,相位精度代表波形数据的多少。根据phi_inc_i累加地址,rom根据地址输出波形数据,最后数据计算如下。
基带载波
频率(mhz)0.110
phi_inc_i8589935858993459
然后让基带和载波信号相乘,使用lpm_mult ip核,设置好位宽,数据类型设为“signed”,设置流水线(增加clock),延迟设为1,便于后续通过时序检查。相乘输出信号位宽为32位,保险起见我们只截取最高位的符号位,再截取低位的数据。但是经过上板测试和仿真,符号位实际上有很多位。当然,这部分可以将符号位进行优化,或者设置一个模块,根据输入的参数输出不一样的截位信号,相当于在调整调制深度。同时,将载波信号延迟一个周期,与乘法器延迟一周期的信号做好时序对齐,然后经过lpm_add_sub ip核的加法运算;同样,lpm_add_sub ip核设置好输入信号位宽,数据类型设为“signed”,设置流水线,延迟设为1。最后输出的信号就可以经过高速dac输出。整个调制过程就结束了。仿真结果:
最后思考,可以在加法器和乘法器增加一个enable端口,ip核可以增加这个输入信号;如果先加再乘,由于直流信号一般不会变动,使能信号可以等待每次低速adc或低速nco数值更新再拉高一次;乘法器也可以使用使能信号控制,这样的话性能可能没有变化,功耗或许可降低些。此外,使用vcs仿真nco的nco.vo文件时,一直遇到一个问题,报错如下:
大概是说nco生成的4个hex文件有问题,但是使用modelsim就没这个问题了。
原文标题:简易am信号调制的fpga实现过程简单讲解
文章出处:【微信公众号:fpga之家】欢迎添加关注!文章转载请注明出处。
ThreadLocal实例应用
第三代区块链主网FUTUREPIA将解决现有区块链生态系统的问题
电压跟随器电路原理、作用及应用
京东方的面板离三星还有多少差距
电源标准简介
如何写一个简易AM信号的FPGA实现?
精密划片机:半导体材料在芯片生产制造过程中的关键性作用
PCB设计的基础知识设置技巧分享
关于扬尘监测仪厂家及型号的详细介绍
荷兰将区块链写入国家议程,并确认将投入数百万欧元到科研工作
智能制造2025什么意思_2025两个制造是什么(中国制造)
魅族pro7什么时候上市?魅族pro7最新消息:魅族pro7即将上市,魅族Pro7首发十核处理器!小米笑翻了
浅谈盖勒普高柔性自动化制造控制管理系统方案
中环股份表示无锡工厂预计2020年第一季度开始投产 目前在国内占有率超过80%
分布式VxWorks/Linux/Android开发测试环境的实现与探索
小米将是国内首家跟进苹果3D结构光的公司
华为异军突起
Ubuntu存在读取任意文件和拒绝服务等安全漏洞
拉压力传感器的分类及应用解析
新唐科技高精度模数转换器(ADC)系列-NAU780X