- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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;
您可能关注的文档
最近下载
- 安川(YASKAWA)变频器H1000系列说明书.pdf
- 《防范电信诈骗》PPT课件.pptx VIP
- JJF 1832-2020(1 mT~2.5 T)磁强计校准规范.pdf
- 医院感染的职业防护.pptx VIP
- 人教版小学四年级上册数学试题全集(打印版).pdf VIP
- 寒假作业(试题)2024-2025学年五年级上册数学 人教版(五).docx VIP
- 2025年高考生物模拟试卷02(广东卷)及答案.docx VIP
- 医院感染的患者教育与健康宣教.pptx VIP
- 《展览公司规章管理制度》.docx
- 世界英文绘本-05.Cloudy With a Chance of Meatballs.pdf
文档评论(0)