基于FPGA的两路信号发生器

基于FPGA的两路信号发生器

生产实习著blog2

这个的基本实现是一般新手就可以实现的了.整篇博客所需数学基础大概在初三水平

release : 2019-07-05 修正正弦波ROM裁剪问题
著有另一篇博客说明

[TOC]

DDS(Direct Digital Synthesizer)

DDS是直接数字式频率合成器的英文缩写。直接数字合成器除了具有最基本的频率合成(Frequency Synthesis)功能,还是一个灵活的多用途数字式信号调制与信号合成发生器,具有频率分辨率高、频率切换时间短、输出频率带宽大、可输出任意波形等特点,已经成为通信和雷达系统中的关键单元。 --百度百科

整体系统框图

先上一个dds理论图:


dds

有几点需要注意:

  1. 整个系统框图是非常简单的,就是做一个查找表,然后去用时钟去查表就完事了
  2. 对特定波形,ROM表定制性会很高,比如正弦波只需要\frac14段就够用了,方波锯齿波可以不用ROM等
  3. 框图在DAC后面少了一个低通滤波器,其实相当于信号重建滤波器,十分重要!

这里做的指标是这样的:

  1. 频率相位定点可控,其实可以做连续可控,但是因为想了个新想法估计要做专利,就换掉了.
  2. 只是做了正弦,但是不同波形用matlab生成,然后fpga加个选通就完事了.
  3. 做了14位的8192点的,主要考虑到电赛用的DAC和fpga的ROM资源

所以整体的FPGA框图是这样的:


框图

MATLAB生成查找表

这次我们直接生成mif文件,免得产生格式问题:

depth = 8192;
width = 14;
x = 0 : 2*pi/(depth-1) :2*pi;
y = sin(x);

y=(y+1)/2*(2^width -1 )/(2^width);      %转正,防溢出
disp(y);
y_qua = round(y*2^width);

%编写mif文件
fid = fopen('/home/heweibao/project_matlab/fpga_dds/sin.mif','wt'); %将信号写入一个.mif文件中
fprintf(fid,'WIDTH=%d;\n',width);%写入存储位宽
fprintf(fid,'DEPTH=%d;\n',depth);%写入存储深度
fprintf(fid,'ADDRESS_RADIX=UNS;\n');%写入地址类型为无符号整型
fprintf(fid,'DATA_RADIX=UNS;\n');%写入数据类型为无符号整型
fprintf(fid,'CONTENT BEGIN\n');%起始内容
for num=0 : (depth-1) 
fprintf(fid,'%d:%14.0f;\n',num,y_qua(num+1));
end
fclose(fid);
plot(x,y_qua);

简单,有一些小技巧大家可以看一看,我这里为了偷懒还是直接生成一个周期,没有节省空间

频率和相位计算

在介绍调频和调相之前,我们需要对相应的一些参数计算做点说明

最高频率f_{max}

设系统时钟为f_{clk},总的点数为N,则最高输出频率为:
f_{max} = \frac{f_{clk}}{N}
当然了,如果对一个给定的ROM表,而我们又想要一个高一点的输出频率的话,可以在相位累加器那里进行抽取,比如进行基2抽取后,8192点就相当于减半到4096点,即有:
f_{max2} = \frac{f_{clk}}{N/2} = 2f_{max}

频率分辨率\Delta f

设系统时钟为1Hz,则频率分辨率为:
\Delta f = \frac1N (Hz)

最小步进相移P_{min}

这个主要取决于相位累加器的位数,但是由于这里我取的是一个周期,所以总的相位就限制为2\pi:
P_{min} = \frac{2\pi}{N}
我个人比较喜欢用角度制(信号发生器嘛):
P_{min} = \frac{360}{N}

自然,这个视ROM表存储的不同而不同,这里仅仅介绍个最简单的应用

调相位

实际上,为了实现两路信号的相位差,我们只要设计两个相位累加器的初值不一样就完事了,所以大家会看见我的框图中存在一条soft_rst线用来进行调相之后的软复位.

  1. 比如假设我们想产生90度的相差,设总点数为8192点,则:
    \Delta N = \frac{90}{\frac1{8192}*360}
  2. 180度:
    \Delta N = \frac{180}{\frac1{8192}*360}

当然,在调相这方面,存在连续调相和定点调相两种方法,通过公式对比大家可以发现,连续调相相位差越调越大,定点调相相位越大误差越小,那怎么克服这一点呢?就在这里给大家留下一个博后习题了.

调频率

这个就特别简单了,在前面说过,我们调频的范围在DC-f_{max},所以只要做一个程控分频器就完事了,程序中我为了测试FPGA的极限参数,使用PLL例化了450M的时钟.输出频率其实跟上面的最高频率计算方法一样

这个就没什么连续和定点的区别了,比较简单

FPGA实现简单DDS

这里由于做一个简单应用,所以调频调相模块我没有放上来,有兴趣的朋友可以私信博主获取源码

module read_data_rom(
    input clk,rst_n,
    input soft_rst,
    input [12:0] phase_control,
    output wire [13:0] data_out
);

reg [12:0] address_reg;
always @(posedge clk or negedge rst_n)  //相位累加器
begin
    if(!rst_n)
        address_reg <= 13'b0;
    else if (soft_rst)
        address_reg <= phase_control;
    else
        address_reg <= address_reg + 1'b1;

end


sin_data    sin_data_inst (             //调用的一个小ROM
    .address ( address_reg ),
    .clock ( clk ),
    .q ( data_out )
    );

endmodule

仿真结果

仿真

结语

其实这里还是有很多东西可以讲的,但是真的不慎研究了几天写了一个小算法,发现之前的人没有想过这个思路,就去找个弟弟写专利去了,在这里没法详述,等以后申请了之后再给大家细细聊聊怎么优化这个粗糙得一匹的信号发生器

欢迎大家有什么新想法(无论是DDS还是有什么算法想用FPGA实现的)都可以私信我大家聊一聊喔

下一篇应该就是用FPGA实现各种通信编码,大家无妨投一个关注

想我尽早更新的方法之一

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容