FPGA如何利用查表法得到某角度所对应的正弦值、余弦值

  • 1 实现思路
  • 2 具体实现步骤
    • 2.1 MATLAB生成sin.coe文件和cos.coe文件
    • 2.2 将sin.coe和cos.coe文件分别写入ROM核
    • 2.3添加ILA
    • 2.4 新建源文件top,编写源文件
    • 2.5 新建约束文件,编写约束文件
  • 3 结果
    • 3.1 结构图
    • 3.2结果分析
  • 4 工程文件

1 实现思路

1、MATLAB生成不同角度的正弦值sin.coe文件和余弦值cos.coe文件;
2、将sin.coe和cos.coe文件分别写入ROM核;
3、查表得到角度所对应的正弦值、余弦值。

2 具体实现步骤

2.1 MATLAB生成sin.coe文件和cos.coe文件

close all;
clear all;
clc;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%           参数定义
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% L=90;               % 采样点数
Quantify_bit=16;      % 量化位数fc=10e6;         % 信号频率
fs=65e6;         % 采样频率
yinzi=100;       % 缩减因子,避免出现  D 必须为小于 flintmax 的非负整数。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%              产生信号
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
theta=0:1:360;  % 度
L=length(theta);          % 采样点数
y=cosd(theta);% y=st/max(abs(st));               % 归一化
% y=st/yinzi;
yt=round(y*(2^(Quantify_bit-1)-1));     % 12bit量化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%            MATLAB生成coe文件
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 在.coe文件中
% 第一行为定义数据格式, 2代表 ROM 的数据格式为二进制。
% 从第 3 行开始到第最后一行,是这个  L(数据长度为1024)* ADC_bit(16bit) 大小 ROM 的初始化数据。
% 第一行到倒数第二行的数字后面用逗号,最后一行数字结束用分号。
fid=fopen('cos.coe','w');  % w表示write
fprintf(fid,'Memory_Initialization_Radix = 2;\r\n'); % 二进制
fprintf(fid,'Memory_Initialization_Vector = \r\n');
for p=1:LB_s=dec2bin(yt(p)+(yt(p)<0)*2^Quantify_bit,Quantify_bit);for q=1:Quantify_bit  % 12位,依次判断这12位的数值if B_s(q)=='1'data=1;elsedata=0;endfprintf(fid,'%d',data);end%  下面if语句的目的%  每行数字后面用逗号(,),最后一行数字结束用分号(;)if (p<L)fprintf(fid,',\r\n'); elsefprintf(fid,';\r\n');    % 分号(;)  结束标志位endend
fclose(fid);figure(1);
plot(theta,y);hold on;figure(2);
plot(theta,yt);hold on;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%            信号幅度估计
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ST_FFT=fftshift(fft(y));    % 傅里叶变换
P_ST=abs(ST_FFT)/L;          % 幅度谱
u_st=max(P_ST);              % 得到波束1接收到的信号的幅度值
fprintf('u_st信号的幅度值为%g\n',u_st);Y_FFT=fft(y,L);     % 傅里叶变换
P_Y=abs(Y_FFT)/L;   % 幅度谱
u_y=max(P_Y);       % 得到波束1接收到的信号的幅度值
fprintf('u_y信号的幅度值为%g\n',u_y);YT_FFT=fft(yt,L);   % 傅里叶变换
P_YT=abs(YT_FFT)/L; % 幅度谱
u_yt=max(P_YT);     % 得到波束1接收到的信号的幅度值
fprintf('u_yt信号的幅度值为%g\n',u_yt);AM=u_yt*yinzi/u_st;       % 扩大了2^11次方倍

2.2 将sin.coe和cos.coe文件分别写入ROM核

添加Block Memory Generator,并进行ROM IP核配置


port A width表示位宽,选择的是16位;
port A depth表示数据的个数,0度到360度,一度步进,所以有361个数据。

2.3添加ILA

2.4 新建源文件top,编写源文件

`timescale 1ns / 1psmodule top(input sys_clk,  //50MHz时钟input rst_n     //复位,低电平有效);/*函数功能:产生余弦值
*/
wire [15:0] cos_value; //ROM读出数据  每个数据有12bit
reg  [8:0]  cos_addr; //ROM输入地址 361个数据,需要2^9个地址//产生ROM地址读取数据
always @ (posedge sys_clk or negedge rst_n)
beginif(!rst_n)cos_addr <= 10'd0;elsecos_addr <= cos_addr+1'b1;
end
//实例化ROM
rom_cos rom_cos_inst
(.clka  (sys_clk ),   //inoput clka.addra (cos_addr ),  // input wire [8 : 0] addra 361个数据,需要2^9个地址.douta (cos_value )  // output wire [15 : 0] douta
);/*函数功能:产生正弦值
*/
wire [15:0] sin_value; //ROM读出数据  每个数据有12bit
reg  [8:0]  sin_addr; //ROM输入地址  1024个数据,需要2^10个地址//产生ROM地址读取数据
always @ (posedge sys_clk or negedge rst_n)
beginif(!rst_n)sin_addr <= 10'd0;elsesin_addr <= sin_addr+1'b1;
end
//实例化ROM
rom_sin rom_sin_inst
(.clka  (sys_clk ),   //inoput clka.addra (sin_addr ),  // input wire [8 : 0] addra 361个数据,需要2^9个地址.douta (sin_value )  // output wire [15 : 0] douta
);/*函数功能:查表计算某角度的正弦值、余弦值
*/
wire [15:0] data_value_sin;
wire [15:0] data_value_cos;
wire [8:0]       theta;
assign     theta=9'd300;// 角度//查表得到余弦值
rom_cos rom_cos_data_inst
(.clka  (sys_clk ),   //inoput clka.addra (theta ),  // input wire [8 : 0] addra 361个数据,需要2^9个地址.douta (data_value_cos )  // output wire [15 : 0] douta
);
//查表得到正弦值
rom_sin rom_sin_data_inst
(.clka  (sys_clk ),   //inoput clka.addra (theta ),  // input wire [8 : 0] addra 361个数据,需要2^9个地址.douta (data_value_sin )  // output wire [15 : 0] douta
);//实例化逻辑分析仪
ila_0 ila_0_inst (.clk(sys_clk), // input wire clk.probe0(cos_addr ), // input wire [8:0]  probe0  .probe1(cos_value), // input wire [15:0]  probe1 .probe2(sin_addr ), // input wire [8:0]  probe2 .probe3(sin_value), // input wire [15:0]  probe3.probe4(data_value_sin), // input wire [`15:0]  probe4.probe5(data_value_cos) // input wire [15:0]  probe5
);endmodule

2.5 新建约束文件,编写约束文件

############## clock and reset define##################
create_clock -period 20 [get_ports sys_clk]
set_property IOSTANDARD LVCMOS33 [get_ports {sys_clk}]
set_property PACKAGE_PIN U18 [get_ports {sys_clk}]
set_property IOSTANDARD LVCMOS33 [get_ports {rst_n}]
set_property PACKAGE_PIN N15 [get_ports {rst_n}]

3 结果

3.1 结构图

3.2结果分析

1、ila触发条件

2、ila结果

需要注意的是:cos_value和sin_value中,不是曲线的点的值都为0。为什么不是完整的正弦波,目标还不知道为什么,但结果应该是正确的。

3、MATLAB仿真结果
300度的余弦值为16383,正弦值为-28377.(已经量化)。
余弦结果:

正弦结果:

为什么看的是序号为301的值,有一个0度,所以是300度对应的是301。

4、结果表明,实验成功。

4 工程文件

工程文件

FPGA如何利用查表法得到某角度所对应的正弦值、余弦值相关推荐

  1. c语言利用查表法画正弦波,嵌入式C语言查表法在项目中的应用

    就像下面的这个表 之前写过上面这个标题的一篇文章,讲的是以位移的方式去遍历表中的数据,效率非常高,但是,如果要实现一个乱序的流水灯或者跑马灯的话,思考一个这样的算法是不可取的,很费时间,也很费脑力,于 ...

  2. FPGA之道(63)“万能”的查表法

    文章目录 前言 "万能"的查表法 正弦波发生器示例 前言 又好几天没更新了,这就是又停止了读书的节奏,终于在毕业论文可以稍微舒缓下来的时候更新了博客,完成一个系列,读完一本书等等都 ...

  3. CRC算法 个人学习笔记 直接法、查表法注意点

    CRC检验码主要是用在数据校验中,用于判断对应数据是否发生传输错误,详细的介绍百度就可以.本文主要是记录我个人在这几天学习使用CRC的过程中遇到的问题.各位在阅读时如果有发现问题,可在评论区留言,谢谢 ...

  4. LUT查表法乘法器所犯下错误。。。。

    程序参见黑金时序篇一章实验五LUT查表法实验,不同的是LUT我用了一个ROM来实现,word depth 256,word size 16,数据用matlab生成,发现matlab确实好强大,不用操作 ...

  5. CRC查表法——表的由来及Java实现CRC8校验算法

    转载请标明出处: http://blog.csdn.net/xx326664162/article/details/51718857 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定 ...

  6. CRC校验查表法原理及实现(CRC-16)

    绪论 在网上浏览了很多关于CRC校验的文章,基本上都是针对CRC校验原理的阐述以及关于CRC校验查表法的实际应用以及具体软件实现方法. 至于查的表是怎么来的,软件为什么要这样实现很多文章并没有说明.本 ...

  7. CRC16查表法的C语言实现

    循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC.它是利用除法及余数的原理来作错误侦测(Error Detecting)的.实际应用时,发送装置计算出CRC值并随 ...

  8. STM32CUBEMX—查表法实现SPWM

    SPWM称为正弦波脉宽调制,其原理是采用三角波作为载波,正弦波作为调制波合成后生成的等高不等宽的PWM波.在simulink仿真中直接用三角波模块与sine wave合成即可,但对于编程来说比较麻烦, ...

  9. crc16查表法c语言实现,CRC校验查表法原理及实现(CRC-16)

    绪论 在网上浏览了不少关于CRC校验的文章,基本上都是针对CRC校验原理的阐述以及关于CRC校验查表法的实际应用以及具体软件实现方法. 至于查的表是怎么来的,软件为何要这样实现不少文章并无说明.本篇文 ...

最新文章

  1. iframe 内嵌第三方网站 cookie 失效,解决办法
  2. 你算个什么鸟?AI十级“找茬”选手诞生
  3. Legacy autograd function with non-static forward method is deprecated. Please use new-style autograd
  4. ​软件推荐:17 款必备Chrome浏览器插件,值得一试!
  5. easyUI 绑定右键菜单在数据行上显示
  6. python re模块详解_python 详解re模块
  7. Windows 10 上强制Visual Studio以管理员身份运行
  8. 机器学习必知的 10 个 Python 库
  9. Object.preventExtensions()使用技巧
  10. Redis 那么快之底层 ziplist 的奥秘!
  11. PS各种实用的辅助工具
  12. 大数据杀熟?我从银行数仓项目学到了什么
  13. Android 微信登录 无法调起授权页面
  14. dither(抖动)
  15. 笔记本合上盖子怎么不休眠了?
  16. iMeta视频教程 | 代谢物溯源/微生物组与代谢组整合分析软件MetOrigin
  17. Matlab之创建单位矩阵函数eye
  18. Access to XMLHttpRequest at ‘http://xx‘ from origin ‘http://xx‘ has been blocked by CORS policy:
  19. Windows驱动开发书籍简介
  20. 【Win10】打开控制面板提示:操作系统当前的配置不能运行此应用程序

热门文章

  1. 什么叫侧面指纹识别_新科技?侧面指纹解锁有什么不同?
  2. 使用Nginx反向代理tomcat服务器
  3. Python基础知识随缘补(1)字符串的前缀f,r,u,b
  4. (免费分享)基于javaweb,ssm旅游景点预定系统
  5. 这些逻辑运算符你都使用正确了吗?
  6. 如何用python画国旗?
  7. 什么是串并口硬盘 串口与并口硬盘的区别
  8. shell系列9-awk
  9. 如何快速搭建线上电商商城网站?
  10. 一款跨平台小巧的端口爆破工具