第一章 緒論
1.1 EDA簡(jiǎn)介
EDA 技術(shù)就是依賴功能強(qiáng)大的計(jì)算機(jī),在EDA工具軟件平臺(tái)上,對(duì)以硬件描述語言HDL為系統(tǒng)邏輯描述手段完成的設(shè)計(jì)文件,自動(dòng)地完成邏輯編譯、化簡(jiǎn)、分割、綜合、布局布線以及邏輯優(yōu)化和仿真測(cè)試,直至實(shí)現(xiàn)既定的電子線路系統(tǒng)功能。EDA技術(shù)使得設(shè)計(jì)者的工作僅限于利用軟件的方式,即利用硬件描述語言和EDA軟件來完成對(duì)系統(tǒng)硬件功能的實(shí)現(xiàn),這是電子設(shè)計(jì)技術(shù)的一個(gè)巨大進(jìn)步。EDA技術(shù)在進(jìn)入21世紀(jì)后,得到了更大的發(fā)展。嵌入式處理器軟核的成熟,使得SOPC步入大規(guī)模應(yīng)用階段。電子技術(shù)領(lǐng)域全方位融入EDA技術(shù),除了日益成熟的數(shù)字技術(shù)外,傳統(tǒng)的電路系統(tǒng)設(shè)計(jì)建模理念發(fā)生了重大的變化。同時(shí),EDA使得電子領(lǐng)域各學(xué)科的界限更加模糊,更加互為包容。這些都利于設(shè)計(jì)人員利用EDA技術(shù)進(jìn)行電子系統(tǒng)設(shè)計(jì),如全定制或半定制ASIC設(shè)計(jì),FPGA/CPLD開發(fā)應(yīng)用和印制電路板。從EDA技術(shù)的特點(diǎn)不難看出,相比于傳統(tǒng)的數(shù)字電子系統(tǒng)或IC設(shè)計(jì),EDA技術(shù)擁有獨(dú)特的優(yōu)勢(shì)。在傳統(tǒng)的數(shù)字電子系統(tǒng)或IC設(shè)計(jì)中,手工設(shè)計(jì)占了較大的比例。因此,也存在很多缺點(diǎn)。例如:復(fù)雜電路的設(shè)計(jì)、調(diào)試十分困難;由于無法進(jìn)行硬件系統(tǒng)仿真,如果某一過程存在錯(cuò)誤,查找和修改十分不便;設(shè)計(jì)過程中產(chǎn)生大量文檔,不易管理;可移植性差等。相比之下,EDA技術(shù)有很大不同。它運(yùn)用HDL對(duì)數(shù)字系統(tǒng)進(jìn)行抽象的行為與功能描述到具體的內(nèi)部線路結(jié)構(gòu)描述,從而可以在電子設(shè)計(jì)的各個(gè)階段、各個(gè)層次進(jìn)行計(jì)算機(jī)模擬驗(yàn)證,保證設(shè)計(jì)過程的正確性,可以大大降低設(shè)計(jì)成本,縮短設(shè)計(jì)周期。由于有各類庫(kù)的支持,能夠完成各種自動(dòng)設(shè)計(jì)過程。它極大地簡(jiǎn)化了設(shè)計(jì)文檔的管理,邏輯設(shè)計(jì)仿真測(cè)試技術(shù)也日益強(qiáng)大。VHDL在現(xiàn)在的EDA設(shè)計(jì)中使用最多,也擁有幾乎所有主流EDA工具的支持。
EDA技術(shù)在硬件實(shí)現(xiàn)方面融合了大規(guī)模集成電路制造技術(shù),IC版圖設(shè)計(jì),ASIC測(cè)試和封裝以及FPGA/CPLD編程下載和自動(dòng)測(cè)試等技術(shù);在計(jì)算機(jī)輔助工程方面融合了計(jì)算機(jī)輔助設(shè)計(jì)(CAD),計(jì)算機(jī)輔助制造(CAM),計(jì)算機(jī)輔助測(cè)試(CAT),計(jì)算機(jī)輔助工程(CAE)技術(shù)以及多種計(jì)算機(jī)語言的設(shè)計(jì)概念;
1.2芯片介紹
主流產(chǎn)品:ALTERA公司 、FLEX公司
產(chǎn)品類型:CPLD:EPROM類型,掉電后程序不丟失。
FPGA:SRAM類型,掉電后程序丟失,必須重新編程。
工作電壓:5V/3.3V/2.5V/1.8V/1.5V
目前主要產(chǎn)品
MAX7000S/AE,MAX3000A系列、FLEX10KE/ACEX1K系列
APEX20K/20KE系列、APEXII系列、Stratix系列
Cyclone(颶風(fēng)) 系列、Excalibur系列
1.3 Cyclone(颶風(fēng))系列介紹
Altera最新一代SRAM工藝中等規(guī)模FPGA:
與Stratix結(jié)構(gòu)類似,是一種低成本FPGA系列:
是目前主流產(chǎn)品,其配置芯片業(yè)改用新的產(chǎn)品
可支持多種擴(kuò)展模塊
攝像頭模塊
VGA模塊
2.4寸彩屏
3.2寸彩屏
7寸高清大屏
以太網(wǎng)模塊
網(wǎng)口模塊
USB模塊
高速AD DA
第二章 模塊介紹
2.1設(shè)計(jì)分析根據(jù)設(shè)計(jì)要求,由于樂曲自動(dòng)演奏機(jī)和硬件電子琴的設(shè)計(jì)已經(jīng)存在,我們對(duì)已有的設(shè)計(jì)進(jìn)行修改,形成兩個(gè)不同功能的模塊,然后采用元件例化,拼接兩個(gè)模塊,同時(shí)附加一個(gè)選擇功能模塊,以實(shí)現(xiàn)樂曲自動(dòng)演機(jī)和硬件電子琴兩個(gè)功能。 2.2硬件電子琴分析對(duì)于硬件電子琴,參考了實(shí)驗(yàn)時(shí)使用的程序,已經(jīng)達(dá)到的要求有: (1)按下key1~key7 分別表示中音的DO、 RE 、 ME、 FA、 SOL、 LA、 S; (2)按下相應(yīng)的鍵有對(duì)應(yīng)LED燈指示。 2.3 樂曲自動(dòng)演奏機(jī)分析對(duì)于樂曲自動(dòng)演奏機(jī),參考了實(shí)驗(yàn)時(shí)使用的程序,已經(jīng)達(dá)到的要求有: (1)可以在電路上能自動(dòng)演奏樂曲,在這里我們采用的是貝多芬的《歡樂頌》 (2)有相應(yīng)的LED燈指示高低音。 而對(duì)于其他要求: (1)晶振為12 MHz. (2)采用CPLD 器件為ALTERA 的EPM7064SL-44。 我們?cè)趯?shí)驗(yàn)箱驗(yàn)證時(shí),先按照實(shí)驗(yàn)箱芯片和晶振進(jìn)行就修改,在實(shí)驗(yàn)箱上確認(rèn)實(shí)驗(yàn)相應(yīng)功能之后,我們?cè)趯?duì)應(yīng)模塊的頻率數(shù)值進(jìn)行修改,并在對(duì)管腳重新鎖定即可 2.4整體設(shè)計(jì)分析整體設(shè)計(jì)要求:用key8實(shí)現(xiàn)兩個(gè)功能切換。添加一個(gè)選擇器,以實(shí)現(xiàn)兩個(gè)功能切換。當(dāng)key8鍵沒有按下時(shí),電路實(shí)現(xiàn)硬件電子琴功能,當(dāng)key8鍵按下之后,電路實(shí)現(xiàn)樂曲自動(dòng)演奏機(jī)。由于不存在現(xiàn)成可以借鑒的,于是,課程設(shè)計(jì)任務(wù)重心就放在了選擇器模塊的編寫以及整體電路的合成上。 頂層模塊輸入輸出: 圖2-1 頂層文件圖形 管腳說明:輸入:時(shí)鐘信號(hào)——clk ,按鍵——[6:0]key ,功能切換鍵——key7 輸出:LED燈——[6:0]led ,蜂鳴器——beep; Key0: DO key1: RE key2: ME key3:FA key4: SOL key5: LA key6: SI key7:功能切換鍵 2.5 設(shè)計(jì)流程
第三章 功能劃分與模塊劃分3.1自動(dòng)演奏模塊自動(dòng)演奏模塊功能:在按下key7鍵后,實(shí)現(xiàn)可以自動(dòng)播放樂曲的功能。 3.2 自動(dòng)演奏設(shè)計(jì)方案(1)根據(jù)樂曲自動(dòng)演奏的基本原理設(shè)計(jì)出適合EDA多功能試驗(yàn)箱的源程序,通過分頻模塊得到12MHZ的晶振;源程序編寫完成,編譯調(diào)試后,在實(shí)驗(yàn)箱上驗(yàn)證其功能; (2)驗(yàn)證模塊是否能完成實(shí)踐要求的所有功能;然后去掉分頻模塊,將功能模塊做適當(dāng)?shù)男薷,編譯調(diào)試成功后,將其下載到CPLD實(shí)驗(yàn)板上。 方案設(shè)計(jì)步驟: (1)在Quartus Ⅱ中建立一個(gè)工程項(xiàng)目文件song.qpf,并在該項(xiàng)目下新建Verilog HDL源程序文件song.v輸入程序代碼并保存。完整的Verilog HDL程序參考程序清單。 (2)然后在該工程選擇目標(biāo)器件并對(duì)相應(yīng)的引腳進(jìn)行鎖定,在這里所選擇器件為Alter公司的EPM7064SL-44芯片。 (3)對(duì)該工程文件進(jìn)行全程編譯處理,若在編譯中發(fā)現(xiàn)錯(cuò)誤,則找出錯(cuò)誤并更正,直到編譯成功。 (4)最后拿出下載電纜,將此電纜的兩端分別接到PC機(jī)的打印機(jī)并口和核心板上的JTAG 接口上,打開電源執(zhí)行下載命令,把程序下載到CPLD器件中。此時(shí)可以得到《歡樂頌》樂曲的演奏以及LED燈的明滅指示其高低音。 3.3硬件電子琴模塊硬件電子琴模塊功能:在按下功能切換鍵key7后,可以實(shí)現(xiàn)電子琴功能,即按下key1 到key7的過程中發(fā)出相應(yīng)的高低音。 3.3.1硬件電子琴設(shè)計(jì)方案(1)根據(jù)硬件電子琴演奏的基本原理設(shè)計(jì)出適合EDA多功能試驗(yàn)箱的源程序,通過分頻模塊得到12MHZ的晶振;源程序編寫完成,編譯調(diào)試后,在實(shí)驗(yàn)箱上驗(yàn)證其功能; (2)驗(yàn)證模塊是否能完成實(shí)踐要求的所有功能;然后去掉分頻模塊,將功能模塊做適當(dāng)?shù)男薷暮,編譯調(diào)試成功后,將其下載到CPLD實(shí)驗(yàn)板上。 3.3.2設(shè)計(jì)步驟(1)在Quarters II中建立一個(gè)工程項(xiàng)目文件beep1.qpf。并在該項(xiàng)目下新建Verilog HDL源程序文件beep1.v,輸入程序代碼并保存,進(jìn)行綜合編譯,若在編譯中發(fā)現(xiàn)錯(cuò)誤,則找出并更正錯(cuò)誤,直至編譯成功為止。 (2)選擇目標(biāo)器件并進(jìn)行引腳鎖定。將未使用的管腳設(shè)置為三態(tài)輸入。 (3)對(duì)該工程文件進(jìn)行全程編譯處理。若在編譯過程中發(fā)現(xiàn)錯(cuò)誤,則找出并更正錯(cuò)誤,直到編譯成功為止。 (4)將產(chǎn)生的beep1.sof輸出對(duì)FPGA進(jìn)行配置。按下按鍵KEY1~KEY8就可以開始使用電子琴來演奏音樂了。
第四章 課程設(shè)計(jì)原理4.1硬件電子琴設(shè)計(jì)原理樂曲演奏的原理是:由于組成樂曲的每個(gè)音符的頻率值(音調(diào))及其持續(xù)時(shí)間(音長(zhǎng))是樂曲演奏的2個(gè)基本數(shù)據(jù),因此需要控制輸出到揚(yáng)聲器的激勵(lì)信號(hào)的頻率高低和該頻率信號(hào)持續(xù)的時(shí)間。頻率的高低決定了音調(diào)的高低,而樂曲的簡(jiǎn)譜與各音名的頻率對(duì)應(yīng)關(guān)系在后面將給出。所有不同頻率的信號(hào)都是從一基準(zhǔn)頻率分頻而得來的,由于音階頻率多為非整數(shù),而分頻系數(shù)有不能為小數(shù),故必須將計(jì)算得到的分頻數(shù)進(jìn)行向下取整,基準(zhǔn)頻率和分頻系數(shù)應(yīng)綜合考慮加以選擇,從而保證音樂不會(huì)走調(diào)。如在48MHz 時(shí)鐘下,中音1(對(duì)應(yīng)的頻率值是523.3Hz)的分頻系數(shù)應(yīng)該為:48000000/(2*523.3)=45863,這樣只需對(duì)系統(tǒng)時(shí)鐘進(jìn)行45863次分頻即可得到所要的中音M1(分頻系數(shù)計(jì)算公式為D=F/2K,由于F/2K之后,會(huì)使分頻系數(shù)D變小,所以功能模塊中語句:beep_r<=!beep_r,使得輸出取反,K=F/2count_end,消除了前面除以2K的影響) 。 4.2樂曲自動(dòng)演奏設(shè)計(jì)原理硬件電路和自動(dòng)演奏的原理同硬件電子琴實(shí)驗(yàn)原理類似。至于其他音符,同樣可由一式求出對(duì)應(yīng)的分頻系數(shù)。在程序中設(shè)置一個(gè)狀態(tài)機(jī),每250ms改變一個(gè)狀態(tài)(即一個(gè)節(jié)拍),組成樂曲的每個(gè)音符的頻率值(音調(diào))相對(duì)應(yīng)于狀態(tài)機(jī)的每一個(gè)狀態(tài)。只要讓狀態(tài)機(jī)的狀態(tài)按順序轉(zhuǎn)換,就可以自動(dòng)演奏播放音樂了。 《歡樂頌》樂曲的簡(jiǎn)譜如圖所示: 圖4-1《歡樂頌》簡(jiǎn)譜圖 4.3各模塊的實(shí)現(xiàn)方法4.3.1選擇器模塊實(shí)現(xiàn)方法我們可以對(duì)輸出進(jìn)行控制。即讓兩個(gè)模塊都工作,但是輸出的部分添加選擇器,有選擇輸出信號(hào)。當(dāng)KEY8沒有按下時(shí),硬件電子琴的模塊輸出接到蜂鳴器和LED燈;當(dāng)KEY8按下時(shí),樂曲自動(dòng)演奏模塊輸出接到蜂鳴器和LED燈。從輸出進(jìn)行控制,通過將蜂鳴和LED燈的輸入和兩個(gè)模塊的輸出有選擇的匹配進(jìn)行切換。通過編譯下載到實(shí)驗(yàn)箱驗(yàn)證可以實(shí)現(xiàn)功能,而且在兩種狀態(tài)的切換時(shí),不會(huì)出現(xiàn)無法控制的狀況。 4.3.2自動(dòng)演奏模塊實(shí)現(xiàn)方法通過參照實(shí)驗(yàn)課本,我們根據(jù)相關(guān)實(shí)驗(yàn)對(duì)試驗(yàn)程序進(jìn)行了簡(jiǎn)單修改,得到了本次自動(dòng)演奏模塊的歌曲《歡樂頌》,實(shí)現(xiàn)其自動(dòng)演奏功能。 對(duì)于自動(dòng)演奏模塊而言,要實(shí)現(xiàn)其功能,只需要在頂層模塊中添加觸發(fā)自動(dòng)演奏模塊的觸發(fā)點(diǎn),在本程序中,即按下key8按鍵,屏蔽掉硬件電子琴的時(shí)鐘信號(hào),而使自動(dòng)演奏模塊的電子時(shí)鐘信號(hào)作為使能信號(hào)。 在自動(dòng)演奏模塊中,首先計(jì)算出各個(gè)音符所對(duì)應(yīng)的參數(shù),對(duì)參數(shù)進(jìn)行定義和設(shè)計(jì)。通過對(duì)晶振的控制實(shí)現(xiàn)每個(gè)音響應(yīng)時(shí)間的長(zhǎng)短并且可以修改相關(guān)參數(shù)實(shí)現(xiàn)音長(zhǎng)的改變。演奏過程中,設(shè)置循環(huán)體,即每次演奏結(jié)束,可以再?gòu)念^開始演奏,從而實(shí)現(xiàn)自動(dòng)演奏的自動(dòng)功能。程序中可以設(shè)置每次循環(huán)時(shí)間,也可以設(shè)置循環(huán)中斷。每個(gè)音符都需要驅(qū)動(dòng)蜂鳴器實(shí)現(xiàn)其功能。 最后,自動(dòng)演奏模塊中,需要有LED燈的指示,對(duì)于這樣的要求,我們?cè)诔绦蜃詈筇砑恿薬ssign賦值語句。實(shí)現(xiàn)了每個(gè)音符響時(shí)對(duì)應(yīng)的LED燈點(diǎn)亮。對(duì)于在實(shí)驗(yàn)中沒有出現(xiàn)的音符所對(duì)應(yīng)的LED燈則設(shè)置為高阻態(tài),從而屏蔽LED燈點(diǎn)亮。 在程序中,通過控制TIME從而得到每個(gè)音階所響應(yīng)的時(shí)間,不同晶振所對(duì)應(yīng)的的時(shí)間為1s,對(duì)應(yīng)的時(shí)間可以控制振蕩次數(shù)實(shí)現(xiàn)控制時(shí)間的長(zhǎng)短。 if(state == 8'd125) state = 8'd0;語句實(shí)現(xiàn)的是自動(dòng)演奏循環(huán)和實(shí)現(xiàn)歌曲演奏長(zhǎng)短。通過系應(yīng)該參數(shù)從而使歌曲唱到想要唱到的部分。 4.3.3硬件電子琴模塊實(shí)現(xiàn)方法在原理部分我們已經(jīng)知道了硬件電子琴和自動(dòng)演奏樂曲的原理是相同的,因此在知道了如何實(shí)現(xiàn)樂曲演奏模塊的方法后,對(duì)于硬件電子琴只需要實(shí)現(xiàn)同樣的方法,就可以實(shí)現(xiàn)其模塊功能,只不過在硬件電子琴模塊中,需要的是利用按鍵實(shí)現(xiàn)其功能。對(duì)于每一個(gè)按鍵,在程序中設(shè)置各按鍵所對(duì)應(yīng)的參數(shù)即可實(shí)現(xiàn)硬件電子琴的功能。 硬件電子琴的功能實(shí)現(xiàn)主要靠蜂鳴器和系數(shù)得到實(shí)現(xiàn)。在試驗(yàn)程序的基礎(chǔ)上進(jìn)行修改系數(shù)而得到?刂瞥绦虻难h(huán)體部分實(shí)現(xiàn)了計(jì)數(shù)和完成清零的操作。通過assign賦值語句實(shí)現(xiàn)LED燈的操作,在這里,我們添加了數(shù)碼管的功能,從而實(shí)現(xiàn)了再按下按鍵的同時(shí),實(shí)現(xiàn)數(shù)碼管顯示相對(duì)應(yīng)的音階大小。
第五章 實(shí)驗(yàn)箱設(shè)計(jì)
5.1硬件電子琴模塊程序圖5-1 硬件電子琴模塊圖 module beep1(clk,key,beep,led); //模塊名稱beep input clk; //系統(tǒng)時(shí)鐘48MHz input[6:0]key; //按鍵輸入 output beep; //蜂鳴器輸出端 output[6:0]led; //LED輸出 reg beep_r; //寄存器 reg[15:0]count,count_end; reg[6:0]key_r; reg [13:0]a; //消抖寄存器 always@(posedge clk) begin count <= count + 1'b1; //計(jì)數(shù)器加1 if((count == count_end)&(!(count_end == 16'hffff))) begin count <= 16'h0; //計(jì)數(shù)器清零 beep_r <= !beep_r; //取反輸出信號(hào) end end always @(key) begin a=2000; //消抖等待時(shí)間 key_r = key; //取鍵值 case(key_r) 7'b1111110:begin while(a>0) begin a=a-1; end count_end = 16'hb327; while(a>0) begin a=a-1; end end 7'b1111101:begin while(a>0)begin a=a-1 ;end count_end = 16'h9fa0;while(a>0)begin a=a-1; end end //中音2的分頻系數(shù)值 7'b1111011:begin while(a>0)begin a=a-1 ;end count_end = 16'h8e32;while(a>0)begin a=a-1; end end //中音3的分頻系數(shù)值 7'b1110111:begin while(a>0)begin a=a-1 ;end count_end16'h8637;while(a>0)begin a=a-1; end end//中音4的分頻系數(shù)值 7'b1101111:begin while(a>0)begin a=a-1 ;end count_end = 16'h7794;while(a>0)begin a=a-1; end end //中音5的分頻系數(shù)值 7'b1011111:begin while(a>0)begin a=a-1 ;end count_end = 16'h6a88;while(a>0)begin a=a-1; end end //中音6的分頻系數(shù)值 7'b0111111:begin while(a>0)begin a=a-1 ;end count_end = 16'h5ee8;while(a>0)begin a=a-1; end end //中音7的分頻系數(shù)值 default: begin while(a>0)begin a=a-1 ;end count_end = 16'hffff;while(a>0)begin a=a-1; end end endcase end assign beep =beep_r; //輸出音樂 assign led =key_r; //輸出按鍵狀態(tài) endmodule 5.2樂曲自動(dòng)演奏機(jī)程序圖5-2 樂曲自動(dòng)演奏模塊圖 module song(clk,beep,led); //模塊名稱 input clk; //系統(tǒng)時(shí)鐘48Mhz output beep; //蜂鳴器輸出端 output[7:0] led; reg beep_r; //寄存器 reg[7:0] state; //樂譜狀態(tài)機(jī) reg[15:0]count,count_end; reg[23:0]count1; //樂譜參數(shù):D=F/2K (D:參數(shù),F:時(shí)鐘頻率,K:音高頻率) //以下是12MHZ晶振狀態(tài)下的各音高對(duì)應(yīng)的參數(shù) /*parameter L_5 = 16'h3bca, //低音5 M_1 = 16'h2cc9, //中音1 M_2 = 16'h27f8, //中音2 M_3 = 16'h238c, //中音3 M_4 = 16'h218d, //中音4 M_5 = 16'h1de5, //中音5 M_6 = 16'h1aa2; //中音6 parameter TIME = 3000000; //控制每一個(gè)音的長(zhǎng)短(250ms)*/ //樂譜參數(shù):D=F/2K (D:參數(shù),F:時(shí)鐘頻率,K:音高頻率) parameter L_5 = 16'd61224, //低音5 M_1 = 16'd45863, //中音1 M_2 = 16'd40864, //中音2 M_3 = 16'd36402, //中音3 M_4 = 16'd34359, //中音4 M_5 = 16'd30612; //中音5 parameter TIME = 12000000; //控制每一個(gè)音的長(zhǎng)短(250ms) assign beep = beep_r; //輸出音樂 ,蜂鳴器 always@(posedge clk) begin count <= count + 1'b1; //計(jì)數(shù)器加1 if(count == count_end) begin count <= 16'h0; //計(jì)數(shù)器清零 beep_r <= !beep_r; //輸出取反 end end always @(posedge clk) begin if(count1 < TIME) //一個(gè)節(jié)拍250mS count1 = count1 + 1'b1; else begin count1 = 24'd0; if(state == 8'd125) //控制歌曲循環(huán)播放時(shí)間 state = 8'd0; //循環(huán)從頭開始 else state = state + 1'b1; //循環(huán)結(jié)構(gòu)體 begin case(state) 8'd0,8'd1: count_end = M_3;//中音"3",持續(xù)2個(gè)節(jié)拍 8'd2,8'd3: count_end = M_3;//中音"3",持續(xù)2個(gè)節(jié)拍 8'd4,8'd5: count_end = M_4;//中音"4",持續(xù)2個(gè)節(jié)拍 8'd6,8'd7: count_end = M_5; 8'd8,8'd9: count_end = M_5; 8'd10,8'd11: count_end = M_4; 8'd12,8'd13: count_end = M_3; 8'd14,8'd15: count_end = M_2; 8'd16,8'd17: count_end = M_1; 8'd18,8'd19: count_end = M_1; 8'd20,8'd21: count_end = M_2; 8'd22,8'd23: count_end = M_3; 8'd24,8'd25,8'd26: count_end = M_3; 8'd27: count_end = M_2; 8'd28,8'd29,8'd30,8'd31: count_end = M_2; 8'd32,8'd33: count_end = M_3; 8'd34,8'd35: count_end = M_3; 8'd36,8'd37: count_end = M_4; 8'd38,8'd39: count_end = M_5; 8'd40,8'd41: count_end = M_5; 8'd42,8'd43: count_end = M_4; 8'd44,8'd45: count_end = M_3; 8'd46,8'd47: count_end = M_2; 8'd48,8'd49: count_end = M_1; 8'd50,8'd51: count_end = M_1; 8'd52,8'd53: count_end = M_2; 8'd54,8'd55: count_end = M_3; 8'd56,8'd57,8'd58: count_end = M_2; 8'd59: count_end = M_1; 8'd60,8'd61,8'd62,8'd63: count_end = M_1; 8'd64,8'd65: count_end = M_2; 8'd66,8'd67: count_end = M_2; 8'd68,8'd69: count_end = M_3; 8'd70,8'd71: count_end = M_1; 8'd72,8'd73: count_end = M_2; 8'd74: count_end = M_3; 8'd75: count_end = M_4; 8'd76,8'd77: count_end = M_3; 8'd78,8'd79: count_end = M_1; 8'd80,8'd81: count_end = M_2; 8'd82: count_end = M_3; 8'd83: count_end = M_4; 8'd84,8'd85: count_end = M_3; 8'd86,8'd87: count_end = M_2; 8'd88,8'd89: count_end = M_1; 8'd90,8'd91: count_end = M_2; //8'd92,8'd93: count_end = L_5; 8'd92,8'd93,8'd94,8'd95: count_end = L_5; //8'd94,8'd95: count_end = M_3; 8'd96,8'd97: count_end = M_3; 8'd98,8'd99: count_end = M_3; 8'd100,8'd101: count_end = M_4; 8'd102,8'd103: count_end = M_5; 8'd104,8'd105: count_end = M_5; 8'd106,8'd107: count_end = M_4; 8'd108: count_end = M_3; 8'd109: count_end = M_2; 8'd110,8'd111: count_end = M_1; 8'd112,8'd113: count_end = M_1; 8'd114,8'd115: count_end = M_2; 8'd116,8'd117: count_end = M_3; 8'd118,8'd119,8'd120: count_end = M_2; 8'd121: count_end = M_1; 8'd122,8'd123,8'd124,8'd125: count_end = M_1; default:count_end = 16'hffff; endcase end end end assign led[0]=(count_end == M_1)?0:1; //控制LED燈的語言 assign led[1]=(count_end == M_2)?0:1; assign led[2]=(count_end == M_3)?0:1; assign led[3]=(count_end == M_4)?0:1; assign led[4]=(count_end == M_5)?0:1; assign led[5]=(count_end == L_5)?0:1; assign led[6]=1; assign led[7]=1; endmodule
5.3 選擇模塊程序 圖5-3選擇模塊圖
module select(key,beep1,beep2,led1,led2,beep,led); input key,beep1,beep2; input [6:0]led1; input [6:0]led2; output beep; output [6:0]led; reg key_r; always @(negedge key) begin key_r = ~key_r; //將琴鍵開關(guān)轉(zhuǎn)換為乒乓開關(guān) end assign beep=(key_r)?beep2:beep1; assign led=(key_r)?led2:led1; endmodule 5.4頂層文件程序
圖5-4頂層文件圖 module dzq(key,key7,beep,led,clk); input key7; input [6:0]key; input clk; output [6:0]led; output beep; reg dout1; reg dout2; reg dout3; reg led; reg key_r; wire a,b,key_l; wire [6:0]c; wire [6:0]d; assign key_l = (dout1 | dout2 | dout3); //按鍵消抖輸出 always @(posedge clk) begin dout1 <= key7; dout2 <= dout1; dout3 <= dout2; end song (.clk(clk),.beep(b),.led(c)); beep1 (.clk(clk),.key(key),.beep(a),.led(d)); select (.key(key_l),.beep1(a),.beep2(b),.beep(beep),.led(led),.led1(d),.led2(c)); endmodule 第六章 實(shí)驗(yàn)圖形文件6.1管腳鎖定圖引腳鎖定:選擇Assignments-pin planer
圖6-1管腳鎖定圖 RTL圖:選擇Tools—netlist viewers—RTL viewers 圖6-2 RTL圖 6.2DXP原理圖及封裝DXP原理圖的設(shè)計(jì): - 執(zhí)行“文件”—“創(chuàng)建”—“項(xiàng)目”—“PCB項(xiàng)目”命令
- 在projects面板上新建一個(gè)項(xiàng)目文件,默認(rèn)名為PCB_Projects.PrjPCB.
- 執(zhí)行“文件”—“保存項(xiàng)目”命令
- 利用libiaries元件庫(kù)進(jìn)行原理圖繪制

圖6-3 dxp原理圖 DXP封裝設(shè)計(jì): - 執(zhí)行“文件”—“創(chuàng)建”—“PCB文件”命令,新建PCB設(shè)計(jì)文件并保存
- 設(shè)置工作層:選擇機(jī)械層設(shè)置物理邊界,在禁止布線層設(shè)置電氣邊界。
- 加載網(wǎng)絡(luò)表:執(zhí)行“設(shè)計(jì)”—Import Changes From DESIGN.PRJPCB命令,單擊“使變化生效”—“執(zhí)行變化”
- 元件自動(dòng)布局:執(zhí)行“工具”—“放置元件”—“自動(dòng)布局”命令
- 元件自動(dòng)布線:執(zhí)行“自動(dòng)布線”—“設(shè)定”—“全部對(duì)象”命令,選擇默認(rèn)設(shè)置,確認(rèn)布線即可
圖6-4封裝圖 6.3任務(wù)完成情況說明 | | | | 按下KEY1—KEY7 分別表示中音的DO、 RE 、 ME、 FA、 SOL、 LA、 SI; | | | 對(duì)于電子琴,按下相應(yīng)的鍵有對(duì)應(yīng)LED燈指示 | | | 可以在電路上能自動(dòng)演奏樂曲。在這里我們采用的是貝多芬的《歡樂頌》,且有相應(yīng)的LED燈指示高低音; | | | 能實(shí)現(xiàn)電子琴和樂曲自動(dòng)演奏功能的切換 | |
表6-5 任務(wù)完成情況表:
6.4硬件連接圖
圖6-6按鍵電路圖 圖6-6 LED燈電路圖 圖6-7 2X5下載插座 圖6-8 蜂鳴器電路圖 圖6-9 晶振電路圖 圖6-10 電源電路圖
總結(jié)
本次EDA課程設(shè)計(jì)進(jìn)一步加深了我們對(duì)實(shí)驗(yàn)課的認(rèn)識(shí)和對(duì)EDA的了解,對(duì)于Verilog HDL語言的運(yùn)用更加的熟練。同時(shí)對(duì)于課程設(shè)計(jì)過程中要進(jìn)行的調(diào)試和編寫程序有了一定的認(rèn)識(shí)。
電子琴使用按鍵的沖突,不得不消除原有模塊的高音階部分,而將其改造出現(xiàn)在的模塊和形式,對(duì)于硬件電子琴的改造,看似是對(duì)原功能塊的簡(jiǎn)單的改進(jìn),而實(shí)際上是需要重新構(gòu)造電路的,因?yàn)樵谘葑嗟倪^程中會(huì)有LED燈的使用沖突,如何調(diào)試和調(diào)用,才是本課程設(shè)計(jì)的重點(diǎn),因?yàn)轫攲游募男枰,我們需要?duì)各自的程序進(jìn)行調(diào)整和修改。目的是為了能夠在最后的開發(fā)平臺(tái)上得到我們想要的結(jié)果。
在這次的課程設(shè)計(jì)過程中,我們采取的分工合作的方式來進(jìn)行課程設(shè)計(jì)是一件很好的事情。大家各有側(cè)重點(diǎn)但是同時(shí)都為課程設(shè)計(jì)做出應(yīng)該做的努力,分工協(xié)作有時(shí)候不僅有利用于課程設(shè)計(jì)的快速進(jìn)行,而且也有利于個(gè)人和小組的交流和促進(jìn),在分工的時(shí)候,每個(gè)人都各盡所長(zhǎng),實(shí)現(xiàn)了又快又好的完成課程任務(wù)的目標(biāo)。最后,特別感謝本次課程設(shè)計(jì)給予我們指導(dǎo)的老師,在老師的知道和啟發(fā)下,我們才能正確的完成課程設(shè)計(jì)。
附錄:項(xiàng)目實(shí)物圖 |