高精度正余弦函数的FPGA实现(打印)

上传人:小** 文档编号:68690742 上传时间:2022-04-03 格式:DOC 页数:28 大小:1.05MB
返回 下载 相关 举报
高精度正余弦函数的FPGA实现(打印)_第1页
第1页 / 共28页
高精度正余弦函数的FPGA实现(打印)_第2页
第2页 / 共28页
高精度正余弦函数的FPGA实现(打印)_第3页
第3页 / 共28页
点击查看更多>>
资源描述
高精度正余弦函数的FPGA实现陈海波(巢湖学院 物理与电子科学系,妥緻 巢湖238000)摘 要:近年来,由于电力电子的发展,电力电子方而大功率可控整流、变频调速设备的广范 应用使得电力系统的稳定运行存在严重的隐患,使得谐波的检测和补偿抑制受到关注,其中任意次 谐波的准确检测在于如何准确的设立正余弦函数的频率。因此如何利用最少的ROM许源在最短的时 延之内产生高精度的正余弦函数成为了需要解决的首要问題。随着研究的深入,不断的产生了多种 算法如:cordic算法、查找表法、插值法。查找表法是根据精度要求产生函数值存储器,构成正 弦表:cordic (坐标旋转數字计算机算法)算法是由J. Voider于1959年提出的应用计算三角函數 等方法通过迭代满足精度的串行实现方法:线性插值法是选择合适的基点值,在基点上进行线性插 值。本文就上面三种方法逬行比较,用礦件描述语言Veri logHDL描述三种算法的正余弦函数实现, 其次利用VCS仿真软件,得到其仿真后输出的时序波形结果并对其作出说明,得出线性插值法实現 正余弦函数的优点,最后把仿真成功的程序下栽到现场可编程门阵列(FPGA)中进行实现。关键词:函数;FPGA:算法;时延:面积Implementation of High Accuracy Sine and CosineFunction Based on FPGAChen Haibo(Department of Physics and Electronic Science, Chaohu College, Chaohu Anhui 238000)Abstract: In resent years, Because the development of Power Electronic, the electric power electronics big power can control to commutate, veloireter and transducer be used in widely, so many seventy hidden questions in electric system, Make hannonic examination and repair repress to be subjected to concern. Among them arbifaanty the time hannonic accurate examination lie in how to accurately establish the frequency of positive cosine function Consequently how make use of the minimal ROM resources at the shortest of postpone uiside produced tlie positive cosine function of higli accuracy to become the initial problem that needs to be solved Along with research of thorough, continuously produced various calculate ways for example: cordic algorithm, linera inteipolation algonthm, lookup-table algonthm lookup -table method requests to produce a function value saving machine accordmg to the accuracy, conshtute sine value table, The cordic algorithm is the applicahon calculation that is put Forward in 1959 by J Voider Un angle function etc method to cany out a method through the Die generation string line tliat satisfies accuracy, The linear interpolation algonthm is choose the suitable refeirence point and cany on line to interpolation values ovei* the reference point This text above three kinds of methodses cany on a companson, describes three kinds of algonthm of sine and cosine function how to realization by Venlog HDL language, secondly make use of VCS simulation software get tlie output wavefonn file by function and timing simulation and then make elucidation, get the advantage of realizing sine and cosine fimctions by linear interpolation algorithm, finally download the code and realization it in the field programmable logical array(FPGA) and cairy on itKeywords: functional, FPGA, algonthm, timing delay, area当21世纪这个信息化高速发展的时代的大门开启之后,随看科技的发展,我们仔 细市视这个飞速前进的世界,你会发现电子通讯、光子通讯越來越快的发展,显然随 着大规模集成电路的迅速发展,FPGA己成为电子工程设计的主要器件,但在采用FPGA 器件构建数字信号处理系统时却存在着一些困难,原因在于:一方面,基于FPGA的DSP 设计工具还不够完善,不能根据实际需求灵活构建相应的结构;另一方面大多数设计 者缺乏硬件实现高精度运算的实际设计经验,因此一些运算密集型的应用不易完成 FPGA设计。正余弦函数作为基本三角函数广泛应用于数值分析、概率统计、图像处理、通信 等各个领域。其计算过程复杂,运算速度明显低于其他的运算,特别是硬件不容易实 现,为此人们一直在寻找一种易于硬件实现的算法来提高三角函数的运算速度和精度, 目前比较流行的几种算法有:线性插值法、cordic法、查找表法等。然而一种算法的硬件实现目前主要依赖于复杂可编程逻辑器件和现场可编程门阵 列(CPLD/FPGA, Complex Programmable Logic Device/Field Programmable Gate Array),其中运算速度和占用芯片的面积是衡量一种算法优劣的主要技术指标,当然 在FPGA的应用中占用资源最大和时延大的问题在实际中也是普遍存在的,本文就这一 问题进行研究,寻找一种满足硬件面积和计算时延、运算精度要求的三角函数实现方 法。综合比较cordic算法、查找表法和线性插值法,cordic算法由于运算过于复杂使 得时延太大影响运算速度:査找表法由于所需的ROM空间过大占用了过多的芯片面积; 线性插值法中和了以上两者的不足在减少ROM的同时提升了运算速度,同时利用三角函 数的对称性将三角函数的波形从四分之一周期扩展到一个完整的周期。这种三角函数 的实现方法为实际应用解决了很大的难题,实现了髙速高精度的正余弦函数。2算法描述和原理分析2.1査找表法基本概念及原理查表法的匸作原理是:先把一个周期内的正余弦函数根据精度的要求分为若干个 间隔的点,求出相应点的函数值,规格化后用二进制写入高速只读存储器中,构成一 个正余弦函数表,产生频率为f时,数字频率控制字在相位累加器中的累加,因为累加 器的位数有限,当累计到最大的数时累加器清零,从而实现了线性变化的离散相位, 离散的相位作为地址从ROM中读出相应的周期性离散相位幅度码,从而产生相应的频率 幅度码。查表法的FPGA实现方法是将0, 2 n )范围内以步长271/2选取2个,对应正弦值量 化为n位二进制数存于表中,得到2xn的正弦表(2口即为存储深度,n为存储的宽度)。给2定输入相位所对应的地址就可以査表得到对应的正弦值。易知,在满足下式:n max0og2Jog-l-cos(2/2n)-(2-1)的条件下,相位分辨率 0=2龙/2”,由此可见其性能取决于n。当构造一个深度为”,宽度为n的表时需要2nxn (bits)的资源。如果我们要使相 位分辨率提高一倍,那么存储资源需要增加(2n+1xn)-(2nxn) = (2axn)(bits);要使正 余弦值精度提高一倍,存储资源需要增加2nx(ii-l)-2nxn = 2n (bits)。总之,查找表法求函数值是一种最有效、最简单、直接的方法,适用于任何函数 的计算。这种方法的优点是可以实时的输出,但是会消耗大量的存储单元,尤其是当 对相位和频率分辨率以及输出地精度要求很高的时候。虽然具体实现的时候可以只存 储一个象限的正余弦函数值來减少存储童,但是总的來说,存储资源的消耗仍经常超出FPGA的承受能力。所以,在实质上这种方法只适用于较小精度的函数值求解,很多 双精度数无法用这种方法实现。2.2 cordic算法的基本概念及原理针对以上查找表法的不足我们介绍一种基丁迭代的逐次逼近求解的方法一 cordic 算法,cordic算法包含圆周系统,线性系统,双曲系统三种旋转系统。在这里我们选 择圆周系统,完成平而坐标旋转进行说明。单次迭代原理如下图1。阳图1迭代原理图cordic算法是由J. Voider于1959年提出的基于坐标 旋转通过迭代满足精度的计算三角函数方法,作为一种 高效的硬件算法,在理论上已经被证明可以用于实现三 角函数运算。图中X】、丫、Q分别为初始向崑的横坐标、 纵坐标和幅角,Y?、如分别为未知向最的横坐标、 纵坐标和幅角,两向量为单位向最,()=%-电,贝ICOS0= JL=2=J=1sin Q cos 血 sin 如(2-2)可知_ Axcos(g + 0) _ x (cosx cos sin x sin (fi) Xp _cos acosg得:同理X2 = X xcosQ-Y xsinQYI = X1xsin(|)+y x cos(|)(2-3)(2-4)3#假设0V9O,那么#4(2-5)(2-6) cos (p x (X - yj x tan 0)Y2 = cos0x(X xtan0+ 乙)经过N步的迭代Z后有xn41 = flcos(Q+i - Q) xXx-Yxx tan(1+1 一 九)(2-7)11丫屈=fpos(九* - Q)xXi xhm(|)舟-札)+ YJ(2-8)X=1其中如-a为第z次迭代的角度差。在实现运算的过程中为了省掉除法器以便于FPGA实现和丰収治-的计算,我们 需要依次取tan为1、1/2 . . l/2n,表1中列出了 nv8的和cos的值。表1不同n的对应值tan G1/145 0000C00 7071071/226 5650510.8944271/414 0362430 9701431/87 1250160 9922781/163.5763340 9980531/321.7899110 9995121/640 8951740 9998781/1280 4476140 999969通过上表我们可以得到血cos(U5的近似值为0. 607253,所以我们可以把它看做常数项,易知这种算法适用的角度范围为:f (如-仇)(如 - 0J卜-99.8-9.81=1 11然而,在FPGA实现的过程中一般用于幘(090),无法覆盖整个正余弦函数周期, 对于大角度,我们需要判断其属于哪个象限,然后根据其对应的锐角値得出故终的结 果,这样就在实现大角度的函数值运算的时候就增加了很多的运算,结果使得所占用 的芯片面积大大的增加,同时运算的速度也大大的下降。在cordic算法中,为了减小 误差我们必须增加迭代的次数,并根据实际的精度要求适当的选取e和初始值的精度。 所以,这样增加迭代的次数就增加了面积和运算的时延。输出时延和面积是正余弦函数产生过程中的一对主要矛盾。实现cordic算法时可以使用一个算法单元,将输出反馈到输入进行反复的迭代il算。这种结构节省了硬件 资源,可以实现算法精度可调,但是速度很慢。要提高持度就必须增加迭代的级数。 随看迭代的级数增加,速度乂会降下來,而且还会增加面积,很难解决速度、面积、 精度之间的关系。2.3线性插值法基本概念及原理线性插值法的工作原理是:先将一个周期内的正余弦函数根据精度要求尽可能多 的分为若干个间隔点,求出相应点的函数值,将各点函数值规格化后用二进制表示, 利用数学建模的方法,根据正余弦函数值的斜率变化及精度的要求,将一个周期内的 二进制函数值进行分段,并求出每段的基点值。在满足分辨率和精度的基础上,为了能够更好的减少ROM使用,必须减少插值数所 占的存储器数量,所以在己经分段的基础上再将斜率相似的连续基点分为一段,在斜 率相似的每段中利用相同的插值,这样就在不减少差值基点的基础上,大大的减少了为插值提供的ROM数最。在本文中我们使用的方法是将正余弦函数的第一象限波形利用 线性插值法实现,从而实现Om/2的高精度正余弦函数计算器。如左图2所示,若将0山/2的正弦波分成6 段,(a、b、c、d、e、f)对于这木段的插值基 点分别是图示1、2、3、4、5、6,从图示分析 看我们可以对斜率相似的鍛、b段,c段、d段, e段、f段,进行相同的插值。如果每段有n个插 值点,这样我们的插值寄存器数量就从原来的 6n个减少了一半,只需要3n个。相比之下由于 两次运算使时延有所增加,但是总的时延还是 很小。所以,相比之下应用这种线性插值的方法去实现正余弦函数,可以在一定程度上降低时延和ROM数最之间的冲突,满足实时性要求。tn3正余弦函数计算器的Verilog实现及对比3.1计算器原理说明本文实现的设计是完成090度之间正弦值的计算。输入有效位数为3位,精度 为0.1度;输出的有效位数为4位,精度达0. 001 o整个电路要求具有输入清零(输入 错误时可以清除)、输出使能功能(相当于按键的等于号键)。在这里我们分别利用 线性插值法和查找表法实现函数值的输出.实际使用时,将用户的输入的角度值转换 成相应的ROM地址,同时利用显示电路实现输入弧度值在数码管上的同步显示。在角 度值输入完毕后,按下il算使能键,将会根据ROM的地址进行査找表或插值并最终利 用显示电路将数据送往数码管显示。电路设计整体框图如3(a)所示,设计实现的RTL 级电路图如图3(b)所示。图3(a)电路整体流程框图屮冃,g :n:图3 (b) RTL级电路图3.1.1设计原理及设计的工作流程分析如上图所示,电路分为:按键输入数据获取电路、输入的去抖动电路、输入解码 电路、输入弧度值存储电路、sine函数值存储电路、显示电路、显示数码管(外部试 验箱提供电路)。在这些电路中:1. 按键输入数据获取电路:用实验系统中的十个按键开关分别代表09十个数字 和清除键(clear).计算使能键(sin_en,相当于二),在这些数字按键上连续按3 次,表示输入一个带有一位小数的角度。例如连续输入3、6、7则表示为36. 7度。2. 输入的去抖动电路:一般的机械开关,在接通或断开过程中,由于受触点金屈 片弹性的影响,通常会产生一连串脉冲式的振动。如果将它安装在电路中,则会相应 引起电脉冲,若不采取措施,将造成电路的误操作。在这里提供一个去抖动电路,此 电路是利用移位寄存器组成的一个滤波电路,我们利用十二个lbit宽度的电路,将每 个按键的输入单独的进行滤波,电路的Verilog实现代码如下所示这部分电路将会滤 除周期在3/4秒(F4/3Hz)以下的脉冲,Verilog编译之后的电路原理图如图4所示。 /*输入去抖动电路venlog代码*/module filtei*(din,clean_out,clki*st)input 110 din,inputelk,inputrst,output 110 clean_out,调用12个lbit滤波模块,实现入的滤波delay3u00(.in(din0).clk(clk),.rst(rst),.out(clean_out0) delay 3_1 uO 1 (in(din 1 ),. clk(clk),.rst(rst),. out(clean_out 1 ), delaysu02(.in(din2),.clk(clk).rst(rst), out(clean_out2), delay 3_1 u03(. in(din3)r clk(clk)r rst(rst). out(clean_out 3); delay3_l u04( in(din4)rclk(clk)rrst(rst),.out(clean_out4), delay3u05(. in(din5),. clk(clk),.rst(rst),. out(clean_out5), delay3_l u06(.in(din6),.clk(clk),.rst(rst),.out(clean_out6), delay3u07( in(din7).clk(clk), rst(rst), out(clean_out7), delay3_1 u08( m(dm8)clk(clk).rst(rst), out(clean_out8), delay 3_1 u09(. m(din9),. clk(clk)rrst(rst),. out(clean_out9);delay3uOa(. in(din 10)clk(clk)rst(rst)out(clean_out 10), delay3_1 uOb(. in(dinl 1 ), clk(clk), rst(rst), out(clean_out 11 ), endmodule / filtei*/lbit宽度的滤波电路module delay3_l(inQut,clk,rst),inputm,inputelk,inputrst,outputout.regout,reg 2 0shift,alv/ays (posedge elk or posedge rst)if(rst)shift = 3bxxx,elseshift = (shiftlalways (posedge elk or posedge rst)if(rst)out = 1bO,else if(shifl2 0 = 31)111 & out = 1bO)out = lbl,else if(shift2 0 = 3-bOOO & out=lbl)out piora!ion gna View Wav&onn Andlo Tools WmcovU C r. X 壯 ft mm32Q & 二=; J- 二 iy 创18伽冋图5输入去抖动电路仿真波形3输入解码电路:按键通过去抖动电路后,其中的弧度值输入的lObit总线将被 接至解码电路输入端,解码电路的功能是根据输入的lObit总线的髙低电平进行解码, 输出4位十进制数。作为寄存器寻址的三位十进制地址中的一位。使用Verilog实现 代码如下,经过编译后的电路如图6所示。 /*输入编码电路venlog代码*/ module encoder(flt_mcode_out)input 9 0output 3:0 codeout,reg 3.0 code_out,alv/ays (flt_in)case(flt_in)10bOO 0000 0001 : code out = 0,2b00_0000_0010 : code_out = 1,101)00_0000_0100 : code_out = 2, 10bOO 0000 1000 : code out = 3t10bOO 0001 0000 : code out = 4, MM10bOO 0010 0000 : code out = 5,10b00_0100_0000 : code_out = 6,1 ObOO000_0000 : code_out = 7, 10*b01 0000 0000 : code out = 8,MM10b 10 0000 0000 : code out = 9.default code_out = 4bOOOO,89endcase / case (pi_clean) endmodule#对以上的电路进行功能仿真,得到如图7所示的波形图,按键输入经过滤波后的 flt.in作为解码电路的输入,当按键输入为n时,在解码之前应是2,经过解码电路 之后为n,我们可以看到按键的输入为1、3、4,在flt_in中显示为十六进制2、8、 10,进过解码之后的code_out为1、3、4。图7编码电路仿真波形4. 输入弧度值存储电路:这一部分的电路主要是对前端已经编码的按键输入弧度 值进行存储,同时将输入的数据送到后端的显示电路中,己达到在数码管上的同步显示,这样满足了输入错误的实时清除更正,下面是实现电路的Verilog代码,编译之 后的电路如图8所示。/*输入弧度值存储电路verilog代码/module addr_ram(code_datclk,rst,dis_outclean_dalcleai;sin_en)inputelk,inputrst,inputclear,sinen,input 3 0code_dat,input 9 0clean_dat,output 9 0dis_out,reg 9 0dis_out,reg 10ent,alv/ays (clean_dat)if(rst | sin_en | clear) ent = 2bOO.else if(clean_dat)ent = ent + ltil, always (rst or clear or ent)if(rst | clear)dis_out = 0,else if(cnt = 1)dis_out = code_dat”else if(cnt = 2)dis out = dis out 10 + code datelse if(cnt = 3)dis out addr11#图10查找表sin函数值存储电路仿真结果如图11,当每次按键的0-9有高电半脉冲输入时,这部分电路都会按照#图行 査找表sin函数值寄存电路仿真波形当前的地址值addr査找到对应的函数值sin_out,虽然这些值也都会被送到后面的显 示电路中去,但是由于没有计算使能信号的输入,它们并不会在显示电路中显示。(2)对丁线性插值法而言,同样是利用输入弧度值存储电路的寄存器值作为RAM 的地址,但是在这里不是直接的读取所需的函数值,而是利用地址的高位首先读取地 址所在的插值分段的插值参考点。然后,在参考点的基础上利用地址的低位对其进行 插值。实现电路的Verilog代码见附录一,代码编译电路如图12,这里利用十位二进 制数表示函数值,精度已经足够,这样我们将函数值分32段(即取32个基点),每段 有三十二个插值点,由于精度满足,将每相邻的四段使用相同的插值,这样就可以更 多的节省寄存器的数量。图12插值法sin函数值存储插值电路仿真波形见图16 (b),电路在每次地址变化的时候利用地址的髙五位addr9:5 将基点ref_out的值读出,同时利用地址低位addr 4:0确定函数的插値fine_out, 当两个值都读出的时候,电路将这两个值进行相加得到地址对应的函数值sin_out,供 后端的显示电路使用。6. 显示电路:在电路工作的整个过程中,这部分电路将按键的输入弧度值和计算 结果显示在数码管上,主要是驱动数码管,进行对外应答。在我们进行弧度值的输入时,这部分电路将前端的dis_out中的数据显示在数码管中,当sin_en (函数计算使 能信号)为髙电平时这里将我们计算得得函数值显示出來,以便读収。实现电路的 Verilog代码如下,代码编译电路如图13所示。/*査找表两数值存储电路venlog代码/module display(sm_en,sin_outpi_outclrst,clear,display);input 9 0 sinout,input 9 0 pinout,inputsin_eninputclk,rst,inputclear,outputdisplay,reg 9 0 display,always (posedge elk or posedge rst)if(rst | clear)display = 0,else if(sin_en)display = sin_outt elsedisplay = pinout, endmodule / displaypi_outPL呷】sin out 9:0吕0 nk t el sorclearctoar图13数据显示电路对显示电路进行功能仿真,所得波形如下图14,当每次按动按键,pi_out就会得 到相应的变化并显示到后端的数码管上,当计算时能信号sin_en为高电平,电路就将 sin.out赋给display,达到函数值在后端的显示。当清除信号clear为高电平时,后 端的显示将被清零。图14显示电路仿真波形7. 显示数码管:这部分是实验箱提供的电路,和按键输入类似,是一个信息的交换部分。参考下图15。(外部试验箱提供电路模块)89. Si8j8 8Ifilflp LLmhS MM邑丄数码管显示模块图15显示数码管3. 1.2 C程序实现正余弦函数査找表在利用査找表实现正弦函数il算器的同时,我们碍要首先利用编程语言实现il算 器内部的函数值査找表。在这里我们需要二进制归一化之后的精度为四位有效数据的 函数值査找表此设计中使用的查找表文件sin_table.dat的部分截图见附录二。以下 是利用C语言产生查找表文件(sin_table.dat)的程序段: /水*車*水*/#include #include #include vstnng h/*定义在程序段中所使用的库函数*/*/#define pi 3 1415926/*预定义在程序段中所使用的n值为3.1415926/void mainO/*/mtt,y, ati.b,x;char ch10tdouble s,/*定义变量名*/*/FILE *fp;fp = fopen Csin_table.datVw)严定义输出文件指it,并只写打开文件*/*水*/戶for循环计算090度sine函数值/foit = Qt =5)a = (int)(y/10)+ 1;elsea = (int)(y/10)t/*对函数值进行四舍五入勺 /水*/x = a,/水*車*水*/for(i = 0,1 =0,i-)pnntf(d,chi).fpnntfCfp/d11 ,chi).printfCnB)fpnntfCfp/11),/*将sine函数值输出到文件指针所指向的文件*/球欢瘴車丈4c*4c*p*4c*4c*拿*專球欢欢*水戒車龙4c*4c*Mc4c4e*車*攻*4c*4c*4c水应4c*4c*Mc專拓/ fclose(fp),/*关闭指针所指向的己打开文件*/3.2査找表法和线性插值法的仿真验证-ax0執555)uir480 x mtg“ 1 /home/cheprjprjO/worklng/waveform/tt.fsdbViewnaloj Tools Wndozz:图16 (a)查找農法仿真波形图16 (b)线性插值法仿真波形在这里我们利用synopsys公司的Verilog仿真工具VCS(这里使用2009-BT2版), 在仿真时我们设置时间单位/精度(timeseal护ls/lms)。测试激励程序见附录三。査 找表法和线性插值法实现的仿真波形分别如图16 (a)、(b)所示。3. 2.1査找表法和线性插值法的时延比较在这里我们对两种正弦函数的实现方法进行比较,通过仿真波形我们可以看出, 査找表法和线性插值法的时延区别,我们之前理论预算的时延在这里我们将其计算在 按键的输入时段内,这样就合理的避免了输出延时的问题,从而不影响函数值在数码 管中的输出。3. 2. 2査找表法和线性插值法的ROM数量比较通过实现的代码和电路,我们可以初步的计算出两者寄存器数最得差异,这两种 实现方法的寄存器数量的差別就在函数值的寄存器部分。如表2所示:哀2两种实现方法的寄存器数比较实现方法线性插值法(bit)査找表法(bit)寄存器数32*10+6*32*6+2*32*2900*10这样我们可以看出两者寄存器的数量差距,这种差距为我们的线性插值法带來了 巨大的面积节约。虽然从仿真的结果看,线性插值法的精度与査找表法最大相差了 0. 01,在这里己经足够使用了,但是如果我们将査找表的参考值增加为libit那么我 们的精度差距将会缩小到0.005。然而,这样我们的寄存器数星也仅仅增加了 32*3。4正余弦函数在FPGA中的实现4.1现场可编程门阵列一一FPGA随着微屯了技术的发展,设计与制造集成电路的任务己经不完全是由半导体厂商 來独立承担。系统设计师门更愿意1;1己设计专用集成电路(ASIC)芯片,最好是将设 计周期缩短到在实验室里就可以设计出合适的ASIC芯片,并且立即的投入实际应用, 因而出现了现场可编程逻辑器件(FPLD),其中应用最广泛的当屈现场可编程门阵列 (FPGA)和复杂可编程逻辑器件(CPLD)o现场可编程门阵列(FPGA)器件是当今运用极为广泛的可编程逻辑器件,也被称为 可编程ASIC,兼有串行、并行工作方式和高集成度、高速、高可靠性等特点,时钟延 时可达到纳秒级,在基于芯片的设计中可以减少门数量,缩小系统体积,降低能源消 耗,提高系统的性能指标和可靠性。FPGA器件在结构上具有逻辑功能块排列,可编程的内部连线连接这些功能模块來 实现一定的逻辑功能。FPGA器件的功能由逻辑结构的配置数据决定。工作时,这些配 置数据存放在片内的SRAM。使用SRAM的FPGA器件,在工作前需要从芯片外部加载配 置数据,配置数据可以存储在片外的EPROM或其他存储体上,设订者可以控制加載过 程,在现场修改器件的逻辑功能,即所谓现场编程。用户不仅可以方便地设计出所需 的硬件逻辑,而且可以进行静态重复编程和动态系统重配置,使系统的硬件功能可以 像软件一样利用编程修改,从而可以实时地进行灵活而方便的更新和开发,大大提高 了系统设计的灵活性和通用性。概括的说,FPGA有很强的灵活性,可以根据需要进行重构配置,有较强的通用性, 适于模块化设计,同时其开发周期短,系统易丁维护和扩展,适合实时的信号处理, 能够大大地提高数据的处理速度,达到系统的实时性要求。因此,采用FPGA的硬件实 现是一个不错的选择。4.2正弦函数计算器的FPGA实现我们将涉及代码下载到实验箱的FPGA中实现,在Max+plus II软件中将正弦函数计算器的各个模块连接好,然后保存设成当前匸程,经过编译提示无误后即可下载到 可编程器件实验系统中,这里我采用的是湖北众友公司提供的EDA技术试验箱,它的 核心芯片是ALTERA公司生产的型号为EP1K3OQC2O8-2的FPGA器件。验证时利用实验 板上的按键作为计算器的输入,数码管作为显示端。验证结果证明该正弦函数计算器 工作正常,可以实现清零、计算、显示的功能。5结束语本文通过对线性插值法、cordic及查表法实现正余弦函数的探讨,提出了在数 字视频信号传输及编解码中普遍使用的一种实现正余弦函数的方法一一线性插值法实 现正余弦函数计算器。并且利用理论推导对cordic n法、线性插值法和查表法的进行 对比。最后,采用Verilog HDL编程语言对线性插值法和查找表法进行实现、仿真对比 并在FPGA上实现线性插值法。而对实验的结果分析,证明了线性插值法与cordic算 法及查找表法相比,在大大降低运算时延和芯片所占用的ROM数的同时还满足了正弦 函数的精度要求。特别是在芯片中ROM的数星和运算的实时性方面,线性插值法在很 好的降低ROM数量的同时降低了运算时延。而且,利用FPGA对正弦函数实现,也证明 了该方法的可行性与可操作性,使得在高速的数字视频信号的传输中,正弦函数调制 信号的实时性更高。由受工作星以及时间的限制,本文并没有对cordic算法进彳亍verilog HDL的实 现,同时也只是对正函数的计算进行了实现并进行验证,还有大最的算法没有加入到 文章中來讨论,进行整体的对比对于利用Vsrilog实现的正弦函数计算器也只是在 FPGA上进行了实现,还停留在理论阶段,没有具体的应用到实践中去。利用FPGA的仿 真程序还不是很完善,在程序的流畅性以及模块的设il方面还有可提升的空间。参考文献:1 谭浩强.C语言程序设计(第三版)M.北京:清华大学出版社,2007.2 夏宇闻.夏宇闻verilog经典教程H.北京:北京航空航天大学出版社,2000.3 谭浩强.C语言程序设计上机指导M.北京:清华大学出版社,2007.4 刘爱荣等编著.EDA技术与CPLD/1PGA开发应用简明教程山.北京:清华大学出版 社,2007.5 刘畅,李智.基于FPGA的任意波形发生器的设计J.桂林电子科技大学,200&6 吴继华,王诚.ALTERA FPGA/CPLD设计(高级篇)M.北京:人民邮电出版社,2005. 69-71.7 孙宇峰陈国军,王大鸣等一种高精度正余弦函数的实现方法J信息工程大学学 报,2008,9: 1-3.8 孔復元.针对正余弦计算的CORD1C算法忧化及其EPGA实现J.中南大学硕士学位论 文,2008.9 田杭沛.高性能HPOR CORDIC算法及实现D.西北工业大学博士学位论文,2004.10 佟志伟.Cordie算法及其FPGA实现的研究D.北京大学硕士学位论文,2008.:11黃聚永,袁慧梅,吴向阳等.基于查找表Newton插值算法的正余弦函数的卜PGA实现D. 首都师范大学硕士学位论文,2007.12 盛利元,孔復元,筒远明等.正弦和余弦函数的一种混合式C0RD1C算法实现J.郑州大 学学报(工学版),2008,29 (2): 1-2.13 周小青,李合生,陶荣辉等.基于CORDIC算法的双曲正余弦运算的1:PGA实现J.信息 与电子工程,2010, 8 (2); 2-4.14 姜萍,蒋立平,谭学琴.正弦函数计算器的设计与实现J.现代电子技术,2007,30(18):4-12.王金明,杨吉斌数字系统设计与Verilog IIDLMj.北京:电子工业出版社.2003.18附录一:线性插值函数值存储电路rilog代码19module ROM_SIN (addi; sinout), output 9.0 sin_out, input 9 0 addr, reg 90re匚out,reg 50fineout,reg 50fineoutO,fine_out 1,fineoutZ,fine_out3,reg 40fine_out4,fine_out5,reg 10 fine_out6,fine_out7fassign sin_out = addr ? (refout + fine_out) : 0,alv/ays (addr)case(addr9 5)5h0:re 匚 out = 0,5hlre 匚 out = 56,5h2:refout = 112,5h3:refout = 167,5h4:refout = 222,5h5:re匚out = 276,5h6re 匚 out = 329,5*h7:re 匚 out = 381,5h8:refout =433,5h9ref_out = 482,5bare 匚 out = 530,5hb:ref_out = 577,5 he:re 匚 out = 622,5hd:re匚out = 665,5*he:re 匚 out = 705,5*hfre 匚 out = 744t5hl0ref_out = 780,5hllre匚out =814,5*hl2ref_out = 845,5hl3re 匚out = 873,5hl4ref_out = 899,5hl5re匚out = 922,5hl6re匚out = 943,5hl7re匚out = 960,51118re 匚 out = 974,5hl9ref_out = 985,5hlare匚out = 993,5hlbre匚out = 998,5*hlcre匚out = 1000,default ref out = hx,endcase / case (addr9:5)alv/ays (addr)case(addr9:7)3*bOOO : fme_out = fineoutO, 3*b001 : fine_out = fine_outl, 3*b010 : fine out = fine out2;StOll : fine out = fine out3,MMMMF3*bl00 : fine out = fine out4, 3b 101 : fine_out = fine_out5, 3110 : fine out = fine out6,3 b 111 : fine_out = fine_out7, endcase / case (addr4:3)always (addr)case(addr4 0)5*1100 : fine_outO = 0, 5h01 : fine_outO = 2, 5*h02 : fineoutO = 3, 51103 : fine_outO = 5, 5*h04 : fine_outO = 7, 5h05 : fine_outO = 9, 5*h06 : fine_outO = 10, 51107 : fine_outO = 12, 5*h08 : fine_outO = 14, 5h09 : fine_outO = 15; 5h0a fine_outO = 17, 5*hOb : fineoutO = 19, 5h0c : fine_outO = 21, 50(1: fine_outO = 23; 5*h0e : fine_outO = 24, 5*hOf fine_outO = 26, 5*hl0 : fine_outO = 27, 5hll : fine_outO = 30, 5*hl2 : fineoutO = 31; 5hl3 : fine_outO = 33. 5*hl4 : fine_outO = 34, 5*hl5 : fine_outO = 36, 5 h 16 fine_outO = 38, 51117 : fine_outO = 39, 5 h 18 fine_outO =41, 5*hl9 : fineoutO =43, 5*hla : fine_outO =45, 5hlb : fine_outO v=47, 5hlc : fine outO = 49t5bld fine_outO = 50,5*hle fine_outO = 52,5hlf fine_out0 = 53, endcase / case (addi*2:0)alv/ays (addr) case(addr4 0)5*h00fine._outl = 0f5h01fineoutl = 2,5h02fineoutl = 4,5*h03f
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!