新聞中心

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

        I2C總線控制器的VHDL設計及實現

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

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

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

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

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

        在FPGA中的實現
        本I2C控制器模塊全部采用可綜合的VHDL語言設計,通過Mentor公司的Leonardo Spectrum工具綜合,并在Altera公司的Cyclone FPGA中實現布線。
        Leonardo Spectrum 2003b65綜合的結果是:
        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
        此處作為一個單獨的模塊進行綜合,因此上述結果I/O口占用率包括了地址、數據總線和時鐘線等,實際使用時作為一個子模塊,這些信號線都在FPGA內部。

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

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

        參考文獻
        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

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 年辖:市辖区| 都江堰市| 扶余县| 五莲县| 芦溪县| 察哈| 陇川县| 正镶白旗| 吉木乃县| 阳泉市| 怀宁县| 信宜市| 罗田县| 南充市| 武冈市| 登封市| 桦南县| 银川市| 仁怀市| 岱山县| 枣庄市| 绥芬河市| 屯门区| 巴南区| 芮城县| 赤水市| 土默特右旗| 昭苏县| 遂平县| 蓝田县| 绍兴市| 邻水| 富川| 正蓝旗| 鸡西市| 长垣县| 临颍县| 阳东县| 栾川县| 海阳市| 南昌县|