FPGA產(chǎn)生正弦波方法(四分之一周期)COE文件_第1頁
FPGA產(chǎn)生正弦波方法(四分之一周期)COE文件_第2頁
FPGA產(chǎn)生正弦波方法(四分之一周期)COE文件_第3頁
FPGA產(chǎn)生正弦波方法(四分之一周期)COE文件_第4頁
FPGA產(chǎn)生正弦波方法(四分之一周期)COE文件_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、FPGA產(chǎn)生正弦波方法(1/4周期)COE文件 本文主要介紹通過查表法產(chǎn)生正弦波。涉及利用matlab生成四分之一周期的正弦相位、幅值對(duì)應(yīng)表,生成COE文件的IP核方法,F(xiàn)PGA編程產(chǎn)生數(shù)字正弦信號(hào)。 正弦信號(hào),是一個(gè)模擬信號(hào)。FPGA只能產(chǎn)生數(shù)字信號(hào)。因此需要用DA將數(shù)字量轉(zhuǎn)化為模擬量。這里采用modelsim的模擬波形顯示,不敘述DA轉(zhuǎn)換相關(guān)知識(shí)了。產(chǎn)生正弦信號(hào)的方法有很多,這里用的是查找rom的方法,產(chǎn)生正弦信號(hào)。正弦信號(hào),是一個(gè)幅值介于-1和1之間周期變化的模擬量,因此只需要將1/4周期的值存進(jìn)rom里,其波形就可以根據(jù)這1/4周期幅值的變化得到。 matlab產(chǎn)生正弦信號(hào)的值。以0.

2、01為步長,從0采集到pi/2,共158個(gè)點(diǎn)。x = linspace(0, pi/2,158); 因sin的幅值值是小數(shù),而FPGA不能表示小數(shù),我們把幅值乘以12位二進(jìn)制后取整實(shí)現(xiàn)幅值整數(shù)化。即幅值放大4096倍。例如幅值為0.3,而0.3*212=1228.8,取整為1229。當(dāng)然這樣表示會(huì)有一定誤差,但可以根據(jù)精度需要調(diào)整參數(shù),使誤差可接受。 生成ROM。這里rom用的是ISE的IP rom。將matlab生成的數(shù)據(jù)存入rom里面,讀取rom的值,即可生成正弦信號(hào)。首先是生成rom的初始化文件。Xilinx的rom的初始化文件的后綴為.coe。這個(gè)特殊文件有固定的格式如下: 文件前面兩

3、行的內(nèi)容是固定的。MEMORY_INITIALIZATION_RADIX=10;表示下面的數(shù)字是10進(jìn)制數(shù),后面的數(shù)據(jù)是依次存入rom的值,以逗號(hào)分開,最后以一個(gè)分號(hào)結(jié)束。生成初始化文件的matlab程序如下所示:fid = fopen('sin_rom.txt','w');fprintf(fid,'MEMORY_INITIALIZATION_RADIX = 10;n');fprintf(fid,'MEMORY_INITIALIZATION_VECTOR =n');for i = 0:1:pi/2*100y = sin(i/100

4、);rom =floor( y * 212);if i = 157fprintf(fid,'%d;',rom);elsefprintf(fid,'%d,',rom);endif mod(i,10)=0 && i = 0fprintf(fid,'n');endendfclose(fid); matlab生成的文件是.txt文件。將后綴直接改為.coe即可。然后復(fù)制到ISE分工程目錄下。 初始化文件生成后,剩下就是編寫verilog代碼。 首先建一個(gè)工程,然后新建一個(gè)IP。 找到rom,打開。設(shè)置按如下設(shè)置:這里是設(shè)置位寬,采用的是1

5、3位(第一位為符號(hào)位,后面12位為數(shù)據(jù)位)來顯示sin的值。因此這里是設(shè)置為13.深度是因?yàn)橐?58個(gè)值,所以這里設(shè)置為158. 將剛剛生成的.coe文件載入,生成即可。接著就是編寫verilog代碼了。首次查看用ip生成的rom的例化代碼.sin_rom your_instance_name (.clka(clka), / input clka.addra(addra), / input 7 : 0 addra.douta(douta) / output 12 : 0 douta);從上面的程序可看出,只需要給時(shí)鐘信號(hào),和輸入地址,就可以了。輸出的就是正弦的數(shù)字信號(hào)了。分析正弦信號(hào),前1/

6、4個(gè)周期,地址從0自加,一直加到157(1/4個(gè)周期的點(diǎn)數(shù))。然后再自減,減到0。然后進(jìn)入到負(fù)半周,負(fù)數(shù)的表示是以二進(jìn)制的補(bǔ)碼來表示的,即絕對(duì)值數(shù)的二進(jìn)制取反在加1。 編寫地址自加自減的代碼,然后再根據(jù)地址的值,判斷輸出值的正負(fù),如為負(fù)數(shù),則取反加1后再輸出。代碼,如下所示:module sin_top(input clk, /輸入時(shí)鐘信號(hào)input 9:0 address, /輸入地址信號(hào)output reg 12:0 data_out /輸出sin的數(shù)字值);reg 7:0 add;wire 12:0 douta;/ 以下是判斷地址的值always * beginif( address &

7、lt;= 157 )add = address;else if( address <= 314 )add = 10'd314 - address;else if( address <= 471 )add = address - 10'd314;else if( address <= 628 )add = 10'd628 - address;elseadd = 0;end/例化之前生成的sin_romsin_rom u1_sin_rom (.clka(clk), / input clka.addra(add), / input 7 : 0 addra.d

8、outa(douta) / output 12 : 0 douta);/ 判斷輸出值是正數(shù)還是負(fù)數(shù)。always * beginif( address <= 314)data_out = douta;else if( address <= 628 )data_out = douta + 1'b1;elsedata_out = 0;endendmodule程序?qū)懞昧?,剩下就是要仿真了。仿真的testbench,只需要輸入時(shí)鐘和地址信號(hào)就可以了。地址信號(hào)一直加一,直到不小于628,剛好一個(gè)周期結(jié)束。就返回0值,在繼續(xù)自加。測(cè)試代碼如下所示:module sin_top_test

9、;/ Inputsreg clk;reg 9:0 address;/ Outputswire 12:0 data_out;/ Instantiate the Unit Under Test (UUT)sin_top uut (.clk(clk),.address(address),.data_out(data_out);always#5 clk = clk;initial begin/ Initialize Inputsclk = 0;address = 0;/ Wait 100 ns for global reset to finishwhile(1)begin(negedge(clk);if( address < 628 )

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論