Vivado基于Rom IP核查找表生成cos、sin波形的方法

一、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计算的值

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值