FPGA产生正弦波方法COE文件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FPGA产生正弦波方法(1/4周期)COE文件本文主要介绍通过查表法产生正弦波。涉及利用matlab生成四分之一周期的正弦相位、幅值对应表,生成COE文件的IP 核方法,FPGA编程产生数字正弦信号。
正弦信号,是一个模拟信号。FPGA只能产生数字信号。因此需要用DA将数字量转化为模拟量。这里采用modelsim的模拟波形显示,不叙述DA转换相关知识了。产生正弦信号的方法有很多,这里用的是查找rom的方法,产生正弦信号。
正弦信号,是一个幅值介于-1和1之间周期变化的模拟量,因此只需要将1/4周期的值存进rom里,其波形就可以根据这1/4周期幅值的变化得到。
matlab产生正弦信号的值。以为步长,从0采集到pi/2,共158
个点。x = linspace(0, pi/2,158); 因sin的幅值值是小数,而FPGA不能表示小数,我们把幅值乘以12位二进制后取整实现幅值整数化。即幅值放大4096倍。例如幅值为,而*2^12=,取整为1229。当然这样表示会有一定误差,但可以根据精度需要调整参数,使误差可接受。
生成ROM。这里rom用的是ISE的IP rom。将matlab生成的数据存入rom里面,读取rom的值,即可生成正弦信号。
首先是生成rom的初始化文件。Xilinx的rom的初始化文件的后缀为.coe。这个特殊文件有固定的格式如下:
文件前面两行的内容是固定的。MEMORY_INITIALIZATION_RADIX=10;表示下面的数字是10进制数,后面的数据是依次存入rom的值,以逗号分开,最后以一个分号结束。
生成初始化文件的matlab程序如下所示:
fid = fopen('','w');
fprintf(fid,'MEMORY_INITIALIZATION_RADIX = 10;\n');
fprintf(fid,'MEMORY_INITIALIZATION_VECTOR =\n');
for i = 0:1:pi/2*100
y = sin(i/100);
rom =floor( y * 2^12);
if i == 157
fprintf(fid,'%d;',rom);
else
fprintf(fid,'%d,',rom);
end
if mod(i,10)==0 && i ~= 0
fprintf(fid,'\n');
end
end
fclose(fid);
matlab生成的文件是.txt文件。将后缀直接改为.coe即可。然后复制到ISE 分工程目录下。
初始化文件生成后,剩下就是编写verilog代码。
首先建一个工程,然后新建一个IP。
找到rom,打开。设置按如下设置:
这里是设置位宽,采用的是13位(第一位为符号位,后面12位为数据位)来显示sin的值。因此这里是设置为13.深度是因为要存158个值,所以这里设置为158.
将刚刚生成的.coe文件载入,生成即可。
接着就是编写verilog代码了。
首次查看用ip生成的rom的例化代码.
sin_rom your_instance_name (
.clka(clka), ddra(addra), outa(douta) lka(clk), ddra(add), outa(douta) lk(clk),
.address(address),
.data_out(data_out)
);
always#5 clk = ~clk;
initial begin
// Initialize Inputs
clk = 0;
address = 0;
// Wait 100 ns for global reset to finish
while(1)
begin
@(negedge(clk));
if( address < 628 )
address = address + 1;
else
address = 0;
end
end
endmodule
至此FPGA产生正弦波程序结束。这样产生的正弦波,方法比较简单,但是不能调节,调节的话,就要重新生成rom的值。而且还伴随着有误差。可以通过增大位数,和减小采样间隔时间来减小误差。