基于FPGA的可編程定時(shí)器/計(jì)數(shù)器8253的設(shè)計(jì)與實(shí)現(xiàn)
摘 要:本文介紹了可編程定時(shí)器/計(jì)數(shù)器8253的基本功能,以及一種用VHDL語(yǔ)言設(shè)計(jì)可編程定時(shí)器/計(jì)數(shù)器8253的方法,詳述了其原理和設(shè)計(jì)思想,并利用Altera公司的FPGA器件ACEX 1K予以實(shí)現(xiàn)。
關(guān)鍵詞:FPGA;IP;VHDL
引言
在工程上及控制系統(tǒng)中,常常要求有一些實(shí)時(shí)時(shí)鐘,以實(shí)現(xiàn)定時(shí)或延時(shí)控制,如定時(shí)中斷,定時(shí)檢測(cè),定時(shí)掃描等,還要求有計(jì)數(shù)器能對(duì)外部事件計(jì)數(shù)。要實(shí)現(xiàn)定時(shí)或延時(shí)控制,有三種主要方法:軟件定時(shí)、不可編程的硬件定時(shí)、可編程的硬件定時(shí)器。其中可編程定時(shí)器電路的定時(shí)值及其范圍可以很容易地由軟件來(lái)確定和改變,功能較強(qiáng),使用靈活。Intel的定時(shí)器/計(jì)數(shù)器為可編程定時(shí)器PIT,型號(hào)為8253,改進(jìn)型為8254,就是為完成上述功能而設(shè)計(jì)出來(lái)的一種電路。
隨著ASIC的發(fā)展,在實(shí)際工程中通用的8253PIT芯片表現(xiàn)出如下的不足:1. 計(jì)數(shù)頻率不夠,8253計(jì)數(shù)速率最高2MHz,即使是其改進(jìn)型8254也往往不能滿足一些需要較高計(jì)數(shù)頻率的工程。2. 8253PIT沒(méi)有復(fù)位信號(hào),輸出的初始狀態(tài)不受控制。針對(duì)8253的這些局限性,在實(shí)際工程中往往需要重新設(shè)計(jì)8253,并把8253的部分功能作為一個(gè)獨(dú)立的IP模塊嵌入到設(shè)計(jì)中,以實(shí)現(xiàn)完成某種特定功能的ASIC。
8253的基本功能和內(nèi)部結(jié)構(gòu)
主要功能
* 每片內(nèi)部包含有3個(gè)獨(dú)立的16位計(jì)數(shù)通道;
* 每個(gè)計(jì)數(shù)器都可以按照二進(jìn)制或二—十進(jìn)制計(jì)數(shù);
* 每個(gè)計(jì)數(shù)器的計(jì)數(shù)速率可高達(dá)2MHz;
* 每個(gè)計(jì)數(shù)通道有6種工作方式,可由程序設(shè)置和改變;
* 所有的輸入/輸出電平信號(hào)都與TTL兼容。
內(nèi)部結(jié)構(gòu)
8253的內(nèi)部結(jié)構(gòu)如圖1所示。
1. 數(shù)據(jù)總線緩沖器。這是8253與CPU數(shù)據(jù)總線連接的8位雙向三態(tài)緩沖器,CPU通過(guò)數(shù)據(jù)總線緩沖器將控制命令字和計(jì)數(shù)初值寫入8253芯片,或者從8253計(jì)數(shù)器中讀取當(dāng)前計(jì)數(shù)值。
2. 讀/寫邏輯。這是8253內(nèi)部操作的控制部分。首先有片選信號(hào)CS的控制部分,當(dāng)CS為高時(shí),數(shù)據(jù)總線緩沖器處在三態(tài),系統(tǒng)的數(shù)據(jù)總線脫開(kāi),故不能進(jìn)行編程,也不能進(jìn)行讀寫操作。其次,由這部分選擇讀寫操作的端口(3個(gè)計(jì)數(shù)器及控制字寄存器),并控制數(shù)據(jù)傳送的方向。
3. 控制字寄存器。在8253初始化編程時(shí),由CPU寫入控制字以決定通道的工作方式。此寄存器只能寫入而不能讀出。實(shí)際上,8253的3個(gè)計(jì)數(shù)器通道都有各自的控制字寄存器,存放各自的控制字,初始化編程時(shí),這3個(gè)控制字分三次共用一個(gè)控制端口地址寫入各自的通道.它們是利用最高兩位的狀態(tài)不同來(lái)區(qū)分的。
4. 計(jì)數(shù)器通道。包括計(jì)數(shù)器0、計(jì)數(shù)器1、計(jì)數(shù)器2。它們的結(jié)構(gòu)完全相同,彼此可以按照不同的方式獨(dú)立工作。每個(gè)通道包括:一個(gè)8位的控制寄存器;一個(gè)16位的計(jì)數(shù)初值寄存器;一個(gè)計(jì)數(shù)執(zhí)行部件,他是一個(gè)16位的減法計(jì)數(shù)器;一個(gè)16位的輸出鎖存器。
每個(gè)通道都對(duì)輸入脈沖CLK按二進(jìn)制或二—十進(jìn)制,從預(yù)置值開(kāi)始減1計(jì)數(shù)。當(dāng)預(yù)置值減到零時(shí),從OUT輸出端輸出一信號(hào)。計(jì)數(shù)過(guò)程中,計(jì)數(shù)器受到門控信號(hào)GATE的控制。
8253的設(shè)計(jì)
根據(jù)8253的內(nèi)部結(jié)構(gòu),設(shè)計(jì)8253主要分為兩大部分:總線控制部分和定時(shí)/計(jì)數(shù)部分。
總線控制部分設(shè)計(jì)
這一部分主要完成數(shù)據(jù)的讀/寫,以及控制字的寫入。用VHDL設(shè)計(jì)這部分前,應(yīng)該了解8253的端口選擇(見(jiàn)表1)和控制字(見(jiàn)圖2)。
設(shè)計(jì)的關(guān)鍵在于對(duì)8253端口控制字的掌握。寫信號(hào)到來(lái)時(shí),首先要判斷是控制字還是計(jì)數(shù)初始值。如果是初始值,其中先寫低字節(jié),再寫高字節(jié)部分是重點(diǎn),需要一個(gè)信號(hào)來(lái)判斷寫入的是新數(shù)據(jù)還是上一數(shù)據(jù)沒(méi)寫完的高字節(jié)部分.其他計(jì)數(shù)器的讀/寫大同小異。只要對(duì)8253的端口控制字了解清楚以及對(duì)讀/寫的時(shí)序有一定的了解,這一部分的邏輯很容易用VHDL語(yǔ)言描述出來(lái).該進(jìn)程可對(duì)外發(fā)出控制信號(hào),表示控制字及數(shù)據(jù)寫入完畢,可以進(jìn)行計(jì)數(shù)器的計(jì)數(shù)操作了。該控制信號(hào)可以作為下面介紹的計(jì)數(shù)部分的觸發(fā)信號(hào)。
計(jì)數(shù)器部分設(shè)計(jì)
8253有3個(gè)獨(dú)立的計(jì)數(shù)器,每個(gè)計(jì)數(shù)器有6種工作模式,完成不同的功能?,F(xiàn)以方式4為例介紹VHDL設(shè)計(jì),其他的可以在方式4基礎(chǔ)上加以修改。
這種工作方式,當(dāng)寫入控制字后輸出為高。當(dāng)寫入計(jì)數(shù)值后,再過(guò)一個(gè)時(shí)鐘周期,計(jì)數(shù)執(zhí)行部件獲得計(jì)數(shù)初值,并開(kāi)始減1計(jì)數(shù)。當(dāng)計(jì)數(shù)到0后輸出變低電平,此低電平一直維持一個(gè)時(shí)鐘周期,然后又自動(dòng)變?yōu)楦唠娖?,并一直維持高電平,計(jì)數(shù)器停止計(jì)數(shù)。這種方式計(jì)數(shù)是一次性的,只有輸入新的計(jì)數(shù)值之后,才能開(kāi)始新的計(jì)數(shù)。
下面介紹方式4的設(shè)計(jì)過(guò)程:
CPU寫入控制字后,輸出outs立即復(fù)位,方式4中復(fù)位后outs為高電平。CPU寫入計(jì)數(shù)初值的下一個(gè)CLK脈沖,計(jì)數(shù)初值被送到計(jì)數(shù)執(zhí)行部件并開(kāi)始減1計(jì)數(shù),又經(jīng)過(guò)N個(gè)時(shí)鐘周期后才輸出一個(gè)負(fù)脈沖。當(dāng)GATE=1時(shí),允許計(jì)數(shù),GATE=0時(shí),禁止計(jì)數(shù)。這樣就實(shí)現(xiàn)了方式4基本的軟件觸發(fā)功能。
if clk1'event and clk1='0' then ——時(shí)鐘脈沖下降沿到來(lái)
if gate1='1' then ——門控位為1,允許計(jì)數(shù)
if ce1>"0000000000000001" then
ce1<=ce1-1;
——減1計(jì)數(shù),ce為計(jì)數(shù)執(zhí)行部件
elsif ce1="0000000000000001" then
out1<='0'; ——初值減到1時(shí)輸出低電平
ce1<=ce1-1; ——繼續(xù)減1
elsif ce1="0000000000000000" then
out1<='1'; ——初值減到0時(shí)輸出高電平
end if;
elsif gate1='0' then
——門控位為0,禁止計(jì)數(shù)
null;
end if;
end if;
上面的小程序雖不完整但是卻描述出了方式4的軟件觸發(fā)基本功能。若在計(jì)數(shù)過(guò)程中改變計(jì)數(shù)值,新值寫入后的下一個(gè)CLK周期時(shí),此計(jì)數(shù)值被寫入計(jì)數(shù)執(zhí)行部件并從新的計(jì)數(shù)值開(kāi)始計(jì)數(shù).如果寫入的計(jì)數(shù)值是兩個(gè)字節(jié),那么寫入第一個(gè)字節(jié)時(shí)計(jì)數(shù)不受影響,寫入第二個(gè)字節(jié)后的下一個(gè)時(shí)鐘周期,計(jì)數(shù)執(zhí)行部件獲得新值,并從新值開(kāi)始重新計(jì)數(shù),叫做軟件再觸發(fā).軟件再觸發(fā)功能只要在上面的程序中加入相應(yīng)的判斷信號(hào)和控制信號(hào)即可實(shí)現(xiàn)。
完整的8253寫過(guò)程流程
實(shí)際上完整的8253就是一個(gè)擁有多個(gè)進(jìn)程的復(fù)雜結(jié)構(gòu)體。讀總線過(guò)程、寫總線過(guò)程、每個(gè)計(jì)數(shù)器的6種工作方式都是一個(gè)獨(dú)立的進(jìn)程.進(jìn)程之間是并行的,只要進(jìn)程的敏感信號(hào)發(fā)生變化,該進(jìn)程就被觸發(fā)一次,而進(jìn)程內(nèi)部是按照時(shí)序順序執(zhí)行的。以寫過(guò)程為例,寫總線進(jìn)程本身是靠敏感信號(hào)wr和cs來(lái)觸發(fā)的,無(wú)論寫入控制字還是寫入計(jì)數(shù)初值后,寫總線進(jìn)程都會(huì)對(duì)外發(fā)出信號(hào)以表示某個(gè)計(jì)數(shù)器的控制字寫入完畢或者某個(gè)計(jì)數(shù)器的某個(gè)工作方式的計(jì)數(shù)初值已經(jīng)寫入,可以進(jìn)行計(jì)數(shù)了。而這些信號(hào)又相應(yīng)的作為其他進(jìn)程的敏感信號(hào),進(jìn)程之間的通信就是依靠這些信號(hào)來(lái)完成的。這些進(jìn)程之間都是并發(fā)執(zhí)行的,具體哪個(gè)進(jìn)程被執(zhí)行取決于控制字。圖3給出了寫過(guò)程的流程,讀過(guò)程與之類似。
設(shè)計(jì)結(jié)果驗(yàn)證
本設(shè)計(jì)開(kāi)發(fā)軟件采用Altera公司的集成開(kāi)發(fā)軟件MAX+PLUS II 10.2完成。并用該公司的ACEX 1K系列FPGA芯片予以驗(yàn)證。
之所以選用ACEX 1K系列芯片,是因?yàn)樗且环N低成本高密度的FPGA芯片系列,是首選的中規(guī)模器件產(chǎn)品。它具有如下特點(diǎn):
* ACEX 1K采用查找表(LUT)和EAB(嵌入式陣列塊)相結(jié)合的結(jié)構(gòu),特別適用于實(shí)現(xiàn)復(fù)雜邏輯功能存儲(chǔ)器功能,例如通信中應(yīng)用的數(shù)字信號(hào)處理、多通道數(shù)據(jù)處理、數(shù)據(jù)傳遞和微控制等。
* 典型門數(shù)為1萬(wàn)到10萬(wàn)門,有多達(dá)49152位的RAM(每個(gè)EAB有4096位RAM)。
* 器件內(nèi)核采用2.5V電壓,功耗低,能夠提供高達(dá)250MHz的雙向I/O功能,完全支持33MHz和66MHz的PCI局部總線標(biāo)準(zhǔn)。
* 具有快速連續(xù)式、延時(shí)可預(yù)測(cè)的快速通道互連;具有實(shí)現(xiàn)快速加法器、計(jì)數(shù)器、乘法器和比較器等算術(shù)功能的專用進(jìn)位鏈,以及實(shí)現(xiàn)高速多扇入邏輯功能的專用級(jí)連接。
通過(guò)仿真、綜合,并下載到FPGA中進(jìn)行驗(yàn)證,本設(shè)計(jì)可以很好地實(shí)現(xiàn)其功能。■
參考文獻(xiàn)
1 曾繁泰,陳美金. VHDL程序設(shè)計(jì)
2 林明權(quán). VHDL數(shù)字控制系統(tǒng)設(shè)計(jì)范例
評(píng)論