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

下載本文檔

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

文檔簡介

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

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

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

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

5、機讀取從機數(shù)據(jù)時,從機發(fā)送數(shù)據(jù),主機發(fā)應(yīng)答位;若是主機寫數(shù)據(jù)到從機時,主機發(fā)送數(shù)據(jù),從機發(fā)應(yīng)答位。 數(shù)據(jù)傳輸結(jié)束時,主機發(fā)送 1個停止信號,當時鐘線 SCL為高電平時,數(shù)據(jù)線 SDA由低電平變?yōu)楦唠娖綍r形成終止信號,停止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總是由主機產(chǎn)生;寫數(shù)據(jù)時, ACK由從機產(chǎn)生,D7D0由主機產(chǎn)生;讀 數(shù)據(jù)時,ACK由主機產(chǎn)生,D7D0由從機產(chǎn)生。2. I2C

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

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

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

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

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

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

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

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

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

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

16、1I2C的數(shù)據(jù)線,外接I2c器件Scl1I2C的時鐘線,外接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) 功能:實現(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復位信號,低電平復位clk_sys1系統(tǒng)時鐘ena1系統(tǒng)使能信號,高電平有效cmd4控制命令,由字節(jié)傳輸模塊給岀Bit data wr1待寫入總線的1位數(shù)據(jù)Scl_i1總線時鐘輸入Sda i1總線數(shù)據(jù)輸入輸出Scl_oen1總線時鐘輸岀使能Sda oen1總線數(shù)據(jù)輸岀使能Bit_finish1完成1位讀寫的標志,1為完成,0為未完成busy1總線忙標志,1為忙,0為閑lose1總線仲裁丟失標志,1為岀錯,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 時鐘使能信號SIGNAL Scl_a,Sda_a, Scl_b,Sda_b:STD_LOGIC;- 同步 SCL 和 SDA 中間信號SIGNAL scl_edg: STD_LOGIC;-

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

22、 - 同步 SCL 和 SDA 的輸入信號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、);- 檢測時鐘 SCL 上升沿PROCESS (clk_sys) -產(chǎn)生數(shù)據(jù)輸出信號,在 SCL 上升沿時鎖存 SDA 上的數(shù)據(jù)值 BEGINIF RISING_EDGE(clk_sys) THENIF scl_edg='1' THENBit_data_rd<=Sda_a;END IF;END IF;END PROCESS;-從節(jié)點未準備好時,下拉 SCL 延遲周期;當給出的 SCL 使能為 1 時,檢測 SCL 總線為 0 時,則 節(jié)點未準備就緒,產(chǎn)生等待信號。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)時鐘分頻產(chǎn)生 500KHz 時鐘使能控制信號VARIABLE cnt: INTEGER RANGE 0 TO n-1;- 時鐘分頻計數(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é)點準備好,給出時鐘使能 cnt:=0;en_500k<='1'ELSE - 從節(jié)點未準備好,延遲等待cnt:= cnt; en_500k<='0'END IF;END IF;END IF;END PROCESS;-生成啟動標志和停止標志-在 SCL 高電平時 ,檢測 SDA 的下降沿(起始信號) ,產(chǎn)生啟動標志-在 SCL 高電平時 ,檢測

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

27、動信號發(fā)生,但無停止信號發(fā)生時表示總線處于忙狀態(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;- 忙標志輸出-產(chǎn)生仲裁丟失標志,-當沒有停止請求時,檢測到停止信號,產(chǎn)生仲裁丟失標志- 當驅(qū)動 SDA 總線為高時,但檢測 SDA 一直為低,產(chǎn)生仲裁丟失標志PROCESS (clk

28、_sys,rst)BEGINIF rst='0' THEN stop_cmd<='0'- 停止命令信號 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);-丟失標志END IF;END PROCESS;Lose<=Lose_r;-位傳輸狀態(tài)機Scl_oen<=scl_oen_r; Sda_oen<=Sda_oen_r;PROCESS(clk_sys,rst)BEGINIF rst='0' THEN Sta_p<=bit_idle;- 初始準備狀態(tài) bit_finish<='0' -1 位信號發(fā)送或接收完成標志 Scl_oen_r<='1'- 時鐘

30、輸出使能Sda_oen_r <='1'- 數(shù)據(jù)輸出使能Sda_chk<='0'- 不檢查輸出ELSIF RISING_EDGE(clk_sys) THENIF Lose_r='1' THEN- 數(shù)據(jù)傳輸信號丟失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=>- 準備狀態(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ā)送起始信號狀態(tài)WHEN "0010" => sta_p<=stop_a;- 發(fā)送停止信號狀態(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;-啟動 I2C 狀態(tài),分 5 個時鐘段產(chǎn)生起始信號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'- 起始信號傳送完成,給出標志 Scl_oen_r <='0'Sda_oen_r <='0'Sda_chk<='0'-停止 I2C 狀態(tài),分 4 個時鐘段產(chǎn)生停止信號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'- 停止信號傳送完成,給出標志 Scl_oen_r <='1'Sda_oen_r <='1'Sda_chk<='0'-讀狀態(tài),分 4 個時鐘段讀 1 位信號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ù),給出標志 Scl_oen_r <='0'Sda_oe

38、n_r <='1'Sda_chk<='0:-寫狀態(tài),分4個時鐘段寫1位信號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位信號,給出標志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) 功能:實現(xiàn)字節(jié)數(shù)據(jù)的傳輸控制。(3) 端口說明方向端口名寬度說明輸入Rst1復位信號,外接按鈕開關(guān),低電平復位clk_sys1系統(tǒng)時鐘start1啟動命令stop1停止命令read1讀命令write1寫命令Ack_in1應(yīng)答輸入信號Data_txd8待發(fā)送的8位輸入數(shù)據(jù)或地址,由發(fā)送寄存器提供Bit_data_rd1從位模塊接收的1位數(shù)據(jù)Lose1總線仲裁丟失標志Bit_finish1來自位模塊的1位傳送完成標志輸出c

41、md4輸岀命令Bit_data_wr1向位模塊發(fā)送的數(shù)據(jù)Data_rxd8接收到的8位數(shù)據(jù),送給接收寄存器,Ack_finish1應(yīng)答完成標志Ack_out1從總線上讀岀的應(yīng)答信號(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 位傳送完成標志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ù)傳輸標志SIGNAL en:STD_LOGIC;-使能信號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ù)計數(shù)器SIGNAL cnt_do ne: STD_LOGIC;- 完成1個字節(jié)數(shù)據(jù)移位完成標志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ù)時 shift_reg<=data_txd;- 待發(fā)送數(shù)據(jù)加載到移位寄存器ELSIF shift_en='1' THEN- 讀數(shù)據(jù)時 shift_reg<=shift_reg(6 DOWNTO 0)& bit_data_rd;- 移位讀入數(shù)據(jù)END IF;END IF;END PROCESS;PROCESS (clk_sys,rst) - 進行讀寫位計數(shù)

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

47、" ELSE '0'- 讀寫完 1 個字節(jié)(計數(shù) 8 次),給出標志 -字節(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;- 初始準備狀態(tài) sck_finish_r<='0&#

48、39;- 應(yīng)答完成標志置 0 sck_out<='0'- 應(yīng)答輸出置 0ELSIF RISING_EDGE(clk_sys) THENIF Lose='1' THEN- 數(shù)據(jù)傳輸信號丟失 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)答完成標志置 0 CASE sta_c ISWHEN Byte_idle=>- 空閑狀態(tài)IF en='1' THEN- 發(fā)生讀 /寫/停止命令且無應(yīng)答完成標志 ld_en<='1' - 重新加載寫入數(shù)據(jù)初值,復位傳送計數(shù)器IF start='1' THEN sta_c<=B

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

51、" - 啟動位模塊發(fā)送停止位 ack_finish_r<='1'- 產(chǎn)生傳送完成標志END IF;END IF;WHEN Byte_start=>IF bit_finish='1' THEN - 起始位發(fā)送完成標志 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 位標志IF cnt_done='1' THEN- 寫完 8 位標志 sta_c<=ack_rd; - 讀應(yīng)答狀態(tài) Cmd<="1000"- 準備讀應(yīng)答位ELSE sta_c<=Byte_write;- 保持寫狀態(tài) cmd<= "0100"- 準備繼續(xù)寫下 1 位 shift_en<='1' - 移位,準備下 1 位數(shù)據(jù)END IF;END IF;WHEN Byte_read=&

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

54、;END IF;WHEN ack_rd=>- 讀應(yīng)答狀態(tài)IF bit_finish ='1' THEN - 應(yīng)答位讀完成標志 ack_out<=bit_data_rd;- 輸出應(yīng)答信號 ack_finish_r<='1' - 給出應(yīng)答完成標志 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)答位寫完成標志 bit_data_wr<='1'- 待寫入的位信號為高 ack_finish_r<='1' - 給出應(yīng)答完成標志 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=>- 停止狀態(tài)IF bit_finish='1' THEN - 停止位發(fā)送完成標志 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總線對AT24C256指定單元進行讀寫。(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)時鐘rst,ena, clk_ena:IN STD_LOGIC;-復位,使能信號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復位信號,外接按鈕開關(guān),低電平復位clk_sys1系統(tǒng)時鐘

59、ena1接口使能信號clk_ena1:時鐘使能信號rw1讀寫控制Ack_flag1應(yīng)答值A(chǔ)ck finish1完成一個字節(jié)傳輸標志Slave_addr7:從機地址,送給傳輸寄存器Sub_addr16從機子地址,送給傳輸寄存器Data rd8從從機讀入的數(shù)據(jù),送給接收寄存器Data_in8輸入數(shù)據(jù),送給傳輸寄存器輸出Data_wr8待寫岀值,來自傳輸寄存器Data out8輸岀數(shù)據(jù),來自接收寄存器Rtx f1傳輸完成標志start1啟動命令,來自命令寄存器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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論