基于vhdl-的簡單信號發(fā)生器的設計_第1頁
基于vhdl-的簡單信號發(fā)生器的設計_第2頁
基于vhdl-的簡單信號發(fā)生器的設計_第3頁
基于vhdl-的簡單信號發(fā)生器的設計_第4頁
基于vhdl-的簡單信號發(fā)生器的設計_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

目錄TOC\o"1-3"\h\z\u25908設計任務及要求設計任務及要求本課程設計主要是利用VHDL語言設計一個信號發(fā)生器,要求實現以下功能:信號發(fā)生器的控制模塊可以用數據選擇器實現,用4選1數據選擇器實現對四種信號的輸出進行選擇。根據輸入信號的選擇可以產生周期性輸出正弦波、方波、三角波、鋸齒波四種波形信號。將波形數據送入D/A轉換器,將數字信號轉換為模擬信號輸出,用示波器測試D/A轉換器的輸出,可以觀測到4種信號的輸出。實現根據不同輸入輸出不同頻率輸出的功能,并且能把頻率顯示到數碼管上。實現多種波形的疊加功能。實現波形幅度的增加功能。上面的1,2,3這三點要求是根本要求,而4,5,6是本次課程設計的發(fā)揮局部。1、設計目的1)掌握使用EDA工具設計信號發(fā)生器系統的設計思路和設計方法,體會使用EDA綜合過程中電路設計方法和設計思路的不同,理解層次化設計理念。2)熟悉在QuartusII環(huán)境中,用文本輸入方式與原理圖輸入方式完成電路的設計,同時掌握使用這兩種方式相結合的EDA設計思路。3)通過這一局部的學習,對VHDL的設計方法進行進一步的學習,對其相關語言設計標準進行更深層次的掌握,能夠更加熟練的做一些編程設計。2、設計的主要內容和要求通過使用VHDL語言及QuartusII軟件,設計多功能信號發(fā)生器的每個模塊,將正弦波模塊,方波模塊,三角波模塊,鋸齒波模塊創(chuàng)立相應的元件,同時設計好4選1數據選擇器模塊,再通過例化連接語句或圖形輸入的方式,將各個模塊組合起來,設計成一個完整的多種信號發(fā)生器電路,同時將各個模塊單獨進行仿真,設計各個模塊的仿真波形,最后進行總原理圖電路仿真,設計該信號發(fā)生器的總的仿真波形,然后進行下載,然后用硬件電路調試。信號發(fā)生器:實現四種波形的轉換。根據題目的分析與整體構思可知,要完成設計任務必須完成以下要求:1、設計好用于總電路設計的各個信號輸出模塊;2、設計好用于波形切換的四路數據選擇器;3、設計好用于頻率切換的分頻電路;4、設計好用于數碼管顯示的動態(tài)掃描電路;5、設計好用于波形疊加的選擇電路;6、設計好數模〔D/A〕轉換。3、整體設計方案根本設計方案:在現有多路選擇器的根底上,加上其它信號模塊,通過組合與設計,用數模轉換器〔D/A〕將選中的信號源發(fā)出的信號由數字信號轉換為模擬信號,再用示波器顯示出來,其信號發(fā)生器的根本結構框圖如下圖。信號發(fā)生器由各個單一信號模塊組合而成,其中信號產生模塊將產生所需的各種信號,信號發(fā)生器的控制模塊可以用數據選擇器實現,用4選1數據選擇器實現對四種信號的選擇。最后將波形數據送入D/A轉換器,將數字信號轉換為模擬信號輸出。用示波器測試D/A轉換器的輸出,可以觀測到4種信號的輸出。圖信號發(fā)生器結構框圖最后,在前面模塊做好的根底上再考慮如何輸出波形的問題,通過對四種波形采樣就可以得到??傮w功能框圖4、方案選擇4.1各波形數據模塊實現方式①.VHDL模塊各自調用:這種方法看起來比擬明了,很容易知道自己寫了什么,但是正弦波,鋸齒波這些波形的數據切換都要自己查表自己輸入進vhdl文本中去,這樣不僅費時費力,而且很容易出錯,一旦出錯,很難找出錯誤的所在,總的來說不是一個很好的方案。②.LPM_ROM調用:LPM,即參數化模塊庫(LibraryofParameterizedModules),是Altera公司FPGA/CPLD設計軟件QuartusII自帶的一些宏功能模塊,功能非常強大,很容易滿足我們的要求,我們只要建立一個ROM模塊,并且把數據文件導入進去就可以很簡單的做出一個我們需要的宏模塊。很明顯要選LPM_ROM作為解決方案,這樣我們要分別做四種波形的ROM。4.2各模塊連接方式①.圖形連接輸入:這種方法簡單明了,不過只適合小型工程,對于大工程不能使用圖形輸入。②.VHDL文本的例化連接:例化連接使用COMPONENT等語句直接可以連接映射,更能直接表現出各引腳的連接方式。所以用VHDL文本例化連接。5、具體實現設計5.1正弦波的波形的產生我們用調用mif的方式來實現LPM_ROM的具體功能,這里我們不需要寫任何一行代碼,具體方法如下:1、翻開向導工具tools→MegaWizardPlug-inManager2、選擇ROM,選擇VHDL,并且輸入名稱3、選擇雙時鐘輸入,選擇采樣字節(jié)數4、把輸出時鐘取消掉,只剩下一個inclock5、選著生成的nif文件,mif中存在需要輸出波形數據6、點擊finish,這樣我們的一個正弦波LPM_ROM就做好了這樣我們一行代碼也沒寫,卻做到了很多功能,這效率是要提前完工的節(jié)奏啊,可喜可賀?。if文件也是這樣生成的:感謝杭州康芯電子公司提供的mifmaker!翻開mifmaker→設置全局參數→選擇正弦波→保存為mif→可以用來輸入了!通過這種方式我們連續(xù)再做三次,就得到了能輸出數據分別是正弦波、方波、三角波和鋸齒波的元件,只要在最頂層文件中調用就可以了?。?.2四種LPM_ROM的調用在最高層文件中調用這四種LPM_ROM,因為每個ROM都生成了自己相對應的vhd文件,所以我們直接調用就ok啦,具體實現代碼如下:這是這四種LPM_ROM的聲明局部這是這四種LPM_ROM的調用例化管腳映射局部5.3四種波形的輸出選擇用K1,K2來控制選著輸出具體的哪一種波形5.4輸出頻率的選擇用K3,K4,K5來控制選擇輸出頻率,具體代碼如下:5.5數碼管頻率顯示調用我們之前例化好的一個動態(tài)顯示元件display,元件代碼見附錄二5.6D/A的控制由于實驗箱只有一個時鐘,所以把時鐘分頻后連接入LPM_ROM的時鐘,不分頻的直接接入D/A模塊時鐘,用這種方式就能到達DAC正常輸出目的波形的效果。6、引腳鎖定系統仿真和下載測試6.1LPM_ROM的仿真以正弦波為例,dout是查mif得出的值6.2引腳設置6.3系統總邏輯仿真〔基于signaltap〕7、使用說明7.1各相關元件符號名稱名稱功能SIN正弦波信號發(fā)生SQUAR方波信號發(fā)生SANJIAO三角波信號發(fā)生JU鋸齒波信號發(fā)生DISP綜合波形選擇以及頻率選擇DISPLAY數碼管動態(tài)掃描7.2使用方法K1,K2的調節(jié)方式如下選擇值對應輸出波形00正弦波01方波10三角波11鋸齒波K3,K4,K5的調節(jié)方式如下選擇值對應輸出頻率00093.75KHz00146.88KHz01023.44KHz01111.72KHz1005.86KHz1012.93KHz1101.46KHz111732Hz8、總結參考文獻[1]潘松,黃繼業(yè).EDA技術實用教程(第四版〕[M].科學出版社,2023[2]江國強.EDA技術與應用〔第3版〕[M].電子工業(yè)出版社,2023[3]J.Bhasker著,徐振林等譯.VerilogHDL硬件描述語言.北京:機械工業(yè)出版社,2000[4]盧杰,賴毅.VHDL與數字電路設計.北京:科學出版社,2001[5]張昌凡,龍永紅,彭濤.可編程邏輯器件及VHDL設計技術.廣州:華南工學院出版社,2001libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;*******************************entityDISPisport(clk:instd_logic;--這是時鐘輸入 dout:outstd_logic_vector(7downto0);--輸出給AD Pout:outstd_logic_vector(7downto0);--段碼 WS:outstd_logic_vector(2downto0);--位選 CLKOUT:OUTstd_logic;--clk直接輸出給DA K1:instd_logic;--撥動開關12,用來選信號種類 K2:instd_logic; K3:instd_logic;--撥動開關345,用來選信號頻率 K4:instd_logic; K5:instd_logic);endDISP;architecturebehavofDISPis*******************************componentSIN--這是正弦波port(address:instd_logic_vector(6downto0); inclock:instd_logic; q:outstd_logic_vector(7downto0));endcomponent;*******************************componentSQUAR--這是方波port(address:instd_logic_vector(6downto0); inclock:instd_logic; q:outstd_logic_vector(7downto0));endcomponent;*******************************componentSANJIAO--這是三角波port(address:instd_logic_vector(6downto0); inclock:instd_logic; q:outstd_logic_vector(7downto0));endcomponent;*******************************componentJU--這是鋸齒波port(address:instd_logic_vector(6downto0); inclock:instd_logic; q:outstd_logic_vector(7downto0));endcomponent;*******************************componentdisplay--這是數碼管顯示功能的例化聲明 port(dclk:instd_logic; disout:outstd_logic_vector(7downto0); --顯示輸出 seld:outstd_logic_vector(2downto0); --位選 selq:instd_logic_vector(2downto0));--頻率選擇 endcomponent;******************************* signalq1 :std_logic_vector(6downto0);--地址尋址 signalDOUT1:std_logic_vector(7downto0);--用來輸出各種波形 signalDOUT2:std_logic_vector(7downto0); signalDOUT3:std_logic_vector(7downto0); signalDOUT4:std_logic_vector(7downto0); signalSLE :std_logic_vector(1downto0);--信號選擇 signalFRE :std_logic_vector(2downto0);--頻率選擇 signalQout :std_logic_vector(7downto0);--clk分頻 signalQin :std_logic;--clk分頻后輸出begin*******************************p0:process(clk)--24Mhz beginifclk'eventandclk='1'then if(Qout="11111111")thenQout<="00000000"; elseQout<=Qout+1; endif;endif;endprocess;*******************************CLKOUT<=clk;--DADADADADAD*******************************FRE<=K3&K4&K5;p1:process(FRE) BEGIN CASEFREIS WHEN"000"=>qin<=qout(7);--732hz WHEN"001"=>qin<=qout(6); WHEN"010"=>qin<=qout(5); WHEN"011"=>qin<=qout(4); WHEN"100"=>qin<=qout(3); WHEN"101"=>qin<=qout(2); WHEN"110"=>qin<=qout(1); WHEN"111"=>qin<=qout(0);--93.7k WHENOTHERS=>NULL; ENDCASE;ENDPROCESS;*******************************P2:process(qin) begin ifqin'eventandqin='1'thenq1<=q1+1; endif;ENDPROCESS;*******************************u1:SIN portmap(address=>q1,q=>dout1,inclock=>qin);u2:SQUAR portmap(address=>q1,q=>dout2,inclock=>qin);u3:SANJIAO portmap(address=>q1,q=>dout3,inclock=>qin);u4:JU portmap(address=>q1,q=>dout4,inclock=>qin);U5:DISPLAYportmap(dclk=>CLK,disout=>pout,seld=>ws,selq=>FRE);*******************************SLE<=K1&K2;P3:process(SLE) BEGIN CASESLEIS WHEN"00"=>DOUT<=dout1; WHEN"01"=>DOUT<=dout2; WHEN"10"=>DOUT<=dout3; WHEN"11"=>DOUT<=dout4; WHENOTHERS=>NULL; ENDCASE;ENDPROCESS;endbehav;--*****動態(tài)顯示********動態(tài)顯示*******動態(tài)顯示******動態(tài)顯示************--*****動態(tài)顯示********動態(tài)顯示*******動態(tài)顯示******動態(tài)顯示************--*****動態(tài)顯示********動態(tài)顯示*******動態(tài)顯示******動態(tài)顯示************libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitydisplayis port( dclk:instd_logic; disout:outstd_logic_vector(7downto0); --顯示輸出 seld:outstd_logic_vector(2downto0); --位選 selq:instd_logic_vector(2downto0)); --頻率選擇endentity;architecturebehaveofdisplayis signaldclk1:std_logic; signalc:std_logic_vector(7downto0); signaldis:std_logic_vector(2downto0);beginprocess(dclk) begin ifdclk'eventanddclk='1'then c<=c+1; endif;endprocess;process(c(2)) --dclk8分頻 begin ifc(2)'eventandc(2)='1'then dis<=dis+1; endif; seld<=dis;endprocess;process(selq) begin caseselqis when"111"=> casedisis --93.75KHz when"000"=> disout<="00000000"; when"001"=> disout<="01101111"; when"010"=> disout<="11001111"; when"011"=> disout<="00000111"; when"100"=> disout<="01101101"; when"101"=> disout<="01110111"; when"110"=> disout<="01110110"; when"111"=> disout<="01011011"; endcase; when"110"=> --46.88KHz casedisis when"000"=> disout<="00000000"; when"001"=> disout<="01100110"; when"010"=> disout<="11111101"; when"011"=> disout<="01111111"; when"100"=> disout<="01111111"; when"101"=> disout<="01110111"; when"110"=> disout<="01110110"; when"111"=> disout<="01011011"; endcase; when"101"=> --23.44KHz casedisis when"000"=> disout<="00000000"; when"001"=> disout<="01011011"; when"010"=> disout<="11001111"; when"011"=> disout<="01100110"; when"100"=> disout<="01100110"; when"101"=> disout<="01110111"; when"110"=> disout<="01110110"; when"111"=> disout<="01011011"; endcase; when"100"=> --11.72KHz casedisis when"000"=> disout<="00000000"; when"001"=> disout<="00000110"; when"010"=> disout<="10000110"; when"011"=> disout<="00000111"; when"100"=> disout<="01011011"; when"101"=> disout<="01110111"; when"110"=> disout<="01110110"; when"111"=> disout<="01011011"; endcase; when"011"=> --5.86KHz casedisis when"000"=> disout<="00000000"; when"001"=> disout<="00000000"; when"010"=> disout<="11101101"; when"011"=> disout<="01111111"; when"100"=> disout<="01111101"; when"101"=> disout<="01110111"; when"110"=> disout<="01110110"; when"111"=> disout<="01011011"; endcase; when"010"=> --2.93KHz casedisis when"000"=> disout<="00000000"; when"001"=> disout<="00000000"; when"010"=> disout<="11011011"; when"011"=> disout<="01101111"; when"100"=> disout<="01001111"; when"101"=> disout<="01110111"; when"110"=> disout<="01110110";

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論