I2C總線接口電路設(shè)計(jì)_第1頁(yè)
I2C總線接口電路設(shè)計(jì)_第2頁(yè)
I2C總線接口電路設(shè)計(jì)_第3頁(yè)
I2C總線接口電路設(shè)計(jì)_第4頁(yè)
I2C總線接口電路設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、FPGA與 II2C的主機(jī)和從機(jī),發(fā)送器和接收器產(chǎn)生I2C總線時(shí)鐘信號(hào)和起始、停止控制信號(hào)的器件,稱為主機(jī),被主機(jī)尋址的器件稱為從機(jī)。 任何將數(shù)據(jù)傳送到12C總線的器件稱為發(fā)送器,任何從I2C總線接收數(shù)據(jù)的器件稱為接收器。主機(jī)和從機(jī)都可作為發(fā)送數(shù)據(jù)器件和接收數(shù)據(jù)器件。 I2C總線上數(shù)據(jù)的有效性:時(shí)鐘線SCL為高電平時(shí),數(shù)據(jù)線 SDA的任何電平變化將被看作總線的起始或停止信號(hào);在數(shù)據(jù)傳送過程中,當(dāng)時(shí)鐘線SCL為高電平時(shí),數(shù)據(jù)線 SDA必須保持穩(wěn)定狀態(tài),不允許有跳變;數(shù)據(jù)線SDA的狀態(tài)只能在SCL低電平期間才能改變。 即進(jìn)行串行傳送數(shù)據(jù)時(shí), 在SCL高電平期間傳送 位數(shù)據(jù),低電平期間準(zhǔn)備數(shù)據(jù)。 從

2、機(jī)地址I2C總線不需要額外的片選信號(hào)或地址譯碼。多個(gè)I2C總線接口器件可連接到一條I2C總線上,它們之間通過地址來區(qū)分。主機(jī)是主控制器件,只有一個(gè)主機(jī)的不需要地址。其它器件均為從機(jī),均有器 件地址,但必須保證同一條I2C總線上的器件地址不能重復(fù)。一般從機(jī)地址由7位地址位和1位讀寫位組成,地址位為高7位,讀寫位為最低位。 讀寫位為0時(shí),表示主機(jī)將向從機(jī)寫入數(shù)據(jù);讀寫位為1時(shí),表示主機(jī)將要從從機(jī)讀取數(shù)據(jù)。 I2C總線的通信時(shí)序C總線器件接口電路設(shè)計(jì)利用FPGA模擬I2C總線協(xié)議對(duì)|2C總線接口器件AT24C256進(jìn)行讀寫操作。利用按鍵輸入讀寫命 令和相應(yīng)的地址、數(shù)據(jù),對(duì)芯片進(jìn)行讀寫操作,讀寫的數(shù)據(jù)

3、用數(shù)碼管顯示。、丨2C總線接口電路設(shè)計(jì)分析1. I 2c總線協(xié)議2 2I C總線的兩根通信線,一根是串行數(shù)據(jù)線SDA,另一根是串行時(shí)鐘線 SCL。多個(gè)符合I C總線標(biāo)準(zhǔn)的器件都可以通過同一條I2C總線進(jìn)行通信,而不需要額外的地址譯碼器。每個(gè)連接到總線上的器件都有一個(gè)唯一的地址作為識(shí)別的標(biāo)志,都可以發(fā)送或接收數(shù)據(jù)。I2C總線通信速率受主機(jī)控制,標(biāo)準(zhǔn)模式下可達(dá)100kbit/s。一般具有I2C總線的器件其SDA、SCL引腳都為集電極(或漏極)開路結(jié)構(gòu)。因此實(shí)際使用時(shí),SDA 和SCL信號(hào)線必須加310K的上拉電阻??偩€空閑時(shí)均保持高平。I2C總線接法如圖1所示。VCC圖1 I2C總線連接示意圖2I

4、 C總線的通信時(shí)序如圖 2所示。S起始條件ACK應(yīng)答應(yīng)答7 I I 2'-總線暫??刂芔.iP停止條件圖2 I2C 總線的通信時(shí)序 首先主機(jī)發(fā)送一個(gè)起始信號(hào)。當(dāng)時(shí)鐘線SCL處于高電平期間,數(shù)據(jù)線 SDA電平從高到低的跳變形成i2c總線的起始信號(hào),啟動(dòng)i2c總線。 主機(jī)逐位發(fā)送7位(高位在前,低位在后)從機(jī)地址和1位讀寫控制信號(hào),共 8位。需8個(gè)時(shí)鐘。 與傳送地址一致的從機(jī)發(fā)應(yīng)答信號(hào)(ACK )。在第9個(gè)時(shí)鐘周期時(shí)將 SDA線拉低表示其已收到一個(gè)8位數(shù)據(jù)。若在第9個(gè)時(shí)鐘周期,SDA為高電平時(shí)為非應(yīng)答。 開始傳送數(shù)據(jù),傳送數(shù)據(jù)數(shù)量不限。每個(gè)字節(jié)(8位)后緊跟1個(gè)接收器件發(fā)出的應(yīng)答位。若是主

5、機(jī)讀取從機(jī)數(shù)據(jù)時(shí),從機(jī)發(fā)送數(shù)據(jù),主機(jī)發(fā)應(yīng)答位;若是主機(jī)寫數(shù)據(jù)到從機(jī)時(shí),主機(jī)發(fā)送數(shù)據(jù),從機(jī)發(fā)應(yīng)答位。 數(shù)據(jù)傳輸結(jié)束時(shí),主機(jī)發(fā)送 1個(gè)停止信號(hào),當(dāng)時(shí)鐘線 SCL為高電平時(shí),數(shù)據(jù)線 SDA由低電平變?yōu)楦唠娖綍r(shí)形成終止信號(hào),停止I2C總線通信。(5)數(shù)據(jù)傳輸基本格式如表 1。SA7A1R/WACKD7D0ACKD7D0ASKP起始位7位地址0 :寫1 :讀應(yīng)答位8位數(shù)據(jù)應(yīng)答位8位數(shù)據(jù)應(yīng)答位0:應(yīng)答1 :非應(yīng)答停止位表1 I2C總線數(shù)據(jù)傳輸基本格式其中S、A7A1、R/W、P總是由主機(jī)產(chǎn)生;寫數(shù)據(jù)時(shí), ACK由從機(jī)產(chǎn)生,D7D0由主機(jī)產(chǎn)生;讀 數(shù)據(jù)時(shí),ACK由主機(jī)產(chǎn)生,D7D0由從機(jī)產(chǎn)生。2. I2C

6、總線器件 AT24C2562 2AT24C256是一個(gè)256K位的串行 CMOS型 EPROM, 可存儲(chǔ)32768個(gè)字節(jié)。該器件通過I C總線接口進(jìn)行操作,其引腳如圖3所示,各引腳功能見表2。圖3 AT24C256引腳圖表2 AT24C256引腳功能說明功能說明管腳名稱SCLAT24C256串行時(shí)鐘輸入管腳。用于產(chǎn)生器件所有數(shù)據(jù)發(fā)送或接收的時(shí)鐘,是輸入管腳。SDA雙向串行數(shù)據(jù)/地址管腳。用于器件所有數(shù)據(jù)的發(fā)送或接收,SDA是一個(gè)開漏輸岀管腳可與其它開漏輸岀或集電極開路輸岀進(jìn)行線或wire-OR。WP寫保護(hù)。當(dāng)WP腳連接到Vcc ,所有內(nèi)存變成寫保護(hù)只能讀; 當(dāng)WP引腳連接到Vss或 懸空,允許

7、器件進(jìn)行讀/寫操作。A0 A1器件地址輸入。這些管腳為硬連線或者不連接,對(duì)于單總線系統(tǒng)最多可尋址4個(gè)AT24C256器件。當(dāng)這些引腳沒有連接時(shí)其默認(rèn)值為0。VSS電源地VCC1.86VNC空腳作為帶有I2C總線接口的器件,每個(gè)AT24C256都有一個(gè)7位的從機(jī)地址,其高5位固定為“10100”, 接下來的2位由AT24C256的引腳A1 A0硬連線輸入決定(A1、A0直接接電源 VCC或GND),同一 I2C總線上最多可以連接 4個(gè)AT24C256器件。AT24C256除了有作為從機(jī)的地址,其內(nèi)部還有作為存 儲(chǔ)單元的編碼子地址,其子地址為雙字節(jié)(16位),從0000H7FFFH。本設(shè)計(jì)中只有

8、1個(gè)AT24C256,可將AT24C256的引腳A1、A0直接接地,其硬件電路如圖 4所示。則該AT24C256作為從機(jī)的7位地 址為“ 1010000”。VCC13-rHT 卜WDA0A1A2SDAWPSCLvssAT24CJ55圖4單個(gè)AT24C256連接電路圖3. 對(duì)AT24C256的讀寫過程(1)向AT24C256某一存儲(chǔ)單元寫入 1個(gè)字節(jié)數(shù)據(jù),過程如下: 主機(jī)(這里為FPGA控制器)發(fā)送一個(gè)起始信號(hào),啟動(dòng)發(fā)送過程; 主機(jī)發(fā)送7位從機(jī)地址(這里為 1010000)和1位寫控制位(為 0); 從機(jī)(這里為 AT24C256 )發(fā)應(yīng)答位。在主機(jī)發(fā)送起始信號(hào)和從機(jī)地址字節(jié)后,AT24C256

9、監(jiān)視總線并當(dāng)其地址與發(fā)送的從地址相符時(shí),響應(yīng)一個(gè)應(yīng)答信號(hào)。在第9個(gè)時(shí)鐘,將SDA線拉為低電平; 主機(jī)接收到應(yīng)答位后,發(fā)從機(jī)子地址高8位(為AT24C256某一存儲(chǔ)單元地址)。 從機(jī)接收完高8位子地址后,發(fā)應(yīng)答位; 主機(jī)接收到應(yīng)答位后,發(fā)從機(jī)子地址低8位; 從機(jī)接收完低8位子地址后,發(fā)應(yīng)答位; 主機(jī)接收到應(yīng)答位后,發(fā)送待8位寫入數(shù)據(jù); 從機(jī)接收完8數(shù)據(jù)后,發(fā)應(yīng)答位,并開始內(nèi)部數(shù)據(jù)的擦寫; 主機(jī)接收到應(yīng)答位后,發(fā)停止位,結(jié)束傳送,總線掛起。SDA上數(shù)據(jù)傳輸格式見表 3,數(shù)據(jù)傳送時(shí)序如圖 5所示。表3向AT24C256寫 1個(gè)數(shù)據(jù)時(shí)總線SDA上數(shù)據(jù)傳輸格式SA7A100AD15AD80AD7AD00

10、D7D00/1P模擬I2C總線對(duì)AT24C256的讀寫控制電路基本結(jié)構(gòu)框圖如圖7所示。起7位寫應(yīng)高8位應(yīng)低8位應(yīng)寫入應(yīng)停始器件答指針答指針答8位答止位地址位地址位地址位數(shù)據(jù)位位主機(jī)發(fā)送從主機(jī)發(fā)送從主機(jī)發(fā)送從主機(jī)發(fā)送從機(jī)主機(jī)機(jī)機(jī)發(fā)送機(jī)發(fā)發(fā)發(fā)發(fā)送送送送圖5向AT24C256寫一個(gè)數(shù)據(jù)時(shí)序(2)從AT24C256某一存儲(chǔ)單元讀出1個(gè)字節(jié)數(shù)據(jù),過程如下: 主機(jī)發(fā)送一個(gè)起始信號(hào),啟動(dòng)發(fā)送過程,接著發(fā)送7位從機(jī)地址(1010000 )和1位寫控制位(0); 從機(jī)檢測(cè)到起始信號(hào)及本身從地址相符時(shí)的從機(jī)地址后,發(fā)應(yīng)答位。 主機(jī)接收到應(yīng)答位后,發(fā)從機(jī)子地址高8位(為AT24C256某一存儲(chǔ)單元地址)。 從機(jī)接收

11、完高8位子地址后,發(fā)應(yīng)答位; 主機(jī)接收到應(yīng)答位后,發(fā)從機(jī)子地址低8位; 從機(jī)接收完低8位子地址后,發(fā)應(yīng)答位; 主機(jī)接收到應(yīng)答位后,再發(fā)送一個(gè)起始信號(hào)(稱為重復(fù)起始信號(hào)),接著再發(fā)送 7位從機(jī)地址(1010000)和1位讀控制位(為 1); 從機(jī)檢測(cè)到重復(fù)起始信號(hào)及從機(jī)地址后,發(fā)應(yīng)答位,并將子地址對(duì)應(yīng)的存儲(chǔ)單元數(shù)據(jù)發(fā)送到總 線上。 主機(jī)接收到應(yīng)答位后,接著準(zhǔn)備從總線接收數(shù)據(jù),從總線接收完8數(shù)據(jù)后。發(fā)非應(yīng)答位和發(fā)停止位,結(jié)束傳送,總線掛起。SDA上數(shù)據(jù)傳輸格式見表 4所示,數(shù)據(jù)傳送時(shí)序如圖 6所示。SA7A100AD15AD80AD71AD00SrA7A110D7D00/1P起始位7位器件地址寫應(yīng)

12、答位高8位指針地址應(yīng)答位低8位 指針 地址應(yīng)答位重復(fù)起始位7位器件地址讀應(yīng)答位讀岀8位數(shù)據(jù)非應(yīng)答停止位主機(jī)發(fā)送從 機(jī) 發(fā) 送主 機(jī) 發(fā) 送從 機(jī) 發(fā) 送主 機(jī) 發(fā) 送從 機(jī) 發(fā) 送主機(jī)發(fā)送從 機(jī) 發(fā) 送從 機(jī) 發(fā) 送主 機(jī) 發(fā) 送主 機(jī) 發(fā) 送BYTE ACWE55 *1 s-sArA)表4從AT24C256上讀1個(gè)數(shù)據(jù)時(shí)總線SDA上數(shù)據(jù)傳輸格式BUS ACT-VI < MASTERADDRESSSTOP模擬I2C總線對(duì)AT24C256的讀寫控制電路基本結(jié)構(gòu)框圖如圖7所示。fti it 口rm: i 朗 nm i: ::丨冋A*SIGO圖6從AT24C256讀一個(gè)數(shù)據(jù)時(shí)序4. FPGA內(nèi)

13、部電路圖7模擬I2C總線對(duì)AT24C256的讀寫控制框圖2(1) I C總線端口i2c總線端口為三態(tài)輸出,當(dāng)使能端有效時(shí),總線輸出為低電平;當(dāng)使能端無效時(shí)三態(tài)門輸出為高 阻,但由于I2C總線上有上拉電阻,總線保持在高電平或由總線上從機(jī)輸出數(shù)據(jù)決定??偩€數(shù)據(jù)始終能 被讀入。其結(jié)構(gòu)示意圖如圖 8所示。SclSda(2) 位傳輸控制模塊位傳輸模塊以“位”為單位產(chǎn)生各種I2C協(xié)議命令(開始、停止和重復(fù)開始)以及進(jìn)行位數(shù)據(jù)讀寫。為了讀寫到穩(wěn)定的“位”數(shù)據(jù),讀寫1位數(shù)據(jù)分為4到5個(gè)階段完成。1位數(shù)據(jù)傳輸時(shí)序要求如圖 9所示。這樣內(nèi)部讀寫時(shí)鐘頻率一般采用5倍于SCL時(shí)鐘總線頻率。開始重復(fù)開始停止圖9 I2C

14、協(xié)議命令和位數(shù)據(jù)傳輸?shù)膱?zhí)行時(shí)序位傳輸控制電路根據(jù)輸入的控制命令,將來自字控制模塊的一位待寫入的數(shù)據(jù)送到總線上,或從總 線上讀入一位數(shù)據(jù)給字控制模塊。當(dāng)完成1位數(shù)據(jù)傳輸時(shí)產(chǎn)生讀寫完成標(biāo)志,并根據(jù)數(shù)據(jù)傳輸情況產(chǎn)生忙標(biāo)志和總線仲裁丟失標(biāo)志。(3) 字傳輸控制模塊字節(jié)傳輸模塊以字節(jié)為單位控制I2C總線的數(shù)據(jù)傳輸。該模塊根據(jù)輸入控制命令,將存放在發(fā)送寄存器中的數(shù)據(jù)加載到一個(gè)移位寄存器,然后逐位發(fā)送到位傳輸模塊, 再控制位傳輸模塊將數(shù)據(jù)發(fā)送到I 2c總線上。或控制位傳輸模塊從總線上逐位接收位數(shù)據(jù),暫存到移位寄存器,再轉(zhuǎn)換成字節(jié)數(shù)據(jù)送給數(shù)據(jù) 輸出。同時(shí)給出相關(guān)傳輸標(biāo)志。(4) AT24C256讀寫控制根據(jù)輸

15、入控制信號(hào)和來自位傳輸模塊的反饋標(biāo)志,將控制信號(hào)加到命令寄存器,給字節(jié)傳輸模塊提 供控制信號(hào);將輸入數(shù)據(jù)或指定單元地址加載到數(shù)據(jù)傳送寄存器;將從字節(jié)模塊讀取的數(shù)據(jù)回送到數(shù)據(jù) 接收寄存器。二、FPGA硬件系統(tǒng)電路設(shè)計(jì)(略)三、I C總線接口電路VHDL設(shè)計(jì)1. I2C總線端口(1) 名稱:IIC_IO.vhd(2) 功能:|2C總線雙向端口電路描述(3) 端口說明方向端口名寬度說明輸入Sda en1數(shù)據(jù)線三態(tài)使能控制端,來自位傳輸控制模塊Scl en1時(shí)鐘線三態(tài)使能控制端,來自位傳輸控制模塊輸出Sda_i1回送的數(shù)據(jù)線信號(hào),給位傳輸控制模塊Scl_i1回送的時(shí)鐘線信號(hào),給位傳輸控制模塊雙向Sda

16、1I2C的數(shù)據(jù)線,外接I2c器件Scl1I2C的時(shí)鐘線,外接l2C器件(4) VHDL 描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY IIC_IO ISPORT(Scl_e n,sda_e n: IN STD_LOGIC;Sda,Scl: INOUT STD_LOGIC;Scl_i,sda_i : OUT STD_LOGIC);END IIC_IO;ARCHITECTURE one OF IIC_IO ISBEGINSda_i<=sda;Scl_i<=scl;Scl<='0' WHEN scl_e n=&#

17、39;O' ELSE 'Z'Sda<='0' WHEN sda_e n='O' ELSE 'Z' END one;2. 位傳輸控制模塊(1) 名稱:bit_txd_rxd.vhd(2) 功能:實(shí)現(xiàn)位數(shù)據(jù)或協(xié)議命令的傳輸(3) 端口說明 VHDL 描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_Arith.ALL;USE IEEE.STD_LOGIC_ Un sig ned.ALL;ENTITY bit_txd_rxd IS方向端口名寬度說明輸

18、入Rst1復(fù)位信號(hào),低電平復(fù)位clk_sys1系統(tǒng)時(shí)鐘ena1系統(tǒng)使能信號(hào),高電平有效cmd4控制命令,由字節(jié)傳輸模塊給岀Bit data wr1待寫入總線的1位數(shù)據(jù)Scl_i1總線時(shí)鐘輸入Sda i1總線數(shù)據(jù)輸入輸出Scl_oen1總線時(shí)鐘輸岀使能Sda oen1總線數(shù)據(jù)輸岀使能Bit_finish1完成1位讀寫的標(biāo)志,1為完成,0為未完成busy1總線忙標(biāo)志,1為忙,0為閑lose1總線仲裁丟失標(biāo)志,1為岀錯(cuò),0為正確Bit data rd1從總線讀岀的1位數(shù)據(jù)GENERIC (n:INTEGER:=48);- 分頻系數(shù)PORT(Clk_sys:IN STD_LOGIC;Rst,ena:I

19、N STD_LOGIC;cmd: IN STD_LOGIC_VECTOR(3 DOWNTO 0);Bit_data_wr:IN STD_LOGIC;-Scl_i,sda_i : IN STD_LOGIC;Scl_oen,sda_oen: OUT STD_LOGIC;Busy,Lose: OUT STD_LOGIC;Bit_data_rd,Bit_finish: OUT STD_LOGIC);END bit_txd_rxd;ARCHITECTURE two OF bit_txd_rxd ISType state_t IS (bit_idle,start_a,start_b,start_c,sta

20、rt_d,start_e,stop_a,stop_b,stop_c,stop_d, write_a, write_b, write_c, write_d,read_a, read_b, read_c, read_d);SIGNAL sta_p: state_t;CONSTANT n:INTEGER:=48; - 產(chǎn)生 500KHz 的分頻系數(shù)SIGNAL en_500k: STD_LOGIC;-500KHz 時(shí)鐘使能信號(hào)SIGNAL Scl_a,Sda_a, Scl_b,Sda_b:STD_LOGIC;- 同步 SCL 和 SDA 中間信號(hào)SIGNAL scl_edg: STD_LOGIC;-

21、SCL 的邊沿信號(hào)SIGNAL scl_oen_r, sda_oen_r: STD_LOGIC;- 總線使能信號(hào)SIGNAL sda_chk: STD_LOGIC;- 寫數(shù)據(jù)時(shí),檢查總線信號(hào)SIGNAL dscl_oen,slave_wait: STD_LOGIC;- 時(shí)鐘延遲等待的信號(hào)SIGNAL Sda_S,Sda_P: STD_LOGIC;- 啟動(dòng)、停止標(biāo)志位SIGNAL Busy_r,Lose_r: STD_LOGIC;- 忙標(biāo)志、丟失標(biāo)志信號(hào)SIGNAL stop_cmd,stop_cmd_r: STD_LOGIC;- 停止命令信號(hào)BEGINPROCESS (clk_sys,rst)

22、 - 同步 SCL 和 SDA 的輸入信號(hào)BEGINIF rst='0' THENScl_a<='1'Sda_a<='1'Scl_b<='1'Sda_b<='1'ELSIF RISING_EDGE(clk_sys) THEN - 暫存 SCL、 SDA 的值Scl_a<= Scl_i;Sda_a<= Sda_i;Scl_b<= Scl_a;Sda_b<= Sda_a;END IF;END PROCESS;Scl_edg<=scl_a AND( NOT Scl_b

23、);- 檢測(cè)時(shí)鐘 SCL 上升沿PROCESS (clk_sys) -產(chǎn)生數(shù)據(jù)輸出信號(hào),在 SCL 上升沿時(shí)鎖存 SDA 上的數(shù)據(jù)值 BEGINIF RISING_EDGE(clk_sys) THENIF scl_edg='1' THENBit_data_rd<=Sda_a;END IF;END IF;END PROCESS;-從節(jié)點(diǎn)未準(zhǔn)備好時(shí),下拉 SCL 延遲周期;當(dāng)給出的 SCL 使能為 1 時(shí),檢測(cè) SCL 總線為 0 時(shí),則 節(jié)點(diǎn)未準(zhǔn)備就緒,產(chǎn)生等待信號(hào)。PROCESS (clk_sys)BEGINIF RISING_EDGE(clk_sys) THEN dsc

24、l_oen<=scl_oen_r;END IF;END PROCESS;Slave_wait<=dscl_oen AND (NOT scl_a);PROCESS (clk_sys,rst) - 將 24M 系統(tǒng)時(shí)鐘分頻產(chǎn)生 500KHz 時(shí)鐘使能控制信號(hào)VARIABLE cnt: INTEGER RANGE 0 TO n-1;- 時(shí)鐘分頻計(jì)數(shù)器BEGINIF rst='0' THENcnt: =0; en_500k<='1'ELSIF RISING_EDGE(clk_sys) THENIF clk_cnt<n-1 THEN -n 為分頻系

25、數(shù)IF ena='1' THEN cnt:= cnt+1; en_500k<='0'END IF;ELSEIF Slave_wait='0' THEN- 從節(jié)點(diǎn)準(zhǔn)備好,給出時(shí)鐘使能 cnt:=0;en_500k<='1'ELSE - 從節(jié)點(diǎn)未準(zhǔn)備好,延遲等待cnt:= cnt; en_500k<='0'END IF;END IF;END IF;END PROCESS;-生成啟動(dòng)標(biāo)志和停止標(biāo)志-在 SCL 高電平時(shí) ,檢測(cè) SDA 的下降沿(起始信號(hào)) ,產(chǎn)生啟動(dòng)標(biāo)志-在 SCL 高電平時(shí) ,檢測(cè)

26、SDA 的上升沿(停止信號(hào)) ,產(chǎn)生停止標(biāo)志PROCESS (clk_sys,rst)BEGINIF rst='0' THENSda_S<='0'- 啟動(dòng)標(biāo)志復(fù)位 Sda_P<='0'- 停止標(biāo)志復(fù)位ELSIF RISING_EDGE(clk_sys) THENSda_S<=(NOT Sda_a ) AND Sda_b AND Scl_a ;- 生成啟動(dòng)標(biāo)志 Sda_P<=Sda_a AND ( NOT Sda_b ) AND Scl_a; - 生成停止標(biāo)志 END IF;END PROCESS;-生成總線忙標(biāo)志-檢測(cè)到啟

27、動(dòng)信號(hào)發(fā)生,但無停止信號(hào)發(fā)生時(shí)表示總線處于忙狀態(tài)PROCESS (clk_sys,rst)BEGINIF rst='0' THEN Busy_r<='0'ELSIF RISING_EDGE(clk_sys) THEN Busy_r<=(Sda_S OR busy_r) AND (NOT Sda_P);END IF;END PROCESS;Busy<=busy_r;- 忙標(biāo)志輸出-產(chǎn)生仲裁丟失標(biāo)志,-當(dāng)沒有停止請(qǐng)求時(shí),檢測(cè)到停止信號(hào),產(chǎn)生仲裁丟失標(biāo)志- 當(dāng)驅(qū)動(dòng) SDA 總線為高時(shí),但檢測(cè) SDA 一直為低,產(chǎn)生仲裁丟失標(biāo)志PROCESS (clk

28、_sys,rst)BEGINIF rst='0' THEN stop_cmd<='0'- 停止命令信號(hào) stop_cmd_r <='0'Lose_r<='0'ELSIF RISING_EDGE(clk_sys) THENIF cmd<= "0010" THEN - 有停止命令 stop_Cmd<='1'ELSE stop_Cmd<='0'END IF; stop_Cmd_r <= stop_Cmd;ANDLose_r<=(Sda_P

29、 AND (NOT stop_Cmd_r ) OR(NOT sda_a AND sda_chk sda_oen_r);-丟失標(biāo)志END IF;END PROCESS;Lose<=Lose_r;-位傳輸狀態(tài)機(jī)Scl_oen<=scl_oen_r; Sda_oen<=Sda_oen_r;PROCESS(clk_sys,rst)BEGINIF rst='0' THEN Sta_p<=bit_idle;- 初始準(zhǔn)備狀態(tài) bit_finish<='0' -1 位信號(hào)發(fā)送或接收完成標(biāo)志 Scl_oen_r<='1'- 時(shí)鐘

30、輸出使能Sda_oen_r <='1'- 數(shù)據(jù)輸出使能Sda_chk<='0'- 不檢查輸出ELSIF RISING_EDGE(clk_sys) THENIF Lose_r='1' THEN- 數(shù)據(jù)傳輸信號(hào)丟失Sta_p<=bit_idle;bit_finish <='0'Scl_oen_r <='1'Sda_oen_r <='1'Sda_chk<='0'ELSEbit_finish <='0'IF clk_en=

31、9;1' THENCASE sta_p ISWHEN bit_idle=>- 準(zhǔn)備狀態(tài)Scl_oen_r <=scl_oen_r;- 保持 SCL 在同一狀態(tài)Sda_oen_r <=sda_oen_r; - 保持 SDA 在同一狀態(tài)Sda_chk<='0'CASE cmd IS - 狀態(tài)命令字WHEN "0001"=> sta_p<=start_a;- 發(fā)送起始信號(hào)狀態(tài)WHEN "0010" => sta_p<=stop_a;- 發(fā)送停止信號(hào)狀態(tài)WHEN "0100&quo

32、t; => sta_p<=write_a;- 寫入 1 位數(shù)據(jù)WHEN "1000" => sta_p<=read_a; - 讀出 1 位數(shù)據(jù)WHEN OTHERS=> sta_p<=bit_idle;END CASE;-啟動(dòng) I2C 狀態(tài),分 5 個(gè)時(shí)鐘段產(chǎn)生起始信號(hào)WHEN start_a=>sta_p<=start_b;Scl_oen_r <=scl_oen_r; - 保持 SCLSda_oen_r <='1' -SDA 處于高Sda_chk<='0' - 不檢查輸出WH

33、EN start_b=>sta_p<=start_c;Scl_oen_r <='1'Sda_oen_r <='1'Sda_chk<='0'WHEN start_c=>sta_p<=start_d;Scl_oen_r <='1'Sda_oen_r <='0'Sda_chk<='0'WHEN start_d=>sta_p<=start_e;Scl_oen_r <='1'Sda_oen_r <='0

34、'Sda_chk<='0'WHEN start_e=> - 開始狀態(tài) 5 sta_p<=bit_idle;- 回到等待狀態(tài) bit_finish <='1'- 起始信號(hào)傳送完成,給出標(biāo)志 Scl_oen_r <='0'Sda_oen_r <='0'Sda_chk<='0'-停止 I2C 狀態(tài),分 4 個(gè)時(shí)鐘段產(chǎn)生停止信號(hào)WHEN stop_a=> sta_p<=stop_b; Scl_oen_r <='0' Sda_oen_r &l

35、t;='0'Sda_chk<='0'WHEN stop_b=> sta_p<=stop_c; Scl_oen_r <='1' Sda_oen_r <='0' Sda_chk<='0'WHEN stop_c=> sta_p<=stop_d; Scl_oen_r <='1' Sda_oen_r <='0' Sda_chk<='0'WHEN stop_d=>sta_p<=bit_idle;bit_

36、finish <='1'- 停止信號(hào)傳送完成,給出標(biāo)志 Scl_oen_r <='1'Sda_oen_r <='1'Sda_chk<='0'-讀狀態(tài),分 4 個(gè)時(shí)鐘段讀 1 位信號(hào)WHEN read_a=> sta_p<= read_b;Scl_oen_r <='0' - SCL 處于低Sda_oen_r <='1' -SDA 由從器件決定 Sda_chk<='0'WHEN read_b=> sta_p<= read_

37、c; Scl_oen_r <='1' Sda_oen_r <='1' Sda_chk<='0'WHEN read_c=> sta_p<= read_d; Scl_oen_r <='1' Sda_oen_r <='1' Sda_chk<='0'WHEN read_d=>sta_p<=bit_idle;bit_finish <='1'-讀完1位數(shù)據(jù),給出標(biāo)志 Scl_oen_r <='0'Sda_oe

38、n_r <='1'Sda_chk<='0:-寫狀態(tài),分4個(gè)時(shí)鐘段寫1位信號(hào)WHEN write_a=>sta_p<= write_b;Scl_oen_r <='0' - SCL 處于低Sda_oen_r <=bit_data_wr;-輸入數(shù)據(jù)Sda_chk<='0'WHEN write_b=>sta_p<= write_c;Scl_oen_r <='1'-Sda_oe n_r <=bit_data_wr;Sda_chk<='1'-WHE

39、N write_c=> -寫狀態(tài) 3 sta_p<= write_d;Scl_oen_r <='1'-Sda_oe n_r <= bit_data_wr;Sda_chk<='1'WHEN write_d=> -寫狀態(tài) 4 sta_p<=bit_idle;bit_finish <='1'-寫完1位信號(hào),給出標(biāo)志Scl_oen_r <='0'Sda_oe n_r <= bit_data_wr;Sda_chk<='0'WHEN OTHERS=>n u

40、ll;END CASE;END IF;END IF;END IF;END PROCESS;END two;3.字傳輸控制模塊(1) 名稱:byte_txd_rxd.vhd(2) 功能:實(shí)現(xiàn)字節(jié)數(shù)據(jù)的傳輸控制。(3) 端口說明方向端口名寬度說明輸入Rst1復(fù)位信號(hào),外接按鈕開關(guān),低電平復(fù)位clk_sys1系統(tǒng)時(shí)鐘start1啟動(dòng)命令stop1停止命令read1讀命令write1寫命令A(yù)ck_in1應(yīng)答輸入信號(hào)Data_txd8待發(fā)送的8位輸入數(shù)據(jù)或地址,由發(fā)送寄存器提供Bit_data_rd1從位模塊接收的1位數(shù)據(jù)Lose1總線仲裁丟失標(biāo)志Bit_finish1來自位模塊的1位傳送完成標(biāo)志輸出c

41、md4輸岀命令Bit_data_wr1向位模塊發(fā)送的數(shù)據(jù)Data_rxd8接收到的8位數(shù)據(jù),送給接收寄存器,Ack_finish1應(yīng)答完成標(biāo)志Ack_out1從總線上讀岀的應(yīng)答信號(hào)(4) VHDL 描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_Arith.ALL;USE IEEE.STD_LOGIC_ Un sig ned.ALL;ENTITY byte_txd_rxd ISPORT(clk_sys:IN STD_LOGIC;rst:IN STD_LOGIC;ack_i n:IN STD_LOGIC;data_txd

42、:IN STD_LOGIC_VECTOR(7 DOWNTO 0);start,stop,write,read:IN STD_LOGIC;lose:IN STD_LOGIC;bit_data_rd:IN STD_LOGIC;-從位控制模塊讀入的一位數(shù)據(jù)bit_fi nish:IN STD_LOGIC;-1 位傳送完成標(biāo)志cmd:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);bit_data_wr:OUT STD_LOGIC;-待寫出的位數(shù)據(jù)ack_fi nish,ack_out: OUT STD_LOGIC;data_rxd:OUT STD_LOGIC_VECTOR(7 DO

43、WNTO 0);END byte_txd_rxd;ARCHITECTURE three OF byte_txd_rxd ISType state_byte IS (byte_idle,byte_start,byte_stop, byte_write,byte_read,ack_wr,ack_rd);SIGNAL sta_c: state_byte;SIGNAL ack_fi nish_r:STD_LOGIC;-完成 1 字節(jié)數(shù)據(jù)傳輸標(biāo)志SIGNAL en:STD_LOGIC;-使能信號(hào)SIGNAL ld_e n, shift_e n:STD_LOGIC;- 加載數(shù)據(jù)使能、移位數(shù)據(jù)使能SIGNA

44、L shift_reg:STD_LOGIC_VECTOR(7 DOWNTO 0);- 數(shù)據(jù)移位寄存器SIGNAL cnt_rw: STD_LOGIC_VECTOR(2 DOWNTO 0);- 移位次數(shù)計(jì)數(shù)器SIGNAL cnt_do ne: STD_LOGIC;- 完成1個(gè)字節(jié)數(shù)據(jù)移位完成標(biāo)志BEGINack_fi nish<=ack_fi nish_r;en <=(read OR write OR stop) AND (NOT Ack_fi nish_r);-操作使能PROCESS (clk_sys,rst)-生成移位寄存器內(nèi)容BEGINIF rst='0' TH

45、EN shift_reg<=(OTHERS=>'0');ELSIF RISING_EDGE(clk_sys) THENIF ld_en='1' THEN - 寫數(shù)據(jù)時(shí) shift_reg<=data_txd;- 待發(fā)送數(shù)據(jù)加載到移位寄存器ELSIF shift_en='1' THEN- 讀數(shù)據(jù)時(shí) shift_reg<=shift_reg(6 DOWNTO 0)& bit_data_rd;- 移位讀入數(shù)據(jù)END IF;END IF;END PROCESS;PROCESS (clk_sys,rst) - 進(jìn)行讀寫位計(jì)數(shù)

46、BEGINIF rst='0' THEN cnt_rw<="000"ELSIF RISING_EDGE(clk_sys) THENIF Ld_en='1' THEN - 加載新數(shù)據(jù)時(shí) cnt_rw<="111"- 設(shè)置計(jì)數(shù)初值為 8 次ELSIF shift_en='1' THEN -移位 1 次 cnt_rw<=cnt_rw-1;- 減 1 計(jì)數(shù)END IF;END IF;END PROCESS;cnt_done<='1' WHEN cnt_rw="000

47、" ELSE '0'- 讀寫完 1 個(gè)字節(jié)(計(jì)數(shù) 8 次),給出標(biāo)志 -字節(jié)傳送狀態(tài)控制PROCESS (clk_sys,rst)BEGINIF rst='0' THEN cmd<="0000"-I2C 總線處于空閑狀態(tài)命令 bit_data_wr <='0' - 待寫出的位數(shù)據(jù) ld_en<='0'- 禁止加載數(shù)據(jù) shift_en<='0'- 禁止移位Sta_c<=Byte_idle;- 初始準(zhǔn)備狀態(tài) sck_finish_r<='0&#

48、39;- 應(yīng)答完成標(biāo)志置 0 sck_out<='0'- 應(yīng)答輸出置 0ELSIF RISING_EDGE(clk_sys) THENIF Lose='1' THEN- 數(shù)據(jù)傳輸信號(hào)丟失 cmd<="0000"bit_data_wr <='0' ld_en<='0'shift_en<='0' sta_c<=Byte_idle;ack_finish_r<='0' ack_out<='0'ELSE - bit_data_

49、wr<=shift_reg(7); - 取移位寄存器的最高位作為待寫出位 shift_en<='0'- 禁止移位ld_en<='0'- 禁止加載 ack_finish_r<='0' - 應(yīng)答完成標(biāo)志置 0 CASE sta_c ISWHEN Byte_idle=>- 空閑狀態(tài)IF en='1' THEN- 發(fā)生讀 /寫/停止命令且無應(yīng)答完成標(biāo)志 ld_en<='1' - 重新加載寫入數(shù)據(jù)初值,復(fù)位傳送計(jì)數(shù)器IF start='1' THEN sta_c<=B

50、yte_start;- 起始狀態(tài) cmd<= "0001"- 啟動(dòng)位模塊發(fā)送起始位ELSIF read='1' THEN sta_c<=Byte_read;- 讀狀態(tài) cmd<= "1000" - 啟動(dòng)位模塊讀取 1 位數(shù)據(jù)ELSIF write='1' THEN sta_c<=Byte_write;- 寫狀態(tài) cmd<="0100" ; - 啟動(dòng)位模塊寫入 1 位數(shù)據(jù)ELSE sta_c<=Byte_stop;- - 停止?fàn)顟B(tài) cmd<= "0010

51、" - 啟動(dòng)位模塊發(fā)送停止位 ack_finish_r<='1'- 產(chǎn)生傳送完成標(biāo)志END IF;END IF;WHEN Byte_start=>IF bit_finish='1' THEN - 起始位發(fā)送完成標(biāo)志 ld_en<='1' - 重新加載初值IF read='1' THEN sta_c<=Byte_read; cmd<="1000"ELSE sta_c<=Byte_write; cmd<="0100"END IF;END IF;

52、WHEN Byte_write=>IF bit_finish ='1' THEN - 寫完 1 位標(biāo)志IF cnt_done='1' THEN- 寫完 8 位標(biāo)志 sta_c<=ack_rd; - 讀應(yīng)答狀態(tài) Cmd<="1000"- 準(zhǔn)備讀應(yīng)答位ELSE sta_c<=Byte_write;- 保持寫狀態(tài) cmd<= "0100"- 準(zhǔn)備繼續(xù)寫下 1 位 shift_en<='1' - 移位,準(zhǔn)備下 1 位數(shù)據(jù)END IF;END IF;WHEN Byte_read=&

53、gt;IF bit_finish ='1' THEN - 讀完 1 位標(biāo)志 shift_en<='1' - 移位,存儲(chǔ)新讀入的 1 位數(shù)據(jù) IF cnt_done='1' THEN- 讀完 8 位標(biāo)志 sta_c<=ack_wr; - 寫應(yīng)答狀態(tài) cmd<= "0100"- 準(zhǔn)備寫應(yīng)答位 bit_data_wr<=ack_in;- 給出待發(fā)送的應(yīng)答信號(hào) ELSEsta_c<=Byte_read;- 保持讀狀態(tài) Cmd<= "1000"- 準(zhǔn)備繼續(xù)讀下 1 位 END IF

54、;END IF;WHEN ack_rd=>- 讀應(yīng)答狀態(tài)IF bit_finish ='1' THEN - 應(yīng)答位讀完成標(biāo)志 ack_out<=bit_data_rd;- 輸出應(yīng)答信號(hào) ack_finish_r<='1' - 給出應(yīng)答完成標(biāo)志 data_rxd<=shift_reg;IF stop='1' THENsta_c<=Byte_stop;cmd<= "0010"- 發(fā)停止位ELSEsta_c<=Byte_idle; - 空閑狀態(tài)cmd<="0000"

55、- 等待END IF;END IF;WHEN ack_wr=>- 寫應(yīng)答狀態(tài)IF bit_finish ='1' THEN - 應(yīng)答位寫完成標(biāo)志 bit_data_wr<='1'- 待寫入的位信號(hào)為高 ack_finish_r<='1' - 給出應(yīng)答完成標(biāo)志 IF stop='1' THEN sta_c<=Byte_stop;cmd<= "0010"- 發(fā)停止位ELSEsta_c<=Byte_idle; - 空閑狀態(tài) cmd<="0000"- 等待E

56、ND IF;ELSEbit_data_wr<=ack_in;END IF;WHEN Byte_stop=>- 停止?fàn)顟B(tài)IF bit_finish='1' THEN - 停止位發(fā)送完成標(biāo)志 sta_c<=Byte_idle;Cmd<="0000"- 等待END IF;END CASE;END IF;END IF;END PROCESS;END three;4. AT24C256讀寫控制(1) 名稱:AT24C256_wr.vhd(2) 功能:通過I2C總線對(duì)AT24C256指定單元進(jìn)行讀寫。(3) 端口說明 VHDL 描述LIBRARY

57、 IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_Arith.ALL;USE IEEE.STD_LOGIC_ Un sig ned.ALL;ENTITY AT24C256_rw ISPORT(clk_sys:IN STD_LOGIC;-24MHz 系統(tǒng)時(shí)鐘rst,ena, clk_ena:IN STD_LOGIC;-復(fù)位,使能信號(hào)rw:IN STD_LOGIC;slave_addr: STD_LOGIC_VECTOR(6 DOWNTO 0); sub_addr:STD_L0GIC_VECT0R(15 DOWNTO 0);data_ in:

58、 IN STD_LOGIC_VECTOR(7 DOWNTO 0);ack_fi nish,ack_flag: IN STD_LOGIC;data_rxd: IN STD_LOGIC_VECTOR(7 DOWNTO 0); data_wr: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); start,stop,write,read:OUT STD_LOGIC;data_out: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); rtx_f: OUT STD_LOGIC);方向端口名寬度說明輸入Rst1復(fù)位信號(hào),外接按鈕開關(guān),低電平復(fù)位clk_sys1系統(tǒng)時(shí)鐘

59、ena1接口使能信號(hào)clk_ena1:時(shí)鐘使能信號(hào)rw1讀寫控制Ack_flag1應(yīng)答值A(chǔ)ck finish1完成一個(gè)字節(jié)傳輸標(biāo)志Slave_addr7:從機(jī)地址,送給傳輸寄存器Sub_addr16從機(jī)子地址,送給傳輸寄存器Data rd8從從機(jī)讀入的數(shù)據(jù),送給接收寄存器Data_in8輸入數(shù)據(jù),送給傳輸寄存器輸出Data_wr8待寫岀值,來自傳輸寄存器Data out8輸岀數(shù)據(jù),來自接收寄存器Rtx f1傳輸完成標(biāo)志start1啟動(dòng)命令,來自命令寄存器stop1停止命令,來自命令寄存器read1讀命令,來自命令寄存器write1寫命令,來自命令寄存器END AT24C256_rw; ARCH

60、ITECTURE four OF A T24C256_rw ISType state_at IS (S0,S1,S2,S3,S4,S5,S6);SIGNAL sta_n: state_at;SIGNAL cmd_reg: STD_LOGIC_VECTOR(3 DOWNTO 0);-命令寄存器SIGNAL txd_reg: STD_LOGIC_VECTOR(7 DOWNTO 0);- 數(shù)據(jù)發(fā)送寄存器 SIGNAL rxd_reg: STD_LOGIC_VECTOR(7 DOWNTO 0);- 數(shù)據(jù)接收寄存器 BEGINstart<=cmd_reg(0);stop <=cmd_reg(1);write <=cmd_reg(2); read <=cmd_reg(3); data_wr <=txd_reg; data_out<=rxd_reg;PROCESS(rst,clk_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論