![I2C總線接口電路設(shè)計_第1頁](http://file4.renrendoc.com/view/43c8503020cbe2ce0894999104af04ba/43c8503020cbe2ce0894999104af04ba1.gif)
![I2C總線接口電路設(shè)計_第2頁](http://file4.renrendoc.com/view/43c8503020cbe2ce0894999104af04ba/43c8503020cbe2ce0894999104af04ba2.gif)
![I2C總線接口電路設(shè)計_第3頁](http://file4.renrendoc.com/view/43c8503020cbe2ce0894999104af04ba/43c8503020cbe2ce0894999104af04ba3.gif)
![I2C總線接口電路設(shè)計_第4頁](http://file4.renrendoc.com/view/43c8503020cbe2ce0894999104af04ba/43c8503020cbe2ce0894999104af04ba4.gif)
![I2C總線接口電路設(shè)計_第5頁](http://file4.renrendoc.com/view/43c8503020cbe2ce0894999104af04ba/43c8503020cbe2ce0894999104af04ba5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
FPGA與Il234C總線器件接口電路設(shè)計利用FPGA模擬I2C總線協(xié)議對|2C總線接口器件AT24C256進(jìn)行讀寫操作。利用按鍵輸入讀寫命令和相應(yīng)的地址、數(shù)據(jù),對芯片進(jìn)行讀寫操作,讀寫的數(shù)據(jù)用數(shù)碼管顯示。—、12C總線接口電路設(shè)計分析1.i I2C的主機(jī)和從機(jī),發(fā)送器和接收器產(chǎn)生I2C I2C的主機(jī)和從機(jī),發(fā)送器和接收器產(chǎn)生I2C總線時鐘信號和起始、停止控制信號的器件,稱為主機(jī),被主機(jī)尋址的器件稱為從機(jī)。任何將數(shù)據(jù)傳送到I2C總線的器件稱為發(fā)送器,任何從 I2C總線接收數(shù)據(jù)的器件稱為接收器。主機(jī)和從機(jī)都可作為發(fā)送數(shù)據(jù)器件和接收數(shù)據(jù)器件。 I2C總線上數(shù)據(jù)的有效性:時鐘線SCL為高電平時,數(shù)據(jù)線SDA的任何電平變化將被看作總線的起始或停止信號;在數(shù)據(jù)傳送過程中,當(dāng)時鐘線SCL為高電平時,數(shù)據(jù)線SDA必須保持穩(wěn)定狀態(tài),不允許有跳變;數(shù)據(jù)線SDA的狀態(tài)只能在SCL低電平期間才能改變。即進(jìn)行串行傳送數(shù)據(jù)時,在SCL高電平期間傳送位數(shù)據(jù),低電平期間準(zhǔn)備數(shù)據(jù)。 從機(jī)地址I2C總線不需要額外的片選信號或地址譯碼。多個 I2C總線接口器件可連接到一條I2C總線上,它們之間通過地址來區(qū)分。主機(jī)是主控制器件,只有一個主機(jī)的不需要地址。其它器件均為從機(jī),均有器件地址,但必須保證同一條I2C總線上的器件地址不能重復(fù)。一般從機(jī)地址由 7位地址位和1位讀寫位組成,地址位為高7位,讀寫位為最低位。讀寫位為0時,表示主機(jī)將向從機(jī)寫入數(shù)據(jù); 讀寫位為1時,表示主機(jī)將要從從機(jī)讀取數(shù)據(jù)。 I2C總線的通信時序22IC總線的兩根通信線,一根是串行數(shù)據(jù)線 SDA,另一根是串行時鐘線SCL。多個符合IC總線標(biāo)準(zhǔn)的器件都可以通過同一條I2C總線進(jìn)行通信,而不需要額外的地址譯碼器。每個連接到總線上的器件都有一個唯一的地址作為識別的標(biāo)志,都可以發(fā)送或接收數(shù)據(jù)。 I2C總線通信速率受主機(jī)控制,標(biāo)準(zhǔn)模式下可達(dá)100kbit/s。一般具有I2C總線的器件其SDA、SCL引腳都為集電極(或漏極)開路結(jié)構(gòu)。因此實(shí)際使用時,SDA和SCL信號線必須加3~10K的上拉電阻??偩€空閑時均保持高平。 I2C總線接法如圖1所示。VCC圖1I2C總線連接示意圖
SDAIC總線的通信時序如圖2所示。RjDOCOCTTDOCC7SCLRaZUSDAIC總線的通信時序如圖2所示。RjDOCOCTTDOCC7SCLRaZU 八'?…7UUVAAVS起始條件ACK應(yīng)答ACK應(yīng)答停止總線暫??刂茥l件圖2I2C總線的通信時序首先主機(jī)發(fā)送一個起始信號。當(dāng)時鐘線 SCL處于高電平期間,數(shù)據(jù)線SDA電平從高到低的跳變形成I2C總線的起始信號,啟動I2C總線。主機(jī)逐位發(fā)送7位(高位在前,低位在后)從機(jī)地址和 1位讀寫控制信號,共8位。需8個時鐘。與傳送地址一致的從機(jī)發(fā)應(yīng)答信號(ACK)。在第9個時鐘周期時將SDA線拉低表示其已收到一個8位數(shù)據(jù)。若在第9個時鐘周期,SDA為高電平時為非應(yīng)答。開始傳送數(shù)據(jù),傳送數(shù)據(jù)數(shù)量不限。每個字節(jié)( 8位)后緊跟1個接收器件發(fā)出的應(yīng)答位。若是主機(jī)讀取從機(jī)數(shù)據(jù)時,從機(jī)發(fā)送數(shù)據(jù),主機(jī)發(fā)應(yīng)答位;若是主機(jī)寫數(shù)據(jù)到從機(jī)時,主機(jī)發(fā)送數(shù)據(jù),從機(jī)發(fā)應(yīng)答位。數(shù)據(jù)傳輸結(jié)束時,主機(jī)發(fā)送1個停止信號,當(dāng)時鐘線SCL為高電平時,數(shù)據(jù)線SDA由低電平變?yōu)楦唠娖綍r形成終止信號,停止 I2C總線通信。(5)數(shù)據(jù)傳輸基本格式如表1。其中S、SA7~A1其中S、SA7~A1R/WACKD7~D0ACKD7~D0ASKP起始位7位地址0:寫1:讀應(yīng)答位8位數(shù)據(jù)應(yīng)答位8位數(shù)據(jù)應(yīng)答位0:應(yīng)答1:非應(yīng)答停止位表1I2C總線數(shù)據(jù)傳輸基本格式R/W、P總是由主機(jī)產(chǎn)生;寫數(shù)據(jù)時,ACK由從機(jī)產(chǎn)生,D7~D0由主機(jī)產(chǎn)生;讀A7~A1、數(shù)據(jù)時,ACK由主機(jī)產(chǎn)生,D7~D0由從機(jī)產(chǎn)生。2.I2C總線器件AT24C2562265A匚匚匚匚AT24C256是一個256K位的串行CMOS型EPROM,可存儲32768個字節(jié)。該器件通過IC總65A匚匚匚匚TOC\o"1-5"\h\zvccWPSCLSDA線接口進(jìn)行操作,其引腳如圖 3所示,各引腳功能見表 2。表2AT24C256引腳功能說明管腳名稱功能說明管腳名稱SCLAT24C256串行時鐘輸入管腳。用于產(chǎn)生器件所有數(shù)據(jù)發(fā)送或接收的時鐘, 是輸入管腳。SDA雙向串行數(shù)據(jù)/地址管腳。用于器件所有數(shù)據(jù)的發(fā)送或接收, SDA是一個開漏輸岀管腳可與其它開漏輸岀或集電極開路輸岀進(jìn)行線或 wire-OR。WP寫保護(hù)。當(dāng)WP腳連接到Vcc,所有內(nèi)存變成寫保護(hù)只能讀;當(dāng)WP引腳連接到Vss或懸空,允許器件進(jìn)行讀/寫操作。A0A1器件地址輸入。這些管腳為硬連線或者不連接,對于單總線系統(tǒng)最多可尋址 4個AT24C256器件。當(dāng)這些引腳沒有連接時其默認(rèn)值為 0。VSS電源地VCC1.8~6VNC空腳作為帶有I2C總線接口的器件,每個AT24C256都有一個7位的從機(jī)地址,其高5位固定為“10100”接下來的2位由AT24C256的引腳A1A0硬連線輸入決定(A1、A0直接接電源VCC或GND),同一I2C總線上最多可以連接4個AT24C256器件。AT24C256除了有作為從機(jī)的地址,其內(nèi)部還有作為存儲單元的編碼子地址,其子地址為雙字節(jié)( 16位),從0000H~7FFFH。本設(shè)計中只有1個AT24C256,可將AT24C256的引腳A1、A0直接接地,其硬件電路如圖4所示。則該AT24C256作為從機(jī)的7位地址為“1010000”。HHi'-SPA
scTVDDA0A12SPA
scTVDDA0A12SDASCLlOQf104圖4單個AT24C256連接電路圖3.對AT24C256的讀寫過程(1)向AT24C256某一存儲單元寫入1個字節(jié)數(shù)據(jù),過程如下:主機(jī)(這里為FPGA控制器)發(fā)送一個起始信號,啟動發(fā)送過程;主機(jī)發(fā)送7位從機(jī)地址(這里為1010000)和1位寫控制位(為0);從機(jī)(這里為AT24C256)發(fā)應(yīng)答位。在主機(jī)發(fā)送起始信號和從機(jī)地址字節(jié)后, AT24C256監(jiān)視總線并當(dāng)其地址與發(fā)送的從地址相符時,響應(yīng)一個應(yīng)答信號。在第 9個時鐘,將SDA線拉為低電平;主機(jī)接收到應(yīng)答位后,發(fā)從機(jī)子地址高 8位(為AT24C256某一存儲單元地址)。從機(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ù)傳送時序如圖5所示。表3向AT24C256寫1個數(shù)據(jù)時總線SDA上數(shù)據(jù)傳輸格式SA7~A100AD15~AD80AD7~AD00D7~D00/1P
起始位7位器件地址寫應(yīng)答位咼8位指針地址應(yīng)答位低8位指針地址應(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ā)送圖5向AT24C256寫一個數(shù)據(jù)時序(2)從AT24C256某一存儲單元讀出1個字節(jié)數(shù)據(jù),過程如下:主機(jī)發(fā)送一個起始信號,啟動發(fā)送過程,接著發(fā)送7位從機(jī)地址(1010000)和1位寫控制位(0);從機(jī)檢測到起始信號及本身從地址相符時的從機(jī)地址后,發(fā)應(yīng)答位。主機(jī)接收到應(yīng)答位后,發(fā)從機(jī)子地址高 8位(為AT24C256某一存儲單元地址)。從機(jī)接收完高8位子地址后,發(fā)應(yīng)答位;主機(jī)接收到應(yīng)答位后,發(fā)從機(jī)子地址低 8位;從機(jī)接收完低8位子地址后,發(fā)應(yīng)答位;主機(jī)接收到應(yīng)答位后,再發(fā)送一個起始信號(稱為重復(fù)起始信號) ,接著再發(fā)送7位從機(jī)地址(1010000)和1位讀控制位(為1);從機(jī)檢測到重復(fù)起始信號及從機(jī)地址后,發(fā)應(yīng)答位,并將子地址對應(yīng)的存儲單元數(shù)據(jù)發(fā)送到總線上。8數(shù)據(jù)后。發(fā)非應(yīng)答位和發(fā)停8數(shù)據(jù)后。發(fā)非應(yīng)答位和發(fā)停STOP-1OdNoACKSDA上數(shù)據(jù)傳輸格式見表4所示,數(shù)據(jù)傳送時序如圖 6所示。表4從AT24C256上讀1個數(shù)據(jù)時總線SDA上數(shù)據(jù)傳輸格式ST辛ST辛BUSACTIVrTT*$LWEBYTEADDRESSASUWEMASTERRADDRESS島席Afl片訊RADORESSDATASA7A100AD151~AD80AD7AD00SrA7A110D7D0起7位應(yīng)咼8位應(yīng)低8位應(yīng)重復(fù)7位應(yīng)讀岀始器件寫答指針答指針答起始器件讀答8位位地址位地址位地址位位地址位數(shù)據(jù)0/1主機(jī)發(fā)送從機(jī)發(fā)送主機(jī)發(fā)送從機(jī)發(fā)送主機(jī)發(fā)送從機(jī)發(fā)送主機(jī)發(fā)送從機(jī)發(fā)送從機(jī)發(fā)送主機(jī)發(fā)送主機(jī)發(fā)送沁⑷〔;;:;麗Fnrrrt ii rrmFAAAACCCC圖6從AT24C256讀一個數(shù)據(jù)時序4.FPGA內(nèi)部電路⑴I2C總線端口I2C總線端口為三態(tài)輸出,當(dāng)使能端有效時,總線輸出為低電平;當(dāng)使能端無效時三態(tài)門輸出為高阻,但由于I2C總線上有上拉電阻,總線保持在高電平或由總線上從機(jī)輸出數(shù)據(jù)決定??偩€數(shù)據(jù)始終能被讀入。其結(jié)構(gòu)示意圖如圖8所示。SdaSclSdaScl(2)(2)位傳輸控制模塊位傳輸模塊以“位”為單位產(chǎn)生各種圖8I2C總線端口示意圖I2C協(xié)議命令(開始、停止和重復(fù)開始)以及進(jìn)行位數(shù)據(jù)讀寫。為了讀寫到穩(wěn)定的“位”數(shù)據(jù),讀寫 1位數(shù)據(jù)分為4到5個階段完成。1位數(shù)據(jù)傳輸時序要求如圖9所示。這樣內(nèi)部讀寫時鐘頻率一般采用 5倍于SCL時鐘總線頻率。
開始重復(fù)開始停止SCLSDASCLSDASCL開始重復(fù)開始停止SCLSDASCLSDASCLSDASCLSDASCLSDA:AB;C:? * * * '—V ** */ ? i\*―:_/ : :v-i-A: : :A1*111till*1 1j~! L *:: \ :1 / ft I\ 丄一14 11*(3)字傳輸控制模塊字節(jié)傳輸模塊以字節(jié)為單位控制存器中的數(shù)據(jù)加載到一個移位寄存器,圖9(3)字傳輸控制模塊字節(jié)傳輸模塊以字節(jié)為單位控制存器中的數(shù)據(jù)加載到一個移位寄存器,位傳輸控制電路根據(jù)輸入的控制命令,將來自字控制模塊的一位待寫入的數(shù)據(jù)送到總線上,或從總線上讀入一位數(shù)據(jù)給字控制模塊。當(dāng)完成忙標(biāo)志和總線仲裁丟失標(biāo)志。1位數(shù)據(jù)傳輸時產(chǎn)生讀寫完成標(biāo)志,并根據(jù)數(shù)據(jù)傳輸情況產(chǎn)生I2C|2I2C總線上。或控制位傳輸模塊從總線上逐位接收位數(shù)據(jù),暫存到移位寄存器,再轉(zhuǎn)換成字節(jié)數(shù)據(jù)送給數(shù)據(jù)輸出。同時給出相關(guān)傳輸標(biāo)志。(4)AT24C256讀寫控制根據(jù)輸入控制信號和來自位傳輸模塊的反饋標(biāo)志,將控制信號加到命令寄存器,給字節(jié)傳輸模塊提供控制信號;將輸入數(shù)據(jù)或指定單元地址加載到數(shù)據(jù)傳送寄存器;將從字節(jié)模塊讀取的數(shù)據(jù)回送到數(shù)據(jù)接收寄存器。二、 FPGA硬件系統(tǒng)電路設(shè)計(略)三、 I2C總線接口電路VHDL設(shè)計1.I2C總線端口名稱:IIC_IO.vhd功能:I2C總線雙向端口電路描述端口說明 ?方向端口名寬度說明輸入Sdaen1數(shù)據(jù)線三態(tài)使能控制端,來自位傳輸控制模塊Sclen1時鐘線三態(tài)使能控制端,來自位傳輸控制模塊輸出Sda_i1回送的數(shù)據(jù)線信號,給位傳輸控制模塊Scl」1回送的時鐘線信號,給位傳輸控制模塊雙向Sda1I2C的數(shù)據(jù)線,外接I2C器件Scl1I2C的時鐘線,外接I2C器件(4)VHDL描述LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYIIC_IOISPORT(Scl_en,sda_en:INSTD_LOGIC;Sda,Scl:INOUTSTD_LOGIC;Scl_i,sda_i:OUTSTD_LOGIC);ENDIIC_IO;ARCHITECTUREoneOFIIC_IOISBEGINSda_i<=sda;Scl_i<=scl;Scl<='0'WHEN scl_en='O'ELSE'Z';Sda<='0'WHENsda_en='O'ELSE'Z';ENDone;2.位傳輸控制模塊5⑴名稱:bit_txd_rxd.vhd(2)功能:實(shí)現(xiàn)位數(shù)據(jù)或協(xié)議命令的傳輸⑶端口說明方向端口名寬度說明輸入Rst1復(fù)位信號,低電平復(fù)位clk_sys1系統(tǒng)時鐘ena1系統(tǒng)使能信號,咼電平有效cmd4控制命令,由字節(jié)傳輸模塊給岀Bit_data_wr1待寫入總線的1位數(shù)據(jù)Scl」1總線時鐘輸入Sda_i1總線數(shù)據(jù)輸入輸出Scl_oen1總線時鐘輸岀使能Sdaoen1總線數(shù)據(jù)輸岀使能Bit_finish1完成1位讀寫的標(biāo)志,1為完成,0為未完成busy1總線忙標(biāo)志,1為忙,0為閑lose1總線仲裁丟失標(biāo)志,1為岀錯,0為正確Bitdatard1從總線讀岀的1位數(shù)據(jù)5VHDL描述LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_Arith.ALL;USEIEEE.STD_LOGIC_Unsigned.ALL;ENTITYbit_txd_rxdISGENERIC(n:INTEGER:=48);--分頻系數(shù)PORT(Clk_sys: INSTD_LOGIC;Rst,ena: INSTD_LOGIC;cmd:INSTD_LOGIC_VECTOR(3DOWNTO0);Bit_data_wr: INSTD_LOGIC;--Scl_i,sda_i:INSTD_LOGIC;Scl_oen,sda_oen:OUTSTD_LOGIC;Busy,Lose:OUTSTD_LOGIC;Bit_data_rd,Bit_finish:OUTSTD_LOGIC);ENDbit_txd_rxd;ARCHITECTUREtwoOFbit_txd_rxdISwrite_a,Typestate_tIS(bit_idle,start_a,start_b,start_c,start_d,start_e,stop_a,stop_b,stop_c,stop_dwrite_b,write_c,write_d,read_a,read_b,read_c,read_d);write_a,SIGNALsta_p:state_t;CONSTANTn:INTEGER:=48;--產(chǎn)生500KHz的分頻系數(shù)SIGNALen_500k: STD_LOGIC;--500KHz時鐘使能信號SIGNALScl_a,Sda_a,Scl_b,Sda_b:STD_LOGIC;--同步SCL和SDA中間信號SIGNALscl_edg:STD_LOGIC;--SCL的邊沿信號SIGNALscl_oen_r,sda_oen_r:STD_LOGIC;--總線使能信號SIGNALsda_chk:STD_LOGIC;--寫數(shù)據(jù)時,檢查總線信號SIGNALdscl_oen,slave_wait:STD_LOGIC;--時鐘延遲等待的信號SIGNALSda_S,Sda_P:STD_LOGIC;--啟動、停止標(biāo)志位SIGNALBusy_r,Lose_r:STD_LOGIC;--忙標(biāo)志、丟失標(biāo)志信號SIGNALstop_cmd,stop_cmd_r:STD_LOGIC;--停止命令信號BEGINPROCESS(clk_sys,rst)--同步SCL和SDA的輸入信號BEGINIFrst='0'THENScl_a<='1';Sda_a<='1';Scl_b<='1';Sda_b<='1';ELSIFRISING_EDGE(clk_sys)THEN--暫存SCL、SDA的值Scl_a<=Scl_i;Sda_a<=Sda_i;Scl_b<=Scl_a;Sda_b<=Sda_a;ENDIF;ENDPROCESS;Scl_edgv=scl_aAND(NOTScl_b);--檢測時鐘SCL上升沿PROCESS(clk_sys)--產(chǎn)生數(shù)據(jù)輸出信號,在 SCL上升沿時鎖存SDA上的數(shù)據(jù)值BEGINIFRISING_EDGE(clk_sys)THENIFscl_edg='1'THENBit_data_rd<=Sda_a;ENDIF;ENDIF;ENDPROCESS;--從節(jié)點(diǎn)未準(zhǔn)備好時,下拉SCL延遲周期;當(dāng)給出的SCL使能為1時,檢測SCL總線為0時,則節(jié)點(diǎn)未準(zhǔn)備就緒,產(chǎn)生等待信號。PROCESS(clk_sys)BEGINIFRISING_EDGE(clk_sys)THENdscl_oen<=scl_oen_r;ENDIF;ENDPROCESS;Slave_wait<=dscl_oenAND(NOTscl_a);PROCESS(clk_sys,rst)--將24M系統(tǒng)時鐘分頻產(chǎn)生500KHz時鐘使能控制信號VARIABLEcnt:INTEGERRANGE0TOn-1;--時鐘分頻計數(shù)器BEGINIFrst='0'THENcnt:=0;en_500k<='1';ELSIFRISING_EDGE(clk_sys)THENIFclk_cnt<n-1THEN--n為分頻系數(shù)IFena='1'THENcnt:=cnt+1;en_500k<='0';ENDIF;ELSEIFSlave_wait='0'THEN--從節(jié)點(diǎn)準(zhǔn)備好,給出時鐘使能cnt:=0;en_500k<='1';ELSE --從節(jié)點(diǎn)未準(zhǔn)備好,延遲等待cnt:=cnt;en_500k<='0';ENDIF;ENDIF;ENDIF;ENDPROCESS;--生成啟動標(biāo)志和停止標(biāo)志--在SCL高電平時,檢測SDA的下降沿(起始信號),產(chǎn)生啟動標(biāo)志--在SCL高電平時,檢測SDA的上升沿(停止信號),產(chǎn)生停止標(biāo)志PROCESS(clk_sys,rst)BEGINIFrst='0'THENSda_S<='0';--啟動標(biāo)志復(fù)位Sda_P<='0';--停止標(biāo)志復(fù)位ELSIFRISING_EDGE(clk_sys)THENSda_S<=(NOTSda_a)ANDSda_bANDScl_a;--生成啟動標(biāo)志Sda_P<=Sda_aAND(NOTSda_b)ANDScl_a;--生成停止標(biāo)志ENDIF;ENDPROCESS;--生成總線忙標(biāo)志--檢測到啟動信號發(fā)生,但無停止信號發(fā)生時表示總線處于忙狀態(tài)PROCESS(clk_sys,rst)BEGINIFrst='0'THENBusy_r<='0';ELSIFRISING_EDGE(clk_sys)THENBusy_r<=(Sda_SORbusy_r)AND(NOTSda_P);ENDIF;ENDPROCESS;Busy<=busy_r;--忙標(biāo)志輸出--產(chǎn)生仲裁丟失標(biāo)志,--當(dāng)沒有停止請求時,檢測到停止信號,產(chǎn)生仲裁丟失標(biāo)志---當(dāng)驅(qū)動SDA總線為高時,但檢測SDA—直為低,產(chǎn)生仲裁丟失標(biāo)志PROCESS(clk_sys,rst)BEGINIFrst='0'THENstop_cmd<='0';--停止命令信號stop_cmd_r<='0';Lose_r<='0';ELSIFRISING_EDGE(clk_sys)THENIFcmd<="0010"THEN--有停止命令stop_Cmd<='1';ELSEstop_Cmd<='0';ENDIF;stop_Cmd_r<=stop_Cmd;Lose_r<=(Sda_PAND(NOTstop_Cmd_r))OR(NOTsda_aANDsda_chksda_oen_r);--丟失標(biāo)AND志ENDIF;ENDPROCESS;Lose<=Lose_r;--位傳輸狀態(tài)機(jī)Scl_oen<=scl_oen_r;Sda_oen<=Sda_oen_r;PROCESS(clk_sys,rst)BEGINIFrst='0'THENSta_p<=bit_idle;--初始準(zhǔn)備狀態(tài)bit_finish<='0';--1位信號發(fā)送或接收完成標(biāo)志Scl_oen_r<='1';--時鐘輸出使能Sda_oen_r<='1';--數(shù)據(jù)輸出使能Sda_chk<='0';--不檢查輸出ELSIFRISING_EDGE(clk_sys)THENIFLose_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';IFclk_en='1'THENCASEsta_pISWHENbit_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';CASEcmdIS--狀態(tài)命令字WHEN"0001"=>sta_p<=start_a;--發(fā)送起始信號狀態(tài)WHEN"0010"=>sta_p<=stop_a;--發(fā)送停止信號狀態(tài)WHEN"0100"=>sta_p<=write_a;--寫入1位數(shù)據(jù)WHEN"1000"=>sta_p<=read_a;--讀出1位數(shù)據(jù)WHENOTHERS=>sta_p<=bit_idle;ENDCASE;--啟動I2C狀態(tài),分5個時鐘段產(chǎn)生起始信號WHENstart_a=>sta_p<=start_b;Scl_oen_r<=scl_oen_r;--保持SCLSda_oen_r<='1';--SDA處于高Sda_chk<='0';--不檢查輸出WHENstart_b=>sta_p<=start_c;Scl_oen_r<='1';Sda_oen_r<='1';Sda_chk<='0';WHENstart_c=>sta_p<=start_d;Scl_oen_r<='1';Sda_oen_r<='0';Sda_chk<='0';WHENstart_d=>sta_p<=start_e;Scl_oen_r<='1';Sda_oen_r<='0';Sda_chk<='0';WHENstart_e=> --開始狀態(tài)5sta_p<=bit_idle;--回到等待狀態(tài)bit_finish<='1';--起始信號傳送完成,給出標(biāo)志Scl_oen_r<='0';Sda_oen_r<='0';Sda_chk<='0';--停止I2C狀態(tài),分4個時鐘段產(chǎn)生停止信號WHENstop_a=>sta_p<=stop_b;Scl_oen_r<='0';Sda_oen_r<='0';Sda_chk<='0';WHENstop_b=>sta_p<=stop_c;Scl_oen_r<='1';Sda_oen_r<='0';Sda_chk<='0';WHENstop_c=>sta_p<=stop_d;Scl_oen_r<='1';Sda_oen_r<='0';Sda_chk<='0';WHENstop_d=>sta_p<=bit_idle;bit_finish<='1';--停止信號傳送完成,給出標(biāo)志Scl_oen_r<='1';Sda_oen_r<='1';Sda_chk<='0';--讀狀態(tài),分4個時鐘段讀1位信號WHENread_a=>sta_p<=read_b;Scl_oen_r<='0';--SCL處于低Sda_oen_r<='1';--SDA由從器件決定Sda_chk<='0';WHENread_b=>sta_p<=read_c;Scl_oen_r<='1';Sda_oen_r<='1';Sda_chk<='0';WHENread_c=>sta_p<=read_d;Scl_oen_r<='1';Sda_oen_r<='1';Sda_chk<='0';WHENread_d=>sta_p<=bit_idle;bit_finish<='1';--讀完1位數(shù)據(jù),給出標(biāo)志Scl_oen_r<='0';Sda_oen_r<='1';Sda_chk<='0:--寫狀態(tài),分4個時鐘段寫1位信號WHENwrite_a=>sta_p<=write_b;Scl_oen_r<='0';--SCL處于低Sda_oen」<=bit_data_wr;--輸入數(shù)據(jù)Sda_chk<='0';WHENwrite_b=>sta_p<=write_c;Scl_oen_r<='1';--Sda_oen_r<=bit_data_wr;Sda_chk<='1';--WHENwrite_c=>--寫狀態(tài)3sta_p<=write_d;Scl_oen_r<='1';--Sda_oen_r<=bit_data_wr;Sda_chk<='1';WHENwrite_d=>--寫狀態(tài)4sta_p<=bit_idle;bit_finish<='1';--寫完1位信號,給出標(biāo)志Scl_oen_r<='0';Sda_oen_r<=bit_data_wr;Sda_chk<='0';WHENOTHERS=>null;ENDCASE;ENDIF;ENDIF;ENDIF;ENDPROCESS;ENDtwo;3.字傳輸控制模塊⑴名稱:byte_txd_rxd.vhd(2)功能:實(shí)現(xiàn)字節(jié)數(shù)據(jù)的傳輸控制。⑶端口說明方向端口名寬度說明Rst1復(fù)位信號,外接按鈕開關(guān),低電平復(fù)位clk_sys1系統(tǒng)時鐘輸入start1啟動命令stop1停止命令read1讀命令write1寫命令A(yù)ck_in1應(yīng)答輸入信號Data_txd8待發(fā)送的8位輸入數(shù)據(jù)或地址,由發(fā)送寄存器提供Bit_data_rd1從位模塊接收的1位數(shù)據(jù)
Lose1總線仲裁丟失標(biāo)志Bit_finishLose1總線仲裁丟失標(biāo)志Bit_finish1來自位模塊的1位傳送完成標(biāo)志輸出cmd4輸岀命令Bit_data_wr1向位模塊發(fā)送的數(shù)據(jù)Data_rxd8接收到的8位數(shù)據(jù),送給接收寄存器,Ack_finish1應(yīng)答完成標(biāo)志Ack_out1從總線上讀岀的應(yīng)答信號LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_Arith.ALL;USEIEEE.STD_LOGIC_Unsigned.ALL;ENTITYbyte_txd_rxdISPORT(clk_sys: INSTD_LOGIC;rst: INSTD_LOGIC;ack_in: INSTD_LOGIC;data_txd: INSTD_LOGIC_VECTOR(7DOWNTO0);start,stop,write,read: INSTD_LOGIC;lose: INSTD_LOGIC;bit_data_rd:INSTD_LOGIC;--從位控制模塊讀入的一位數(shù)據(jù)bit_finish: INSTD_LOGIC;--1位傳送完成標(biāo)志cmd: OUTSTD_LOGIC_VECTOR(3DOWNTO0);bit_data_wr:OUTSTD_LOGIC;--待寫出的位數(shù)據(jù)ack_finish,ack_out:OUTSTD_LOGIC;data_rxd: OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDbyte_txd_rxd;ARCHITECTUREthreeOFbyte_txd_rxdISTypestate_byteIS(byte_idle,byte_start,byte_stop,byte_write,byte_read,ack_wr,ack_rd);SIGNALsta_c:state_byte;SIGNALack_finish_r:STD_LOGIC;--完成1字節(jié)數(shù)據(jù)傳輸標(biāo)志SIGNALen: STD_LOGIC;--使能信號SIGNALld_en,shift_en:STD_LOGIC;--加載數(shù)據(jù)使能、移位數(shù)據(jù)使能SIGNALshift_reg: STD_LOGIC_VECTOR(7DOWNTO0);--數(shù)據(jù)移位寄存器SIGNALcnt_rw:STD_LOGIC_VECTOR(2DOWNTO0);--移位次數(shù)計數(shù)器SIGNALcnt_done:STD_LOGIC;--完成1個字節(jié)數(shù)據(jù)移位完成標(biāo)志BEGINack_finish<=ack_finish_r;en<=(readORwriteORstop)AND(NOTAck_finish_r);--操作使能PROCESS(clk_sys,rst)--生成移位寄存器內(nèi)容BEGINIFrst='0'THENshift_reg<=(OTHERS=>'0');ELSIFRISING_EDGE(clk_sys)THENIFld_en='1'THEN--寫數(shù)據(jù)時shift_reg<=data_txd;--待發(fā)送數(shù)據(jù)加載到移位寄存器ELSIFshift_en='1'THEN--讀數(shù)據(jù)時shift_reg<=shift_reg(6DOWNTO0)&bit_data_rd;--移位讀入數(shù)據(jù)ENDIF;ENDIF;ENDPROCESS;PROCESS(clk_sys,rst)--進(jìn)行讀寫位計數(shù)BEGINIFrst='0'THENcnt_rw<="000";ELSIFRISING_EDGE(clk_sys)THENIFLd_en='1'THEN--加載新數(shù)據(jù)時cnt_rw<="111";--設(shè)置計數(shù)初值為8次ELSIFshift_en='1'THEN--移位1次cnt_rw<=cnt_rw-1;--減1計數(shù)ENDIF;ENDIF;ENDPROCESS;cnt_done<='1'WHENcnt_rw="000"ELSE'0';--讀寫完1個字節(jié)(計數(shù)8次),給出標(biāo)志--字節(jié)傳送狀態(tài)控制PROCESS(clk_sys,rst)BEGINIFrst='0'THENcmd<="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';--應(yīng)答完成標(biāo)志置0sck_out<='0';--應(yīng)答輸出置0ELSIFRISING_EDGE(clk_sys)THENIFLose='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_wr<=shift_reg(7);--取移位寄存器的最高位作為待寫出位shift_en<='0';--禁止移位ld_en<='0';--禁止加載ack_finish_r<='0';--應(yīng)答完成標(biāo)志置0CASEsta_cISWHENByte_idle=>--空閑狀態(tài)IFen='1'THEN--發(fā)生讀/寫/停止命令且無應(yīng)答完成標(biāo)志ld_en<='1';--重新加載寫入數(shù)據(jù)初值,復(fù)位傳送計數(shù)器IFstart='1'THENsta_c<=Byte_start;--起始狀態(tài)cmd<="0001";--啟動位模塊發(fā)送起始位ELSIFread='1'THENsta_c<=Byte_read;--讀狀態(tài)cmd<="1000";--啟動位模塊讀取1位數(shù)據(jù)ELSIFwrite='1'THENsta_c<=Byte_write;--寫狀態(tài)cmd<="0100";--啟動位模塊寫入1位數(shù)據(jù)ELSEsta_c<=Byte_stop;----停止?fàn)顟B(tài)cmd<="0010";--啟動位模塊發(fā)送停止位ack_finish_r<='1';--產(chǎn)生傳送完成標(biāo)志ENDIF;ENDIF;WHENByte_start=>IFbit_finish='1'THEN--起始位發(fā)送完成標(biāo)志ld_en<='1';--重新加載初值IFread='1'THENsta_c<=Byte_read;cmd<="1000";ELSEsta_c<=Byte_write;cmd<="0100";ENDIF;ENDIF;WHENByte_write=>IFbit_finish='1'THEN--寫完1位標(biāo)志IFcnt_done='1'THEN--寫完8位標(biāo)志sta_c<=ack_rd;--讀應(yīng)答狀態(tài)Cmd<="1000";--準(zhǔn)備讀應(yīng)答位ELSEsta_c<=Byte_write;--保持寫狀態(tài)cmd<="0100";--準(zhǔn)備繼續(xù)寫下1位shift_en<='1';--移位,準(zhǔn)備下1位數(shù)據(jù)ENDIF;ENDIF;WHENByte_read=>IFbit_finish='1'THEN--讀完1位標(biāo)志shift_en<='1';--移位,存儲新讀入的1位數(shù)據(jù)IFcnt_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)答信號ELSEsta_c<=Byte_read;--保持讀狀態(tài)Cmd<="1000";--準(zhǔn)備繼續(xù)讀下1位ENDIF;ENDIF;WHENack_rd=>--讀應(yīng)答狀態(tài)IFbit_finish='1'THEN-應(yīng)答位讀完成標(biāo)志ack_outv=bit_data_rd;--輸出應(yīng)答信號ack_finish」v=T;--給出應(yīng)答完成標(biāo)志data_rxd<=shift_reg;IFstop='1'THENsta_c<=Byte_stop;cmd<="0010";--發(fā)停止位ELSEsta_c<=Byte_idle;--空閑狀態(tài)cmd<="0000";--等待ENDIF;ENDIF;WHENack_wr=>--寫應(yīng)答狀態(tài)IFbit_finish='1'THEN--應(yīng)答位寫完成標(biāo)志bit_data_wr<='1';--待寫入的位信號為高ack_finish_r<='1';--給出應(yīng)答完成標(biāo)志IFstop='1'THENsta_c<=Byte_stop;cmd<="0010";--發(fā)停止位ELSEsta_c<=Byte_idle;--空閑狀態(tài)cmd<="0000";--等待ENDIF;ELSEbit_data_wr<=ack_in;ENDIF;WHENByte_stop=>--停止?fàn)顟B(tài)IFbit_finish='1'THEN--停止位發(fā)送完成標(biāo)志sta_c<=Byte_idle;Cmd<="0000";--等待ENDIF;ENDCASE;ENDIF;ENDIF;ENDPROCESS;ENDthree;4.AT24C256讀寫控制⑴名稱:AT24C256_wr.vhd功能:通過|2C總線對AT24C256指定單元進(jìn)行讀寫。端口說明6方向端口名寬度說明輸入Rst1復(fù)位信號,外接按鈕開關(guān),低電平復(fù)位clk_sys1系統(tǒng)時鐘ena1接口使能信號clk_ena1時鐘使能信號rw1讀寫控制Ack_flag1應(yīng)答值A(chǔ)ck_finish1完成一個字節(jié)傳輸標(biāo)志Slaveaddr7從機(jī)地址,送給傳輸寄存器Sub_addr16從機(jī)子地址,送給傳輸寄存器Data_rd8從從機(jī)讀入的數(shù)據(jù),送給接收寄存器Data_in8輸入數(shù)據(jù),送給傳輸寄存器輸出Data_wr8待寫岀值,來自傳輸寄存器Data_out8輸岀數(shù)據(jù),來自接收寄存器Rtxf1傳輸完成標(biāo)志start1啟動命令,來自命令寄存器stop1停止命令,來自命令寄存器read1讀命令,來自命令寄存器write1寫命令,來自命令寄存器ENDAT24C256_rw;ARCHITECTUREfourOFAT24C256_rwIS6VHDL描述LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_Arith.ALL;USEIEEE.STD_LOGIC_Unsigned.ALL;ENTITYAT24C256_rwISPORT(clk_sys: INSTD_LOGIC;--24MHz系統(tǒng)時鐘rst,ena,clk_ena: INSTD_LOGIC;--復(fù)位,使能信號rw: INSTD_LOGIC;slave_addr:STD_LOGIC_VECTOR(6DOWNTO0);sub_addr:STD_L0GIC_VECT0R(15DOWNTO0);data_in:INSTD_LOGIC_VECTOR(7DOWNTO0);ack_finish,ack_flag:INSTD_LOGIC;data_rxd:INSTD_LOGIC_VECTOR(7DOWNTO0);data_wr:OUTSTD_LOGIC_VECTOR(7DOWNTO0);start,stop,write,read:OUTSTD_LOGIC;data_out:OUTSTD_LOGIC_VECTOR(7DOWNTO0);rtx_f:OUTSTD_LOGIC);Typestate_atIS(S0,S1,S2,S3,S4,S5,S6);SIGNALsta_n:state_at;SIGNALcmd_reg:STD_LOGIC_VECTOR(3DOWNTO0);-- 命令寄存器SIGNALtxd_reg:STD_LOGIC_VECTOR(7DOWNTO0);--數(shù)據(jù)發(fā)送寄存器SIGNALrxd_reg:STD_LOGIC_VECTOR(7DOWNTO0);--數(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_sys)BEGINIFrst='0'THENcmd_reg<="0000";--命令寄存器清零txd_reg<="00000000";--數(shù)據(jù)傳輸寄存器清零Sta_n<=S0;ELSIFRISING_EDGE(clk_sys)THENCASEsta_nISWHEN
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 部編版八年級道德與法治上冊聽課評課記錄《7.2服務(wù)社會》
- 2024-2025學(xué)年八年級物理全冊1.3站在巨人的肩膀上練習(xí)含解析新版滬科版
- 技術(shù)員年度工作規(guī)劃
- 公司行政部門個人工作計劃
- 年度幼兒教師個人工作計劃
- 物業(yè)客服部工作計劃范本
- 可調(diào)單價合同范本
- 知識產(chǎn)權(quán)授權(quán)協(xié)議書范本
- 商業(yè)店鋪?zhàn)赓U合同范本
- 紅河衛(wèi)生職業(yè)學(xué)院《物理化學(xué)(II)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2024年服裝門店批發(fā)管理系統(tǒng)軟件項(xiàng)目可行性研究報告
- 交通法規(guī)課件
- (優(yōu)化版)高中地理新課程標(biāo)準(zhǔn)【2024年修訂版】
- 《Python程序設(shè)計》課件-1:Python簡介與應(yīng)用領(lǐng)域
- 各類心理量表大全
- 體育概論(第二版)課件第三章體育目的
- DB11T 1481-2024生產(chǎn)經(jīng)營單位生產(chǎn)安全事故應(yīng)急預(yù)案評審規(guī)范
- 《氓》教學(xué)設(shè)計 2023-2024學(xué)年統(tǒng)編版高中語文選擇性必修下冊
- 《網(wǎng)店運(yùn)營與管理》第3版 課件全套 白東蕊 第1-11章 網(wǎng)上開店概述- 移動網(wǎng)店運(yùn)營
- 2024年全國國家電網(wǎng)招聘之電網(wǎng)計算機(jī)考試歷年考試題(附答案)
- 化學(xué)元素周期表注音版
評論
0/150
提交評論