一、MATLAB生成sin,cos的数据文件
构造256点的正余弦表,分别得到 cos和sin的查找表
matlab代码: 求sin
fid = fopen('sin.txt','a' );
str1 = 'MEMORY_INITIALIZATION_RADIX=10;';
str2 = 'MEMORY_INITIALIZATION_VECTOR=';
fprintf(fid,'\t%s\n \t%s\n', str1,str2);
for k=1:256;
y(k) =sin(2*pi*k/256);
y(k) = int16(y(k)*2^15); %这一步主要是考虑是表中数据的格式Q(s,16,15).
fprintf(fid,'\t%d%c\n',y(k),',');
end
fclose(fid);
matlab代码:求cos
fid = fopen('cos.txt','a' );
str1 = 'MEMORY_INITIALIZATION_RADIX=10;';
str2 = 'MEMORY_INITIALIZATION_VECTOR=';
fprintf(fid,'\t%s\n \t%s\n', str1,str2);
for k=1:256;
y(k) =cos(2*pi*k/256);
y(k) = int16(y(k)*2^15);
fprintf(fid,'\t%d%c\n',y(k),',');
end
fclose(fid);
二、Vivado实现
源文件:
module rom(
input clk,
input rst,
output [16:0] data_sin,
output [16:0] data_cos
);
reg [7:0] addr;
always@ (posedge clk or negedge rst) begin
if (!rst)
addr <= 0;
else
addr <= addr + 1;
end
blk_mem_gen_0 u_lut_sin (
.addra(addr),
.clka(clk),
.douta(data_sin)
);
blk_mem_gen_1 u_lut_cos (
.addra(addr),
.clka(clk),
.douta(data_cos)
);
endmodule
测试文件:
`timescale 1ns / 1ps
module tb;
reg clk;
reg rst;
wire [16:0] data_sin;
wire [16:0] data_cos;
initial begin
clk = 0;
rst = 0;
#10 rst = 1;
end
always #10 clk = ~clk;
rom inst_rom(
.clk (clk) ,
.rst (rst) ,
.data_sin (data_sin) ,
.data_cos(data_cos)
);
endmodule
仿真波形:设置查看波形格式,有符号十进制数,模拟信号格式
正余弦波形:每个clk输出的值即为存储在rom中sin,cos计算的值