使用FPGA产生sin波.docx
《使用FPGA产生sin波.docx》由会员分享,可在线阅读,更多相关《使用FPGA产生sin波.docx(9页珍藏版)》请在冰豆网上搜索。
使用FPGA产生sin波
使用FPGA产生正弦波
看不懂可以加QQ137194782
1使用matlab产生正弦波的.mif的rom表
工程中,经常要用到正弦表数据。
把正弦表数据存入mif文件中,供LPM_ROM初始化用,那么如何得到正弦表数据呢?
可以用matlab实现
这里介绍两种方式:
(一)这个方法只在matlab中生成数据表,需要自己手动的
往mif文件中添加数据
1.假设用到的DA芯片为14为,则2^14=16384
2.一个完整的正弦波为0-2pi
3.正弦波ROM的深度为4096(地址总数)
4.由于FPGA中不识别负数,加入一个直流分量,加8192
则用matlab产生正弦表的函数为:
Y=ceil((16384/2-1)*sin(0:
pi*2/4096:
2*pi)+8192)
其中ceil函数描述如下:
ceil(x):
大于x的最小整数
>>ceil([3.12-3.12])
ans=4 -3
(二)可以直接生成mif文件
直接生成mif文件
depth=4096;
width=14;
x=ceil(16384/2*sin(0:
pi*2/4096:
2*pi)+8192)
fid=fopen('d:
\romdata1.mif','w');%路径
fprintf(fid,'depth=%d;\n',depth);
fprintf(fid,'width=%d;\n',width);
fprintf(fid,'address_radix=uns;\n');
fprintf(fid,'data_radix=uns;\n');
fprintf(fid,'ContentBegin\n');
for(k=1:
depth)
fprintf(fid,'%d:
%d;\n',k-1,x(k));
end
fprintf(fid,'end;');
用上面这段程序最大值会出现16384,在QuartusII中会认为是超出数据范围,所以需要手动的改写为16383把x=ceil(16384/2*sin(0:
pi*2/4096:
2*pi)+8192)改写为下面语句
x=ceil((16384/2-1)*sin(0:
pi*2/4096:
2*pi)+8192)就不存在上述问题了
数据量小的话,可以用第一种方法,要是数据量大的话,介意用第二种方法。
2使用modelsim仿真FPGA产生正玄波。
最简易的sin波发生器
Verilog代码:
modulesin_top(
inputclk_50m,
inputrst_n,
output[13:
0]q
);
reg[11:
0]cnt;
wire[11:
0]addr;
always@(posedgeclk_50mornegedgerst_n)begin
if(!
rst_n)
cnt<=12'd0;
elseif(cnt==12'd4095)
cnt<=12'd0;
else
cnt<=cnt+12'd1;
end
assignaddr=cnt;
sin_romsin_rom_inst(
.address(addr),//4096
.clock(clk_50m),
.q(q)//14bit
);
Endmodule
测试模块:
modulesin_tb();
regclk_50m;
regrst_n;
wire[13:
0]q;
sin_topsin_inst(
.clk_50m(clk_50m),
.rst_n(rst_n),
.q(q)
);
initialbegin
clk_50m=0;
rst_n=0;
#100;
rst_n=1;
#80000;
$stop;
end
always#10clk_50m=~clk_50m;
endmodule
综合:
Modelsim仿真:
我们修改如下
使用FPGA产生正玄波发生器仿真完成。