




已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
高精度正余弦函數(shù)的FPGA實現(xiàn)陳海波(巢湖學(xué)院 物理與電子科學(xué)系,安徽 巢湖 238000)摘 要:近年來,由于電力電子的發(fā)展,電力電子方面大功率可控整流、變頻調(diào)速設(shè)備的廣范應(yīng)用使得電力系統(tǒng)的穩(wěn)定運行存在嚴重的隱患,使得諧波的檢測和補償抑制受到關(guān)注,其中任意次諧波的準確檢測在于如何準確的設(shè)立正余弦函數(shù)的頻率。因此如何利用最少的ROM資源在最短的時延之內(nèi)產(chǎn)生高精度的正余弦函數(shù)成為了需要解決的首要問題。隨著研究的深入,不斷的產(chǎn)生了多種算法如:cordic算法、查找表法、插值法。查找表法是根據(jù)精度要求產(chǎn)生函數(shù)值存儲器,構(gòu)成正弦表;cordic(坐標旋轉(zhuǎn)數(shù)字計算機算法)算法是由J.Volder于1959年提出的應(yīng)用計算三角函數(shù)等方法通過迭代滿足精度的串行實現(xiàn)方法;線性插值法是選擇合適的基點值,在基點上進行線性插值。本文就上面三種方法進行比較,用硬件描述語言Verilog HDL描述三種算法的正余弦函數(shù)實現(xiàn),其次利用VCS仿真軟件,得到其仿真后輸出的時序波形結(jié)果并對其作出說明,得出線性插值法實現(xiàn)正余弦函數(shù)的優(yōu)點,最后把仿真成功的程序下載到現(xiàn)場可編程門陣列(FPGA)中進行實現(xiàn)。關(guān)鍵詞:函數(shù);FPGA;算法;時延;面積Implementation of High Accuracy Sine and Cosine Function 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, velometer and transducer be used in widely, so many severity hidden questions in electric system, Make harmonic examination and repair repress to be subjected to concern, Among them arbitrarily the time harmonic 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 inside produced the positive cosine function of high 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 interpolation algorithm, lookup-table algorithm. lookup-table method requests to produce a function value saving machine according to the accuracy, constitute sine value table; The cordic algorithm is the application calculation that is put forward in 1959 by J.Volder triangle function etc. method to carry out a method through the Die generation string line that satisfies accuracy; The linear interpolation algorithm is choose the suitable referrence point and carry on line to interpolation values over the reference point. This text above three kinds of methodses carry on a comparison, describes three kinds of algorithm of sine and cosine function how to realization by Verilog HDL language, secondly make use of VCS simulation software get the output waveform file by function and timing simulation and then make elucidation, get the advantage of realizing sine and cosine functions by linear interpolation algorithm, finally download the code and realization it in the field programmable logical array(FPGA) and carry on it.Keywords: functional; FPGA; algorithm; timing delay; area1 引言當(dāng)21世紀這個信息化高速發(fā)展的時代的大門開啟之后,隨著科技的發(fā)展,我們仔細審視這個飛速前進的世界,你會發(fā)現(xiàn)電子通訊、光子通訊越來越快的發(fā)展,顯然隨著大規(guī)模集成電路的迅速發(fā)展,F(xiàn)PGA已成為電子工程設(shè)計的主要器件,但在采用FPGA器件構(gòu)建數(shù)字信號處理系統(tǒng)時卻存在著一些困難,原因在于:一方面,基于FPGA的DSP設(shè)計工具還不夠完善,不能根據(jù)實際需求靈活構(gòu)建相應(yīng)的結(jié)構(gòu);另一方面大多數(shù)設(shè)計者缺乏硬件實現(xiàn)高精度運算的實際設(shè)計經(jīng)驗,因此一些運算密集型的應(yīng)用不易完成FPGA設(shè)計。正余弦函數(shù)作為基本三角函數(shù)廣泛應(yīng)用于數(shù)值分析、概率統(tǒng)計、圖像處理、通信等各個領(lǐng)域。其計算過程復(fù)雜,運算速度明顯低于其他的運算,特別是硬件不容易實現(xiàn),為此人們一直在尋找一種易于硬件實現(xiàn)的算法來提高三角函數(shù)的運算速度和精度,目前比較流行的幾種算法有:線性插值法、cordic算法、查找表法等。然而一種算法的硬件實現(xiàn)目前主要依賴于復(fù)雜可編程邏輯器件和現(xiàn)場可編程門陣列(CPLD/FPGA, Complex Programmable Logic Device/Field Programmable Gate Array),其中運算速度和占用芯片的面積是衡量一種算法優(yōu)劣的主要技術(shù)指標,當(dāng)然在FPGA的應(yīng)用中占用資源量大和時延大的問題在實際中也是普遍存在的,本文就這一問題進行研究,尋找一種滿足硬件面積和計算時延、運算精度要求的三角函數(shù)實現(xiàn)方法。綜合比較cordic算法、查找表法和線性插值法,cordic算法由于運算過于復(fù)雜使得時延太大影響運算速度;查找表法由于所需的ROM空間過大占用了過多的芯片面積;線性插值法中和了以上兩者的不足在減少ROM的同時提升了運算速度,同時利用三角函數(shù)的對稱性將三角函數(shù)的波形從四分之一周期擴展到一個完整的周期。這種三角函數(shù)的實現(xiàn)方法為實際應(yīng)用解決了很大的難題,實現(xiàn)了高速高精度的正余弦函數(shù)。2 算法描述和原理分析2.1 查找表法基本概念及原理查表法的工作原理是:先把一個周期內(nèi)的正余弦函數(shù)根據(jù)精度的要求分為若干個間隔的點,求出相應(yīng)點的函數(shù)值,規(guī)格化后用二進制寫入高速只讀存儲器中,構(gòu)成一個正余弦函數(shù)表,產(chǎn)生頻率為f時,數(shù)字頻率控制字在相位累加器中的累加,因為累加器的位數(shù)有限,當(dāng)累計到最大的數(shù)時累加器清零,從而實現(xiàn)了線性變化的離散相位,離散的相位作為地址從ROM中讀出相應(yīng)的周期性離散相位幅度碼,從而產(chǎn)生相應(yīng)的頻率幅度碼。查表法的FPGA實現(xiàn)方法是將0,2)范圍內(nèi)以步長選取個,對應(yīng)正弦值量化為n位二進制數(shù)存于表中,得到的正弦表(即為存儲深度,n為存儲的寬度)。給定輸入相位所對應(yīng)的地址就可以查表得到對應(yīng)的正弦值。易知,在滿足下式: (2-1)的條件下,相位分辨率,由此可見其性能取決于n。當(dāng)構(gòu)造一個深度為,寬度為n的表時需要(bits)的資源。如果我們要使相位分辨率提高一倍,那么存儲資源需要增加(bits);要使正余弦值精度提高一倍,存儲資源需要增加(bits)。7總之,查找表法求函數(shù)值是一種最有效、最簡單、直接的方法,適用于任何函數(shù)的計算。這種方法的優(yōu)點是可以實時的輸出,但是會消耗大量的存儲單元,尤其是當(dāng)對相位和頻率分辨率以及輸出地精度要求很高的時候。雖然具體實現(xiàn)的時候可以只存儲一個象限的正余弦函數(shù)值來減少存儲量,但是總的來說,存儲資源的消耗仍經(jīng)常超出FPGA的承受能力。所以,在實質(zhì)上這種方法只適用于較小精度的函數(shù)值求解,很多雙精度數(shù)無法用這種方法實現(xiàn)。2.2 cordic算法的基本概念及原理圖1 迭代原理圖針對以上查找表法的不足我們介紹一種基于迭代的逐次逼近求解的方法-cordic算法,cordic算法包含圓周系統(tǒng),線性系統(tǒng),雙曲系統(tǒng)三種旋轉(zhuǎn)系統(tǒng)。在這里我們選擇圓周系統(tǒng),完成平面坐標旋轉(zhuǎn)進行說明。單次迭代原理如下圖1。13cordic算法是由J.Volder于1959年提出的基于坐標旋轉(zhuǎn)通過迭代滿足精度的計算三角函數(shù)方法,作為一種高效的硬件算法,在理論上已經(jīng)被證明可以用于實現(xiàn)三角函數(shù)運算。圖中、 分別為初始向量的橫坐標、縱坐標和幅角,、分別為未知向量的橫坐標、縱坐標和幅角,兩向量為單位向量,則 (2-2)可知 得: (2-3)同理 (2-4)假設(shè),那么 (2-5) (2-6)經(jīng)過N步的迭代之后有 (2-7) (2-8)其中為第次迭代的角度差。在實現(xiàn)運算的過程中為了省掉除法器以便于FPGA實現(xiàn)和的計算,我們需要依次取tan為1、.,表1中列出了的和的值。表1 不同n的對應(yīng)值tan(度)cos1/145.0000000.7071071/226.5650510.8944271/414.0362430.9701431/87.1250160.9922781/163.5763340.9980531/321.7899110.9995121/640.8951740.9998781/1280.4476140.999969通過上表我們可以得到的近似值為0.607253,所以我們可以把它看做常數(shù)項,易知這種算法適用的角度范圍為:然而,在FPGA實現(xiàn)的過程中一般用于,無法覆蓋整個正余弦函數(shù)周期,對于大角度,我們需要判斷其屬于哪個象限,然后根據(jù)其對應(yīng)的銳角值得出最終的結(jié)果,這樣就在實現(xiàn)大角度的函數(shù)值運算的時候就增加了很多的運算,結(jié)果使得所占用的芯片面積大大的增加,同時運算的速度也大大的下降。在cordic算法中,為了減小誤差我們必須增加迭代的次數(shù),并根據(jù)實際的精度要求適當(dāng)?shù)倪x取和初始值的精度。所以,這樣增加迭代的次數(shù)就增加了面積和運算的時延。7輸出時延和面積是正余弦函數(shù)產(chǎn)生過程中的一對主要矛盾。實現(xiàn)cordic算法時可以使用一個算法單元,將輸出反饋到輸入進行反復(fù)的迭代計算。這種結(jié)構(gòu)節(jié)省了硬件資源,可以實現(xiàn)算法精度可調(diào),但是速度很慢。要提高精度就必須增加迭代的級數(shù)。隨著迭代的級數(shù)增加,速度又會降下來,而且還會增加面積,很難解決速度、面積、精度之間的關(guān)系。82.3 線性插值法基本概念及原理線性插值法的工作原理是:先將一個周期內(nèi)的正余弦函數(shù)根據(jù)精度要求盡可能多的分為若干個間隔點,求出相應(yīng)點的函數(shù)值,將各點函數(shù)值規(guī)格化后用二進制表示,利用數(shù)學(xué)建模的方法,根據(jù)正余弦函數(shù)值的斜率變化及精度的要求,將一個周期內(nèi)的二進制函數(shù)值進行分段,并求出每段的基點值。圖2 插值基點與分段在滿足分辨率和精度的基礎(chǔ)上,為了能夠更好的減少ROM使用,必須減少插值數(shù)所占的存儲器數(shù)量,所以在已經(jīng)分段的基礎(chǔ)上再將斜率相似的連續(xù)基點分為一段,在斜率相似的每段中利用相同的插值,這樣就在不減少差值基點的基礎(chǔ)上,大大的減少了為插值提供的ROM數(shù)量。在本文中我們使用的方法是將正余弦函數(shù)的第一象限波形利用線性插值法實現(xiàn),從而實現(xiàn)的高精度正余弦函數(shù)計算器。如左圖2所示,若將的正弦波分成6段,(a、b、c、d、e、f)對于這六段的插值基點分別是圖示1、2、3、4、5、6,從圖示分析看我們可以對斜率相似的a段、b段,c段、d段,e段、f段,進行相同的插值。如果每段有n個插值點,這樣我們的插值寄存器數(shù)量就從原來的6n個減少了一半,只需要3n個。相比之下由于兩次運算使時延有所增加,但是總的時延還是很小。所以,相比之下應(yīng)用這種線性插值的方法去實現(xiàn)正余弦函數(shù),可以在一定程度上降低時延和ROM數(shù)量之間的沖突,滿足實時性要求。113 正余弦函數(shù)計算器的Verilog實現(xiàn)及對比3.1 計算器原理說明本文實現(xiàn)的設(shè)計是完成090度之間正弦值的計算。輸入有效位數(shù)為3位,精度為0.1度;輸出的有效位數(shù)為4位,精度達0.001。整個電路要求具有輸入清零(輸入錯誤時可以清除)、輸出使能功能(相當(dāng)于按鍵的等于號鍵)。在這里我們分別利用線性插值法和查找表法實現(xiàn)函數(shù)值的輸出。實際使用時,將用戶的輸入的角度值轉(zhuǎn)換成相應(yīng)的ROM地址,同時利用顯示電路實現(xiàn)輸入弧度值在數(shù)碼管上的同步顯示。在角度值輸入完畢后,按下計算使能鍵,將會根據(jù)ROM的地址進行查找表或插值并最終利用顯示電路將數(shù)據(jù)送往數(shù)碼管顯示。電路設(shè)計整體框圖如3(a)所示,設(shè)計實現(xiàn)的RTL級電路圖如圖3(b)所示。圖3(a) 電路整體流程框圖圖3(b) RTL級電路圖3.1.1 設(shè)計原理及設(shè)計的工作流程分析如上圖所示,電路分為:按鍵輸入數(shù)據(jù)獲取電路、輸入的去抖動電路、輸入解碼電路、輸入弧度值存儲電路、sine函數(shù)值存儲電路、顯示電路、顯示數(shù)碼管(外部試驗箱提供電路)。在這些電路中:1. 按鍵輸入數(shù)據(jù)獲取電路:用實驗系統(tǒng)中的十個按鍵開關(guān)分別代表09十個數(shù)字和清除鍵(clear)、計算使能鍵(sin_en,相當(dāng)于=),在這些數(shù)字按鍵上連續(xù)按3次,表示輸入一個帶有一位小數(shù)的角度。例如連續(xù)輸入3、6、7則表示為36.7度。2. 輸入的去抖動電路:一般的機械開關(guān),在接通或斷開過程中,由于受觸點金屬片彈性的影響,通常會產(chǎn)生一連串脈沖式的振動。如果將它安裝在電路中,則會相應(yīng)引起電脈沖,若不采取措施,將造成電路的誤操作。在這里提供一個去抖動電路,此電路是利用移位寄存器組成的一個濾波電路,我們利用十二個1bit寬度的電路,將每個按鍵的輸入單獨的進行濾波,電路的Verilog實現(xiàn)代碼如下所示這部分電路將會濾除周期在3/4秒(F4/3Hz)以下的脈沖,Verilog編譯之后的電路原理圖如圖4所示。/*輸入去抖動電路verilog代碼*/module filter(din,clean_out,clk,rst); input 11:0 din; input clk; input rst; output 11:0 clean_out;/調(diào)用12個1bit濾波模塊,實現(xiàn)12bit輸入的濾波 delay3_1 u00(.in(din0),.clk(clk),.rst(rst),.out(clean_out0); delay3_1 u01(.in(din1),.clk(clk),.rst(rst),.out(clean_out1); delay3_1 u02(.in(din2),.clk(clk),.rst(rst),.out(clean_out2); delay3_1 u03(.in(din3),.clk(clk),.rst(rst),.out(clean_out3); delay3_1 u04(.in(din4),.clk(clk),.rst(rst),.out(clean_out4); delay3_1 u05(.in(din5),.clk(clk),.rst(rst),.out(clean_out5); delay3_1 u06(.in(din6),.clk(clk),.rst(rst),.out(clean_out6); delay3_1 u07(.in(din7),.clk(clk),.rst(rst),.out(clean_out7); delay3_1 u08(.in(din8),.clk(clk),.rst(rst),.out(clean_out8); delay3_1 u09(.in(din9),.clk(clk),.rst(rst),.out(clean_out9); delay3_1 u0a(.in(din10),.clk(clk),.rst(rst),.out(clean_out10); delay3_1 u0b(.in(din11),.clk(clk),.rst(rst),.out(clean_out11);endmodule / filter/1bit寬度的濾波電路module delay3_1(in,out,clk,rst); input in; input clk; input rst; output out; reg out; reg 2:0 shift; always (posedge clk or posedge rst) if(rst) shift = 3bxxx; else shift = shift1:0,in; always (posedge clk or posedge rst) if(rst) out = 1b0; else if(shift2:0 = 3b111 & out = 1b0) out = 1b1; else if(shift2:0 = 3b000 & out = 1b1) out = 1b0;endmodule / delay3_1在功能驗證中我們得到如圖5所示的仿真波形。就如波形所示,當(dāng)某個按鍵輸入din為高電平時,濾波電路會按照時鐘clk對其進行抓取,當(dāng)信號長達3個clk長度時就將會被輸出到clean_out中,如果din信號的長度不能滿足要求(如圖中的最后一個值)就將被濾除,clean_out維持原值,這樣就達到了濾除抖動的作用。圖4 輸入去抖動電路圖5 輸入去抖動電路仿真波形3.輸入解碼電路:按鍵通過去抖動電路后,其中的弧度值輸入的10bit總線將被接至解碼電路輸入端,解碼電路的功能是根據(jù)輸入的10bit總線的高低電平進行解碼,輸出4位十進制數(shù)。作為寄存器尋址的三位十進制地址中的一位。使用Verilog實現(xiàn)代碼如下,經(jīng)過編譯后的電路如圖6所示。/*輸入編碼電路verilog代碼 */module encoder(flt_in,code_out); input 9:0 flt_in; output 3:0 code_out; reg 3:0 code_out; always (flt_in) case(flt_in) 10b00_0000_0001 : code_out = 0; 10b00_0000_0010 : code_out = 1; 10b00_0000_0100 : code_out = 2; 10b00_0000_1000 : code_out = 3; 10b00_0001_0000 : code_out = 4; 10b00_0010_0000 : code_out = 5; 10b00_0100_0000 : code_out = 6; 10b00_1000_0000 : code_out = 7; 10b01_0000_0000 : code_out = 8; 10b10_0000_0000 : code_out = 9; default : code_out = 4b0000; endcase / case (pi_clean)endmodule圖6 編碼電路對以上的電路進行功能仿真,得到如圖7所示的波形圖,按鍵輸入經(jīng)過濾波后的flt_in作為解碼電路的輸入,當(dāng)按鍵輸入為n時,在解碼之前應(yīng)是,經(jīng)過解碼電路之后為n,我們可以看到按鍵的輸入為1、3、4,在flt_in中顯示為十六進制2、8、10,進過解碼之后的code_out為1、3、4。圖7 編碼電路仿真波形4.輸入弧度值存儲電路:這一部分的電路主要是對前端已經(jīng)編碼的按鍵輸入弧度值進行存儲,同時將輸入的數(shù)據(jù)送到后端的顯示電路中,已達到在數(shù)碼管上的同步顯示,這樣滿足了輸入錯誤的實時清除更正,下面是實現(xiàn)電路的Verilog代碼,編譯之后的電路如圖8所示。/*輸入弧度值存儲電路verilog代碼 */module addr_ram(code_dat,clk,rst,dis_out,clean_dat,clear,sin_en); input clk; input rst; input clear,sin_en; input 3:0 code_dat; input 9:0 clean_dat; output 9:0 dis_out; reg 9:0 dis_out; reg 1:0 cnt; always (clean_dat) if(rst | sin_en | clear) cnt = 2b00; else if(|clean_dat) cnt = cnt + 1b1; always (rst or clear or cnt) if(rst | clear) dis_out = 0; else if(cnt = 1) dis_out = code_dat; else if(cnt = 2) dis_out = dis_out * 10 + code_dat; else if(cnt = 3) dis_out = dis_out *10 + code_dat; endmodule / addr_ram圖8 輸入弧度值存儲電路如上圖,電路按照輸入次序的先后判定輸入的數(shù)據(jù)在寄存器中的位置,為函數(shù)值寄存器的尋址提供所需的地址。編碼電路輸出接至寄存器的輸入端,通過按鍵(代表圖9 弧度值存儲電路仿真波形數(shù)字0-9的10個按鍵)形成的正脈沖進行計數(shù),依次將數(shù)據(jù)存放在寄存器dis_out的不同位置中。即按動第一個按鍵時,將對其編碼形成的十進制數(shù)送到寄存器dis_out內(nèi),第二個按鍵輸入時將dis_out內(nèi)的數(shù)據(jù)擴大十倍與之相加后送至寄存器,第三個按鍵輸入時將dis_out內(nèi)的數(shù)據(jù)再擴大十倍與之相加后送至寄存器。同時在顯示電路中同步顯示每次的輸入數(shù)據(jù)。其仿真波形如圖9所示。5.sine函數(shù)值存儲電路:這部分電路主要是起到寄存函數(shù)值的功能,是一個初始化的RAM電路,在之前對這部分電路的設(shè)計方法我們已經(jīng)進行了深刻的分析、討論,在這里我們主要用兩種方法(查找表法、線性插值法)來實現(xiàn),并通過實驗結(jié)果來比較兩者之間的面積和時序之間的差別。在這個設(shè)計的實現(xiàn)中,重要的時延控制和芯片的面積控制,都由這部分電路的實現(xiàn)方法來決定。工作原理:(1) 對于查找表法而言,Verilog實現(xiàn)的代碼如下所示,當(dāng)三位角度值輸入完畢后,前面與弧度值相對應(yīng)的十進制數(shù)已存放在寄存器中,并在數(shù)碼管中顯示,這里利用輸入弧度值存儲電路的寄存器值作為ROM的地址,從ROM中將與之匹配的函數(shù)值讀取出來,當(dāng)計算使能信號(sin_en鍵)為高電平脈沖時,將已經(jīng)讀取出來的函數(shù)值放置到顯示電路中,并在數(shù)碼管中顯示。代碼編譯電路如圖10所示。/*查找表函數(shù)值存儲電路verilog代碼 */module ROM_SIN(addr,sin_out); output 9:0 sin_out; input 9:0 addr; reg 9:0 rom 899:0; initial $readmemb(./sim_env/SIN_table.dat,rom); assign sin_out = romaddr;endmodule / ROM_SIN圖10 查找表sin函數(shù)值存儲電路仿真結(jié)果如圖11,當(dāng)每次按鍵的0-9有高電平脈沖輸入時,這部分電路都會按照圖11 查找表sin函數(shù)值寄存電路仿真波形當(dāng)前的地址值addr查找到對應(yīng)的函數(shù)值sin_out,雖然這些值也都會被送到后面的顯示電路中去,但是由于沒有計算使能信號的輸入,它們并不會在顯示電路中顯示。(2) 對于線性插值法而言,同樣是利用輸入弧度值存儲電路的寄存器值作為RAM的地址,但是在這里不是直接的讀取所需的函數(shù)值,而是利用地址的高位首先讀取地址所在的插值分段的插值參考點。然后,在參考點的基礎(chǔ)上利用地址的低位對其進行插值。實現(xiàn)電路的Verilog代碼見附錄一,代碼編譯電路如圖12,這里利用十位二進制數(shù)表示函數(shù)值,精度已經(jīng)足夠,這樣我們將函數(shù)值分32段(即取32個基點),每段有三十二個插值點,由于精度滿足,將每相鄰的四段使用相同的插值,這樣就可以更多的節(jié)省寄存器的數(shù)量。圖12 插值法sin函數(shù)值存儲插值電路仿真波形見圖16(b),電路在每次地址變化的時候利用地址的高五位addr9:5將基點ref_out的值讀出,同時利用地址低位addr4:0確定函數(shù)的插值fine_out,當(dāng)兩個值都讀出的時候,電路將這兩個值進行相加得到地址對應(yīng)的函數(shù)值sin_out,供后端的顯示電路使用。6.顯示電路:在電路工作的整個過程中,這部分電路將按鍵的輸入弧度值和計算結(jié)果顯示在數(shù)碼管上,主要是驅(qū)動數(shù)碼管,進行對外應(yīng)答。在我們進行弧度值的輸入時,這部分電路將前端的dis_out中的數(shù)據(jù)顯示在數(shù)碼管中,當(dāng)sin_en(函數(shù)計算使能信號)為高電平時這里將我們計算得得函數(shù)值顯示出來,以便讀取。實現(xiàn)電路的Verilog代碼如下,代碼編譯電路如圖13所示。/*查找表函數(shù)值存儲電路verilog代碼 */module display(sin_en,sin_out,pi_out,clk,rst,clear,display); input 9:0 sin_out; input 9:0 pi_out; input sin_en; input clk,rst; input clear; output display; reg 9:0 display; always (posedge clk or posedge rst) if(rst | clear) display = 0; else if(sin_en) display = sin_out; else display = pi_out;endmodule / display圖13 數(shù)據(jù)顯示電路對顯示電路進行功能仿真,所得波形如下圖14,當(dāng)每次按動按鍵,pi_out就會得到相應(yīng)的變化并顯示到后端的數(shù)碼管上,當(dāng)計算時能信號sin_en為高電平,電路就將sin_out賦給display,達到函數(shù)值在后端的顯示。當(dāng)清除信號clear為高電平時,后端的顯示將被清零。圖14 顯示電路仿真波形7.顯示數(shù)碼管:這部分是實驗箱提供的電路,和按鍵輸入類似,是一個信息的交換部分。參考下圖15。(外部試驗箱提供電路模塊)圖15 顯示數(shù)碼管3.1.2 C程序?qū)崿F(xiàn)正余弦函數(shù)查找表在利用查找表實現(xiàn)正弦函數(shù)計算器的同時,我們需要首先利用編程語言實現(xiàn)計算器內(nèi)部的函數(shù)值查找表。在這里我們需要二進制歸一化之后的精度為四位有效數(shù)據(jù)的函數(shù)值查找表此設(shè)計中使用的查找表文件sin_table.dat的部分截圖見附錄二。以下是利用C語言產(chǎn)生查找表文件(sin_table.dat)的程序段:1/*/#include #include #include /*定義在程序段中所使用的庫函數(shù)*/*/#define pi 3.1415926 /*預(yù)定義在程序段中所使用的值為3.1415926*/void main()/*/ int t, y, a, i, b, x;char ch10;double s;/*定義變量名*/*/*/FILE *fp;fp = fopen (sin_table.dat,w); /*定義輸出文件指針,并只寫打開文件*/*/*/*for循環(huán)計算0-90度sine函數(shù)值*/for(t = 0;t = 5)a = (int)(y/10) + 1;elsea = (int)(y/10);/*對函數(shù)值進行四舍五入*/*/x = a;/*/for(i = 0;i =0;i-)printf(%d,chi);fprintf(fp,%d,chi);printf(n);fprintf(fp,n);/*將sine函數(shù)值輸出到文件指針所指向的文件*/*/fclose(fp); /*關(guān)閉指針所指向的已打開文件*/3.2 查找表法和線性插值法的仿真驗證圖16(a) 查找表法仿真波形圖16(b) 線性插值法仿真波形在這里我們利用synopsys公司的Verilog仿真工具VCS(這里使用2009-B-12版),在仿真時我們設(shè)置時間單位/精度(timescale=1s/1ms)。測試激勵程序見附錄三。查找表法和線性插值法實現(xiàn)的仿真波形分別如圖16(a)、(b)所示。3.2.1 查找表法和線性插值法的時延比較在這里我們對兩種正弦函數(shù)的實現(xiàn)方法進行比較,通過仿真波形我們可以看出,查找表法和線性插值法的時延區(qū)別,我們之前理論預(yù)算的時延在這里我們將其計算在按鍵的輸入時段內(nèi),這樣就合理的避免了輸出延時的問題,從而不影響函數(shù)值在數(shù)碼管中的輸出。3.2.2 查找表法和線性插值法的ROM數(shù)量比較通過實現(xiàn)的代碼和電路,我們可以初步的計算出兩者寄存器數(shù)量得差異,這兩種實現(xiàn)方法的寄存器數(shù)量的差別就在函數(shù)值的寄存器部分。如表2所示:表2 兩種實現(xiàn)方法的寄存器數(shù)量比較實現(xiàn)方法線性插值法(bit)查找表法(bit)寄存器數(shù)32*10+6*32*6+2*32*2900*10這樣我們可以看出兩者寄存器的數(shù)量差距,這種差距為我們的線性插值法帶來了巨大的面積節(jié)約。雖然從仿真的結(jié)果看,線性插值法的精度與查找表法最大相差了0.01,在這里已經(jīng)足夠使用了,但是如果我們將查找表的參考值增加為11bit那么我們的精度差距將會縮小到0.005。然而,這樣我們的寄存器數(shù)量也僅僅增加了32*3。4 正余弦函數(shù)在FPGA中的實現(xiàn)4.1 現(xiàn)場可編程門陣列FPGA隨著微電子技術(shù)的發(fā)展,設(shè)計與制造集成電路的任務(wù)已經(jīng)不完全是由半導(dǎo)體廠商來獨立承擔(dān)。系統(tǒng)設(shè)計師門更愿意自己設(shè)計專用集成電路(ASIC)芯片,最好是將設(shè)計周期縮短到在實驗室里就可以設(shè)計出合適的ASIC芯片,并且立即的投入實際應(yīng)用,因而出現(xiàn)了現(xiàn)場可編程邏輯器件(FPLD),其中應(yīng)用最廣泛的當(dāng)屬現(xiàn)場可編程門陣列(FPGA)和復(fù)雜可編程邏輯器件(CPLD)?,F(xiàn)場可編程門陣列(FPGA)器件是當(dāng)今運用極為廣泛的可編程邏輯器件,也被稱為可編程ASIC,兼有串行、并行工作方式和高集成度、高速、高可靠性等特點,時鐘延時可達到納秒級,在基于芯片的設(shè)計中可以減少門數(shù)量,縮小系統(tǒng)體積,降低能源消耗,提高系統(tǒng)的性能指標和可靠性。FPGA器件在結(jié)構(gòu)上具有邏輯功能塊排列,可編程的內(nèi)部連線連接這些功能模塊來實現(xiàn)一定的邏輯功能。FPGA器件的功能由邏輯結(jié)構(gòu)的配置數(shù)據(jù)決定。工作時,這些配置數(shù)據(jù)存放在片內(nèi)的SRAM。使用SRAM的FPGA器件,在工作前需要從芯片外部加載配置數(shù)據(jù),配置數(shù)據(jù)可以存儲在片外的EPROM或其他存儲體上,設(shè)計者可以控制加載過程,在現(xiàn)場修改器件的邏輯功能,即所謂現(xiàn)場編程。用戶不僅可以方便地設(shè)計出所需的硬件邏輯,而且可以進行靜態(tài)重復(fù)編程和動態(tài)系統(tǒng)重配置,使系統(tǒng)的硬件功能可以像軟件一樣利用編程修改,從而可以實時地進行靈活而方便的更新和開發(fā),大大提高了系統(tǒng)設(shè)計的靈活性和通用性。概括的說,F(xiàn)PGA有很強的靈活性,可以根據(jù)需要進行重構(gòu)配置,有較強的通用性,適于模塊化設(shè)計,同時其開發(fā)周期短,系統(tǒng)易于維護和擴展,適合實時的信號處理,能夠大大地提高數(shù)據(jù)的處理速度,達到系統(tǒng)的實時性要求。因此,采用FPGA的硬件實現(xiàn)是一個不錯的選擇。684.2 正弦函數(shù)計算器的FPGA實現(xiàn)我們將涉及代碼下載到實驗箱的FPGA中實現(xiàn),在Max+plus II軟件中將正弦函數(shù)計算器的各個模塊連接好,然后保存設(shè)成當(dāng)前工程,經(jīng)過編譯提示無誤后即可下載到可編程器件實驗系統(tǒng)中,這里我采用的是湖北眾友公司提供的EDA技術(shù)試驗箱,它的核心芯片是ALTERA公司生產(chǎn)的型號為EP1K30QC208-2的FPGA器件。驗證時利用實驗板上的按鍵作為計算器的輸入,數(shù)碼管作為顯示端。驗證結(jié)果證明該正弦函數(shù)計算器工作正常,可以實現(xiàn)清零、計算、顯示的功能。5 結(jié)束語本文通過對線性插值法、cordic、及查表法實現(xiàn)正余弦函數(shù)的探討,提出了在數(shù)字視頻信號傳輸及編解碼中普遍使用的一種實現(xiàn)正余弦函數(shù)的方法線性插值法實現(xiàn)正余弦函數(shù)計算器。并且利用理論推導(dǎo)對cordic算法、線性插值法和查表法的進行對比。最后,采用Verilog HDL編程語言對線性插值法和查找表法進行實現(xiàn)、仿真對比并在FPGA上實現(xiàn)線性插值法。而對實驗的結(jié)果分析,證明了線性插值法與cordic算法及查找表法相比,在大大降低運算時延和芯片所占用的ROM數(shù)的同時還滿足了正弦函數(shù)的精度要求。特別是在芯片中ROM的數(shù)量和運算的實時性方面,線性插值法在很好的降低ROM數(shù)量的同時降低了運算時延。而且,利用FPGA對正弦函數(shù)實現(xiàn),也證明了該方法的可行性與可操作性,使得在高速的數(shù)字視頻信號的傳輸中,正弦函數(shù)調(diào)制信號的實時性更高。由于受工作量以及時間的限制,本文并沒有對cordic算法進行verilog HDL的實現(xiàn),同時也只是對正函數(shù)的計算進行了實現(xiàn)并進行驗證,還有大量的算法沒有加入到文章中來討論,進行整體的對比。對于利用Verilog實現(xiàn)的正弦函數(shù)計算器也只是在FPGA上進行了實現(xiàn),還停留在理論階段,沒有具體的應(yīng)用到實踐中去。利用FPGA的仿真程序還不是很完善,在程序的流暢性以及模塊的設(shè)計方面還有可提升的空間。參考文獻:1 譚浩強.C語言程序設(shè)計(第三版)M.北京:清華大學(xué)出版社,2007.2 夏宇聞.夏宇聞verilog經(jīng)典教程M.北京:北京航空航天大學(xué)出版社,2000.3 譚浩強.C語言程序設(shè)計上機指導(dǎo)M.北京:清華大學(xué)出版社,2007.4 劉愛榮等編著.EDA技術(shù)與CPLD/FPGA開發(fā)應(yīng)用簡明教程M.北京:清華大學(xué)出版社,2007.5 劉暢,李智.基于FPGA的任意波形發(fā)生器的設(shè)計J.桂林電子科技大學(xué),2008.6 吳繼華,王誠.ALTERA FPGA/CPLD設(shè)計(高級篇)M.北京:人民郵電出版社,2005.69-71.7 孫宇峰,陳國軍,王大鳴等.一種高精度正余弦函數(shù)的實現(xiàn)方法J.信息工程大學(xué)學(xué)報,2008,9:1-3.8 孔德元.針對正余弦計算的CORDIC算法優(yōu)化及其FPGA實現(xiàn)J.中南大學(xué)碩士學(xué)位論文,2008.9 田杭沛.高性能HPOR CORDIC算法及實現(xiàn)D.西北工業(yè)大學(xué)博士學(xué)位論文,2004.10 佟志偉.Cordic算法及其FPGA實現(xiàn)的研究D.北京大學(xué)碩士學(xué)位論文,2008.11 黃聚永,袁慧梅,吳向陽等.基于查找表和Newton插值算法的正余弦函數(shù)的FPGA實現(xiàn)D.首都師范大學(xué)碩士學(xué)位論文,2007.12 盛利元,孔德元,簡遠明等.正弦和余弦函數(shù)的一種混合式CORDIC算法實現(xiàn)J.鄭州大學(xué)學(xué)報(工學(xué)版),2008,29(2):1-2.13 周小青,李合生,陶榮輝等.基于CORDIC 算法的雙曲正余弦運算的FPGA實現(xiàn)J.信息與電子工程,2010,8(2):2-4.14 姜萍,蔣立平,譚學(xué)琴.正弦函數(shù)計算器的設(shè)計與實現(xiàn)J.現(xiàn)代電子技術(shù),2007,30(18):
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人租房押付三合同
- 廣告設(shè)計制作合同協(xié)議書
- 客車駕駛員聘用協(xié)議書
- 分期付款設(shè)備買賣合同
- 物資倉庫裝修施工方案
- 下部結(jié)構(gòu)施工方案
- 宿遷住宅防水施工方案
- 安徽省部分學(xué)校2024-2025學(xué)年高三下學(xué)期3月調(diào)研考試歷史試題(原卷版+解析版)
- 暖氣片施工方案
- 泡沫箱和紙箱加工生產(chǎn)線環(huán)評報告表
- 名人介紹l梁啟超
- 幼兒繪本故事:波西和皮普大怪獸
- 譯林版五年級英語下冊 Unit 5 第2課時 教學(xué)課件PPT小學(xué)公開課
- 全套電子課件:混凝土結(jié)構(gòu)設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)英文教學(xué)課件:chapter2 Array
- 新版PEP小學(xué)英語3-6年級單詞表(共14頁)
- 2022年城市軌道交通行車值班員三級考試題庫(附答案)
- 入門級新概念英語青少版A unit8
- 應(yīng)用隨機過程PPT課件
- 鋁合金門窗檢測資料
- 腫瘤學(xué)總論ppt課件
評論
0/150
提交評論