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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

3、行的內容是固定的。MEMORY_INITIALIZATION_RADIX=10;表示下面的數字是10進制數,后面的數據是依次存入rom的值,以逗號分開,最后以一個分號結束。生成初始化文件的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即可。然后復制到ISE分工程目錄下。 初始化文件生成后,剩下就是編寫verilog代碼。 首先建一個工程,然后新建一個IP。 找到rom,打開。設置按如下設置:這里是設置位寬,采用的是1

5、3位(第一位為符號位,后面12位為數據位)來顯示sin的值。因此這里是設置為13.深度是因為要存158個值,所以這里設置為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);從上面的程序可看出,只需要給時鐘信號,和輸入地址,就可以了。輸出的就是正弦的數字信號了。分析正弦信號,前1/

6、4個周期,地址從0自加,一直加到157(1/4個周期的點數)。然后再自減,減到0。然后進入到負半周,負數的表示是以二進制的補碼來表示的,即絕對值數的二進制取反在加1。 編寫地址自加自減的代碼,然后再根據地址的值,判斷輸出值的正負,如為負數,則取反加1后再輸出。代碼,如下所示:module sin_top(input clk, /輸入時鐘信號input 9:0 address, /輸入地址信號output reg 12:0 data_out /輸出sin的數字值);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);/ 判斷輸出值是正數還是負數。always * beginif( address <= 314)data_out = douta;else if( address <= 628 )data_out = douta + 1'b1;elsedata_out = 0;endendmodule程序寫好了,剩下就是要仿真了。仿真的testbench,只需要輸入時鐘和地址信號就可以了。地址信號一直加一,直到不小于628,剛好一個周期結束。就返回0值,在繼續(xù)自加。測試代碼如下所示: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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論