《基于FPGA的現(xiàn)代數(shù)字電路設(shè)計(jì)》-第7章_第1頁(yè)
《基于FPGA的現(xiàn)代數(shù)字電路設(shè)計(jì)》-第7章_第2頁(yè)
《基于FPGA的現(xiàn)代數(shù)字電路設(shè)計(jì)》-第7章_第3頁(yè)
《基于FPGA的現(xiàn)代數(shù)字電路設(shè)計(jì)》-第7章_第4頁(yè)
《基于FPGA的現(xiàn)代數(shù)字電路設(shè)計(jì)》-第7章_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

7.1分頻電路設(shè)計(jì)7.1.1偶數(shù)分頻電路偶數(shù)倍分頻是最簡(jiǎn)單的一種分頻方式,是通過(guò)計(jì)數(shù)器計(jì)數(shù)實(shí)現(xiàn)的,有多種實(shí)現(xiàn)方法。最常用的方法是,如要進(jìn)行N倍偶數(shù)分頻,由待分頻的時(shí)鐘觸發(fā)計(jì)數(shù)器計(jì)數(shù),當(dāng)計(jì)數(shù)器從0計(jì)數(shù)到N/21時(shí),輸出時(shí)鐘進(jìn)行翻轉(zhuǎn),并給計(jì)數(shù)器一個(gè)復(fù)位信號(hào),使得下一個(gè)時(shí)鐘從零開(kāi)始計(jì)數(shù),以此循環(huán)下去。這種方法可以實(shí)現(xiàn)任意的偶數(shù)分頻。給出使用VerilogHDL語(yǔ)言描述的16分頻電路,下一頁(yè)返回7.1分頻電路設(shè)計(jì)

代碼如下上一頁(yè)下一頁(yè)返回7.1分頻電路設(shè)計(jì)

繼續(xù)上一頁(yè)下一頁(yè)返回7.1分頻電路設(shè)計(jì)

上面程序的仿真結(jié)果如圖7.1所示,從中可以看出,在復(fù)位信號(hào)rst為高的情況下,一個(gè)clk_out的周期內(nèi)有16個(gè)clk_in信號(hào),說(shuō)明clk_out的頻率是clk_in的1/16,也就是在計(jì)數(shù)到3'b111時(shí)開(kāi)始翻轉(zhuǎn),從而達(dá)到了16分頻的目的。上一頁(yè)下一頁(yè)返回7.1分頻電路設(shè)計(jì)

7.1.2奇數(shù)分頻電路奇數(shù)倍分頻有多種實(shí)現(xiàn)方法,下面介紹常用的錯(cuò)位“異或”法。如進(jìn)行三分頻,通過(guò)待分頻時(shí)鐘上升沿觸發(fā)計(jì)數(shù)器進(jìn)行模三計(jì)數(shù),當(dāng)計(jì)數(shù)器計(jì)數(shù)到鄰近值進(jìn)行兩次翻轉(zhuǎn)。如在計(jì)數(shù)器計(jì)數(shù)到1時(shí),輸出時(shí)鐘進(jìn)行翻轉(zhuǎn),計(jì)數(shù)到2時(shí)再次進(jìn)行翻轉(zhuǎn),即在鄰近的1和2時(shí)刻進(jìn)行兩次翻轉(zhuǎn),這樣實(shí)現(xiàn)的三分頻占空比為1/3或者2/3。若要實(shí)現(xiàn)占空比為50%的三分頻時(shí)鐘,可以通過(guò)待分頻時(shí)鐘下降沿觸發(fā)計(jì)數(shù),和上升沿同樣的方法計(jì)數(shù)進(jìn)行三分頻,然后將下降沿產(chǎn)生的三分頻時(shí)鐘和上升沿產(chǎn)生的時(shí)鐘進(jìn)行相或運(yùn)算,就可得到占空比為50%的三分頻時(shí)鐘。上一頁(yè)下一頁(yè)返回7.1分頻電路設(shè)計(jì)

這種錯(cuò)位“異或”法可以推廣實(shí)現(xiàn)所有的奇數(shù)分頻:對(duì)于實(shí)現(xiàn)占空比為50%的N倍奇數(shù)分頻,首先采用上升沿觸發(fā)的模N計(jì)數(shù),計(jì)數(shù)到某一選定值時(shí)進(jìn)行輸出時(shí)鐘翻轉(zhuǎn),然后經(jīng)過(guò)(N-1)/2再次翻轉(zhuǎn)得到一個(gè)占空比非50%奇數(shù)N分頻時(shí)鐘。同時(shí)進(jìn)行下降沿觸發(fā)的模N計(jì)數(shù),到和上升沿觸發(fā)輸出時(shí)鐘翻轉(zhuǎn)選定值相同時(shí),進(jìn)行輸出時(shí)鐘翻轉(zhuǎn),同樣經(jīng)過(guò)(N-1)/2時(shí),輸出時(shí)鐘再次翻轉(zhuǎn)生成占空比非50%的奇數(shù)N分頻時(shí)鐘。兩個(gè)占空比非50%的N分頻時(shí)鐘相或運(yùn)算,得到占空比為50%的奇數(shù)N分頻時(shí)鐘。上一頁(yè)下一頁(yè)返回7.1分頻電路設(shè)計(jì)

使用VerilogHDL語(yǔ)言描述的三分頻電路,占空比為50%,代碼如下:moduleclk_div_3(clk_in,rst_n,clk_out);inputclk_in;inputrst_n;outputclk_out;reg[1:0]cnt,cnt1;regclk_1to3p,clk_1to3n;上一頁(yè)下一頁(yè)返回7.1分頻電路設(shè)計(jì)

always@(posedgeclk_in)beginif(!rst_n)begincnt<=0;clk_1to3p<=0;endelsebeginif(cnt==2’b10)begincnt<=0;clk_1to3p<=clk_1to3p;上一頁(yè)下一頁(yè)返回7.1分頻電路設(shè)計(jì)

endelsebegincnt<=cnt+1;clk_1to3p<=!clk_1to3p;endendendalways@(negedgeclk_in)begin上一頁(yè)下一頁(yè)返回7.1分頻電路設(shè)計(jì)

if(!rst_n)begincnt1<=0;clk_1to3n<=0;endelsebeginif(cnt1==2’b10)begincnt1<=0;clk_1to3n<=clk_1to3n;上一頁(yè)下一頁(yè)返回7.1分頻電路設(shè)計(jì)

endelsebegincnt1<=cnt1+1;clk_1to3n<=!clk_1to3n;endendendassignclk_out=clk_1to3n|clk_1to3n;endmodule上一頁(yè)下一頁(yè)返回7.1分頻電路設(shè)計(jì)

上述程序的仿真結(jié)果如圖7.2所示,從中可以看出,在復(fù)位信號(hào)rst_n為高的情況下,一個(gè)clk_out的周期內(nèi)有3個(gè)clk_in信號(hào),表明clk_out的頻率是clk_in的1/3,達(dá)到了三分頻的目的。上一頁(yè)返回7.2同步整形電路在數(shù)字電路設(shè)計(jì)中經(jīng)常需要將外部輸入的異步信號(hào)進(jìn)行同步處理,即讓外部信號(hào)與系統(tǒng)時(shí)鐘同步,有時(shí)候外部輸入信號(hào)為不規(guī)則的波形,則需要對(duì)其進(jìn)行整形,使之成為具有一個(gè)時(shí)鐘周期長(zhǎng)的脈沖波形。同步整形的方法是通過(guò)時(shí)鐘對(duì)外部輸入的異步信號(hào)連續(xù)抽樣而得到同步信號(hào),然后由前后兩次的同步抽樣進(jìn)行邏輯組合,從而得到整形信號(hào)。下面給出利用時(shí)鐘上升沿抽樣得到同步整形設(shè)計(jì)的例子,具體代碼如下:modulesyn_sam(clk,rst_n,din,dout);inputclk;下一頁(yè)返回7.2同步整形電路inputrst_n;inputdin;outputdout;regtemp1,temp2;always@(posedgeclk)beginif(!rst_n)begintemp1<=0;temp2<=0;上一頁(yè)下一頁(yè)返回7.2同步整形電路endelsebegintemp1<=din;temp2<=temp1;endend仿真結(jié)果如圖7.3所示,該程序?qū)斎胄盘?hào)din進(jìn)行兩次抽樣,在時(shí)鐘的上升沿,由dout=temp1&&(~temp2)可知,信號(hào)不是在改變值之后立即變化的,如果din=1小于一個(gè)時(shí)鐘寬,則有temp1=1,temp2=0(雖然進(jìn)程中改變了值,但不會(huì)立即被使用),則dout=1;上一頁(yè)下一頁(yè)返回7.2同步整形電路如果din=1超過(guò)一個(gè)時(shí)鐘寬,則有temp1=1,temp2=1(前次執(zhí)行進(jìn)程后,temp2的值已經(jīng)改變?yōu)?),則dout=0;如果din在時(shí)鐘周期內(nèi)出現(xiàn)抖動(dòng),那么因?yàn)椴粓?zhí)行進(jìn)程,所以輸出無(wú)影響,還是被整成一個(gè)時(shí)鐘寬度。所以不管是輸入信號(hào)din=1的時(shí)間是長(zhǎng)還是短,有效高電平寬度都等于時(shí)鐘的周期。下面使用VHDL語(yǔ)言編寫的同樣功能的程序,代碼如下:libraryieee;useieee.std_logic_1164.all;entitysyn_samisport(din,clk:instd_logic;上一頁(yè)下一頁(yè)返回7.2同步整形電路dout:outstd_logic);endsyn_sam;architecturebehaofsyn_samissignaltemp1,temp2:std_logic;beginprocess(clk)beginifclk'eventandclk='1'then上一頁(yè)下一頁(yè)返回7.2同步整形電路temp1<=din;temp2<=temp1;endif;dout<=temp1&&(~temp2);endprocess;endbeha;上一頁(yè)返回7.3按鍵電路設(shè)計(jì)7.3.1按鍵的連接方式按鍵接口分為獨(dú)立式和矩陣鍵盤式兩大類。獨(dú)立式按鍵是指每個(gè)按鍵都有一個(gè)信號(hào)線與FPGA/CPLD的引腳相連,所有按鍵有一個(gè)公共地和公共正極,每個(gè)按鍵彼此獨(dú)立互不影響。獨(dú)立式按鍵電路結(jié)構(gòu)如圖7.4所示,每個(gè)按鍵一端接地(GND),另一端分兩路,一路通過(guò)一個(gè)10的上拉電阻接電源正極,另一路接入FPGA或CPLD的I/O引腳。當(dāng)按鍵按下,相應(yīng)的I/O引腳直接接地變?yōu)榈碗娖健?’,告訴FPGA或CPLD已按下;當(dāng)按鍵沒(méi)有按下時(shí),相應(yīng)的I/O引腳是高電平‘1’,告訴FPGA或CPLD沒(méi)有按下。下一頁(yè)返回7.3按鍵電路設(shè)計(jì)

矩陣鍵盤式按鍵也是常見(jiàn)的,如手機(jī)鍵盤和ATM機(jī)的輸入鍵盤,其電路結(jié)構(gòu)如圖7.5示。這種鍵盤由行線和列線組成,按鍵位于行、列線的交叉點(diǎn)上,共16個(gè)按鍵。當(dāng)某個(gè)按鍵按下時(shí),按鍵相應(yīng)行線和列線就會(huì)相通,告訴FPGA或CPLD哪個(gè)位置的按鍵已按下。一個(gè)4×4的行、列結(jié)構(gòu)構(gòu)成一個(gè)含有16個(gè)按鍵的鍵盤,卻只占用8個(gè)I/O口線,因此,矩陣鍵盤式按鍵較之獨(dú)立式按鍵可以節(jié)省很多I/O口。上一頁(yè)下一頁(yè)返回7.3按鍵電路設(shè)計(jì)

7.3.2矩陣鍵盤工作原理矩陣鍵盤中識(shí)別按鍵的方法采用掃描法。在圖7.5中的連接方式中,當(dāng)某個(gè)按鍵按下時(shí),按鍵相應(yīng)行線和列線就會(huì)相通,圖中的四根列線分別接在FPGA或CPLD的I/O引腳上,讓這四個(gè)引腳依次輸出“0111”“1011”“1101”“1110”信號(hào),這樣每個(gè)時(shí)刻都有一根列線是低電平,就像低電平信號(hào)在四根列線上不停地掃描一樣。假若某時(shí)刻8號(hào)按鍵按下,第2條行線和第1條列線連通,恰好這時(shí)第1條列線出現(xiàn)低電平,上一頁(yè)下一頁(yè)返回7.3按鍵電路設(shè)計(jì)

那么第2條行線也會(huì)變成低電平,連接第2條行線的I/O引腳也為低電平,該時(shí)刻四根行線的輸入信號(hào)是“1011”,四根列線的輸出信號(hào)是“0111”,出現(xiàn)這種情況,我們就認(rèn)為8號(hào)按鍵被按下,“10110111”被認(rèn)為是8號(hào)按鍵的編碼。按下其他按鍵的機(jī)理基本類似。按鍵掃描模塊的仿真結(jié)果如圖7.6所示。上一頁(yè)下一頁(yè)返回7.3按鍵電路設(shè)計(jì)

7.3.3按鍵防抖電路的設(shè)計(jì)按鍵大多是機(jī)械式開(kāi)關(guān)結(jié)構(gòu),按鍵開(kāi)關(guān)在閉合時(shí)是不會(huì)馬上接通的,在斷開(kāi)時(shí)也不會(huì)一下子斷開(kāi),而是會(huì)產(chǎn)生一系列的抖動(dòng)現(xiàn)象,在釋放按鍵時(shí),按鍵信號(hào)穩(wěn)定前出現(xiàn)了多個(gè)段脈沖。若將這樣的信號(hào)直接送到計(jì)數(shù)器之類的時(shí)序電路,結(jié)果將可能發(fā)生計(jì)數(shù)超過(guò)一次的誤動(dòng)作,被誤以為鍵盤按了多次。因此必須加上抖動(dòng)消除電路,除去雜脈沖。常見(jiàn)的消抖方法可分為軟件和硬件兩種方式。軟件消抖通過(guò)計(jì)數(shù)器對(duì)鍵值進(jìn)行判斷,當(dāng)某一鍵值保持一段時(shí)間不變時(shí),才確認(rèn)其為有效值。簡(jiǎn)單的硬件消抖主要通過(guò)電容的充放電來(lái)消除按鍵的毛刺。上一頁(yè)下一頁(yè)返回7.3按鍵電路設(shè)計(jì)

對(duì)于穩(wěn)定性要求比較高的應(yīng)用,需要借助專門的防抖芯片來(lái)實(shí)現(xiàn)消抖。不同開(kāi)關(guān)的最長(zhǎng)抖動(dòng)時(shí)間也不同,抖動(dòng)時(shí)間的長(zhǎng)短和機(jī)械開(kāi)關(guān)特性有關(guān),一般為5~10ms。也有某些開(kāi)關(guān)的抖動(dòng)時(shí)間長(zhǎng)達(dá)20ms,甚至更長(zhǎng)。一般按鍵按下去的時(shí)間由操作人員決定,通常為零點(diǎn)幾秒至數(shù)秒。用FPGA實(shí)現(xiàn)防抖電路的原理是通過(guò)定期采樣的方法來(lái)實(shí)現(xiàn)的,在一定時(shí)間內(nèi)對(duì)按鍵信息只采樣一次,以避免出現(xiàn)抖動(dòng)現(xiàn)象。在實(shí)現(xiàn)時(shí)需要注意計(jì)數(shù)器的時(shí)間門限的取值,如果門限值太大,即采樣時(shí)間過(guò)長(zhǎng),會(huì)漏掉正確的信號(hào);如果計(jì)數(shù)器的門限值過(guò)小,即采樣時(shí)間太短,則會(huì)將毛刺誤認(rèn)為是正確信號(hào)。一般我們認(rèn)為計(jì)數(shù)器的門限值為50ms。上一頁(yè)返回7.4數(shù)碼管顯示電路設(shè)計(jì)7.4.1數(shù)碼管的工作原理數(shù)碼管是用8段發(fā)光二極管封裝在一起組成的“8”字形器件,如圖7.8(a)所示,數(shù)碼管常用段數(shù)一般為7段另加一個(gè)小數(shù)點(diǎn),每一段是一個(gè)條形發(fā)光二極管,把所有段的陰極相連,并連接到地成為共陰極,如圖7.8(b)所示,另一端接驅(qū)動(dòng)電路輸出端(FPGA輸出引腳);所有段的陽(yáng)極相連,并連接到電源成為共陽(yáng)極,如圖7.8(c)所示,另一端接驅(qū)動(dòng)電路輸出端。驅(qū)動(dòng)輸出端的輸出電壓就決定這些發(fā)光二極管是點(diǎn)亮還是熄滅,這樣驅(qū)動(dòng)輸出端的不同輸出組合就可以使數(shù)碼管顯示不同的數(shù)字,如0~9和字符A~F。要使數(shù)碼管顯示不同的數(shù)字和字符,必須使驅(qū)動(dòng)輸出端輸出相應(yīng)的字形編碼。下一頁(yè)返回7.4數(shù)碼管顯示電路設(shè)計(jì)

7.4.2靜態(tài)顯示原理和FPGA驅(qū)動(dòng)設(shè)計(jì)所謂靜態(tài)顯示,是指在顯示字符時(shí)相應(yīng)的發(fā)光二極管字段固定地接在FPGA引腳上。采用這種顯示方式的各個(gè)數(shù)碼管彼此獨(dú)立,公共端恒定接地或接正電源,每個(gè)數(shù)碼管占用8個(gè)FPGA引腳,F(xiàn)PGA引腳只要有輸出,數(shù)碼管就會(huì)顯示相應(yīng)字符,并保持不變,直到FPGA引腳有新的輸出。采用靜態(tài)顯示方式,其優(yōu)點(diǎn)是較小的電流可獲得較好的亮度,占用CPU時(shí)間少,編程簡(jiǎn)單。其缺點(diǎn)是占用FPGA引腳多,尤其是有多個(gè)數(shù)碼管時(shí)的情況,接線復(fù)雜,成本高。因此靜態(tài)顯示方式只適合顯示位數(shù)較少的場(chǎng)合。上一頁(yè)下一頁(yè)返回7.4數(shù)碼管顯示電路設(shè)計(jì)

7.4.3動(dòng)態(tài)顯示原理和FPGA驅(qū)動(dòng)設(shè)計(jì)假如N個(gè)LED數(shù)碼管以靜態(tài)方式顯示,就需用到8×N條引腳線。在較為復(fù)雜的系統(tǒng)中,F(xiàn)PGA的引腳端資源是有限的,對(duì)于多個(gè)LED數(shù)碼管顯示很不經(jīng)濟(jì),因此采用掃描方式來(lái)實(shí)現(xiàn)LED數(shù)碼管動(dòng)態(tài)顯示。所謂動(dòng)態(tài)掃描顯示,是各個(gè)數(shù)碼管的段選線并聯(lián)在一起,由8位FPGA引腳線控制,每個(gè)數(shù)碼管的片選線連接到另外的FPGA引腳線,各位片選線一次有效,依次點(diǎn)亮各個(gè)LED數(shù)碼管,使各個(gè)數(shù)碼管循環(huán)進(jìn)行顯示,即一個(gè)數(shù)碼管顯示之后另一個(gè)數(shù)碼管馬上顯示,利用人眼的視覺(jué)暫留特性,可以到多個(gè)數(shù)碼管同時(shí)顯示的效果,如圖7.10所示。上一頁(yè)下一頁(yè)返回7.4數(shù)碼管顯示電路設(shè)計(jì)

采用動(dòng)態(tài)掃描方式來(lái)實(shí)現(xiàn)數(shù)碼管動(dòng)態(tài)顯示,需要很好地控制數(shù)碼管之間的延時(shí)。根據(jù)人眼視覺(jué)暫留原理,數(shù)碼管每秒導(dǎo)通16次以上,人眼就無(wú)法分辨LED數(shù)碼管短暫的不亮,認(rèn)為是一直點(diǎn)亮的(其實(shí)LED數(shù)碼管本身是以一定頻率在閃動(dòng)的)。但是,導(dǎo)通頻率也不是越大越好,因?yàn)長(zhǎng)ED數(shù)碼管達(dá)到一定亮度需要一定時(shí)間,如果延時(shí)控制得不好會(huì)出現(xiàn)閃動(dòng),或者亮度不夠。根據(jù)實(shí)踐經(jīng)驗(yàn),最少0.005s可以達(dá)到滿意的效果。修改延時(shí),亦能得到更多的顯示效果,如加長(zhǎng)延時(shí),使得數(shù)碼管顯示一小段時(shí)間,再點(diǎn)亮下一個(gè),可得到數(shù)碼管逐個(gè)顯示的效果。流水燈就是根據(jù)這個(gè)原理設(shè)計(jì)的。上一頁(yè)下一頁(yè)返回7.4數(shù)碼管顯示電路設(shè)計(jì)

另外,當(dāng)顯示的字符有變化時(shí),可在延時(shí)到達(dá)后送一個(gè)低電平(共陰極數(shù)碼管)讓LED數(shù)碼管短暫熄滅,再顯示下一個(gè)字符,這可使得在視覺(jué)上字符的變化更清晰。采用動(dòng)態(tài)掃描方式可以節(jié)約FPGA的I/O引腳數(shù)量,硬件電路也比靜態(tài)顯示方式簡(jiǎn)單,只是亮度要差一些。每次向數(shù)碼管寫數(shù)據(jù)時(shí),需要先選通1個(gè)數(shù)碼管,然后送出該數(shù)碼管需要的顯示數(shù)據(jù)。下面給出一段實(shí)現(xiàn)動(dòng)態(tài)顯示的VHDL程序代碼,其功能是在8個(gè)數(shù)碼管上面分別顯示01234567。上一頁(yè)下一頁(yè)返回7.4數(shù)碼管顯示電路設(shè)計(jì)

在程序中,p1和p2進(jìn)程

溫馨提示

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

評(píng)論

0/150

提交評(píng)論