《EDA課程設(shè)計報告-正弦波信號發(fā)生器的設(shè)計.doc》由會員分享,可在線閱讀,更多相關(guān)《EDA課程設(shè)計報告-正弦波信號發(fā)生器的設(shè)計.doc(18頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、EDA課程設(shè)計報告 正弦波信號發(fā)生器的設(shè)計一、設(shè)計目的 通過本次課程設(shè)計,進(jìn)一步了解QUARTUS 與LPM_ROM與FPGA硬件功能的使用方法。培養(yǎng)自己查閱資料及解決問題的能力。二、設(shè)計要求1、 通過按鍵,可以控制輸出的是正弦波或三角波。2、 通過ADC0832輸出正弦波與三角波,電壓V范圍在0至-10V之間3、 通過示波器觀察波形。三、設(shè)計內(nèi)容: 在QUARTUSII上完成信號發(fā)生器的設(shè)計。最后在實(shí)驗(yàn)板上實(shí)測,包括FPGA中ROM的在系統(tǒng)數(shù)據(jù)讀寫測試和利用示波器測試。信號輸出的D/A使用實(shí)驗(yàn)板上的ADC0832。四、 設(shè)計原理: 圖1所示的波信號發(fā)生器的結(jié)構(gòu)由五部分組成:1、計數(shù)器或地址發(fā)
2、生器(這里選擇8位)。正弦信號數(shù)據(jù)ROM(8位地址線,8位數(shù)據(jù)線),含有256個8位數(shù)據(jù)(一個周期)。2、VHDL頂層設(shè)計。3、8位D/A圖1所示的信號發(fā)生器結(jié)構(gòu)圖中,頂層文件adc.vhd在FPGA中實(shí)現(xiàn),包含兩個部分:ROM的地址信號發(fā)生器,由8位計數(shù)器擔(dān)任;一個正弦數(shù)據(jù)ROM(或者一個三角波數(shù)據(jù)ROM),由LPM_ROM模塊構(gòu)成。地址發(fā)生器的時鐘clk的輸入頻率fo與每周期的波形數(shù)據(jù)點(diǎn)數(shù)(在此選擇256點(diǎn)),以及D/A輸出的頻率f的關(guān)系是:f=fo/256 VHDL頂層設(shè)計adc.vhd 正弦波數(shù)據(jù)存儲ROM1 20分頻8位計數(shù)器(地址發(fā)生器)8位D/A按鍵3三角波數(shù)據(jù)存儲ROM2 圖1
3、 正弦信號發(fā)生器結(jié)構(gòu)框圖 圖一 信號發(fā)生器結(jié)構(gòu)圖 圖2 信號發(fā)生器的設(shè)計圖五、 設(shè)計步驟:1、 建立.mif格式文件mif文件可用C語言程序生成,產(chǎn)生正弦波數(shù)值的C程序如下:#include#includemain()int i;float s;for(i=0;i256;i+)s=sin(atan(1)*8*i/256);printf(%d :%d;n,i,(int)(s+1)*255/2)以zx.c保存。產(chǎn)生三角波數(shù)值的C程序如下:#include#includemain()int i;float s;for(i=0;i zx.mif;sj sj.mif;將生成的*.mif 文件,再加上.m
4、if文件的頭部說明即可。.mif文件的頭部說明如下所示:WIDTH=8;DEPTH=256;ADDRESS_RADIX=DEC;DATA_RADIX=DEC;CONTENT BEGIN(數(shù)據(jù)略去)END;2、 在設(shè)計信號發(fā)生器前,必須首先完成存放波形數(shù)據(jù)ROM的設(shè)計。設(shè)計步驟如下:1) 打開QUARTUS 。在files菜單中選擇new產(chǎn)生一個對話框,選擇Block Diagram/Schematic File 項,會生成一個*.bdf文件,雙擊文件空白處,跳出symbol窗口,在改窗口下選擇megafunctionsstoragelpm_rom。2) 在跳出的 MegaWizard Plug
5、-In Manager中選 擇VHDL,路徑保存在D:chengxv中3) 在parameter settings 窗口中,選擇currently selected device family :cyclone.選擇ROM控制線、地址線和數(shù)據(jù)線。在彈出的對話框中選擇地址線位寬和ROM中數(shù)據(jù)數(shù)分別為8和64;選擇地址鎖存控制信號dual clock。在對話框的“What should the RAM”欄選擇默認(rèn)的Auto。4) 單擊NEXT,將此界面數(shù)據(jù)如圖設(shè)置5) 單擊Next按鈕,選擇BROWSE,選擇利用C做成的MIF文件,將此模塊命名為ROM0,再單擊Finish 按鈕后完成ROM0定制
6、。6) 打開此文件可以看到其中調(diào)用初始化數(shù)據(jù)文件的語句為:init_file = .mif。最后生成的ROM0元件文件如源代碼1所示. 六、 源代碼:1)、源代碼1如下所示:LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.all;ENTITY ROM0 ISPORT(address: IN STD_LOGIC_VECTOR (5 DOWNTO 0);inclock: IN STD_LOGIC ;q: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);END ROM0;ARCHIT
7、ECTURE SYN OF ROM0 ISSIGNAL sub_wire0: STD_LOGIC_VECTOR (7 DOWNTO 0);COMPONENT altsyncramGENERIC (address_aclr_a: STRING;init_file: STRING;intended_device_family: STRING;lpm_hint: STRING;lpm_type: STRING;numwords_a: NATURAL;operation_mode: STRING;outdata_aclr_a: STRING;outdata_reg_a: STRING;widthad_
8、a: NATURAL;width_a: NATURAL;width_byteena_a: NATURAL);PORT (clock0: IN STD_LOGIC ;address_a: IN STD_LOGIC_VECTOR (5 DOWNTO 0);q_a: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);END COMPONENT;BEGINq NONE,init_file = ././ad.mif,intended_device_family = Cyclone,lpm_hint = ENABLE_RUNTIME_MOD=NO,lpm_type = altsyncra
9、m,numwords_a = 64,operation_mode = ROM,outdata_aclr_a = NONE,outdata_reg_a = UNREGISTERED,widthad_a = 6,width_a = 8,width_byteena_a = 1)PORT MAP (clock0 = inclock,address_a = address,q_a = sub_wire0);END SYN;2)、頂層設(shè)計代碼:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY AD
10、C ISPORT ( CLK:in STD_LOGIC;DOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);key:in STD_LOGIC);END ;ARCHITECTURE DACC OF ADC IS COMPONENT ROM0 PORT(address: IN STD_LOGIC_VECTOR(7 DOWNTO 0); inclock: IN STD_LOGIC;q: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ) ; END COMPONENT; COMPONENT ROM1 PORT(address: IN STD_LOGIC_VE
11、CTOR(7 DOWNTO 0); inclock: IN STD_LOGIC;q: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ) ; END COMPONENT; SIGNAL CLK1:STD_LOGIC;SIGNAL Q0:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL Q1:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL Q2:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL Q3:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINPROCESS(CLK)BEGINIF CL
12、Kevent and CLK=1 THEN IF Q00110 THEN Q0=Q0+1;ELSE Q0=0000;CLK1= NOT CLK1;END IF;END IF;END PROCESS;PROCESS(CLK1)BEGINIF CLK1event and CLK1=1 THEN Q1Q1,q=Q2,inclock=CLK);u1:ROM0 PORT MAP(address=Q1,q=Q3,inclock=CLK);process(key)beginif key=1 then DOUT=Q2;else DOUT=Q3; END IF; END PROCESS;END ;3)為此頂層設(shè)
13、計創(chuàng)建一項工程,工程名和實(shí)體名都是adc。4)全程編譯一次后進(jìn)入時序仿真測試。由波形可見,隨著每一個時鐘上升沿的到來,輸出端口將正弦波數(shù)據(jù)依次輸出。 5)硬件測試。選擇電路模式5,則時鐘CLK接實(shí)驗(yàn)箱的clock0 。將dout(0)dout(7)分別鎖定于實(shí)驗(yàn)系統(tǒng)上與DAC0832相接的I/O口:PIO24、PIO25、PIO26、PIO27、PIO28、PIO29、PIO30、PIO31。編譯下載adc.sof后,打開電壓開關(guān),將CLK的時鐘通過實(shí)驗(yàn)箱上clock0的跳線選擇頻率為12MHZ,再將示波器接于實(shí)驗(yàn)箱的兩個掛鉤上就能觀察波形的輸出情況了。七、 仿真波形圖:八、 引腳鎖定:九、 設(shè)計結(jié)果:Clock0=12MHZ,輸出頻率為:f=47KHZ,周期為:T=21us十、 設(shè)計體會:在本次設(shè)計的過程中,我在編譯過程中出現(xiàn)問題,第一個問題出在建立.mif格式文件中,沒有將生成的sdata.mif文件加上.mif文件的頭部說明。.mif文件的頭部說明如下所示:WIDTH=8;DEPTH=1024;ADDRESS_RADIX=DEC;DATA_RADIX=DEC;CONTENT BEGIN0:127;1:130;(數(shù)據(jù)略去)1023:124;END;18