,
(中原工學(xué)院,鄭州 450007)
IIC總線是雙向、兩線、串行、多主控接口標(biāo)準(zhǔn),具有總線仲裁機(jī)制,適合在器件之間進(jìn)行短距離、非經(jīng)常性的數(shù)據(jù)通信,由于其使用兩線的硬件接口簡(jiǎn)單,在微電子通信控制領(lǐng)域被廣泛應(yīng)用[1-2].現(xiàn)場(chǎng)可編程門(mén)陣列(FPGA)使用專(zhuān)用的集成電路,時(shí)序控制能力較強(qiáng),處理信息的速度非常快,含有大量軟核,方便系統(tǒng)二次開(kāi)發(fā),在通信領(lǐng)域的應(yīng)用快速、靈活.為充分利用FPGA的邏輯資源,提高硬件系統(tǒng)的集成度,將IIC控制器嵌入FPGA內(nèi),實(shí)現(xiàn)DSP的高速異步存儲(chǔ)器接口到IIC總線接口的轉(zhuǎn)化.
IIC總線包括雙向數(shù)據(jù)線SDA和時(shí)鐘線SCL,分別通過(guò)上拉電阻連接到正的電源電壓,實(shí)現(xiàn)全雙工同步數(shù)據(jù)傳送[3].
IIC通信協(xié)議是基于起止?fàn)顟B(tài)識(shí)別的.起始信號(hào)表現(xiàn)為在SCL高電平時(shí)SDA線從高到低,停止信號(hào)則表現(xiàn)為在SCL高電平時(shí)SDA線從低到高.應(yīng)答信號(hào)是在SCL高電平時(shí)SDA為低電平,非應(yīng)答信號(hào)相反,表現(xiàn)為在SCL高電平時(shí)SDA也為高電平.數(shù)據(jù)傳輸“0”和“1”時(shí),與發(fā)送應(yīng)答位和非應(yīng)答位時(shí)序圖相同,如圖1所示.在其他任何時(shí)刻,只有SCL在低電平期間,SDA狀態(tài)才能發(fā)生變化,否則,SDA上的數(shù)據(jù)必須保持不變[3].
在一個(gè)起止?fàn)顟B(tài)之間,數(shù)據(jù)字節(jié)數(shù)沒(méi)有限制,但每個(gè)數(shù)據(jù)字節(jié)必須得到確認(rèn).確認(rèn)狀態(tài)時(shí),在SDA上每一個(gè)8位字節(jié)后面的第9位用低電平表示.圖2表示一個(gè)完整的數(shù)據(jù)傳輸過(guò)程.IIC發(fā)送起始信號(hào)后,從器件的7位尋址地址和1位讀寫(xiě)標(biāo)志位R/W被發(fā)送(當(dāng)R/W為0時(shí),表示由主器件向從器件寫(xiě)數(shù)據(jù);當(dāng)R/W為1時(shí),表示由主器件向從器件讀數(shù)據(jù)),有應(yīng)答信號(hào)后,開(kāi)始傳送數(shù)據(jù),直到發(fā)送停止信號(hào).數(shù)據(jù)是以字節(jié)為單位的,每發(fā)送一個(gè)字節(jié)就要檢測(cè)SDA線上的應(yīng)答信號(hào),有則繼續(xù)發(fā)送,否則就停止發(fā)送數(shù)據(jù)[4-5].
圖1 IIC總線SDA與SCL時(shí)序劃分
圖2 完整的數(shù)據(jù)傳輸過(guò)程
寫(xiě)通訊過(guò)程為:①主器件在檢測(cè)到總線空閑的狀況下,發(fā)送一個(gè)START信號(hào)掌管總線;②主器件發(fā)送一個(gè)地址字節(jié)(包括7位地址碼和1位R/W);③當(dāng)從器件檢測(cè)到總器件發(fā)送的地址與自己的地址相同時(shí),發(fā)送一個(gè)應(yīng)答信號(hào)(ACK);④主器件收到ACK后開(kāi)始發(fā)送第一個(gè)數(shù)據(jù)字節(jié);⑤從器件收到數(shù)據(jù)字節(jié)后發(fā)送一個(gè)ACK表示可以繼續(xù)發(fā)送數(shù)據(jù)或進(jìn)行其他操作;⑥主器件發(fā)送完全部數(shù)據(jù)后,發(fā)送一個(gè)停止位STOP,結(jié)束整個(gè)通訊并且釋放總線.
讀通訊過(guò)程:①主器件在檢測(cè)到總線空閑的狀況下,發(fā)送一個(gè)START信號(hào)掌管總線;②主器件發(fā)送一個(gè)地址字節(jié)(包括7位地址碼和1位R/W);③當(dāng)從器件檢測(cè)到總器件發(fā)送的地址與自己的地址相同時(shí),發(fā)送一個(gè)應(yīng)答信號(hào)(ACK);④主器件收到ACK后釋放數(shù)據(jù)總線,開(kāi)始接收第一個(gè)數(shù)據(jù)字節(jié);⑤從器件收到數(shù)據(jù)字節(jié)后發(fā)送一個(gè)ACK,表示可以繼續(xù)傳送數(shù)據(jù)或進(jìn)行其他操作;⑥主器件接收完全部數(shù)據(jù)后,發(fā)送一個(gè)停止位STOP,結(jié)束整個(gè)通訊并且釋放總線.
本文設(shè)計(jì)的IIC控制器核應(yīng)用在基于DM642的圖像采集與顯示系統(tǒng)中,采用自頂向下設(shè)計(jì)方法.控制器核頂層設(shè)計(jì)分為3個(gè)模塊:IIC_TOP模塊、IIC_CMD模塊和IIC_CORE模塊.系統(tǒng)框圖如圖3所示.
圖3 系統(tǒng)框圖
IIC_TOP模塊是頂層管理模塊,主要任務(wù)是接收DSP發(fā)來(lái)的控制信號(hào)、命令及數(shù)據(jù),發(fā)送從設(shè)備讀出的數(shù)據(jù)和確認(rèn)位到DSP,實(shí)現(xiàn)IIC控制器核與DSP的中斷通信機(jī)制,并提供當(dāng)前IIC控制器核的工作狀態(tài),把DSP發(fā)出的命令字信號(hào)送到IIC_CMD模塊.IIC_CMD模塊功能是把從IIC_TOP模塊接收到的命令字信號(hào)傳給IIC_CORE模塊,IIC_CORE模塊將這些命令字信號(hào)譯碼后,再將譯碼信號(hào)傳回IIC_TOP模塊.
本設(shè)計(jì)把控制器從邏輯上分為兩個(gè)狀態(tài)機(jī),分別稱(chēng)為命令狀態(tài)機(jī)和時(shí)序狀態(tài)機(jī),其中,命令狀態(tài)機(jī)用于管理IIC總線上的命令狀態(tài),并實(shí)現(xiàn)IIC總線讀、寫(xiě)操作命令狀態(tài)的轉(zhuǎn)移過(guò)程;時(shí)序狀態(tài)機(jī)用于實(shí)現(xiàn)IIC總線啟動(dòng)、停止、讀、寫(xiě)、確認(rèn)等命令的具體時(shí)序關(guān)系.
命令狀態(tài)機(jī)IIC_CMD模塊的主要功能有兩個(gè):一是把IIC_TOP模塊發(fā)送的開(kāi)始(START)、寫(xiě)(WRITE)、讀(READ)、停止(STOP)四個(gè)命令信號(hào)轉(zhuǎn)化為命令碼,發(fā)送到IIC_CORE模塊;二是實(shí)現(xiàn)從器件接收到的數(shù)據(jù)串在DSP發(fā)出并轉(zhuǎn)換.命令狀態(tài)轉(zhuǎn)移關(guān)系如圖4所示.
圖4 命令狀態(tài)轉(zhuǎn)移關(guān)系圖
系統(tǒng)復(fù)位后,進(jìn)入空閑狀態(tài)IDLE,然后判別命令信號(hào)STARTREADWRITE:①若是START命令,則進(jìn)入START狀態(tài),之后根據(jù)命令信號(hào)READWRITE分別轉(zhuǎn)移到READ或WRITE狀態(tài)進(jìn)行數(shù)據(jù)的讀或?qū)懀?dāng)8個(gè)字節(jié)傳輸完畢后,轉(zhuǎn)移到應(yīng)答狀態(tài)ACK,之后根據(jù)命令轉(zhuǎn)移到STOP或IDLE 狀態(tài);②若是READ命令,則進(jìn)入READ狀態(tài),當(dāng)8個(gè)字節(jié)傳輸完畢后,進(jìn)入應(yīng)答狀態(tài)ACK,之后根據(jù)命令轉(zhuǎn)移到STOP或IDLE 狀態(tài);③若是WRITE命令,則進(jìn)入WRITE狀態(tài),當(dāng)8個(gè)字節(jié)傳輸完畢后,進(jìn)入應(yīng)答狀態(tài)ACK,之后根據(jù)命令轉(zhuǎn)移到STOP或IDLE 狀態(tài).
時(shí)序狀態(tài)機(jī)IIC_CORE模塊負(fù)責(zé)與視頻編碼器、解碼器的IIC接口進(jìn)行連接,實(shí)現(xiàn)IIC總線信號(hào)SCL和SDA的開(kāi)始(START)、停止(STOP)、讀(WRITE)、寫(xiě)(READ)、應(yīng)答(ACK)等具體操作的時(shí)序關(guān)系.根據(jù)時(shí)序,將它分成16個(gè)狀態(tài),時(shí)序狀態(tài)轉(zhuǎn)移關(guān)系如圖5所示.
圖5 時(shí)序狀態(tài)轉(zhuǎn)移關(guān)系圖
時(shí)序狀態(tài)機(jī)將命令狀態(tài)作了細(xì)分,進(jìn)入到各個(gè)命令狀態(tài)后對(duì)各個(gè)子狀態(tài)進(jìn)行數(shù)據(jù)處理.每種操作包含 IDLE、a、b、c、d 等5個(gè)部分,其中 STOP 命令只包括 IDLE、a、b、c等4個(gè)部分.
本設(shè)計(jì)采用Quartus II 9.0開(kāi)發(fā)軟件,對(duì)系統(tǒng)進(jìn)行綜合、適配、仿真.對(duì)IIC控制器進(jìn)行仿真調(diào)試,圖6所示是時(shí)序狀態(tài)機(jī)仿真結(jié)果,圖7所示是總線寫(xiě)數(shù)據(jù)過(guò)程的仿真結(jié)果.
將WRITE信號(hào)設(shè)為高電平,啟動(dòng)寫(xiě)數(shù)據(jù)傳輸,同時(shí)確定START信號(hào)是否為高,若為高,則進(jìn)入開(kāi)始狀態(tài),開(kāi)始信號(hào)變?yōu)榈碗娖綍r(shí),開(kāi)始寫(xiě)數(shù)據(jù)傳輸.
仿真結(jié)果為SDA~result、SCL~result.傳輸數(shù)據(jù)的開(kāi)始信號(hào)到來(lái)后,在SCL~result為高電平期間,SDA~result出現(xiàn)一個(gè)下降沿,接著開(kāi)始傳輸數(shù)據(jù),到CMD_ACK有一個(gè)脈沖,結(jié)束一個(gè)字節(jié)的傳輸.當(dāng)數(shù)據(jù)傳輸結(jié)束后,接收到STOP信號(hào),這是通信停止和IIC總線傳輸數(shù)據(jù)的結(jié)束信號(hào),此時(shí)SCL~result為高電平,SDA~result出現(xiàn)一個(gè)上升沿.結(jié)果顯示了IIC總線的協(xié)議功能,證明了設(shè)計(jì)的正確性.
本文基于IIC控制器在DM642圖像采集與顯示系統(tǒng)中的應(yīng)用,從狀態(tài)機(jī)的角度出發(fā),采用VHDL語(yǔ)言,設(shè)計(jì)完成了IIC總線控制器核,并進(jìn)行了時(shí)序仿真和測(cè)試,結(jié)果表明本次設(shè)計(jì)的IIC控制器核滿足接口協(xié)議的時(shí)序要求.
參考文獻(xiàn):
[1] 劉欲曉,方強(qiáng),黃宛寧,等. EDA技術(shù)與VHDL電路開(kāi)發(fā)應(yīng)用實(shí)踐[M]. 北京:電子工業(yè)出版社,2009.
[2] 楊峰. 基于SOC的IIC總線IP核設(shè)計(jì)[J]. 電腦知識(shí)與技術(shù),2010,6(6):1511-1512.
[3] 王前,吳淑泉,劉喜英. 基于FPGA的IIC總線接口實(shí)現(xiàn)方法[J]. 微電子技術(shù),2002,30(3):21-24.
[4] 俞偉,徐寧儀,羅飛,等. IIC總線控制器IP核設(shè)計(jì)[J]. 世界科技研究與發(fā)展,2005,27(1): 18-22.
[5] 王鈺,潘仕彬,王卉. IIC在數(shù)據(jù)采集中的應(yīng)用[J]. 科技廣場(chǎng),2008(8): 190-191.