FPGA产生正弦波方法COE文件

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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的值。而且还伴随着有误差。可以通过增大位数,和减小采样间隔时间来减小误差。

相关文档
最新文档