FPGA利用查找表实现sin正弦函数

最近在看《基于FPGA的数字图像处理原理及应用》这本书,准备利用FPGA实现一些简单的数字图像处理。想把学习过程中遇到的一些问题以及解决方法与大家分享。

1.查找表的定义

在计算机科学中,查找表使用简单的查询操作替换运行时计算的数组或者associative array这样的数据结构。由于从内存中提取数值经常要比复杂的计算速度快很多,因此这样得到的速度提升是很显著的。

一个经典的例子就是三角表。每次计算所需的正弦值在一些应用中可能会慢的无法忍受,为了避免这种情况,应用程序可以在刚开始的一段时间计算一定数量的角度正弦值,譬如计算每个整数角度的正弦值,在后面的程序需要正弦值的时候,使用查找表从内存中提取临近角度的正弦值而不是使用数学公式进行计算。

由于查找表的高效率与方便易用性,它在实时性要求比较高的嵌入式系统中得到了广泛的应用。在FPGA中,主要是以下两种情况会用到查找表:一种是逻辑的时序要求非常高,例如,若用Cordic计算或是其他计算方式,则其延时不能满足要求时;另一种是计算的复杂度非常高,需要消耗相当一部分逻辑资源,而查找表只需建立一块的存储器,这可以用FPGA的片内存储器来构建,仅仅消耗一小部分逻辑资源。

2.利用查找表实现正弦函数

下面是一个用查找表来实现正弦函数sinx的示例。

①利用MATLAB生成mif文件

mif文件存放sinx的变量和函数值,在程序运行之前利用mif文件对ROM初始化。下面是生成sin函数查找表的MATLAB程序。

用MATLAB运行该程序会生成一个mif文件,文件内容如下。

该mif文件里存放了sinx函数扩大了2^14的901个0-90°步长为0.1°的函数值

用quartus软件打开该mif文件:

可以发现mif文件就是一个表格,对应的内容是地址位和十进制值,所以mif文件头一定不能写错。否则会在下一步初始化ROM时发生错误。

②FPGA例化一个ROM来实现查找表的存放

下面是调用quartus的IP核生成ROM的步骤。

  

  

数据位宽和地址位宽根据前面生成的mif决定,这里选取数据位宽为14,地址位宽为10。

‘q’ output port一般不必勾选

在这里点击browse选择mif文件对ROM进行初始化,最后finish即可。

③利用modelsim进行仿真

下面是仿真测试程序

`timescale1ns/1ns

moduletb_top;

//=====================================================================\

// ********** Define Parameter and Internal Signals *************

//=====================================================================/

parameter DW = 15 ;

parameter AW = 10 ;

parameter ADDR_MAX = 900 ;

parameter const_half_pi = ADDR_MAX-1 ;

parameter const_pi = ADDR_MAX*2-1;

parameter const_double_pi = ADDR_MAX*4-1;

reg clk ;

reg rst_n ;

reg [AW+2-1:0] address_tmp ;

reg [AW-1:0] address ;

wire [DW-1:0] q_tmp ;

reg [DW+1-1:0] q_tmp1 ;

wire [DW-1:0] q ;

//======================================================================

// *************** Main Code ****************

//======================================================================

always #5 clk = ~clk;

initial begin

clk <= 0;

rst_n <= 0;

address_tmp <= {AW+2{1'b0}};

#100

rst_n <= 1;

end

always @(posedge clk or negedge rst_n)begin

if(!rst_n)begin

address_tmp <= {AW+2{1'b0}};

end

else if(address_tmp == const_double_pi)begin

address_tmp <= {AW+2{1'b0}};

end

else begin

address_tmp <= address_tmp + 1'b1;

end

end

always @(posedge clk or negedge rst_n)begin

if(!rst_n)begin

address <= {AW{1'b0}};

end

else if(address_tmp == const_double_pi)begin

address <= {AW{1'b0}};

end

else if(address_tmp <= const_half_pi)begin

address <= address_tmp[AW-1:0];

end

else if(address_tmp <= const_pi)begin

address <= const_pi - address_tmp;

end

else if(address_tmp <= const_half_pi+const_pi)begin

address <= address_tmp - const_pi;

end

else begin

address <= const_double_pi - address_tmp;

end

end

always @(posedge clk or negedge rst_n)begin

if(!rst_n)begin

q_tmp1 <= {DW+1{1'b0}};

end

else if(address_tmp <= const_pi)begin

q_tmp1 <= {1'b0, q_tmp};

end

else begin

q_tmp1 <= {DW+1{1'b0}} - {1'b0, q_tmp};

end

end

assign q = q_tmp1[DW-1:0] ;

//例化

sin_lut sin_lut_inst(

.address(address),

.clock(clk),

.q(q_tmp)

);

endmodule

仿真结果如下图所示。

以上就是通过FPGA利用查找表实现正弦函数的全部内容。

sin查找表 matlab,FPGA利用查找表实现sin正弦函数相关推荐

  1. sin查找表 matlab,FPGA查找表法sin函数的实现

    实验一Sin(x)函数的计算 一.实验要求 1.系统可以根据输入的角度(或弧度)x,显示相应的sin(x)数值,保证角度精度≤0.1度. 2.编辑测试激励文件,进行相关测试,注意测试的完备性. 3.根 ...

  2. 用java写注册表单_利用HTML表单标签编写一个注册页面

    今天我们来写一个注册页面 form表单 先来利用表单标签制作一个简单的注册页面,给大家说说标签的结构: 页面结构大体就是这样子的~ 利用HTML表单标签编写一个注册页面 表单标签: 所有需要提交到服务 ...

  3. FPGA利用查找表实现sin cos函数

    1.生成0到360度的sin和 cos函数的coe文件 2.导入ROM里面 3.编写Verilog程序 4.进行仿真或者逻辑分析仪 1.sin函数 clear; clc; Quantify_bit=1 ...

  4. 利用泰勒公式编程计算sin(x)

    利用泰勒公式编程计算sin(x) 文章目录 利用泰勒公式编程计算sin(x) 问题 代码 问题 利用泰勒公式编程计算sin(x): 程序提示"x=",用户输入x值.程序计算时,精确 ...

  5. sin查找表 matlab,利用Xilinx中的ROM构造查找表来计算sin和cos的方法探讨

    1.使用matlab制作.coe文件 查找表的构造 构造256点的正余弦表 exp(-j*2*pi*(0:255)/256),分别得到 cos和sin的查找表 matlab代码: 求sin fid = ...

  6. OpenCV之core 模块. 核心功能(1)Mat - 基本图像容器 OpenCV如何扫描图像、利用查找表和计时 矩阵的掩码操作 使用OpenCV对两幅图像求和(求混合(blending))

    Mat - 基本图像容器 目的 从真实世界中获取数字图像有很多方法,比如数码相机.扫描仪.CT或者磁共振成像.无论哪种方法,我们(人类)看到的是图像,而让数字设备来"看"的时候,则 ...

  7. OpenCV 【十二】OpenCV如何扫描图像、利用查找表和计时

    目录 OpenCV如何扫描图像.利用查找表和计时 1.函数计算时间测试case 2. Mat图像的存储机理 3. 像素遍历的3--4种方式 4. 实例 OpenCV如何扫描图像.利用查找表和计时 如何 ...

  8. OpenCV遍历图像性能比较、利用查找表

    原文:http://blog.csdn.net/chenjiazhou12/article/details/21052849 对于如何扫描图像的方法实在是太多了,在浏览一些资料的时候也找到了一些好的方 ...

  9. 从原理的视角,一文彻底弄懂FPGA的查找表(LUT)、CLB

    我学东西有个特点,喜欢从原理的层面彻底弄懂一个知识点,这几天想弄明白FPGA的查找表,但发现很多博文写的很模糊,看了以后仍然不是很明白.当然,可能是作者自己弄懂了,但没有站在新人的角度来详细的解释.通 ...

  10. VS+openCV 用直方图统计像素(上)计算图像直方图、利用查找表修改图像外观

    一.计算图像直方图 图像由各种数值的像素构成.例如在单通道灰度图像中,每个像素都有一个 0(黑色)~255(白色)的整数.对于每个灰度,都有不同数量的像素分布在图像内,具体取决于图片内容. 直方图是一 ...

最新文章

  1. Ajax无刷新实现图片切换特效
  2. python以运行效率高著称吗_如何提高python的运行效率
  3. Java实现算法导论中KMP字符串匹配算法
  4. 【版本更新】IM 4.3.0新版本升级上线!
  5. tensorflow笔记
  6. ffmpeg for android shared library
  7. 精彩回顾 | Dapr闪电说系列
  8. 【JEECG技术博文】Local storage easyui extensions
  9. 树状数组相关应用之区间更新单点查询问题
  10. dnSpy - 一款 .NET 程序逆向工具
  11. 三星s9刷android原生6,【极光ROM】-【三星S9/S9+ G9600/G9650-845】-【V22.0 Android-Q-TF6】...
  12. 搭建excel在线编辑服务器,网站如何实现在线编辑Excel?
  13. Overloud TH3 for Mac(电吉他效果器)
  14. openlayers3.0叠加天地图底图及注记后再叠加geoserverWMS服务
  15. 爬虫入门实践:天气信息
  16. 柳传志给杨元庆的信件 (zt)
  17. 一周信创舆情观察(2.14~2.20)
  18. 联想thinkbook14 2022款和2021款区别哪个好
  19. 关于数学计算机手抄报简单的,关于数学的手抄报简单
  20. Hive基础之创建数据库

热门文章

  1. opencv python 人脸识别 相似度_如何使用OpenCV3直方图方法进行人脸相似度对比
  2. 详解关系抽取模型 CasRel
  3. 如何对 List集合进行排序
  4. Scratch(二十七):恐龙飞奔
  5. GEO数据库中platform信息详解
  6. Excel 空值填充
  7. (二)4.逻辑函数的化简
  8. 基于 Octotree 的[码云]文件树插件
  9. 灰色系统理论及其应用 (四) :灰色模型 GM
  10. 不一般的电路设计——什么是电压采集采样?