FPGA查找表法sin函数的实现

上传人:野鹰 文档编号:14289750 上传时间:2017-10-29 格式:DOC 页数:6 大小:31KB
返回 下载 相关 举报
FPGA查找表法sin函数的实现_第1页
第1页 / 共6页
FPGA查找表法sin函数的实现_第2页
第2页 / 共6页
FPGA查找表法sin函数的实现_第3页
第3页 / 共6页
FPGA查找表法sin函数的实现_第4页
第4页 / 共6页
FPGA查找表法sin函数的实现_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《FPGA查找表法sin函数的实现》由会员分享,可在线阅读,更多相关《FPGA查找表法sin函数的实现(6页珍藏版)》请在金锄头文库上搜索。

1、 实验一 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

2、。跟具输入的角度值得到其 Sin函数值存储的 Rom 地址,然后根据地址取出 Rom 中存储的 Sin 函数值,最后显示在数码管上,从而实现 Sin 函数的计算。三、实验过程及代码1. Matlab 中 .mif 文件的生成由于输入的角度值为 0 度360 度,所以计算出的 Sin 函数值至少有 3600个,但由于 Sin 函数值的对称性,所以实际上存储在 FPGA 的 Rom 中的值只需要 900 个。因此在 Matlab 中我们设置 depth=1024,在这里我们对 Sin 函数值做了扩大 10000 倍后四舍五入取整的处理,以便于在 Rom 中存储,所以在这里我们设置 width=14

3、。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.miffprintf(fid,width=14;rn); %设置 width=14fprintf(fid,depth=1024;n); %设置 depth=1024fprintf(fid,address_radix=uns;n);fprintf(fid,data_radix=dec;n);fprintf(fid,content

4、 beginn);for j=1:901i=j-1;fprintf(fid,%d:% d;n,i,round(sin_val(j)*10000);endfprintf(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,输出信

5、号包括 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,data

6、4,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)beginif (!rst_n)beginnum =3d0;qr =14d0;endelsebeginqr = q;num = num+1b1

7、;case(num)3d1 : data1 =qr%4d10;3d2 : data2 =(qr/4d10)%4d10;3d3 : data3 =(qr/8d100)%4d10;3d4 : data4 =(qr/10d1000)%4d10;3d5 : data5 =(qr/10d10000);default : ;endcaseif(num =3d6) num =3d0;endendled led0(rst_n,data0,hex0);led led1(rst_n,data1,hex1);led led2(rst_n,data2,hex2);led led3(rst_n,data3,hex3);

8、led led4(rst_n,data4,hex4);led led5(rst_n,data5,hex5);endmodule3、输入角度的转换由于在 Rom 中只存储了 900 个 Sin 函数值,所以需要对输入的角度根据其所在的象限得到其 Sin 函数值的 Rom 地址,同时给出 Sin 函数值的符号。在这里输入的角度值分为整数和小数部分,整数部分从 0360 共 360 个值,所以在这里输入的整数部分 a 定义 9 位,用 9 个开关输入。小数部分从 09 共 10 个值,在这里输入的小数部分 b 定义 4 位,用 4 个开关输入。程序中 addr 是 Sin 函数值 2 的储存地址,f

9、h 代表的函数值的符号。module jiaodu(clk,a,b,addr,fh);input clk;input 8:0 a;input 3:0 b;output 9:0 addr;output 3:0 fh;reg 3:0 fh;reg 9:0 addr;reg 12:0 c;always (posedge clk )begin c = a*4d10+b; if (2700 c =3600) beginaddr = 3600-c; fh =4ha;endelse if(1800 c =2700) beginaddr = c-1800;fh =4ha;endelse if (900 c =

10、1800)begin addr =1800-c;fh =4hb;endelsebeginaddr =c;fh =4hb;endendendmodule4、数码管显示根据输入的 data_in 的值别对 sm_db 赋值用于数码管的显示。module led( rst_n,data_in,sm_db);input rst_n;input3:0 data_in;output6:0 sm_db;reg6:0 sm_db;always (data_in or rst_n) beginif(!rst_n)sm_db = 7b1000000; else begincase (data_in)4h0: sm

11、_db = 7b1000000;4h1: sm_db = 7b1111001;4h2: sm_db = 7b0100100;4h3: sm_db = 7b0110000;4h4: sm_db = 7b0011001;4h5: sm_db = 7b0010010;4h6: sm_db = 7b0000010;4h7: sm_db = 7b1111000;4h8: sm_db = 7b0000000;4h9: sm_db = 7b0011000;4ha: sm_db = 7b0111111;4hb: sm_db = 7b1111111;default: ;endcaseendendendmodule四、实验体会通过此次实验,我系统的了解了 FPGA 系统设计的全过程。学会了用verilog 语言描述电路,学会了利用宏功能模块编制 LPM_ROM 存放数据,并用编写的.mif 文件初始化这个模块。在这过程中我遇到了一些问题,但通过努力解决了。这让我明白了我们要有随时面对突发问题的心理准备。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 电子/通信 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号