版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 緒論</b></p><p> 1.1 FPGA背景</p><p> 目前以高速集成硬件描述語言(VHDL)所完成的電路設(shè)計(jì),可以經(jīng)過簡 單的綜合與布局,快速的燒錄至 FPGA 上進(jìn)行測試,是現(xiàn)代 IC 設(shè)計(jì)驗(yàn)證的技術(shù)主流。這些可編輯元件可以被用來實(shí)現(xiàn)一些基本的邏輯門電路(比如AND、OR、XOR、NOT)或者更復(fù)雜一些的組合功能比
2、如解碼器或數(shù)學(xué)方程式。在大多數(shù)的FPGA里面,這些可編輯的元件里也包含記憶元件例如觸發(fā)器(Flip-flop)或者其他更加完整的記憶塊。系統(tǒng)設(shè)計(jì)師可以根據(jù)需要通過可編輯的連接把FPGA內(nèi)部的邏輯塊連接起來,就好像一個電路試驗(yàn)板被放在了一個芯片里。一個出廠后的成品FPGA的邏輯塊和連接可以按照設(shè)計(jì)者而改變,所以FPGA可以完成所需要的邏輯功能。 </p><p> FPGA一般來說比ASIC(專用集成芯片)的速度
3、要慢,無法完成復(fù)雜的設(shè)計(jì),而且消耗更多的電能。但是他們也有很多的優(yōu)點(diǎn)比如可以快速成品,可以被修改來改正程序中的錯誤和更便宜的造價(jià)。廠商也可能會提供便宜的但是編輯能力差的FPGA。因?yàn)檫@些芯片有比較差的可編輯能力,所以這些設(shè)計(jì)的開發(fā)是在普通的FPGA上完成的,然后將設(shè)計(jì)轉(zhuǎn)移到一個類似于ASIC的芯片上。另外一種方法是用CPLD(復(fù)雜可編程邏輯器件備)。</p><p> 1.2 FPGA發(fā)展前景 </p
4、><p> FPGA技術(shù)正處于高速發(fā)展時期,新型芯片的規(guī)模越來越大,成本也越來越低,低端的FPGA已逐步取代了傳統(tǒng)的數(shù)字元件,高端的FPGA不斷在爭奪ASIC的市場份額。先進(jìn)的ASIC生產(chǎn)工藝已經(jīng)被用于FPGA的生產(chǎn),越來越豐富的處理器內(nèi)核被嵌入到高端的FPGA芯片中,基于FPGA的開發(fā)成為一項(xiàng)系統(tǒng)級設(shè)計(jì)工程。隨著半導(dǎo)體制造工藝的不同提高,F(xiàn)PGA 的集成度將不斷提高,制造成本將不斷降低,其作為替代ASIC 來實(shí)現(xiàn)
5、電子系統(tǒng)的前景將日趨光明。</p><p> (1) 大容量、低電壓、低功耗FPGA</p><p> 大容量FPGA 是市場發(fā)展的焦點(diǎn)。FPGA 產(chǎn)業(yè)中的兩大霸主:Altera和Xilinx在超大容量FPGA上展開了激烈的競爭。2007年Altera推出了65nm工藝的StratixIII系列芯片,其容量為67200個L E (Logic Element,邏輯單元),Xilinx推出
6、的65nm工藝的VitexVI系列芯片,其容量為33792個Slices (一個Slices約等于2個L E)。采用深亞微米(DSM)的半導(dǎo)體工藝后,器件在性能提高的同時,價(jià)格也在逐步降低。由于便攜式應(yīng)用產(chǎn)品的發(fā)展,對FPGA 的低電壓、低功耗的要日益迫切。因此,無論那個廠家、哪種類型的產(chǎn)品,都在瞄準(zhǔn)這個方向而努力。</p><p> (2) 系統(tǒng)級高密度FPGA</p><p> 隨
7、著生產(chǎn)規(guī)模的提高,產(chǎn)品應(yīng)用成本的下降,F(xiàn)PGA 的應(yīng)用已經(jīng)不是過去的僅僅適用于系統(tǒng)接口部件的現(xiàn)場集成,而是將它靈活地應(yīng)用于系統(tǒng)級(包括其核心功能芯片)設(shè)計(jì)之中。在這樣的背景下,國際主要FPGA 廠家在系統(tǒng)級高密度FPGA 的技術(shù)發(fā)展上,主要強(qiáng)調(diào)了兩個方面:FPGA 的IP( Intellec2tual Property ,知識產(chǎn)權(quán))硬核和IP軟核。當(dāng)前具有IP內(nèi)核的系統(tǒng)級FPGA的開發(fā)主要體現(xiàn)在兩個方面:一方面是FPGA 廠商將IP硬核
8、(指完成版圖設(shè)計(jì)的功能單元模塊)嵌入到FPGA 器件中,另一方面是大力擴(kuò)充優(yōu)化的IP軟核(指利用HDL語言設(shè)計(jì)并經(jīng)過綜合驗(yàn)證的功能單元模塊),用戶可以直接利用這些預(yù)定義的、經(jīng)過測試和驗(yàn)證的IP 核資源,有效地完成復(fù)雜的片上系統(tǒng)設(shè)計(jì)。</p><p> (3) FPGA和ASIC出現(xiàn)相互融合</p><p> 雖然標(biāo)準(zhǔn)邏輯ASIC 芯片尺寸小、功能強(qiáng)、功耗低,但其設(shè)計(jì)復(fù)雜,并且有批量要求
9、。FPGA價(jià)格較低廉,能在現(xiàn)場進(jìn)行編程,但它們體積大、能力有限,而且功耗比ASIC大。正因如此,F(xiàn)PGA和ASIC正在互相融合,取長補(bǔ)短。隨著一些ASIC制造商提供具有可編程邏輯的標(biāo)準(zhǔn)單元,F(xiàn)PGA 制造商重新對標(biāo)準(zhǔn)邏輯單元發(fā)生興趣。</p><p> (4) 動態(tài)可重構(gòu)FPGA</p><p> 動態(tài)可重構(gòu)FPGA是指在一定條件下芯片不僅具有在系統(tǒng)重新配置電路功能的特性,而且還具有在
10、系統(tǒng)動態(tài)重構(gòu)電路邏輯的能力。對于數(shù)字時序邏輯系統(tǒng),動態(tài)可重構(gòu)FPGA的意義在于其時序邏輯的發(fā)生不是通過調(diào)用芯片內(nèi)不同區(qū)域、不同邏輯資源來組合而成,而是通過對FPGA 進(jìn)行局部的或全局的芯片邏輯的動態(tài)重構(gòu)而實(shí)現(xiàn)的。動態(tài)可重構(gòu)FPGA在器件編程結(jié)構(gòu)上具有專門的特征,其內(nèi)部邏輯塊和內(nèi)部連線的改變,可以通過讀取不同的SRAM中的數(shù)據(jù)來直接實(shí)現(xiàn)這樣的邏輯重構(gòu),時間往往在納秒級,有助于實(shí)現(xiàn)FPGA系統(tǒng)邏輯功能的動態(tài)構(gòu)。</p><
11、;p> 1.3 課程設(shè)計(jì)任務(wù)</p><p> 本課程設(shè)計(jì)中使用Altera公司的EP2C35系列的FPGA芯片,利用SOPC-NIOSII-EP2C35開發(fā)板直流電機(jī)與步進(jìn)電機(jī)模塊等資源,實(shí)現(xiàn)一個直流電機(jī)測控儀。</p><p> ?。?)基本技能掌握:</p><p> 1 掌握時鐘作用下頻率的控制</p><p> 2 掌
12、握十進(jìn)制計(jì)數(shù)器的設(shè)計(jì)</p><p> 3 掌握16位的鎖存器的設(shè)計(jì)</p><p> 4 掌握顯示譯碼功能的設(shè)計(jì)</p><p><b> (2)基本功能要求</b></p><p> 1 利用旋轉(zhuǎn)電位器實(shí)現(xiàn)轉(zhuǎn)速的控制</p><p> 2 利用PWM信號實(shí)現(xiàn)轉(zhuǎn)速的控制</p&g
13、t;<p> 3 利用8位動態(tài)七段碼管顯示實(shí)現(xiàn)轉(zhuǎn)速的顯示</p><p> ?。?)擴(kuò)展功能選擇性要求</p><p> 1 利用4×4鍵盤陣列實(shí)現(xiàn)鍵盤轉(zhuǎn)速的控制</p><p> 2 利用16*16點(diǎn)陣顯示實(shí)現(xiàn)轉(zhuǎn)速級別的顯示</p><p><b> 2 設(shè)計(jì)原理</b></p&
14、gt;<p> 2.1 直流電機(jī)測控總原理</p><p> 直流電機(jī)測控儀總體設(shè)計(jì)硬件由圖2.1所示,F(xiàn)PGA為Altera公司的EP2C35系列,輸入設(shè)備有時鐘、4*4鍵盤、霍爾器件和警報(bào)控制開關(guān)。時鐘采用1MHZ,4*4鍵盤給FPGA輸入一個4位數(shù)組信號,霍爾器件輸入計(jì)數(shù)脈沖。輸出設(shè)備有直流電機(jī)、8位7段字符LED數(shù)碼管、16*16點(diǎn)陣LED,直流電機(jī)可采用直接由旋鈕控制轉(zhuǎn)速或者PWM控制
15、轉(zhuǎn)速,8位7段字符LED數(shù)碼管顯示每分鐘轉(zhuǎn)速,16*16點(diǎn)陣LED顯示速度級別。</p><p> 圖2.1:總體設(shè)計(jì)硬件框架圖</p><p> 2.2 直流電機(jī)與霍爾器件驅(qū)動</p><p> 將直流電源通過電刷接通電樞繞組,使電樞導(dǎo)體有電流流過, 由于電磁作用,這樣電樞導(dǎo)體將會產(chǎn)生磁場。同時產(chǎn)生的磁場與主磁極的的磁場產(chǎn)生電磁力,這個電磁力作用于轉(zhuǎn)子,使轉(zhuǎn)
16、子以一定的速度開始旋轉(zhuǎn),這樣電機(jī)就開始工作。</p><p> 圖2.2:直流電機(jī)結(jié)構(gòu)圖</p><p> 為了能夠測定出電機(jī)在單位時間內(nèi)轉(zhuǎn)子旋轉(zhuǎn)了多少個周期,我們在電機(jī)的外部電路中加入了一個開關(guān)型的霍爾器件,同時在電子轉(zhuǎn)子上的轉(zhuǎn)盤上加入了一個能夠使霍爾原件產(chǎn)生輸出的帶有磁場的磁鋼片。當(dāng)電機(jī)旋轉(zhuǎn)時,帶動轉(zhuǎn)盤是的磁鋼片一起旋轉(zhuǎn),當(dāng)磁鋼片旋轉(zhuǎn)到霍爾器件的上方時,可以導(dǎo)致霍爾器件的輸出端高電
17、平變?yōu)榈碗娖?。?dāng)磁鋼片轉(zhuǎn)過霍爾器件上方后,霍爾器件的輸出端又恢復(fù)高電平輸出。這樣電機(jī)每旋轉(zhuǎn)一周,則會使霍爾器件的輸出端產(chǎn)生一個低脈沖,我們就可以通過檢測單位時間內(nèi)霍爾器件輸出端低脈沖的個數(shù)來推算出直流電機(jī)在單位時間內(nèi)的轉(zhuǎn)速。直流電機(jī)和開關(guān)型霍爾器件的電路原理圖如下圖2.3所示:</p><p> 圖2.3:直流電機(jī)、霍爾器件電路圖</p><p> 直流電機(jī)驅(qū)動有兩種方式,其一是可以由
18、模擬電平來驅(qū)動,把電路圖上4與3短接,可以旋轉(zhuǎn)實(shí)驗(yàn)箱左邊的旋鈕,調(diào)節(jié)旋鈕的可以控制速度;其二是通過PWM控制,把電路圖的6與5短接,PWM信號高電位選通三極管,讓直流電機(jī)轉(zhuǎn)動,不過為了讓直流電機(jī)獲得較大的轉(zhuǎn)速,同樣要把電機(jī)左邊的旋鈕調(diào)到比較大的位置。</p><p><b> 2.3 鍵盤驅(qū)動</b></p><p> 對鍵盤的電位掃描,就可以確定當(dāng)前的鍵有沒有被
19、按下。單個按鍵電路如圖2.4所示,在按鍵沒有被按下時,在判斷電位點(diǎn)可以獲取高電位,在鍵被按下時,在判斷電位為低電位,這樣可以通過判斷點(diǎn)電位的高低即可確定按鍵有沒有被按下。</p><p> 圖2.4:單個按鍵電路圖</p><p> 4*4的鍵盤與FPGA連接圖如下圖3.4所示,掃描鍵盤由FPGA的8個控制端口確定,控制行端口設(shè)置為buffer模式,控制列端口設(shè)置為in模式,掃描鍵盤的
20、方法為先給第一行鍵盤為低電平,其余行列為高電平,讀取縱列的電位值,如果沒鍵被按下,在電位判斷端口獲取的為高電位,如果有鍵按下,電位判斷點(diǎn)的電平不全為零,由電位值的第幾位為零就可以確定當(dāng)前行那個鍵被按下,依次對四行鍵盤掃描,掃描結(jié)束輸出4位數(shù)組的信號,以告訴那個鍵被按下。</p><p> 圖2.5: 4*4鍵盤電路圖</p><p> 2.4 8位7段數(shù)碼管的驅(qū)動</p>
21、<p> 七段數(shù)碼管是電子開發(fā)過程中常用的輸出顯示設(shè)備。在實(shí)驗(yàn)系統(tǒng)中使用的是兩個四位一體、共陰極型七段數(shù)碼管。其單個靜態(tài)數(shù)碼管如下圖2.6所示。高點(diǎn)平點(diǎn)亮數(shù)碼管相應(yīng)的數(shù)碼段。</p><p> 圖2.6 :靜態(tài)七段數(shù)碼管</p><p> 圖2.7:8位7段數(shù)碼管的驅(qū)動</p><p> 如圖2.7 的8位7段數(shù)碼管的連接,由于七段數(shù)碼管公共端
22、連接到GND(共陰極型),當(dāng)數(shù)碼管的中的那一個段被輸入高電平,則相應(yīng)的這一段被點(diǎn)亮。反之則不亮。四位一體的七段數(shù)碼管在單個靜態(tài)數(shù)碼管的基礎(chǔ)上加入了用于選擇哪一位數(shù)碼管的位選信號端口。八個數(shù)碼管的a、b、c、d、e、f、g、h、dp都連在了一起,8個數(shù)碼管分別由各自的位選信號來控制,被選通的數(shù)碼管顯示數(shù)據(jù),其余關(guān)閉。</p><p> 2.5 16*16點(diǎn)LED陣列驅(qū)動</p><p>
23、 單個的LED的電路如下圖2.8所示,對于單個LED的電路圖當(dāng)Rn輸入一個高電平,同時Cn輸入一個低電平時,電路形成一個回路,LED發(fā)光。也就是LED點(diǎn)陣對應(yīng)的這個點(diǎn)被點(diǎn)亮。</p><p> 圖2.8:單個LED電路圖</p><p> 本設(shè)計(jì)要完成速度級別(0到15)在點(diǎn)陣LED上的顯示, 16*16點(diǎn)陣LED掃描的工作原理與8位掃描數(shù)碼管類似,只是顯示的方式與結(jié)果不一樣而已。16
24、*16點(diǎn)陣由此256個LED通過排列組合而形成16行*16列的一個矩陣式的LED陣列。</p><p> 圖2.9:16*16點(diǎn)陣硬件圖</p><p> 16*16點(diǎn)陣LED驅(qū)動時,依次選通LED點(diǎn)陣行端口,每次只能選通一個端口(Cn),字符譯碼的第N列結(jié)果在列端口(Rn)輸入,通過高速依次點(diǎn)亮led點(diǎn)陣就可看到led點(diǎn)陣上顯示的數(shù)字。</p><p> 2
25、.6 PWM控制的原理</p><p> PWM控制就是對脈沖的寬度進(jìn)行調(diào)制的技術(shù)。即通過對一系列脈沖的寬度進(jìn)行調(diào)制來等效地獲得所需要的波形。</p><p> 如下圖2.10所示,設(shè)定值計(jì)數(shù)器設(shè)置PWM信號的占空比。當(dāng)U\D=1,輸入CLK2,使設(shè)定值計(jì)數(shù)值的輸出值增加,PWM的占空比增加,電機(jī)轉(zhuǎn)速加快;當(dāng)U\D=0,輸入CLK2使設(shè)定值計(jì)算器的輸出值減小,PWM的占空比減小,電機(jī)轉(zhuǎn)
26、速變慢。在CLK0的作用下,鋸齒波計(jì)數(shù)器輸出周期性線性增加的鋸齒波。當(dāng)計(jì)數(shù)值小于設(shè)定值時,數(shù)字比較器輸出低電平;當(dāng)計(jì)數(shù)值大于設(shè)定值時,數(shù)字比較器輸出高電平,由此產(chǎn)生周期性的PWM波形。旋轉(zhuǎn)反向控制電路控制直流電動機(jī)轉(zhuǎn)向和啟/停,該電路由兩個2選1多路選擇器組成,Z\F鍵控制選擇PWM波形從正端Z進(jìn)入H橋,還是從負(fù)端進(jìn)入H橋,以控制電機(jī)的旋轉(zhuǎn)方向。START鍵通過“與”門控制PWM的輸出,實(shí)現(xiàn)對電機(jī)的工作/停止控制。H橋電路由大功率晶體管
27、組成,PWM波形通過方向控制電路送到H橋,經(jīng)功率放大以后驅(qū)動電機(jī)轉(zhuǎn)動。</p><p> 圖2.10 PWM控制電路原理圖</p><p><b> 3 程序設(shè)計(jì)</b></p><p> 3.1 總體程序設(shè)計(jì)思路</p><p> 程序總體設(shè)計(jì)分為時鐘控制信號模塊、十進(jìn)制計(jì)數(shù)模塊、顯示模塊、鍵盤模塊、pw
28、m控制模塊、十六位鎖存模塊、彩色led及蜂鳴器控制模塊。設(shè)計(jì)思路為十進(jìn)制計(jì)數(shù)器對霍爾器件的脈沖數(shù)計(jì)數(shù),時鐘控制在到了六秒時將計(jì)數(shù)值鎖存到16位鎖存器,顯示模塊的7段數(shù)碼管顯示鎖存器所鎖存的值,同時鍵盤模塊送出鍵盤所按得鍵值,由點(diǎn)陣LED顯示數(shù)值。</p><p> 3.2 時鐘控制信號程序設(shè)計(jì)</p><p> 時鐘控制信號中要為下級鎖存模塊提供鎖存控制型號,同時為計(jì)數(shù)模塊提使能和清
29、零信號,為蜂鳴器提供1khz的時鐘。設(shè)計(jì)當(dāng)中由Cnttemp對1MHZ的上升緣計(jì)數(shù)來產(chǎn)生1HZ的信號(Cnttemp<5000送出高電平,Cnttemp>5000送出低電平),Count對秒信號計(jì)數(shù),鎖存控制信號在第六秒結(jié)束時送出,清零信號在第7秒送出,所以要先產(chǎn)生秒脈沖。</p><p><b> 1M的時鐘</b></p><p> 是
30、 否</p><p> 小于 等于 大于</p><p><b> 輸出</b></p><p> 圖3.1:時鐘控制信號流程圖</p><p> 注:Enal為輸出控制計(jì)數(shù)器的使能信號。</p><p> Clr為輸
31、出控制計(jì)數(shù)器的清零信號。</p><p> Load為輸出控制鎖存器的鎖存信號。</p><p> 圖3.2: 時鐘控制信號模塊</p><p> 3.3 十進(jìn)制計(jì)數(shù)器程序設(shè)計(jì)</p><p> 設(shè)計(jì)當(dāng)中要顯示當(dāng)前直流電機(jī)的轉(zhuǎn)速,因而要4位十進(jìn)制的計(jì)數(shù)器,對轉(zhuǎn)速脈沖計(jì)數(shù)。設(shè)計(jì)當(dāng)中只需要設(shè)計(jì)一位十進(jìn)制的計(jì)數(shù)器,設(shè)計(jì)當(dāng)中特別注意對進(jìn)位脈沖
32、的處理。</p><p><b> 設(shè)計(jì)流程如下:</b></p><p><b> 計(jì)數(shù)脈沖</b></p><p><b> 是</b></p><p> 是 否</p>
33、;<p> 圖3.3:十進(jìn)制計(jì)數(shù)器程序設(shè)計(jì)流程圖</p><p> 注:CLR為外部輸入的清零信號。</p><p> ENA為外部輸入的計(jì)數(shù)使能信號。</p><p> 十進(jìn)制計(jì)數(shù)器對計(jì)數(shù)脈沖計(jì)數(shù),當(dāng)計(jì)數(shù)值到了9時,計(jì)數(shù)值重新到零,同時在歸零的同時輸出進(jìn)位脈沖。</p><p> 圖3.4十進(jìn)制計(jì)數(shù)模塊</p&
34、gt;<p> 3.4 鎖存模塊程序設(shè)計(jì)</p><p> 16位鎖存模塊設(shè)計(jì)較為簡單,只有在控制信號為高電平時鎖存當(dāng)前輸入的信號值,在低電平時保持鎖存被鎖存的輸入信號。</p><p> 是 否</p><p> 圖3.5: 16位鎖存器設(shè)計(jì)流程</p><p> 注:IN為1
35、6位輸入信號,OUT為16位輸出信號,LOAD為輸入鎖存信號。</p><p> 信號DIN對IN信號進(jìn)行保存,只有在LOAD=’1’時才把IN信號保存到DIN,DIN再傳遞給OUT。</p><p> 圖3.6: 16位鎖存模塊</p><p> 3.5 PWM控制信號程序設(shè)計(jì)</p><p> PWM控制信號為驅(qū)動直流電機(jī)轉(zhuǎn)速的使
36、能信號,PWM控制由四個輸入信號控制pwm的占空比,本設(shè)計(jì)當(dāng)中最高為15/16,由控制信號”1111”獲得,最低為0,由控制信號”0000”獲得。</p><p><b> 流程如</b></p><p><b> 時鐘1MHZ</b></p><p><b> 是</b></p>
37、<p><b> 否</b></p><p><b> 輸出pwm控制信號</b></p><p> 圖3.7:PWM控制流程圖</p><p> 注:DATAIN為輸入數(shù)據(jù)大小</p><p> COUNT對時鐘從0到16000循環(huán)計(jì)數(shù),當(dāng)COUNT=0時把輸出電平置為高電平
38、,COUNT=輸入值*1000時把輸出電平置為低電平,這樣就可以通過外部輸入控制占空比,從而控制直流電機(jī)的轉(zhuǎn)速。</p><p> 圖3.8:PWM控制模塊</p><p> 3.6 鍵盤掃描及顯示模塊程序設(shè)計(jì)</p><p> (1)鍵盤掃描程序設(shè)計(jì)</p><p> PWM控制直流電機(jī)是通過掃描鍵盤的按鍵來控制方波的占空比,所按
39、得鍵值越來,方波的占空比越大,最高可達(dá)15/16,最低為0。鍵盤掃描輸出為一個4為的數(shù)組。掃描簡單的來所就是給行低電平,看列獲得的電位就可確定在此行所按下的鍵。大體流程如下:</p><p><b> 時鐘1MHZ輸入</b></p><p> 是 否</p><p><
40、b> 判斷按鍵</b></p><p><b> 輸出相應(yīng)鍵值</b></p><p> 圖3.9:鍵盤掃描流程圖</p><p> 鍵盤模塊大體設(shè)計(jì)思路為,由信號COUNT對時鐘0到3循環(huán)計(jì)數(shù),在CONT=N時對第N列掃描,判斷列端電位,確定當(dāng)前按鍵的鍵位,輸出鍵值。</p><p> ?。?
41、)顯示模塊程序設(shè)計(jì)</p><p> 顯示模塊分為兩部分,分別為8位7段數(shù)碼管led和16*16點(diǎn)陣LED,由于硬件連接的沖突(7段數(shù)碼管的7段與點(diǎn)陣led的列的低8列連接在FPGA的統(tǒng)一管腳),因此把這兩個顯示部分在統(tǒng)一模塊在驅(qū)動,分時段分別驅(qū)動8位7段數(shù)碼管led和16*16點(diǎn)陣LED。</p><p> 時鐘1MHZ </p><p> 是
42、 否</p><p> 圖3.10:顯示模塊程序流程</p><p> 顯示程序中,我們把十進(jìn)制計(jì)數(shù)器的百、十、個位數(shù)輸入,分別在8位7段數(shù)碼管上的第三、四、五位顯示,設(shè)計(jì)當(dāng)中,只記錄六秒鐘的轉(zhuǎn)速,顯示的為每分鐘的轉(zhuǎn)速,因此第六位LED數(shù)碼管顯示0,其他數(shù)碼管顯示橫線。在設(shè)計(jì)當(dāng)中要注意對輸入的4位數(shù)組譯成LED數(shù)碼
43、管能顯示的7段碼(如”0001”譯碼為“01100000“)。點(diǎn)陣LED顯示也需要譯碼,按每列譯碼。點(diǎn)陣LED每次點(diǎn)亮一列,高速點(diǎn)亮就可以在陣面上看到顯示漢字或者數(shù)字。</p><p> 圖3.11:鍵盤掃描及顯示模塊 </p><p> 3.7警報(bào)控制及彩色LED模塊程序設(shè)計(jì) </p><p> 此模塊為自己添加的設(shè)計(jì)模塊,考慮到
44、直流電機(jī)的轉(zhuǎn)速,將其劃分為高、中、低三個等次,高速為轉(zhuǎn)速超過4000R/MIN,低速為轉(zhuǎn)速低于2000R/MIN,中速介于兩者之間,用紅、綠、藍(lán)三個彩色LED 顯示當(dāng)前的速度屬于哪個速度層次。設(shè)計(jì)當(dāng)中另外把5000R/MIN 設(shè)為警戒速度,當(dāng)電機(jī)轉(zhuǎn)速超過警戒速度時,就會觸發(fā)警報(bào)(揚(yáng)聲器發(fā)出間隔為1 秒的的響聲),當(dāng)然超過警戒速度的警報(bào)是可以通過警報(bào)開關(guān)關(guān)閉的。</p><p> 圖3.12:警報(bào)控制及彩色LED
45、模塊</p><p><b> 設(shè)計(jì)過程介紹</b></p><p><b> 4.1 設(shè)計(jì)過程</b></p><p><b> ?。?)測速顯示</b></p><p> 當(dāng)電機(jī)旋轉(zhuǎn)時,帶動轉(zhuǎn)盤是的磁鋼片一起旋轉(zhuǎn),當(dāng)磁鋼片旋轉(zhuǎn)到霍爾器件的上方時,可以導(dǎo)致霍爾器件的輸出
46、端高電平變?yōu)榈碗娖?。?dāng)磁鋼片轉(zhuǎn)過霍爾器件上方后,霍爾器件的輸出端又恢復(fù)高電平輸出。這樣電機(jī)每旋轉(zhuǎn)一周,則會使霍爾器件的輸出端產(chǎn)生一個低脈沖,我們就可以通過檢測單位時間內(nèi)霍爾器件輸出端低脈沖的個數(shù)來推算出直流電機(jī)在單位時間內(nèi)的轉(zhuǎn)速。</p><p> 電機(jī)的轉(zhuǎn)速通常是指每分鐘電機(jī)的轉(zhuǎn)速,也就是單位為rpm,實(shí)際測量過程中,為了減少轉(zhuǎn)速刷新的時間,通常都是5~10秒刷新一次。如果每6秒鐘刷新一次,那么相當(dāng)于只記錄了
47、6秒鐘內(nèi)的電機(jī)轉(zhuǎn)數(shù),把記錄的數(shù)據(jù)乘10即得到一分鐘的轉(zhuǎn)速。最后將這個數(shù)據(jù)在數(shù)碼管上顯示出來。為了使顯示的數(shù)據(jù)能夠在數(shù)碼管是顯示穩(wěn)定,在這個數(shù)據(jù)的輸出時加入了一個16位的鎖存器,把鎖存的數(shù)據(jù)送給數(shù)碼管顯示,這樣就來會因?yàn)樵谟?jì)數(shù)過程中,數(shù)據(jù)的變化而使數(shù)碼管顯示不斷變化。</p><p> ?。?)pwm產(chǎn)生控制</p><p> 通過控制占空比,從而達(dá)到控制直流電機(jī)控制。用按鍵先預(yù)設(shè)一個速度
48、值,讓電動機(jī)的實(shí)際轉(zhuǎn)速與預(yù)設(shè)值比較,如果不相等,就調(diào)節(jié)占空比使之達(dá)到預(yù)設(shè)值</p><p> 4.2 遇到的問題及解決方案</p><p> 問題一:PWM 控制方式下,直流電機(jī)速度太低</p><p> 解決方法:初始在用時,發(fā)現(xiàn)只有用旋律控制時,直流電機(jī)的速度才能提升,在PWM控制時,速度很低。我最初以為是PWM的周期太長,后發(fā)現(xiàn)將周期縮短依然無濟(jì)于事,
49、哪怕PWM信號占空比到了1,直流電機(jī)的速度依然非常低。后來查閱了電路圖發(fā)現(xiàn),PWM信號只是在高電位選通三極管來驅(qū)動直流電機(jī),而決定直流電機(jī)所獲得的電壓由電機(jī)左邊的旋鈕控制,因此只需要把旋鈕調(diào)大即可提高PWM控制方式下的直流電機(jī)的轉(zhuǎn)速。</p><p> 問題二:數(shù)碼管顯示的速度跳動很大</p><p> 解決方法:通過把占空比從100分頻調(diào)到1000,這樣占空比沒變化1速度的變化就會減
50、少。</p><p><b> 4.3 設(shè)計(jì)體會</b></p><p> 本次課程設(shè)計(jì)為期2周,在這兩周中,我們經(jīng)歷了從什么都不懂,到有些了解,到逐漸熟悉EDA各軟件使用,及VHDL語言的運(yùn)用幾個過程。在此過程中我學(xué)到了很多書本上學(xué)不到的東西,同時也鞏固了以前所學(xué)的知識。在做子模塊編寫的時候遇到了很多問題,開始時什么都不知道,就到網(wǎng)上搜集資料,查看老師給的資料,
51、再不懂的就問老師,后來弄清了其中的原理后,經(jīng)過多次練習(xí),逐漸能夠解決編寫程序中的問題,把模塊編寫出來。然而,在仿真時,也遇到了一點(diǎn)困難,想要的結(jié)果不能得到正確的顯示,但是經(jīng)過對結(jié)果的一點(diǎn)點(diǎn)分析,從錯誤中思考產(chǎn)生錯誤的原因,修改電路圖,最終得到想要的結(jié)果,完成了本次課程設(shè)計(jì)。</p><p> 通過這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實(shí)踐相結(jié)合起來,從
52、理論中得出結(jié)論,從而提高自己的實(shí)際動手能力和獨(dú)立思考的能力,才能真正為社會服務(wù)。</p><p> 在此,也要感謝同組的成員,我基礎(chǔ)不好,很多都不懂,感謝他在這兩周的無私幫助,細(xì)心講解,還要感謝給予我們悉心指導(dǎo)的老師,在這兩周中,多虧您們不厭其煩的指教。謝謝!</p><p><b> 參考文獻(xiàn)</b></p><p> [1] 《SOP
53、CIIEDA實(shí)驗(yàn)指導(dǎo)書》(第二版)</p><p> [2] 《SOPCII使用手冊》(第二版)</p><p> [3] 《EDA技術(shù)基礎(chǔ)》. 譚會生編著. 湖南大學(xué)出版社,2004</p><p> [4] 《EDA技術(shù)實(shí)用教程(第二版),潘松、黃繼業(yè)編著 ,科學(xué)出版社 ,2005</p><p><b> 附錄A:設(shè)
54、計(jì)程序</b></p><p> 時鐘控制信號模塊程序</p><p> library ieee;</p><p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_arith.all;</p><p> use ieee.std
55、_logic_unsigned.all;</p><p> --------------------------------------------------------------------</p><p> entity teltcl is</p><p> port( Clk : in std_logic; --時鐘輸入1M
56、hz</p><p> ena : out std_logic; --允許計(jì)數(shù)</p><p> clr : out std_logic; --計(jì)數(shù)器清零信號產(chǎn)生</p><p> clkhz : out std_logic; --秒脈沖信號產(chǎn)生</p><p> c
57、lkkhz : out std_logic; --1KHZ脈沖產(chǎn)生</p><p> load : out std_logic --鎖存、顯示輸出允許</p><p><b> ); </b></p><p> end teltcl;</p><p> -----
58、---------------------------------------------------------------</p><p> architecture behave of teltcl is</p><p> signal clk1hz :std_logic;--1HZ時鐘信號</p><p> signal clk1khz
59、:std_logic;</p><p> signal count : std_logic_vector(2 downto 0);--6秒計(jì)數(shù)</p><p> signal clr1 :std_logic;--清零信號</p><p> signal ena1 :std_logic;--允許計(jì)數(shù)信號</p>&
60、lt;p> signal load1 :std_logic;--允許計(jì)數(shù)信號</p><p> signal cq1,cq2,cq3,cq4 : INTEGER RANGE 0 TO 15;--計(jì)數(shù)數(shù)據(jù)</p><p><b> begin</b></p><p> process(clk) --1HZ信號產(chǎn)生&l
61、t;/p><p> variable cnttemp : INTEGER RANGE 0 TO 999999;</p><p> variable count : integer range 0 to 999;</p><p><b> begin</b></p><p> IF clk='1'
62、AND clk'event THEN </p><p> IF cnttemp=999999 THEN cnttemp:=0; </p><p><b> ELSE </b></p><p> IF cnttemp<500000 THEN clk1hz<='1'; </p><p&g
63、t; ELSE clk1hz<='0'; </p><p><b> END IF; </b></p><p> cnttemp:=cnttemp+1; </p><p><b> END IF; </b></p><p> if count=999 then cou
64、nt:=0;</p><p><b> else</b></p><p> if count<500 then clk1khz<='1';</p><p> else clk1khz<='0';</p><p><b> end if;</b>
65、;</p><p> count:=count+1;</p><p><b> end if;</b></p><p><b> end if;</b></p><p> clkhz<=clk1hz;clkkhz<=clk1khz;</p><p>
66、end process;</p><p> process(Clk1hz)--6秒計(jì)數(shù)</p><p><b> begin</b></p><p> if(Clk1hz'event and Clk1hz='1') then</p><p> count<=count+1;</
67、p><p> if count<6 then</p><p> ena1<='1';load1<='0';clr1<='0';</p><p> elsif count=6 then</p><p> load1<='1';ena1&l
68、t;='0';clr1<='0';</p><p> elsif count=7 then</p><p> ena1<='0';load1<='0';clr1<='1';</p><p><b> end if;</b><
69、;/p><p><b> end if;</b></p><p> ena<=ena1; load<=load1;clr<=clr1;</p><p> end process;</p><p> end behave;</p><p> 十進(jìn)制計(jì)數(shù)器模塊程序 </
70、p><p> LIBRARY IEEE;</p><p> USE IEEE.STD_LOGIC_1164.ALL; </p><p> ENTITY CNT10 IS</p><p> PORT (CLK:IN STD_LOGIC; --計(jì)數(shù)時鐘信號</p><p> CLR:IN STD_L
71、OGIC; --清零信號</p><p> ENA:IN STD_LOGIC; --計(jì)數(shù)使能信號</p><p> CQ :OUT INTEGER RANGE 0 TO 15;--4位計(jì)數(shù)結(jié)果輸出</p><p> CARRY_OUT:OUT STD_LOGIC); --計(jì)數(shù)進(jìn)位</p><p> END
72、 CNT10;</p><p> ARCHITECTURE ART OF CNT10 IS </p><p> SIGNAL CQI :INTEGER RANGE 0 TO 15;</p><p><b> BEGIN</b></p><p> PROCESS(CLK,ENA) IS</p>&l
73、t;p><b> BEGIN</b></p><p> IF CLR= '1' THEN CQI<= 0; ----計(jì)數(shù)器異步清零</p><p> elsIF CLK'EVENT AND CLK= '1' THEN </p><p> IF ENA
74、= '1' THEN </p><p> iF CQI=10 THEN cqi<=1;</p><p> ELSE CQI<=cqi+1;</p><p> END IF; ----等于9,則計(jì)數(shù)器清零</p><p><b> END IF;</b></p>&l
75、t;p><b> END IF;</b></p><p> END PROCESS;</p><p> PROCESS (CQI) IS</p><p><b> BEGIN</b></p><p> IF CQI=10 THEN CARRY_OUT<= '1'
76、; ----進(jìn)位輸出</p><p> ELSE CARRY_OUT<= '0';</p><p><b> END IF;</b></p><p> END PROCESS;</p><p><b> CQ<=CQI;</b></p>&l
77、t;p><b> END ART;</b></p><p><b> 鍵盤掃描及顯示程序</b></p><p> library ieee;</p><p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_ari
78、th.all;</p><p> use ieee.std_logic_unsigned.all;</p><p> --------------------------------------------------------------------</p><p> entity exp13 is</p><p> port(
79、Clk : in std_logic; --時鐘信號</p><p> buff1,buff2,buff3,buff4 : in integer range 0 to 9;</p><p> Kr : in std_logic_vector(3 downto 0); --
80、鍵盤行</p><p> Kc : buffer std_logic_vector(3 downto 0); --鍵盤列</p><p> a,b,c,d,e,f,g,dp : out std_logic;</p><p> Sa,sb,sc : buffer
81、std_logic; --七段碼管片選</p><p> dot_c : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);</p><p> dot_r : out std_logic_vector(7 downto 0);</p><p> yangbo
82、 : out integer range 0 to 15;</p><p> led : out std_logic_vector(7 downto 0)</p><p><b> );</b></p><p> end exp13;</p><p&g
83、t; --------------------------------------------------------------------</p><p> architecture behave of exp13 is</p><p> signal keyr,keyc : std_logic_vector(3 downto 0);</p><p&g
84、t; signal kcount : std_logic_vector(2 downto 0);</p><p> signal dcount : std_logic_vector(1 downto 0);</p><p> signal kflag1,kflag2 : std_logic;</p><p> signal buf
85、f8 : integer range 0 to 15;</p><p> signal Disp_Temp : integer range 0 to 15; --掃描鍵值</p><p> signal Disp_Decode : std_logic_vector(7 downto 0);</p><p> signal s
86、 : std_logic_vector(3 downto 0);</p><p> signal key : std_logic_vector(15 downto 0);</p><p> FUNCTION seg_code(a: in integer) return std_logic_vector is</p>
87、<p><b> begin</b></p><p><b> case a is</b></p><p> when 0=>return "00111111"; --'0'</p><p> when 1=>return "00000110
88、"; --'1'</p><p> when 2=>return "01011011"; --'2'</p><p> when 3=>return "01001111"; --'3'</p><p> when 4=>return
89、"01100110"; --'4'</p><p> when 5=>return "01101101"; --'5'</p><p> when 6=>return "01111101"; --'6'</p><p> when
90、 7=>return "00000111"; --'7'</p><p> when 8=>return "01111111"; --'8'</p><p> when 9=>return "01101111"; --'9'</p>&
91、lt;p> when 10=>return "01110111"; --'A'</p><p> when 11=>return "01111100"; --'b'</p><p> when 12=>return "00111001"; --'C'
92、;</p><p> when 13=>return "01011110"; --'d'</p><p> when 14=>return "01111001"; --'E'</p><p> when 15=>return "01110001";
93、 --'-'</p><p> when others=>return "00000000"; --全滅</p><p> end case; </p><p> end seg_code;</p><p><b> begin</b></p>&
94、lt;p> yangbo<=buff8;</p><p> Disp_Temp<=buff8;</p><p> a<=Disp_Decode(0);</p><p> b<=Disp_Decode(1);</p><p> c<=Disp_Decode(2);</p><p&
95、gt; d<=Disp_Decode(3);</p><p> e<=Disp_Decode(4);</p><p> f<=Disp_Decode(5);</p><p> g<=Disp_Decode(6);</p><p> dp<=Disp_Decode(7);</p><p
96、> process(clk) --掃描鍵盤 </p><p><b> begin</b></p><p> if(Clk'event and Clk='1') then </p><p> if(Kr="1111") then</p><p> kfl
97、ag1<='0';</p><p> kcount<=kcount+1;</p><p> if(kcount=0) then</p><p> kc<="1110";</p><p> elsif(kcount=1) then</p><p> kc&l
98、t;="1101";</p><p> elsif(kcount=2) then</p><p> kc<="1011";</p><p><b> else</b></p><p> kc<="0111"; </p><
99、p><b> end if;</b></p><p><b> else</b></p><p> kflag1<='1';</p><p><b> keyr<=Kr;</b></p><p><b> keyc<=
100、Kc;</b></p><p><b> end if;</b></p><p> kflag2<=kflag1;</p><p><b> end if; </b></p><p> end process; </p><p> process
101、(Clk) -- 獲取鍵值</p><p><b> begin</b></p><p> if(Clk'event and Clk='1') then</p><p> if(kflag1='1' and kflag2='0') then</p><p>
102、 if(keyr="0111") then</p><p> case keyc is</p><p> when "0111"=>buff8<=1; </p><p> when "1011"=>buff8<=4; </p><p> when
103、"1101"=>buff8<=7; </p><p> when "1110"=>buff8<=14; </p><p> when others=>buff8<=buff8; --no change</p><p><b> end case;</b>
104、;</p><p> elsif(keyr="1011") then</p><p> case keyc is</p><p> when "0111"=>buff8<=2; </p><p> when "1011"=>buff8<=5; &l
105、t;/p><p> when "1101"=>buff8<=8; </p><p> when "1110"=>buff8<=0; </p><p> when others=>buff8<=buff8; --no change</p><p>&l
106、t;b> end case;</b></p><p> elsif(keyr="1101") then</p><p> case keyc is</p><p> when "1110"=>buff8<=15; </p><p> when "110
107、1"=>buff8<=9; </p><p> when "1011"=>buff8<=6; </p><p> when "0111"=>buff8<=3;</p><p> when others=>buff8<=buff8; --no chan
108、ge</p><p><b> end case;</b></p><p> elsif(keyr="1110") then</p><p> case keyc is</p><p> when "1110"=>buff8<=13; </p>
109、<p> when "1101"=>buff8<=12; </p><p> when "1011"=>buff8<=11; </p><p> when "0111"=>buff8<=10;</p><p> when others=>buff
110、8<=buff8; --no change</p><p><b> end case;</b></p><p><b> end if;</b></p><p> end if; </p><p><b> end if; <
111、/b></p><p> end process;</p><p> process(clk)</p><p><b> begin</b></p><p> if(clk'event and clk='1') then --掃描累加 </p><p>
112、 dcount<=dcount+1;</p><p> case dcount is</p><p> when "00"=> Disp_Decode<=seg_code(buff1);</p><p> when "01"=> Disp_Decode<=seg_code(buff2);
113、</p><p> when "10"=> Disp_Decode<=seg_code(buff3);</p><p> when "11"=> Disp_Decode<=seg_code(buff4);</p><p><b> end case;</b></p>
114、;<p> sa<=dcount(0);</p><p> sb<=dcount(1);</p><p><b> sc<='0';</b></p><p><b> end if;</b></p><p> end process;<
115、/p><p> process (clk)</p><p><b> begin</b></p><p> if (clk'event and clk='1')then</p><p><b> s<=s+"1";</b></p>
116、<p> if (s="1111") then</p><p> s<="1000";</p><p><b> end if;</b></p><p><b> end if;</b></p><p> end process; &
117、lt;/p><p> process (s)</p><p><b> begin</b></p><p><b> case s is</b></p><p> when "1000"=>dot_r<="01111111"; </p&g
118、t;<p> when "1001"=>dot_r<="10111111";</p><p> when "1010"=>dot_r<="11011111";</p><p> when "1011"=>dot_r<="111
119、01111"; </p><p> when "1100"=>dot_r<="11110111";</p><p> when "1101"=>dot_r<="11111011"; </p><p> when "1110"=&
120、gt;dot_r<="11111101"; </p><p> when "1111"=>dot_r<="11111110";</p><p> when others=>dot_r<="11111111"; </p><p> end case; &
121、lt;/p><p> end process;</p><p> process(s,Disp_Temp)</p><p><b> begin</b></p><p> if (Disp_Temp=0) then </p><p> led<="11000000"
122、; --十位LED顯示0 </p><p><b> case s is</b></p><p> when "1000"=>dot_c<=not"111111111
123、1111111"; --列顯示0</p><p> when "1001"=>dot_c<=not"1111000000001111";</p><p> when "1010"=>dot_c<=not"1110111111110111";</p><p
124、> when "1011"=>dot_c<=not"1101111111111011";</p><p> when "1100"=>dot_c<=not"1101111111111011";</p><p> when "1101"=>dot_c&
125、lt;=not"1110111111110111";</p><p> when "1110"=>dot_c<=not"1111000000001111";</p><p> when "1111"=>dot_c<=not"1111111111111111";&l
126、t;/p><p> when others=>dot_c<="0000000000000000";</p><p> end case; </p><p> elsif (Disp_Temp=1) then</p><p> led<="11000000";
127、 --十位LED顯示0 </p><p><b> case s is</b></p><p> when "1000"=>dot_c<=not"1111111111111111";
128、--顯示1</p><p> when "1001"=>dot_c<=not"1011111110111111";</p><p> when "1010"=>dot_c<=not"1011111111101111";</p><p> when "
129、;1011"=>dot_c<=not"1011111111110111";</p><p> when "1100"=>dot_c<=not"1000000000000011";</p><p> when "1101"=>dot_c<=not"101
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- eda課程設(shè)計(jì)--直流電機(jī)測控儀
- eda實(shí)驗(yàn)直流電機(jī)測控系統(tǒng)設(shè)計(jì)
- 直流電機(jī)課程設(shè)計(jì)--直流電機(jī)控制系統(tǒng)設(shè)計(jì)
- 直流電機(jī)調(diào)速課程設(shè)計(jì)
- 課程設(shè)計(jì)---直流電機(jī)速度控制
- 直流電機(jī)閉環(huán)調(diào)速課程設(shè)計(jì)
- 直流電機(jī)測速系統(tǒng)課程設(shè)計(jì)
- 直流電機(jī)順序控制課程設(shè)計(jì)報(bào)告
- 直流電機(jī)串電阻啟動課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-直流電機(jī)
- 微機(jī)接口課程設(shè)計(jì)--直流電機(jī)控制
- 直流電機(jī)無極調(diào)速系統(tǒng)課程設(shè)計(jì)
- 電力電子課程設(shè)計(jì)-直流電機(jī)調(diào)速
- 直流電機(jī)雙閉環(huán)系統(tǒng)課程設(shè)計(jì)
- 課程設(shè)計(jì)--直流電機(jī)調(diào)速控制的設(shè)計(jì)
- 直流電機(jī)轉(zhuǎn)速測量與控制課程設(shè)計(jì)
- 電機(jī)拖動課程設(shè)計(jì)--直流電機(jī)調(diào)速系統(tǒng)的設(shè)計(jì)
- 直流電機(jī)
- 電子課程設(shè)計(jì)報(bào)告(直流電機(jī)轉(zhuǎn)速測量)
- 基于ppga的直流電機(jī)控制課程設(shè)計(jì)
評論
0/150
提交評論