




已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
高精度正余弦函數(shù)的FPGA實(shí)現(xiàn)陳海波(巢湖學(xué)院 物理與電子科學(xué)系,安徽 巢湖 238000)摘 要:近年來,由于電力電子的發(fā)展,電力電子方面大功率可控整流、變頻調(diào)速設(shè)備的廣范應(yīng)用使得電力系統(tǒng)的穩(wěn)定運(yùn)行存在嚴(yán)重的隱患,使得諧波的檢測(cè)和補(bǔ)償抑制受到關(guān)注,其中任意次諧波的準(zhǔn)確檢測(cè)在于如何準(zhǔn)確的設(shè)立正余弦函數(shù)的頻率。因此如何利用最少的ROM資源在最短的時(shí)延之內(nèi)產(chǎn)生高精度的正余弦函數(shù)成為了需要解決的首要問題。隨著研究的深入,不斷的產(chǎn)生了多種算法如:cordic算法、查找表法、插值法。查找表法是根據(jù)精度要求產(chǎn)生函數(shù)值存儲(chǔ)器,構(gòu)成正弦表;cordic(坐標(biāo)旋轉(zhuǎn)數(shù)字計(jì)算機(jī)算法)算法是由J.Volder于1959年提出的應(yīng)用計(jì)算三角函數(shù)等方法通過迭代滿足精度的串行實(shí)現(xiàn)方法;線性插值法是選擇合適的基點(diǎn)值,在基點(diǎn)上進(jìn)行線性插值。本文就上面三種方法進(jìn)行比較,用硬件描述語言Verilog HDL描述三種算法的正余弦函數(shù)實(shí)現(xiàn),其次利用VCS仿真軟件,得到其仿真后輸出的時(shí)序波形結(jié)果并對(duì)其作出說明,得出線性插值法實(shí)現(xiàn)正余弦函數(shù)的優(yōu)點(diǎn),最后把仿真成功的程序下載到現(xiàn)場(chǎng)可編程門陣列(FPGA)中進(jìn)行實(shí)現(xiàn)。關(guān)鍵詞:函數(shù);FPGA;算法;時(shí)延;面積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世紀(jì)這個(gè)信息化高速發(fā)展的時(shí)代的大門開啟之后,隨著科技的發(fā)展,我們仔細(xì)審視這個(gè)飛速前進(jìn)的世界,你會(huì)發(fā)現(xiàn)電子通訊、光子通訊越來越快的發(fā)展,顯然隨著大規(guī)模集成電路的迅速發(fā)展,F(xiàn)PGA已成為電子工程設(shè)計(jì)的主要器件,但在采用FPGA器件構(gòu)建數(shù)字信號(hào)處理系統(tǒng)時(shí)卻存在著一些困難,原因在于:一方面,基于FPGA的DSP設(shè)計(jì)工具還不夠完善,不能根據(jù)實(shí)際需求靈活構(gòu)建相應(yīng)的結(jié)構(gòu);另一方面大多數(shù)設(shè)計(jì)者缺乏硬件實(shí)現(xiàn)高精度運(yùn)算的實(shí)際設(shè)計(jì)經(jīng)驗(yàn),因此一些運(yùn)算密集型的應(yīng)用不易完成FPGA設(shè)計(jì)。正余弦函數(shù)作為基本三角函數(shù)廣泛應(yīng)用于數(shù)值分析、概率統(tǒng)計(jì)、圖像處理、通信等各個(gè)領(lǐng)域。其計(jì)算過程復(fù)雜,運(yùn)算速度明顯低于其他的運(yùn)算,特別是硬件不容易實(shí)現(xiàn),為此人們一直在尋找一種易于硬件實(shí)現(xiàn)的算法來提高三角函數(shù)的運(yùn)算速度和精度,目前比較流行的幾種算法有:線性插值法、cordic算法、查找表法等。然而一種算法的硬件實(shí)現(xiàn)目前主要依賴于復(fù)雜可編程邏輯器件和現(xiàn)場(chǎng)可編程門陣列(CPLD/FPGA, Complex Programmable Logic Device/Field Programmable Gate Array),其中運(yùn)算速度和占用芯片的面積是衡量一種算法優(yōu)劣的主要技術(shù)指標(biāo),當(dāng)然在FPGA的應(yīng)用中占用資源量大和時(shí)延大的問題在實(shí)際中也是普遍存在的,本文就這一問題進(jìn)行研究,尋找一種滿足硬件面積和計(jì)算時(shí)延、運(yùn)算精度要求的三角函數(shù)實(shí)現(xiàn)方法。綜合比較cordic算法、查找表法和線性插值法,cordic算法由于運(yùn)算過于復(fù)雜使得時(shí)延太大影響運(yùn)算速度;查找表法由于所需的ROM空間過大占用了過多的芯片面積;線性插值法中和了以上兩者的不足在減少ROM的同時(shí)提升了運(yùn)算速度,同時(shí)利用三角函數(shù)的對(duì)稱性將三角函數(shù)的波形從四分之一周期擴(kuò)展到一個(gè)完整的周期。這種三角函數(shù)的實(shí)現(xiàn)方法為實(shí)際應(yīng)用解決了很大的難題,實(shí)現(xiàn)了高速高精度的正余弦函數(shù)。2 算法描述和原理分析2.1 查找表法基本概念及原理查表法的工作原理是:先把一個(gè)周期內(nèi)的正余弦函數(shù)根據(jù)精度的要求分為若干個(gè)間隔的點(diǎn),求出相應(yīng)點(diǎn)的函數(shù)值,規(guī)格化后用二進(jìn)制寫入高速只讀存儲(chǔ)器中,構(gòu)成一個(gè)正余弦函數(shù)表,產(chǎn)生頻率為f時(shí),數(shù)字頻率控制字在相位累加器中的累加,因?yàn)槔奂悠鞯奈粩?shù)有限,當(dāng)累計(jì)到最大的數(shù)時(shí)累加器清零,從而實(shí)現(xiàn)了線性變化的離散相位,離散的相位作為地址從ROM中讀出相應(yīng)的周期性離散相位幅度碼,從而產(chǎn)生相應(yīng)的頻率幅度碼。查表法的FPGA實(shí)現(xiàn)方法是將0,2)范圍內(nèi)以步長(zhǎng)選取個(gè),對(duì)應(yīng)正弦值量化為n位二進(jìn)制數(shù)存于表中,得到的正弦表(即為存儲(chǔ)深度,n為存儲(chǔ)的寬度)。給定輸入相位所對(duì)應(yīng)的地址就可以查表得到對(duì)應(yīng)的正弦值。易知,在滿足下式: (2-1)的條件下,相位分辨率,由此可見其性能取決于n。當(dāng)構(gòu)造一個(gè)深度為,寬度為n的表時(shí)需要(bits)的資源。如果我們要使相位分辨率提高一倍,那么存儲(chǔ)資源需要增加(bits);要使正余弦值精度提高一倍,存儲(chǔ)資源需要增加(bits)。7總之,查找表法求函數(shù)值是一種最有效、最簡(jiǎn)單、直接的方法,適用于任何函數(shù)的計(jì)算。這種方法的優(yōu)點(diǎn)是可以實(shí)時(shí)的輸出,但是會(huì)消耗大量的存儲(chǔ)單元,尤其是當(dāng)對(duì)相位和頻率分辨率以及輸出地精度要求很高的時(shí)候。雖然具體實(shí)現(xiàn)的時(shí)候可以只存儲(chǔ)一個(gè)象限的正余弦函數(shù)值來減少存儲(chǔ)量,但是總的來說,存儲(chǔ)資源的消耗仍經(jīng)常超出FPGA的承受能力。所以,在實(shí)質(zhì)上這種方法只適用于較小精度的函數(shù)值求解,很多雙精度數(shù)無法用這種方法實(shí)現(xiàn)。2.2 cordic算法的基本概念及原理圖1 迭代原理圖針對(duì)以上查找表法的不足我們介紹一種基于迭代的逐次逼近求解的方法-cordic算法,cordic算法包含圓周系統(tǒng),線性系統(tǒng),雙曲系統(tǒng)三種旋轉(zhuǎn)系統(tǒng)。在這里我們選擇圓周系統(tǒng),完成平面坐標(biāo)旋轉(zhuǎn)進(jìn)行說明。單次迭代原理如下圖1。13cordic算法是由J.Volder于1959年提出的基于坐標(biāo)旋轉(zhuǎn)通過迭代滿足精度的計(jì)算三角函數(shù)方法,作為一種高效的硬件算法,在理論上已經(jīng)被證明可以用于實(shí)現(xiàn)三角函數(shù)運(yùn)算。圖中、 分別為初始向量的橫坐標(biāo)、縱坐標(biāo)和幅角,、分別為未知向量的橫坐標(biāo)、縱坐標(biāo)和幅角,兩向量為單位向量,則 (2-2)可知 得: (2-3)同理 (2-4)假設(shè),那么 (2-5) (2-6)經(jīng)過N步的迭代之后有 (2-7) (2-8)其中為第次迭代的角度差。在實(shí)現(xiàn)運(yùn)算的過程中為了省掉除法器以便于FPGA實(shí)現(xiàn)和的計(jì)算,我們需要依次取tan為1、.,表1中列出了的和的值。表1 不同n的對(duì)應(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ù)項(xiàng),易知這種算法適用的角度范圍為:然而,在FPGA實(shí)現(xiàn)的過程中一般用于,無法覆蓋整個(gè)正余弦函數(shù)周期,對(duì)于大角度,我們需要判斷其屬于哪個(gè)象限,然后根據(jù)其對(duì)應(yīng)的銳角值得出最終的結(jié)果,這樣就在實(shí)現(xiàn)大角度的函數(shù)值運(yùn)算的時(shí)候就增加了很多的運(yùn)算,結(jié)果使得所占用的芯片面積大大的增加,同時(shí)運(yùn)算的速度也大大的下降。在cordic算法中,為了減小誤差我們必須增加迭代的次數(shù),并根據(jù)實(shí)際的精度要求適當(dāng)?shù)倪x取和初始值的精度。所以,這樣增加迭代的次數(shù)就增加了面積和運(yùn)算的時(shí)延。7輸出時(shí)延和面積是正余弦函數(shù)產(chǎn)生過程中的一對(duì)主要矛盾。實(shí)現(xiàn)cordic算法時(shí)可以使用一個(gè)算法單元,將輸出反饋到輸入進(jìn)行反復(fù)的迭代計(jì)算。這種結(jié)構(gòu)節(jié)省了硬件資源,可以實(shí)現(xiàn)算法精度可調(diào),但是速度很慢。要提高精度就必須增加迭代的級(jí)數(shù)。隨著迭代的級(jí)數(shù)增加,速度又會(huì)降下來,而且還會(huì)增加面積,很難解決速度、面積、精度之間的關(guān)系。82.3 線性插值法基本概念及原理線性插值法的工作原理是:先將一個(gè)周期內(nèi)的正余弦函數(shù)根據(jù)精度要求盡可能多的分為若干個(gè)間隔點(diǎn),求出相應(yīng)點(diǎn)的函數(shù)值,將各點(diǎn)函數(shù)值規(guī)格化后用二進(jìn)制表示,利用數(shù)學(xué)建模的方法,根據(jù)正余弦函數(shù)值的斜率變化及精度的要求,將一個(gè)周期內(nèi)的二進(jìn)制函數(shù)值進(jìn)行分段,并求出每段的基點(diǎn)值。圖2 插值基點(diǎn)與分段在滿足分辨率和精度的基礎(chǔ)上,為了能夠更好的減少ROM使用,必須減少插值數(shù)所占的存儲(chǔ)器數(shù)量,所以在已經(jīng)分段的基礎(chǔ)上再將斜率相似的連續(xù)基點(diǎn)分為一段,在斜率相似的每段中利用相同的插值,這樣就在不減少差值基點(diǎn)的基礎(chǔ)上,大大的減少了為插值提供的ROM數(shù)量。在本文中我們使用的方法是將正余弦函數(shù)的第一象限波形利用線性插值法實(shí)現(xiàn),從而實(shí)現(xiàn)的高精度正余弦函數(shù)計(jì)算器。如左圖2所示,若將的正弦波分成6段,(a、b、c、d、e、f)對(duì)于這六段的插值基點(diǎn)分別是圖示1、2、3、4、5、6,從圖示分析看我們可以對(duì)斜率相似的a段、b段,c段、d段,e段、f段,進(jìn)行相同的插值。如果每段有n個(gè)插值點(diǎn),這樣我們的插值寄存器數(shù)量就從原來的6n個(gè)減少了一半,只需要3n個(gè)。相比之下由于兩次運(yùn)算使時(shí)延有所增加,但是總的時(shí)延還是很小。所以,相比之下應(yīng)用這種線性插值的方法去實(shí)現(xiàn)正余弦函數(shù),可以在一定程度上降低時(shí)延和ROM數(shù)量之間的沖突,滿足實(shí)時(shí)性要求。113 正余弦函數(shù)計(jì)算器的Verilog實(shí)現(xiàn)及對(duì)比3.1 計(jì)算器原理說明本文實(shí)現(xiàn)的設(shè)計(jì)是完成090度之間正弦值的計(jì)算。輸入有效位數(shù)為3位,精度為0.1度;輸出的有效位數(shù)為4位,精度達(dá)0.001。整個(gè)電路要求具有輸入清零(輸入錯(cuò)誤時(shí)可以清除)、輸出使能功能(相當(dāng)于按鍵的等于號(hào)鍵)。在這里我們分別利用線性插值法和查找表法實(shí)現(xiàn)函數(shù)值的輸出。實(shí)際使用時(shí),將用戶的輸入的角度值轉(zhuǎn)換成相應(yīng)的ROM地址,同時(shí)利用顯示電路實(shí)現(xiàn)輸入弧度值在數(shù)碼管上的同步顯示。在角度值輸入完畢后,按下計(jì)算使能鍵,將會(huì)根據(jù)ROM的地址進(jìn)行查找表或插值并最終利用顯示電路將數(shù)據(jù)送往數(shù)碼管顯示。電路設(shè)計(jì)整體框圖如3(a)所示,設(shè)計(jì)實(shí)現(xiàn)的RTL級(jí)電路圖如圖3(b)所示。圖3(a) 電路整體流程框圖圖3(b) RTL級(jí)電路圖3.1.1 設(shè)計(jì)原理及設(shè)計(jì)的工作流程分析如上圖所示,電路分為:按鍵輸入數(shù)據(jù)獲取電路、輸入的去抖動(dòng)電路、輸入解碼電路、輸入弧度值存儲(chǔ)電路、sine函數(shù)值存儲(chǔ)電路、顯示電路、顯示數(shù)碼管(外部試驗(yàn)箱提供電路)。在這些電路中:1. 按鍵輸入數(shù)據(jù)獲取電路:用實(shí)驗(yàn)系統(tǒng)中的十個(gè)按鍵開關(guān)分別代表09十個(gè)數(shù)字和清除鍵(clear)、計(jì)算使能鍵(sin_en,相當(dāng)于=),在這些數(shù)字按鍵上連續(xù)按3次,表示輸入一個(gè)帶有一位小數(shù)的角度。例如連續(xù)輸入3、6、7則表示為36.7度。2. 輸入的去抖動(dòng)電路:一般的機(jī)械開關(guān),在接通或斷開過程中,由于受觸點(diǎn)金屬片彈性的影響,通常會(huì)產(chǎn)生一連串脈沖式的振動(dòng)。如果將它安裝在電路中,則會(huì)相應(yīng)引起電脈沖,若不采取措施,將造成電路的誤操作。在這里提供一個(gè)去抖動(dòng)電路,此電路是利用移位寄存器組成的一個(gè)濾波電路,我們利用十二個(gè)1bit寬度的電路,將每個(gè)按鍵的輸入單獨(dú)的進(jìn)行濾波,電路的Verilog實(shí)現(xiàn)代碼如下所示這部分電路將會(huì)濾除周期在3/4秒(F4/3Hz)以下的脈沖,Verilog編譯之后的電路原理圖如圖4所示。/*輸入去抖動(dòng)電路verilog代碼*/module filter(din,clean_out,clk,rst); input 11:0 din; input clk; input rst; output 11:0 clean_out;/調(diào)用12個(gè)1bit濾波模塊,實(shí)現(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在功能驗(yàn)證中我們得到如圖5所示的仿真波形。就如波形所示,當(dāng)某個(gè)按鍵輸入din為高電平時(shí),濾波電路會(huì)按照時(shí)鐘clk對(duì)其進(jìn)行抓取,當(dāng)信號(hào)長(zhǎng)達(dá)3個(gè)clk長(zhǎng)度時(shí)就將會(huì)被輸出到clean_out中,如果din信號(hào)的長(zhǎng)度不能滿足要求(如圖中的最后一個(gè)值)就將被濾除,clean_out維持原值,這樣就達(dá)到了濾除抖動(dòng)的作用。圖4 輸入去抖動(dòng)電路圖5 輸入去抖動(dòng)電路仿真波形3.輸入解碼電路:按鍵通過去抖動(dòng)電路后,其中的弧度值輸入的10bit總線將被接至解碼電路輸入端,解碼電路的功能是根據(jù)輸入的10bit總線的高低電平進(jìn)行解碼,輸出4位十進(jìn)制數(shù)。作為寄存器尋址的三位十進(jìn)制地址中的一位。使用Verilog實(shí)現(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 編碼電路對(duì)以上的電路進(jìn)行功能仿真,得到如圖7所示的波形圖,按鍵輸入經(jīng)過濾波后的flt_in作為解碼電路的輸入,當(dāng)按鍵輸入為n時(shí),在解碼之前應(yīng)是,經(jīng)過解碼電路之后為n,我們可以看到按鍵的輸入為1、3、4,在flt_in中顯示為十六進(jìn)制2、8、10,進(jìn)過解碼之后的code_out為1、3、4。圖7 編碼電路仿真波形4.輸入弧度值存儲(chǔ)電路:這一部分的電路主要是對(duì)前端已經(jīng)編碼的按鍵輸入弧度值進(jìn)行存儲(chǔ),同時(shí)將輸入的數(shù)據(jù)送到后端的顯示電路中,已達(dá)到在數(shù)碼管上的同步顯示,這樣滿足了輸入錯(cuò)誤的實(shí)時(shí)清除更正,下面是實(shí)現(xiàn)電路的Verilog代碼,編譯之后的電路如圖8所示。/*輸入弧度值存儲(chǔ)電路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 輸入弧度值存儲(chǔ)電路如上圖,電路按照輸入次序的先后判定輸入的數(shù)據(jù)在寄存器中的位置,為函數(shù)值寄存器的尋址提供所需的地址。編碼電路輸出接至寄存器的輸入端,通過按鍵(代表圖9 弧度值存儲(chǔ)電路仿真波形數(shù)字0-9的10個(gè)按鍵)形成的正脈沖進(jìn)行計(jì)數(shù),依次將數(shù)據(jù)存放在寄存器dis_out的不同位置中。即按動(dòng)第一個(gè)按鍵時(shí),將對(duì)其編碼形成的十進(jìn)制數(shù)送到寄存器dis_out內(nèi),第二個(gè)按鍵輸入時(shí)將dis_out內(nèi)的數(shù)據(jù)擴(kuò)大十倍與之相加后送至寄存器,第三個(gè)按鍵輸入時(shí)將dis_out內(nèi)的數(shù)據(jù)再擴(kuò)大十倍與之相加后送至寄存器。同時(shí)在顯示電路中同步顯示每次的輸入數(shù)據(jù)。其仿真波形如圖9所示。5.sine函數(shù)值存儲(chǔ)電路:這部分電路主要是起到寄存函數(shù)值的功能,是一個(gè)初始化的RAM電路,在之前對(duì)這部分電路的設(shè)計(jì)方法我們已經(jīng)進(jìn)行了深刻的分析、討論,在這里我們主要用兩種方法(查找表法、線性插值法)來實(shí)現(xiàn),并通過實(shí)驗(yàn)結(jié)果來比較兩者之間的面積和時(shí)序之間的差別。在這個(gè)設(shè)計(jì)的實(shí)現(xiàn)中,重要的時(shí)延控制和芯片的面積控制,都由這部分電路的實(shí)現(xiàn)方法來決定。工作原理:(1) 對(duì)于查找表法而言,Verilog實(shí)現(xiàn)的代碼如下所示,當(dāng)三位角度值輸入完畢后,前面與弧度值相對(duì)應(yīng)的十進(jìn)制數(shù)已存放在寄存器中,并在數(shù)碼管中顯示,這里利用輸入弧度值存儲(chǔ)電路的寄存器值作為ROM的地址,從ROM中將與之匹配的函數(shù)值讀取出來,當(dāng)計(jì)算使能信號(hào)(sin_en鍵)為高電平脈沖時(shí),將已經(jīng)讀取出來的函數(shù)值放置到顯示電路中,并在數(shù)碼管中顯示。代碼編譯電路如圖10所示。/*查找表函數(shù)值存儲(chǔ)電路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ù)值存儲(chǔ)電路仿真結(jié)果如圖11,當(dāng)每次按鍵的0-9有高電平脈沖輸入時(shí),這部分電路都會(huì)按照?qǐng)D11 查找表sin函數(shù)值寄存電路仿真波形當(dāng)前的地址值addr查找到對(duì)應(yīng)的函數(shù)值sin_out,雖然這些值也都會(huì)被送到后面的顯示電路中去,但是由于沒有計(jì)算使能信號(hào)的輸入,它們并不會(huì)在顯示電路中顯示。(2) 對(duì)于線性插值法而言,同樣是利用輸入弧度值存儲(chǔ)電路的寄存器值作為RAM的地址,但是在這里不是直接的讀取所需的函數(shù)值,而是利用地址的高位首先讀取地址所在的插值分段的插值參考點(diǎn)。然后,在參考點(diǎn)的基礎(chǔ)上利用地址的低位對(duì)其進(jìn)行插值。實(shí)現(xiàn)電路的Verilog代碼見附錄一,代碼編譯電路如圖12,這里利用十位二進(jìn)制數(shù)表示函數(shù)值,精度已經(jīng)足夠,這樣我們將函數(shù)值分32段(即取32個(gè)基點(diǎn)),每段有三十二個(gè)插值點(diǎn),由于精度滿足,將每相鄰的四段使用相同的插值,這樣就可以更多的節(jié)省寄存器的數(shù)量。圖12 插值法sin函數(shù)值存儲(chǔ)插值電路仿真波形見圖16(b),電路在每次地址變化的時(shí)候利用地址的高五位addr9:5將基點(diǎn)ref_out的值讀出,同時(shí)利用地址低位addr4:0確定函數(shù)的插值fine_out,當(dāng)兩個(gè)值都讀出的時(shí)候,電路將這兩個(gè)值進(jìn)行相加得到地址對(duì)應(yīng)的函數(shù)值sin_out,供后端的顯示電路使用。6.顯示電路:在電路工作的整個(gè)過程中,這部分電路將按鍵的輸入弧度值和計(jì)算結(jié)果顯示在數(shù)碼管上,主要是驅(qū)動(dòng)數(shù)碼管,進(jìn)行對(duì)外應(yīng)答。在我們進(jìn)行弧度值的輸入時(shí),這部分電路將前端的dis_out中的數(shù)據(jù)顯示在數(shù)碼管中,當(dāng)sin_en(函數(shù)計(jì)算使能信號(hào))為高電平時(shí)這里將我們計(jì)算得得函數(shù)值顯示出來,以便讀取。實(shí)現(xiàn)電路的Verilog代碼如下,代碼編譯電路如圖13所示。/*查找表函數(shù)值存儲(chǔ)電路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ù)顯示電路對(duì)顯示電路進(jìn)行功能仿真,所得波形如下圖14,當(dāng)每次按動(dòng)按鍵,pi_out就會(huì)得到相應(yīng)的變化并顯示到后端的數(shù)碼管上,當(dāng)計(jì)算時(shí)能信號(hào)sin_en為高電平,電路就將sin_out賦給display,達(dá)到函數(shù)值在后端的顯示。當(dāng)清除信號(hào)clear為高電平時(shí),后端的顯示將被清零。圖14 顯示電路仿真波形7.顯示數(shù)碼管:這部分是實(shí)驗(yàn)箱提供的電路,和按鍵輸入類似,是一個(gè)信息的交換部分。參考下圖15。(外部試驗(yàn)箱提供電路模塊)圖15 顯示數(shù)碼管3.1.2 C程序?qū)崿F(xiàn)正余弦函數(shù)查找表在利用查找表實(shí)現(xiàn)正弦函數(shù)計(jì)算器的同時(shí),我們需要首先利用編程語言實(shí)現(xiàn)計(jì)算器內(nèi)部的函數(shù)值查找表。在這里我們需要二進(jìn)制歸一化之后的精度為四位有效數(shù)據(jù)的函數(shù)值查找表此設(shè)計(jì)中使用的查找表文件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)計(jì)算0-90度sine函數(shù)值*/for(t = 0;t = 5)a = (int)(y/10) + 1;elsea = (int)(y/10);/*對(duì)函數(shù)值進(jìn)行四舍五入*/*/x = a;/*/for(i = 0;i =0;i-)printf(%d,chi);fprintf(fp,%d,chi);printf(n);fprintf(fp,n);/*將sine函數(shù)值輸出到文件指針?biāo)赶虻奈募?/*/fclose(fp); /*關(guān)閉指針?biāo)赶虻囊汛蜷_文件*/3.2 查找表法和線性插值法的仿真驗(yàn)證圖16(a) 查找表法仿真波形圖16(b) 線性插值法仿真波形在這里我們利用synopsys公司的Verilog仿真工具VCS(這里使用2009-B-12版),在仿真時(shí)我們?cè)O(shè)置時(shí)間單位/精度(timescale=1s/1ms)。測(cè)試激勵(lì)程序見附錄三。查找表法和線性插值法實(shí)現(xiàn)的仿真波形分別如圖16(a)、(b)所示。3.2.1 查找表法和線性插值法的時(shí)延比較在這里我們對(duì)兩種正弦函數(shù)的實(shí)現(xiàn)方法進(jìn)行比較,通過仿真波形我們可以看出,查找表法和線性插值法的時(shí)延區(qū)別,我們之前理論預(yù)算的時(shí)延在這里我們將其計(jì)算在按鍵的輸入時(shí)段內(nèi),這樣就合理的避免了輸出延時(shí)的問題,從而不影響函數(shù)值在數(shù)碼管中的輸出。3.2.2 查找表法和線性插值法的ROM數(shù)量比較通過實(shí)現(xiàn)的代碼和電路,我們可以初步的計(jì)算出兩者寄存器數(shù)量得差異,這兩種實(shí)現(xiàn)方法的寄存器數(shù)量的差別就在函數(shù)值的寄存器部分。如表2所示:表2 兩種實(shí)現(xiàn)方法的寄存器數(shù)量比較實(shí)現(xiàn)方法線性插值法(bit)查找表法(bit)寄存器數(shù)32*10+6*32*6+2*32*2900*10這樣我們可以看出兩者寄存器的數(shù)量差距,這種差距為我們的線性插值法帶來了巨大的面積節(jié)約。雖然從仿真的結(jié)果看,線性插值法的精度與查找表法最大相差了0.01,在這里已經(jīng)足夠使用了,但是如果我們將查找表的參考值增加為11bit那么我們的精度差距將會(huì)縮小到0.005。然而,這樣我們的寄存器數(shù)量也僅僅增加了32*3。4 正余弦函數(shù)在FPGA中的實(shí)現(xiàn)4.1 現(xiàn)場(chǎng)可編程門陣列FPGA隨著微電子技術(shù)的發(fā)展,設(shè)計(jì)與制造集成電路的任務(wù)已經(jīng)不完全是由半導(dǎo)體廠商來獨(dú)立承擔(dān)。系統(tǒng)設(shè)計(jì)師門更愿意自己設(shè)計(jì)專用集成電路(ASIC)芯片,最好是將設(shè)計(jì)周期縮短到在實(shí)驗(yàn)室里就可以設(shè)計(jì)出合適的ASIC芯片,并且立即的投入實(shí)際應(yīng)用,因而出現(xiàn)了現(xiàn)場(chǎng)可編程邏輯器件(FPLD),其中應(yīng)用最廣泛的當(dāng)屬現(xiàn)場(chǎng)可編程門陣列(FPGA)和復(fù)雜可編程邏輯器件(CPLD)?,F(xiàn)場(chǎng)可編程門陣列(FPGA)器件是當(dāng)今運(yùn)用極為廣泛的可編程邏輯器件,也被稱為可編程ASIC,兼有串行、并行工作方式和高集成度、高速、高可靠性等特點(diǎn),時(shí)鐘延時(shí)可達(dá)到納秒級(jí),在基于芯片的設(shè)計(jì)中可以減少門數(shù)量,縮小系統(tǒng)體積,降低能源消耗,提高系統(tǒng)的性能指標(biāo)和可靠性。FPGA器件在結(jié)構(gòu)上具有邏輯功能塊排列,可編程的內(nèi)部連線連接這些功能模塊來實(shí)現(xiàn)一定的邏輯功能。FPGA器件的功能由邏輯結(jié)構(gòu)的配置數(shù)據(jù)決定。工作時(shí),這些配置數(shù)據(jù)存放在片內(nèi)的SRAM。使用SRAM的FPGA器件,在工作前需要從芯片外部加載配置數(shù)據(jù),配置數(shù)據(jù)可以存儲(chǔ)在片外的EPROM或其他存儲(chǔ)體上,設(shè)計(jì)者可以控制加載過程,在現(xiàn)場(chǎng)修改器件的邏輯功能,即所謂現(xiàn)場(chǎng)編程。用戶不僅可以方便地設(shè)計(jì)出所需的硬件邏輯,而且可以進(jìn)行靜態(tài)重復(fù)編程和動(dòng)態(tài)系統(tǒng)重配置,使系統(tǒng)的硬件功能可以像軟件一樣利用編程修改,從而可以實(shí)時(shí)地進(jìn)行靈活而方便的更新和開發(fā),大大提高了系統(tǒng)設(shè)計(jì)的靈活性和通用性。概括的說,F(xiàn)PGA有很強(qiáng)的靈活性,可以根據(jù)需要進(jìn)行重構(gòu)配置,有較強(qiáng)的通用性,適于模塊化設(shè)計(jì),同時(shí)其開發(fā)周期短,系統(tǒng)易于維護(hù)和擴(kuò)展,適合實(shí)時(shí)的信號(hào)處理,能夠大大地提高數(shù)據(jù)的處理速度,達(dá)到系統(tǒng)的實(shí)時(shí)性要求。因此,采用FPGA的硬件實(shí)現(xiàn)是一個(gè)不錯(cuò)的選擇。684.2 正弦函數(shù)計(jì)算器的FPGA實(shí)現(xiàn)我們將涉及代碼下載到實(shí)驗(yàn)箱的FPGA中實(shí)現(xiàn),在Max+plus II軟件中將正弦函數(shù)計(jì)算器的各個(gè)模塊連接好,然后保存設(shè)成當(dāng)前工程,經(jīng)過編譯提示無誤后即可下載到可編程器件實(shí)驗(yàn)系統(tǒng)中,這里我采用的是湖北眾友公司提供的EDA技術(shù)試驗(yàn)箱,它的核心芯片是ALTERA公司生產(chǎn)的型號(hào)為EP1K30QC208-2的FPGA器件。驗(yàn)證時(shí)利用實(shí)驗(yàn)板上的按鍵作為計(jì)算器的輸入,數(shù)碼管作為顯示端。驗(yàn)證結(jié)果證明該正弦函數(shù)計(jì)算器工作正常,可以實(shí)現(xiàn)清零、計(jì)算、顯示的功能。5 結(jié)束語本文通過對(duì)線性插值法、cordic、及查表法實(shí)現(xiàn)正余弦函數(shù)的探討,提出了在數(shù)字視頻信號(hào)傳輸及編解碼中普遍使用的一種實(shí)現(xiàn)正余弦函數(shù)的方法線性插值法實(shí)現(xiàn)正余弦函數(shù)計(jì)算器。并且利用理論推導(dǎo)對(duì)cordic算法、線性插值法和查表法的進(jìn)行對(duì)比。最后,采用Verilog HDL編程語言對(duì)線性插值法和查找表法進(jìn)行實(shí)現(xiàn)、仿真對(duì)比并在FPGA上實(shí)現(xiàn)線性插值法。而對(duì)實(shí)驗(yàn)的結(jié)果分析,證明了線性插值法與cordic算法及查找表法相比,在大大降低運(yùn)算時(shí)延和芯片所占用的ROM數(shù)的同時(shí)還滿足了正弦函數(shù)的精度要求。特別是在芯片中ROM的數(shù)量和運(yùn)算的實(shí)時(shí)性方面,線性插值法在很好的降低ROM數(shù)量的同時(shí)降低了運(yùn)算時(shí)延。而且,利用FPGA對(duì)正弦函數(shù)實(shí)現(xiàn),也證明了該方法的可行性與可操作性,使得在高速的數(shù)字視頻信號(hào)的傳輸中,正弦函數(shù)調(diào)制信號(hào)的實(shí)時(shí)性更高。由于受工作量以及時(shí)間的限制,本文并沒有對(duì)cordic算法進(jìn)行verilog HDL的實(shí)現(xiàn),同時(shí)也只是對(duì)正函數(shù)的計(jì)算進(jìn)行了實(shí)現(xiàn)并進(jìn)行驗(yàn)證,還有大量的算法沒有加入到文章中來討論,進(jìn)行整體的對(duì)比。對(duì)于利用Verilog實(shí)現(xiàn)的正弦函數(shù)計(jì)算器也只是在FPGA上進(jìn)行了實(shí)現(xiàn),還停留在理論階段,沒有具體的應(yīng)用到實(shí)踐中去。利用FPGA的仿真程序還不是很完善,在程序的流暢性以及模塊的設(shè)計(jì)方面還有可提升的空間。參考文獻(xiàn):1 譚浩強(qiáng).C語言程序設(shè)計(jì)(第三版)M.北京:清華大學(xué)出版社,2007.2 夏宇聞.夏宇聞verilog經(jīng)典教程M.北京:北京航空航天大學(xué)出版社,2000.3 譚浩強(qiáng).C語言程序設(shè)計(jì)上機(jī)指導(dǎo)M.北京:清華大學(xué)出版社,2007.4 劉愛榮等編著.EDA技術(shù)與CPLD/FPGA開發(fā)應(yīng)用簡(jiǎn)明教程M.北京:清華大學(xué)出版社,2007.5 劉暢,李智.基于FPGA的任意波形發(fā)生器的設(shè)計(jì)J.桂林電子科技大學(xué),2008.6 吳繼華,王誠.ALTERA FPGA/CPLD設(shè)計(jì)(高級(jí)篇)M.北京:人民郵電出版社,2005.69-71.7 孫宇峰,陳國軍,王大鳴等.一種高精度正余弦函數(shù)的實(shí)現(xiàn)方法J.信息工程大學(xué)學(xué)報(bào),2008,9:1-3.8 孔德元.針對(duì)正余弦計(jì)算的CORDIC算法優(yōu)化及其FPGA實(shí)現(xiàn)J.中南大學(xué)碩士學(xué)位論文,2008.9 田杭沛.高性能HPOR CORDIC算法及實(shí)現(xiàn)D.西北工業(yè)大學(xué)博士學(xué)位論文,2004.10 佟志偉.Cordic算法及其FPGA實(shí)現(xiàn)的研究D.北京大學(xué)碩士學(xué)位論文,2008.11 黃聚永,袁慧梅,吳向陽等.基于查找表和Newton插值算法的正余弦函數(shù)的FPGA實(shí)現(xiàn)D.首都師范大學(xué)碩士學(xué)位論文,2007.12 盛利元,孔德元,簡(jiǎn)遠(yuǎn)明等.正弦和余弦函數(shù)的一種混合式CORDIC算法實(shí)現(xiàn)J.鄭州大學(xué)學(xué)報(bào)(工學(xué)版),2008,29(2):1-2.13 周小青,李合生,陶榮輝等.基于CORDIC 算法的雙曲正余弦運(yùn)算的FPGA實(shí)現(xiàn)J.信息與電子工程,2010,8(2):2-4.14 姜萍,蔣立平,譚學(xué)琴.正弦函數(shù)計(jì)算器的設(shè)計(jì)與實(shí)現(xiàn)J.現(xiàn)代電子技術(shù),2007,30(18):
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 常州二手房買賣合同(含房屋租賃權(quán)優(yōu)先購買權(quán)約定)
- 心動(dòng)告白日活動(dòng)方案
- 快餐新年活動(dòng)方案
- 懷化惠民活動(dòng)方案
- 怎樣寫活動(dòng)區(qū)活動(dòng)方案
- 思品活動(dòng)活動(dòng)方案
- 思政課學(xué)校聯(lián)盟活動(dòng)方案
- 急救講座活動(dòng)方案
- 總結(jié)師徒結(jié)對(duì)活動(dòng)方案
- 恐龍冒險(xiǎn)運(yùn)動(dòng)活動(dòng)方案
- 初++中數(shù)學(xué)設(shè)計(jì)學(xué)校田徑運(yùn)動(dòng)會(huì)比賽場(chǎng)地+課件++人教版七年級(jí)數(shù)學(xué)上冊(cè)
- 《衛(wèi)星導(dǎo)航系統(tǒng)》全套教學(xué)課件
- 職業(yè)道德完全題庫附有答案
- 初高中物理銜接講座(初高中物理對(duì)比)
- 施工現(xiàn)場(chǎng)平面布置及臨時(shí)設(shè)施、臨時(shí)道路布置
- 小學(xué)六年級(jí)課后服務(wù):scratch少兒編程 四階第19課:BMI指數(shù)(上)
- 科技人才評(píng)價(jià)規(guī)范
- 《短視頻編輯與制作(第2版)》-第9章
- 醫(yī)院無菌操作知識(shí)培訓(xùn)
- 年產(chǎn)500噸40gL煙嘧磺隆可分散油懸浮劑農(nóng)藥項(xiàng)目環(huán)境影響評(píng)價(jià)報(bào)告表樣本
- 介紹方志敏(修訂版)
評(píng)論
0/150
提交評(píng)論