网站大量收购闲置独家精品文档,联系QQ:2885784924

FPGA查找表法sin函数的实现.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
FPGA查找表法sin函数的实现

实验一 Sin(x)函数的计算 一、实验要求 1、系统可以根据输入的角度(或弧度)x,显示相应的sin(x)数值,保证角度精度≤0.1度。 2、编辑测试激励文件,进行相关测试,注意测试的完备性。 3、根据DE2板资源,设计下载测试方案,并且完成硬件下载测试。 二、实验方案 本实验要求用FPGA实现角度(0度~360度)的Sin函数的计算,角度的分辨率小于等于0.1度。考虑到实现的简便性,本实验采用查表法实现Sin函数的计算。首先我们用Matlab计算出Sin函数值,然后生成.mif文件。用Matlab生成的.mif文件在Quartus中配置FPGA的Rom。跟具输入的角度值得到其Sin函数值存储的Rom地址,然后根据地址取出Rom中存储的Sin函数值,最后显示在数码管上,从而实现Sin函数的计算。 三、实验过程及代码 Matlab中.mif文件的生成 由于输入的角度值为0度~360度,所以计算出的Sin函数值至少有3600个,但由于Sin函数值的对称性,所以实际上存储在FPGA的Rom中的值只需要900个。因此在Matlab中我们设置depth=1024,在这里我们对Sin函数值做了扩大10000倍后四舍五入取整的处理,以便于在Rom中存储,所以在这里我们设置width=14。Matlab中的程序如下: clear all; close all; clc; t=[0:0.1:90]; %角度 x=pi*t/180; %弧度数 sin_val=sin(x); %sin函数值 fid=fopen(sine.mif,wt); %以wt格式打开文件sine.mif fprintf(fid,width=14;\r\n); %设置width=14 fprintf(fid,depth=1024;\n); %设置depth=1024 fprintf(fid,address_radix=uns;\n); fprintf(fid,data_radix=dec;\n); fprintf(fid,content begin\n); for j=1:901 i=j-1; fprintf(fid,%d:% d;\n,i,round(sin_val(j)*10000)); end fprintf(fid,end;\n); fclose(fid); 然后利用宏功能模块编制LPM_ROM存放上面的数据,取名sin_rom.v,用上面编写的sine.mif初始化这个模块,自动生成的Verilog代码。 2、顶层模块 顶层模块采用Verilog HDL语言编写,保存为sinx.v。输入信号包括一个时钟信号clk,一个复位信号rst_n,一个9位的输入角度的整数部分a,一个4位的输入角度的小数部分b,输出信号包括6个7位的数码管显示信号。由于在Rom中只存储了900个Sin函数值,所以需要对输入的角度进行转换,然后根据转换后的地址对Rom寻址,得在其函数值,在顶层模块中对得到的函数值进行为的的分离,得到函数值的每一位,用于数码管的显示。代码如下: module sinx(clk,rst_n,a,b,hex0,hex1,hex2,hex3,hex4,hex5); input clk,rst_n; input [8:0] a; input [3:0] b; output [6:0] hex0,hex1,hex2,hex3,hex4,hex5; reg [3:0] data1,data2,data3,data4,data5; wire [3:0] data0; wire [13:0] q; wire [9:0] addr; reg [13:0] qr; jiaodu U( .clk(clk), .a(a), .b(b), .addr(addr), .fh(data0) ); sin_rom sin_rom_inst ( .address ( addr ), .clock ( clk ), .q ( q ) ); reg [2:0] num; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin num =3d0; qr =14d0; end else begin qr = q; num = num+1b1; case(num) 3d1 : data1 =qr%4d10; 3d2 : data2 =(qr/4d10)%4d10;

文档评论(0)

liangyuehong + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档