一款基于FPGA的I2C總線的設(shè)計方案
異步時鐘域的轉(zhuǎn)換,采用兩級寄存器的結(jié)構(gòu)。輸入濾波器采用5 級寄存器的結(jié)構(gòu)。當(dāng)采樣到連續(xù)5 個高電平時,輸出才為高電平,否則為低電平。接口部分的寄存器全都用FPGA 的系統(tǒng)時鐘驅(qū)動。
本文引用地址:http://www.ex-cimer.com/article/234978.htm2.2 I2C SLAVE 控制邏輯的實現(xiàn)
I2C SLAVE 控制邏輯狀態(tài)機(jī)是整個模塊的核心,所有I2C 總線相應(yīng)的控制都由其完成。狀態(tài)機(jī)有四個狀態(tài):IDLE,START,SAMPLE 和STOP 組成。Verilog 的定義如下:
`define IDLE 2'b00
`define START 2'b01
`define STOP 2'b10
`define SAMPLE 2'b11
下面介紹各個狀態(tài)的功能。當(dāng)I2C 總線無任何操作時控制器在IDLE 狀態(tài)下,并保持。當(dāng)接口邏輯判斷到START 條件時,控制器跳轉(zhuǎn)到START 狀態(tài)下,并做好接受第一個字節(jié)的準(zhǔn)備,包括初始化bit計數(shù)器。接著開始接受第一個字節(jié)包含7bit的地址和1bit 的讀寫狀態(tài)位。當(dāng)采集完第一個字節(jié)后,控制器跳到SAMPLE 狀態(tài)下,開始執(zhí)行數(shù)據(jù)字節(jié)的接受或發(fā)送。是接受或發(fā)送的狀態(tài)由前一字節(jié)的最后1bit 的讀寫狀態(tài)位決定。
當(dāng)讀寫狀態(tài)位為高時,表示I2C 總線的讀操作,FPGA 邏輯發(fā)送數(shù)據(jù)。讀寫狀態(tài)位為低時,表示I2C 總線的寫讀操作,FPGA邏輯接受數(shù)據(jù)。接著FPGA 邏輯發(fā)出一個ACK 信號后,表示可以進(jìn)行讀寫操作。那么就進(jìn)入到SAMPLE 狀態(tài)下,正常讀或?qū)懸粋€字節(jié)(也可以連續(xù)的讀寫多個字節(jié),對此沒有限制)。在完成8bit 數(shù)據(jù)讀寫后,I2C 的主器件會發(fā)出一個STOP 條件操作。fpga 邏輯收到后,就跳轉(zhuǎn)到STOP 狀態(tài),并在幾個時鐘周期后,自動跳轉(zhuǎn)到IDLE 狀態(tài)下。從而完成一個完整的I2C 總線的讀或?qū)懖僮鳌?/p>
當(dāng)然也包括一些異常處理,以防止?fàn)顟B(tài)機(jī)處在一個不確定的狀態(tài)下。在SAMPLE 狀態(tài)下如果遇到意外的START 條件時,即上次的總線操作沒有完成就開始了下次的操作,則控制狀態(tài)機(jī)會跳轉(zhuǎn)到START 狀態(tài)下,而開始接受這次新的總線操作,而上次的操作為無效。由如在SAMPLE 狀態(tài)下,但是又收到一個START 條件。還有如在STOP 狀態(tài)收到一個START 條件,處理也和上面一樣。下圖4 介紹了I2C SLAVE 控制邏輯狀態(tài)機(jī)的狀態(tài)跳轉(zhuǎn)圖。
如上圖所示,在 SAMPLE 狀態(tài)下,可以連續(xù)的讀寫數(shù)據(jù),而地址是在讀寫完一個字節(jié)后由FPGA 邏輯自動加1 的。這樣做使得I2C 總線的一次操作就可以連續(xù)對多個字節(jié)讀或?qū)憽L岣叩目偩€的使用效率。
以下是在modelsim6.0 下進(jìn)行的行為級仿真的時序圖。
由自行編制的I2C 總線主器件BFM 驅(qū)動進(jìn)行測試。圖5 I2CSLAVE 控制器寫時序圖。圖6 I2C SLAVE 控制器讀時序圖。
3 結(jié)論
本方案通過介紹SLAVE 模式的特點,給出設(shè)計的原理框圖和modelsim 下的行為仿真時序圖。在Altera 的Cyclone II 系列中用Quartus II 12.0生成的模塊時鐘頻率可達(dá)到180MHz,占用的資源Totalcombinational functions 為83 個,Total registers 為41 個。而在實際應(yīng)用中達(dá)100MHz 左右。證實了本方案操作簡便,效果不錯。
上拉電阻相關(guān)文章:上拉電阻原理
評論