<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 汽車電子 > 設(shè)計應(yīng)用 > 基于FPGA的可編程定時器/計數(shù)器8253的設(shè)計與實現(xiàn)

          基于FPGA的可編程定時器/計數(shù)器8253的設(shè)計與實現(xiàn)

          作者:■ 中國科學(xué)院 研究生院 閆永志中國科學(xué)院 沈陽計算技術(shù)研究所 劉偉 何方 時間:2005-04-27 來源:eaw 收藏

          摘    要:本文介紹了可編程定時器/計數(shù)器8253的基本功能,以及一種用語言設(shè)計可編程定時器/計數(shù)器8253的方法,詳述了其原理和設(shè)計思想,并利用Altera公司的器件ACEX 1K予以實現(xiàn)。
          關(guān)鍵詞:;

          引言
          在工程上及控制系統(tǒng)中,常常要求有一些實時時鐘,以實現(xiàn)定時或延時控制,如定時中斷,定時檢測,定時掃描等,還要求有計數(shù)器能對外部事件計數(shù)。要實現(xiàn)定時或延時控制,有三種主要方法:軟件定時、不可編程的硬件定時、可編程的硬件定時器。其中可編程定時器電路的定時值及其范圍可以很容易地由軟件來確定和改變,功能較強(qiáng),使用靈活。Intel的定時器/計數(shù)器為可編程定時器PIT,型號為8253,改進(jìn)型為8254,就是為完成上述功能而設(shè)計出來的一種電路。
          隨著ASIC的發(fā)展,在實際工程中通用的8253PIT芯片表現(xiàn)出如下的不足:1. 計數(shù)頻率不夠,8253計數(shù)速率最高2MHz,即使是其改進(jìn)型8254也往往不能滿足一些需要較高計數(shù)頻率的工程。2. 8253PIT沒有復(fù)位信號,輸出的初始狀態(tài)不受控制。針對8253的這些局限性,在實際工程中往往需要重新設(shè)計8253,并把8253的部分功能作為一個獨立的模塊嵌入到設(shè)計中,以實現(xiàn)完成某種特定功能的ASIC。

          8253的基本功能和內(nèi)部結(jié)構(gòu)
          主要功能
          * 每片內(nèi)部包含有3個獨立的16位計數(shù)通道;
          * 每個計數(shù)器都可以按照二進(jìn)制或二—十進(jìn)制計數(shù);
          * 每個計數(shù)器的計數(shù)速率可高達(dá)2MHz;
          * 每個計數(shù)通道有6種工作方式,可由程序設(shè)置和改變;
          * 所有的輸入/輸出電平信號都與TTL兼容。
          內(nèi)部結(jié)構(gòu)
          8253的內(nèi)部結(jié)構(gòu)如圖1所示。
          1. 數(shù)據(jù)總線緩沖器。這是8253與CPU數(shù)據(jù)總線連接的8位雙向三態(tài)緩沖器,CPU通過數(shù)據(jù)總線緩沖器將控制命令字和計數(shù)初值寫入8253芯片,或者從8253計數(shù)器中讀取當(dāng)前計數(shù)值。
          2. 讀/寫邏輯。這是8253內(nèi)部操作的控制部分。首先有片選信號CS的控制部分,當(dāng)CS為高時,數(shù)據(jù)總線緩沖器處在三態(tài),系統(tǒng)的數(shù)據(jù)總線脫開,故不能進(jìn)行編程,也不能進(jìn)行讀寫操作。其次,由這部分選擇讀寫操作的端口(3個計數(shù)器及控制字寄存器),并控制數(shù)據(jù)傳送的方向。
          3. 控制字寄存器。在8253初始化編程時,由CPU寫入控制字以決定通道的工作方式。此寄存器只能寫入而不能讀出。實際上,8253的3個計數(shù)器通道都有各自的控制字寄存器,存放各自的控制字,初始化編程時,這3個控制字分三次共用一個控制端口地址寫入各自的通道.它們是利用最高兩位的狀態(tài)不同來區(qū)分的。
          4. 計數(shù)器通道。包括計數(shù)器0、計數(shù)器1、計數(shù)器2。它們的結(jié)構(gòu)完全相同,彼此可以按照不同的方式獨立工作。每個通道包括:一個8位的控制寄存器;一個16位的計數(shù)初值寄存器;一個計數(shù)執(zhí)行部件,他是一個16位的減法計數(shù)器;一個16位的輸出鎖存器。
          每個通道都對輸入脈沖CLK按二進(jìn)制或二—十進(jìn)制,從預(yù)置值開始減1計數(shù)。當(dāng)預(yù)置值減到零時,從OUT輸出端輸出一信號。計數(shù)過程中,計數(shù)器受到門控信號GATE的控制。

          8253的設(shè)計
          根據(jù)8253的內(nèi)部結(jié)構(gòu),設(shè)計8253主要分為兩大部分:總線控制部分和定時/計數(shù)部分。
          總線控制部分設(shè)計
          這一部分主要完成數(shù)據(jù)的讀/寫,以及控制字的寫入。用設(shè)計這部分前,應(yīng)該了解8253的端口選擇(見表1)和控制字(見圖2)。
          設(shè)計的關(guān)鍵在于對8253端口控制字的掌握。寫信號到來時,首先要判斷是控制字還是計數(shù)初始值。如果是初始值,其中先寫低字節(jié),再寫高字節(jié)部分是重點,需要一個信號來判斷寫入的是新數(shù)據(jù)還是上一數(shù)據(jù)沒寫完的高字節(jié)部分.其他計數(shù)器的讀/寫大同小異。只要對8253的端口控制字了解清楚以及對讀/寫的時序有一定的了解,這一部分的邏輯很容易用VHDL語言描述出來.該進(jìn)程可對外發(fā)出控制信號,表示控制字及數(shù)據(jù)寫入完畢,可以進(jìn)行計數(shù)器的計數(shù)操作了。該控制信號可以作為下面介紹的計數(shù)部分的觸發(fā)信號。
          計數(shù)器部分設(shè)計
          8253有3個獨立的計數(shù)器,每個計數(shù)器有6種工作模式,完成不同的功能?,F(xiàn)以方式4為例介紹VHDL設(shè)計,其他的可以在方式4基礎(chǔ)上加以修改。
          這種工作方式,當(dāng)寫入控制字后輸出為高。當(dāng)寫入計數(shù)值后,再過一個時鐘周期,計數(shù)執(zhí)行部件獲得計數(shù)初值,并開始減1計數(shù)。當(dāng)計數(shù)到0后輸出變低電平,此低電平一直維持一個時鐘周期,然后又自動變?yōu)楦唠娖?,并一直維持高電平,計數(shù)器停止計數(shù)。這種方式計數(shù)是一次性的,只有輸入新的計數(shù)值之后,才能開始新的計數(shù)。
          下面介紹方式4的設(shè)計過程:
          CPU寫入控制字后,輸出outs立即復(fù)位,方式4中復(fù)位后outs為高電平。CPU寫入計數(shù)初值的下一個CLK脈沖,計數(shù)初值被送到計數(shù)執(zhí)行部件并開始減1計數(shù),又經(jīng)過N個時鐘周期后才輸出一個負(fù)脈沖。當(dāng)GATE=1時,允許計數(shù),GATE=0時,禁止計數(shù)。這樣就實現(xiàn)了方式4基本的軟件觸發(fā)功能。
          if clk1'event and clk1='0' then  ——時鐘脈沖下降沿到來
          if gate1='1' then         ——門控位為1,允許計數(shù)
          if ce1>"0000000000000001" then
          ce1<=ce1-1;
          ——減1計數(shù),ce為計數(shù)執(zhí)行部件
          elsif ce1="0000000000000001" then
          out1<='0';           ——初值減到1時輸出低電平
               ce1<=ce1-1;         ——繼續(xù)減1
          elsif ce1="0000000000000000" then
          out1<='1';           ——初值減到0時輸出高電平
              end if;
             elsif gate1='0' then
          ——門控位為0,禁止計數(shù)
              null;
             end if;
            end if;
          上面的小程序雖不完整但是卻描述出了方式4的軟件觸發(fā)基本功能。若在計數(shù)過程中改變計數(shù)值,新值寫入后的下一個CLK周期時,此計數(shù)值被寫入計數(shù)執(zhí)行部件并從新的計數(shù)值開始計數(shù).如果寫入的計數(shù)值是兩個字節(jié),那么寫入第一個字節(jié)時計數(shù)不受影響,寫入第二個字節(jié)后的下一個時鐘周期,計數(shù)執(zhí)行部件獲得新值,并從新值開始重新計數(shù),叫做軟件再觸發(fā).軟件再觸發(fā)功能只要在上面的程序中加入相應(yīng)的判斷信號和控制信號即可實現(xiàn)。
          完整的8253寫過程流程
          實際上完整的8253就是一個擁有多個進(jìn)程的復(fù)雜結(jié)構(gòu)體。讀總線過程、寫總線過程、每個計數(shù)器的6種工作方式都是一個獨立的進(jìn)程.進(jìn)程之間是并行的,只要進(jìn)程的敏感信號發(fā)生變化,該進(jìn)程就被觸發(fā)一次,而進(jìn)程內(nèi)部是按照時序順序執(zhí)行的。以寫過程為例,寫總線進(jìn)程本身是靠敏感信號wr和cs來觸發(fā)的,無論寫入控制字還是寫入計數(shù)初值后,寫總線進(jìn)程都會對外發(fā)出信號以表示某個計數(shù)器的控制字寫入完畢或者某個計數(shù)器的某個工作方式的計數(shù)初值已經(jīng)寫入,可以進(jìn)行計數(shù)了。而這些信號又相應(yīng)的作為其他進(jìn)程的敏感信號,進(jìn)程之間的通信就是依靠這些信號來完成的。這些進(jìn)程之間都是并發(fā)執(zhí)行的,具體哪個進(jìn)程被執(zhí)行取決于控制字。圖3給出了寫過程的流程,讀過程與之類似。

          設(shè)計結(jié)果驗證
          本設(shè)計開發(fā)軟件采用Altera公司的集成開發(fā)軟件MAX+PLUS II 10.2完成。并用該公司的ACEX 1K系列芯片予以驗證。
          之所以選用ACEX 1K系列芯片,是因為它是一種低成本高密度的FPGA芯片系列,是首選的中規(guī)模器件產(chǎn)品。它具有如下特點:
          * ACEX 1K采用查找表(LUT)和EAB(嵌入式陣列塊)相結(jié)合的結(jié)構(gòu),特別適用于實現(xiàn)復(fù)雜邏輯功能存儲器功能,例如通信中應(yīng)用的數(shù)字信號處理、多通道數(shù)據(jù)處理、數(shù)據(jù)傳遞和微控制等。
          * 典型門數(shù)為1萬到10萬門,有多達(dá)49152位的RAM(每個EAB有4096位RAM)。
          * 器件內(nèi)核采用2.5V電壓,功耗低,能夠提供高達(dá)250MHz的雙向I/O功能,完全支持33MHz和66MHz的PCI局部總線標(biāo)準(zhǔn)。
          * 具有快速連續(xù)式、延時可預(yù)測的快速通道互連;具有實現(xiàn)快速加法器、計數(shù)器、乘法器和比較器等算術(shù)功能的專用進(jìn)位鏈,以及實現(xiàn)高速多扇入邏輯功能的專用級連接。
          通過仿真、綜合,并下載到FPGA中進(jìn)行驗證,本設(shè)計可以很好地實現(xiàn)其功能。■

          參考文獻(xiàn)
          1 曾繁泰,陳美金. VHDL程序設(shè)計
          2 林明權(quán). VHDL數(shù)字控制系統(tǒng)設(shè)計范例

          塵埃粒子計數(shù)器相關(guān)文章:塵埃粒子計數(shù)器原理


          關(guān)鍵詞: FPGA IP VHDL

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();