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

          新聞中心

          EEPW首頁 > 汽車電子 > 設計應用 > I2C總線控制器的VHDL設計及實現(xiàn)

          I2C總線控制器的VHDL設計及實現(xiàn)

          作者:■ 邁瑞醫(yī)療電子公司 鄭儉鋒 時間:2005-05-05 來源:eaw 收藏

          摘    要:本文用設計了一個簡潔而實用的控制器,介紹了詳細的設計思路和在中的實現(xiàn),并給出了在嵌入式系統(tǒng)設計中的使用方法。
          關鍵詞:;

          引言
          以其接口簡單、使用靈活等突出優(yōu)點在數(shù)字系統(tǒng)中獲得了廣泛的應用。尤其在嵌入式系統(tǒng)中,I2C總線被普遍用來連接CPU/MCU和外圍器件。I2C總線規(guī)范經(jīng)過十幾年的實踐,發(fā)展了多層標準。從傳輸速率上劃分,有標準模式(100Kbit/s),快速模式(400Kbit/s),高速模式(3.4Mbit/s);從尋址范圍上劃分有7位地址模式和10位地址模式。本文使用語言設計的控制器模塊采用標準速率、7位地址的模式,主要應用在嵌入式系統(tǒng)中,給CPU/MCU提供一個操作I2C器件的簡易平臺,以彌補某些CPU/MCU功能的不足。

          功能定義
          I2C總線的接口非常簡單,只需一根數(shù)據(jù)線(SDA)和一根時鐘線(SCL)。I2C器件可以工作于主件(Master)模式和從件(Slaver)模式,但I2C總線上同時只能有一個主件和多個從件,每次傳輸規(guī)定由主件發(fā)起,通過從件地址(Slaver Address)訪問從件。設計時本著簡單實用的原則,限定本模塊只工作于Master模式。
          端口定義
          entity I2C_CTRL is
           port(
           -- 系統(tǒng)信號
           nReset: in STD_LOGIC;-- 系統(tǒng)復位信號端
           CLK: in STD_LOGIC; -- 內(nèi)部系統(tǒng)時鐘端
           -- 控制信號
           ADRS: in STD_LOGIC_ VECTOR(4 downto 2); -- 地址線,3位(8個32位地址)
           Din: in STD_LOGIC_ VECTOR(7 downto 0); -- 數(shù)據(jù)輸入線,8位
           Dout: out STD_LOGIC_ VECTOR(7 downto 0); -- 數(shù)據(jù)輸出線,8位
           nCS: in STD_LOGIC; --片選使能端
           nWR: in STD_LOGIC; --寫使能端
           -- I2C總線信號
           SDA: inout STD_LOGIC; --串行數(shù)據(jù)輸入輸出端,輸出有三態(tài)
           SCL: out STD_LOGIC --時鐘輸出端,三態(tài)輸出
           );
          end I2C_CTRL;
          寄存器定義
          本模塊的寄存器定義參照Motorola公司ColdFire系列MCU MCF5307的I2C控制器,共定義了3個寄存器,長度均為8位,采用32位編址,如表1所示。
          時序狀態(tài)機
          本模塊根據(jù)I2C總線規(guī)范的時序標準(見圖1),劃分一個傳輸周期為8個狀態(tài),狀態(tài)轉(zhuǎn)換如圖2所示。

          進程設計
          本模塊全部采用同步時序設計。VHDL時序仿真見圖3,限于篇幅,不提供VHDL原程序。下面只對每個進程的關鍵點進行說明。
          時鐘進程
          本模塊設定FPGA分配給I2C模塊的系統(tǒng)時鐘(CLK)為20MHz,而標準模式的I2C總線操作速率(SCL的速率)為100KHz,需要對系統(tǒng)時鐘進行分頻?;赩HDL的同步設計需要,本地時鐘頻率必須為SCL速率的整數(shù)倍,本模塊取兩倍值,因此本地時鐘頻率設為200KHz。定義6bit定時器timer,對系統(tǒng)時鐘的上升沿進行計數(shù)。
          系統(tǒng)復位時timer清零。當CLK上升沿時,timer值減1。當timer=0時賦值100,對20MHz的系統(tǒng)輸入時鐘進行100分頻產(chǎn)生200KHz的本地時鐘。
          為滿足對總線的運行狀態(tài)進行進一步的細分,使用一個5bit的step信號對運行進度進行計數(shù),每個本地時鐘到達時,step加1。
          CPU讀寄存器進程
          系統(tǒng)復位時Dout端口清零。在片選信號nCS有效的情況下,當CLK上升沿時,對地址總線ADRS譯碼,把指定地址的寄存器內(nèi)容送到Dout端口。
          CPU寫寄存器進程
          系統(tǒng)復位時,初始化I2CR和I2DO。在片選信號nCS和nWR同時有效的情況下,當CLK上升沿時,讀取Din端口的信號,存入被ADRS譯碼選中的寄存器。
          狀態(tài)標志改寫進程
          系統(tǒng)復位時,初始化狀態(tài)標志。運行時根據(jù)狀態(tài)機和step的值改寫狀態(tài)標志。其中I2SR[IIF]因為同時可以由CPU改寫,安排另外一個獨立的進程。
          狀態(tài)機賦值進程和狀態(tài)機轉(zhuǎn)換進程
          系統(tǒng)復位時,狀態(tài)為IDEL。當檢測到MSTA=1時,進入START狀態(tài),保持4個本地時鐘周期,進入READY狀態(tài),根據(jù)MTX的值,進入SENDING或RECEVING狀態(tài),等待ICF=1時,表明傳輸結(jié)束,進入WAITING狀態(tài)。根據(jù)IIF或者MSTA是否被清除,決定繼續(xù)下一個傳輸或者退到STOP狀態(tài)。STOP狀態(tài)保持3個本地時鐘周期,返回IDEL狀態(tài)。
          SCL線進程和SDA線進程
          系統(tǒng)復位時SCL線輸出高阻,運行時按照狀態(tài)機和step的值改寫SCL線。當進入傳輸狀態(tài)(SENDING或RECEIVING)時,step[0]=0輸出高阻,step[0]=1輸出低電平。
          系統(tǒng)復位時SDA線輸出高阻,運行時按照狀態(tài)機和step的值讀寫SDA線。

          在FPGA中的實現(xiàn)
          本I2C控制器模塊全部采用可綜合的VHDL語言設計,通過Mentor公司的Leonardo Spectrum工具綜合,并在Altera公司的Cyclone FPGA中實現(xiàn)布線。
          Leonardo Spectrum 2003b65綜合的結(jié)果是:
          Device Utilization for EP1C6Q240C
          Resource                Used    Avail   Utilization
          IOs                     25      181      13.81%
          LCs                     171     5980      2.86%
          Memory Bits         0       92160     0.00%
                    Clock Frequency Report
           Clock                : Frequency
           CLK                  : 211.8 MHz
          此處作為一個單獨的模塊進行綜合,因此上述結(jié)果I/O口占用率包括了地址、數(shù)據(jù)總線和時鐘線等,實際使用時作為一個子模塊,這些信號線都在FPGA內(nèi)部。

          模塊的使用說明
          本模塊適合應用在嵌入式系統(tǒng)中,作為CPU/MCU連接I2C器件的一個橋接器,使得CPU可以像操作普通存儲器一樣控制I2C器件。下面補充說明CPU/MCU操作本模塊的使用方法。
          1) 每發(fā)起一次傳輸都必須先對I2C器件進行尋址。不管是要從I2C器件里接收還是發(fā)送數(shù)據(jù),都必須先設置I2CR[MTX]以標明是一個發(fā)送任務,并在I2DR中填入要尋址的I2C器件的Slaver地址,再發(fā)送“開始傳輸”指令。只有在傳輸完地址之后,再按需要改寫I2CR[MTX]位來實現(xiàn)接收或者發(fā)送。如果發(fā)送地址之前就試圖讀寫I2C總線將得不到預期的結(jié)果。
          2) 在一次傳輸完成之后,將置位中斷標記I2SR[IIF]。中斷標記必須由軟件清除,在標記被清除之后,控制器將自動讀取I2CR,進行下一輪傳輸。如果要改變傳輸方式,應該在清除中斷標記I2SR[IIF]之前改寫I2CR寄存器。
          3) 對reSTART指令的執(zhí)行與I2C總線協(xié)議規(guī)范不盡相同。只有在傳輸指令沒有被結(jié)束(即在發(fā)送reSTART指令之后沒有發(fā)送過STOP指令)的狀態(tài)下設置I2CR[RSTA]才能產(chǎn)生一個reSTART指令,否則無效。而且每次需要reSTART操作時,必須再次重復設置I2CR[RSTA]才能生效。這樣解釋reSTART指令的目的是,可以方便實現(xiàn)一些EEPROM器件的“選擇/任意讀數(shù)”模式。

          結(jié)語
          本文設計的I2C控制器非常適用于以“MCU+FPGA”為模式的嵌入式系統(tǒng)中。當MCU不具有I2C控制功能,而使用I/O口模擬又占用較多資源時,用FPGA實現(xiàn)對I2C器件的控制成為最理想的選擇。通常這種情況下,針對在I2C總線的地位來說,MCU只需擔當主件(Master模式),I2C器件只充當從件(Slaver模式),而且一般的器件都只工作于標準速率。因此,若采用FPGA廠商提供的標準I2C控制器IP,會造成資源浪費。而自行設計一個控制器就顯得更為經(jīng)濟實用了?!?/P>

          參考文獻
          1 The I2C-Bus Specification, Version 2.1, Philips Semiconductors, 2000.1
          2 MCF5307 ColdFire Integrated Microprocessor User誷 Manual, Rev 2.0, Motorola, Inc., 2000.8



          關鍵詞: FPGA I2C總線 VHDL

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁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); })();