![I2C總線接口電路設(shè)計(jì)_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/7/27920ebc-7f15-4265-862d-5c4f5419f5f2/27920ebc-7f15-4265-862d-5c4f5419f5f21.gif)
![I2C總線接口電路設(shè)計(jì)_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/7/27920ebc-7f15-4265-862d-5c4f5419f5f2/27920ebc-7f15-4265-862d-5c4f5419f5f22.gif)
![I2C總線接口電路設(shè)計(jì)_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/7/27920ebc-7f15-4265-862d-5c4f5419f5f2/27920ebc-7f15-4265-862d-5c4f5419f5f23.gif)
![I2C總線接口電路設(shè)計(jì)_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/7/27920ebc-7f15-4265-862d-5c4f5419f5f2/27920ebc-7f15-4265-862d-5c4f5419f5f24.gif)
![I2C總線接口電路設(shè)計(jì)_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/7/27920ebc-7f15-4265-862d-5c4f5419f5f2/27920ebc-7f15-4265-862d-5c4f5419f5f25.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、FPGA與I2C總線器件接口電路設(shè)計(jì)利用FPGA模擬I2C總線協(xié)議對I2C總線接口器件AT24C256 進(jìn)行讀寫操作。利用按鍵輸入讀寫命令和相應(yīng)的地址、數(shù)據(jù),對芯片進(jìn)行讀寫操作,讀寫的數(shù)據(jù)用數(shù)碼管顯示。一、I2C總線接口電路設(shè)計(jì)分析1. I2C 總線協(xié)議I2C 總線的兩根通信線,一根是串行數(shù)據(jù)線SDA,另一根是串行時鐘線SCL。多個符合I2C總線標(biāo)準(zhǔn)的器件都可以通過同一條I2C總線進(jìn)行通信,而不需要額外的地址譯碼器。每個連接到總線上的器件都有一個唯一的地址作為識別的標(biāo)志,都可以發(fā)送或接收數(shù)據(jù)。I2C 總線通信速率受主機(jī)控制,標(biāo)準(zhǔn)模式下可達(dá)100kbit/s。一般具有I2C總線的器件其SDA、S
2、CL引腳都為集電極(或漏極)開路結(jié)構(gòu)。因此實(shí)際使用時,SDA和SCL信號線必須加310K的上拉電阻??偩€空閑時均保持高平。I2C總線接法如圖1所示。主機(jī)SDA SCL從機(jī)1SDA SCL從機(jī)2SDA SCL從機(jī)nSDAVCCSCL圖1 I2C總線連接示意圖(1) I2C的主機(jī)和從機(jī),發(fā)送器和接收器產(chǎn)生I2C總線時鐘信號和起始、停止控制信號的器件,稱為主機(jī),被主機(jī)尋址的器件稱為從機(jī)。任何將數(shù)據(jù)傳送到I2C總線的器件稱為發(fā)送器,任何從I2C總線接收數(shù)據(jù)的器件稱為接收器。主機(jī)和從機(jī)都可作為發(fā)送數(shù)據(jù)器件和接收數(shù)據(jù)器件。(2) I2C 總線上數(shù)據(jù)的有效性:時鐘線SCL為高電平時,數(shù)據(jù)線SDA的任何電平變
3、化將被看作總線的起始或停止信號;在數(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ù)。(3) 從機(jī)地址 I2C總線不需要額外的片選信號或地址譯碼。多個I2C總線接口器件可連接到一條I2C總線上,它們之間通過地址來區(qū)分。主機(jī)是主控制器件,只有一個主機(jī)的不需要地址。其它器件均為從機(jī),均有器件地址,但必須保證同一條I2C總線上的器件地址不能重復(fù)。一般從機(jī)地址由7位地址位和1位讀寫位組成,地址位為高7位,讀寫位為最低位。讀寫位為0時,表示主機(jī)將向從
4、機(jī)寫入數(shù)據(jù);讀寫位為1時,表示主機(jī)將要從從機(jī)讀取數(shù)據(jù)。(4) I2C 總線的通信時序I2C 總線的通信時序如圖2所示。SDASCLS起始條件P停止條件ACK應(yīng)答ACK應(yīng)答總線暫??刂仆V箺l件1217892圖2 I2C 總線的通信時序 首先主機(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)答。
5、開始傳送數(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。表1 I2C總線數(shù)據(jù)傳輸基本格式SA7A1R/WACKD7D0ACKD7D0ASKP起始位7位地址0:寫1:讀應(yīng)答位8位數(shù)據(jù)應(yīng)答位8位數(shù)據(jù)應(yīng)答位0:應(yīng)答1:非應(yīng)答停止位其中S、A7A1、R/W、P總是由主機(jī)產(chǎn)生;寫數(shù)據(jù)時,ACK由從機(jī)產(chǎn)生,D7D0由主
6、機(jī)產(chǎn)生;讀數(shù)據(jù)時,ACK由主機(jī)產(chǎn)生,D7D0由從機(jī)產(chǎn)生。2. I2C總線器件AT24C256 AT24C256 是一個256K 位的串行CMOS型 E2PROM, 可存儲32768 個字節(jié)。該器件通過I2C總線接口進(jìn)行操作,其引腳如圖3所示,各引腳功能見表2。圖3 AT24C256引腳圖表2 AT24C256引腳功能說明管腳名稱功能說明SCLAT24C256 串行時鐘輸入管腳。用于產(chǎn)生器件所有數(shù)據(jù)發(fā)送或接收的時鐘,是輸入管腳。SDA雙向串行數(shù)據(jù)/地址管腳。用于器件所有數(shù)據(jù)的發(fā)送或接收,SDA 是一個開漏輸出管腳可與其它開漏輸出或集電極開路輸出進(jìn)行線或wire-OR。WP寫保護(hù)。當(dāng)WP 腳連接到
7、Vcc ,所有內(nèi)存變成寫保護(hù)只能讀;當(dāng)WP 引腳連接到Vss 或懸空,允許器件進(jìn)行讀/寫操作。A0 A1器件地址輸入。這些管腳為硬連線或者不連接,對于單總線系統(tǒng)最多可尋址4 個AT24C256器件。當(dāng)這些引腳沒有連接時其默認(rèn)值為0。VSS電源地VCC1.86VNC空腳作為帶有I2C總線接口的器件,每個AT24C256都有一個7位的從機(jī)地址,其高5 位固定為“10100”,接下來的2 位由AT24C256的引腳A1 A0 硬連線輸入決定(A1、A0直接接電源VCC或GND),同一I2C總線上最多可以連接4 個AT24C256器件。AT24C256除了有作為從機(jī)的地址,其內(nèi)部還有作為存儲單元的編碼
8、子地址,其子地址為雙字節(jié)(16位),從0000H7FFFH。本設(shè)計(jì)中只有1 個AT24C256,可將AT24C256的引腳A1、 A0直接接地,其硬件電路如圖4所示。則該AT24C256作為從機(jī)的7位地址為“1010000”。圖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)視總線
9、并當(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ù)傳輸格式SA7A100AD15AD80AD7AD00D7D00
10、/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ī)
11、接收完低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ā)送到總線上。 主機(jī)接收到應(yīng)答位后,接著準(zhǔn)備從總線接收數(shù)據(jù),從總線接收完8數(shù)據(jù)后。發(fā)非應(yīng)答位和發(fā)停止位,結(jié)束傳送,總線掛起。SDA上數(shù)據(jù)傳輸格式見表4所示,數(shù)據(jù)傳送時序如圖6所示。表4 從AT24C256上讀1個數(shù)據(jù)時總線SDA上數(shù)據(jù)傳輸格式SA7A100AD15AD80AD7AD00SrA7A110D7D00/1P起始位7位器件地址寫應(yīng)答位高8位指針地址應(yīng)答位
12、低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ā)送圖6 從AT24C256讀一個數(shù)據(jù)時序4. FPGA內(nèi)部電路模擬I2C總線對AT24C256的讀寫控制電路基本結(jié)構(gòu)框圖如圖7所示。AT24C256讀寫控制接口字節(jié)傳輸控制電路位傳輸控制電路IO總線端口電路SclSda命令寄存器傳送寄存器接收寄存器移位寄存器標(biāo)志寄存器圖7 模擬I2C總線對AT24C256的讀寫控制框圖(1) I2C總線端口I2C總線端口為三態(tài)輸出,當(dāng)使能端有效時,總線輸出為低電平;當(dāng)使能端無效時三態(tài)門輸出為高阻,但由于
13、I2C總線上有上拉電阻,總線保持在高電平或由總線上從機(jī)輸出數(shù)據(jù)決定。總線數(shù)據(jù)始終能被讀入。其結(jié)構(gòu)示意圖如圖8所示。SdaSda_enSda_iVccSclScl_enScl_iVcc圖8 I2C總線端口示意圖(2) 位傳輸控制模塊位傳輸模塊以“位”為單位產(chǎn)生各種I2C協(xié)議命令(開始、停止和重復(fù)開始)以及進(jìn)行位數(shù)據(jù)讀寫。為了讀寫到穩(wěn)定的“位”數(shù)據(jù),讀寫1位數(shù)據(jù)分為4到5個階段完成。1位數(shù)據(jù)傳輸時序要求如圖9所示。這樣內(nèi)部讀寫時鐘頻率一般采用5倍于SCL時鐘總線頻率。SCLSDASCLSDASCLSDASCLSDASCLSDA開始重復(fù)開始停止寫讀ABC圖9 I2C協(xié)議命令和位數(shù)據(jù)傳輸?shù)膱?zhí)行時序位傳
14、輸控制電路根據(jù)輸入的控制命令,將來自字控制模塊的一位待寫入的數(shù)據(jù)送到總線上,或從總線上讀入一位數(shù)據(jù)給字控制模塊。當(dāng)完成1位數(shù)據(jù)傳輸時產(chǎn)生讀寫完成標(biāo)志,并根據(jù)數(shù)據(jù)傳輸情況產(chǎn)生忙標(biāo)志和總線仲裁丟失標(biāo)志。(3) 字傳輸控制模塊字節(jié)傳輸模塊以字節(jié)為單位控制I2C總線的數(shù)據(jù)傳輸。該模塊根據(jù)輸入控制命令,將存放在發(fā)送寄存器中的數(shù)據(jù)加載到一個移位寄存器,然后逐位發(fā)送到位傳輸模塊,再控制位傳輸模塊將數(shù)據(jù)發(fā)送到I2C總線上。或控制位傳輸模塊從總線上逐位接收位數(shù)據(jù),暫存到移位寄存器,再轉(zhuǎn)換成字節(jié)數(shù)據(jù)送給數(shù)據(jù)輸出。同時給出相關(guān)傳輸標(biāo)志。(4) AT24C256讀寫控制根據(jù)輸入控制信號和來自位傳輸模塊的反饋標(biāo)志,將控
15、制信號加到命令寄存器,給字節(jié)傳輸模塊提供控制信號;將輸入數(shù)據(jù)或指定單元地址加載到數(shù)據(jù)傳送寄存器;將從字節(jié)模塊讀取的數(shù)據(jù)回送到數(shù)據(jù)接收寄存器。 二、FPGA硬件系統(tǒng)電路設(shè)計(jì)(略)三、I2C總線接口電路VHDL設(shè)計(jì)1. I2C總線端口(1) 名稱:IIC_IO.vhd(2) 功能:I2C總線雙向端口電路描述(3) 端口說明方向端口名寬度說明輸入Sda_en1數(shù)據(jù)線三態(tài)使能控制端,來自位傳輸控制模塊Scl_en1時鐘線三態(tài)使能控制端,來自位傳輸控制模塊輸出Sda_i1回送的數(shù)據(jù)線信號,給位傳輸控制模塊Scl_i1回送的時鐘線信號,給位傳輸控制模塊雙向Sda1I2C的數(shù)據(jù)線,外接I2C器件Scl1I2
16、C的時鐘線,外接I2C器件(4) VHDL描述LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY IIC_IO ISPORT( Scl_en,sda_en:IN STD_LOGIC; Sda,Scl: INOUT STD_LOGIC; Scl_i,sda_i : OUT STD_LOGIC);END IIC_IO;ARCHITECTURE one OF IIC_IO ISBEGIN Sda_i<=sda; Scl_i<=scl; Scl<='0' WHEN scl_en='0' ELSE '
17、;Z' Sda<='0' WHEN sda_en='0' ELSE 'Z'END one;2. 位傳輸控制模塊(1)名稱:bit_txd_rxd.vhd(2)功能:實(shí)現(xiàn)位數(shù)據(jù)或協(xié)議命令的傳輸(3)端口說明方向端口名寬度說明輸入Rst1復(fù)位信號,低電平復(fù)位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_finish 1完成1位
18、讀寫的標(biāo)志,1為完成,0為未完成busy1總線忙標(biāo)志,1為忙,0為閑lose1總線仲裁丟失標(biāo)志,1為出錯,0為正確Bit_data_rd1從總線讀出的1位數(shù)據(jù)(4) VHDL描述LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_Arith.ALL;USE IEEE.STD_LOGIC_Unsigned.ALL;ENTITY bit_txd_rxd ISGENERIC (n:INTEGER:=48);-分頻系數(shù)PORT( Clk_sys:INSTD_LOGIC; Rst,ena:INSTD_LOGIC; cmd: INST
19、D_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,start_d,start_e,stop
20、_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;-SCL的邊沿信號SIGNAL scl_oen_r, s
21、da_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;-啟動、停止標(biāo)志位SIGNAL Busy_r,Lose_r: STD_LOGIC;-忙標(biāo)志、丟失標(biāo)志信號SIGNAL stop_cmd,stop_cmd_r: STD_LOGIC;-停止命令信號BEGINPROCESS (clk_sys,rst) -同步SCL和SDA的輸入信號BEGIN IF rst='
22、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);-檢測時鐘SCL上升沿PROCESS (clk_sys) -產(chǎn)生
23、數(shù)據(jù)輸出信號,在SCL上升沿時鎖存SDA上的數(shù)據(jù)值BEGIN IF RISING_EDGE(clk_sys) THEN IF scl_edg='1' THEN Bit_data_rd<=Sda_a; END IF; END IF; END PROCESS;-從節(jié)點(diǎn)未準(zhǔn)備好時,下拉SCL延遲周期;當(dāng)給出的SCL使能為1時,檢測SCL總線為0時,則節(jié)點(diǎn)未準(zhǔn)備就緒,產(chǎn)生等待信號。PROCESS (clk_sys) BEGIN IF RISING_EDGE(clk_sys) THEN dscl_oen<=scl_oen_r; END IF;END PROCESS;Slave
24、_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;-時鐘分頻計(jì)數(shù)器BEGIN IF rst='0' THEN cnt:=0; en_500k<='1' ELSIF RISING_EDGE(clk_sys) THEN IF clk_cnt<n-1 THEN -n為分頻系數(shù) IF ena='1' THEN cnt:= cnt+1; en_500k&
25、lt;='0' END IF; ELSE IF Slave_wait='0' THEN-從節(jié)點(diǎn)準(zhǔn)備好,給出時鐘使能cnt:=0; en_500k<='1' ELSE -從節(jié)點(diǎn)未準(zhǔn)備好,延遲等待 cnt:= cnt; en_500k<='0' END IF; END IF; END IF;END PROCESS;-生成啟動標(biāo)志和停止標(biāo)志-在SCL高電平時,檢測SDA的下降沿(起始信號),產(chǎn)生啟動標(biāo)志-在SCL高電平時,檢測SDA的上升沿(停止信號),產(chǎn)生停止標(biāo)志PROCESS (clk_sys,rst) BEGIN IF
26、 rst='0' THEN Sda_S<='0'-啟動標(biāo)志復(fù)位 Sda_P<='0'- 停止標(biāo)志復(fù)位 ELSIF RISING_EDGE(clk_sys) THEN Sda_S<=(NOT Sda_a ) AND Sda_b AND Scl_a ;-生成啟動標(biāo)志 Sda_P<=Sda_a AND ( NOT Sda_b ) AND Scl_a; -生成停止標(biāo)志 END IF;END PROCESS;-生成總線忙標(biāo)志-檢測到啟動信號發(fā)生,但無停止信號發(fā)生時表示總線處于忙狀態(tài)PROCESS (clk_sys,rst) BEGI
27、N IF 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)沒有停止請求時,檢測到停止信號,產(chǎn)生仲裁丟失標(biāo)志-當(dāng)驅(qū)動SDA總線為高時,但檢測SDA一直為低,產(chǎn)生仲裁丟失標(biāo)志PROCESS (clk_sys,rst) BEGIN IF rst='0' THEN stop_cmd<
28、='0'-停止命令信號 stop_cmd_r <='0' Lose_r<='0' ELSIF RISING_EDGE(clk_sys) THEN IF cmd<= "0010" THEN -有停止命令 stop_Cmd<='1' ELSE stop_Cmd<='0' END IF; stop_Cmd_r <= stop_Cmd; Lose_r<=(Sda_P AND (NOT stop_Cmd_r ) OR(NOT sda_a AND sda_chk A
29、ND 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) BEGIN IF rst='0' THEN Sta_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
30、<='0'-不檢查輸出 ELSIF RISING_EDGE(clk_sys) THEN IF Lose_r='1' THEN-數(shù)據(jù)傳輸信號丟失 Sta_p<=bit_idle; bit_finish <='0' Scl_oen_r <='1' Sda_oen_r <='1' Sda_chk<='0' ELSE bit_finish <='0' IF clk_en='1' THEN CASE sta_p IS WHEN bit_
31、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ā)送起始信號狀態(tài) WHEN "0010" => sta_p<=stop_a;- 發(fā)送停止信號狀態(tài) WHEN "0100" => sta_p<=write_a;-寫入1位數(shù)據(jù) W
32、HEN "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; -保持SCL Sda_oen_r <='1' -SDA處于高 Sda_chk<='0' -不檢查輸出 WHEN start_b=> sta_p<=start_c; Scl_o
33、en_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' Sda_chk<='0
34、9; WHEN start_e=> -開始狀態(tài)5 sta_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)生停止信號 WHEN stop_a=> sta_p<=stop_b; Scl_oen_r <='0' Sda_oen_r <='0' Sda_chk<=
35、9;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_finish <='1'-
36、停止信號傳送完成,給出標(biāo)志 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_c; Scl_oen_r <='1&
37、#39; 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_oen_r <='1'
38、 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_oen_r <=bit_data_wr; Sda_chk<='1'- WHEN wr
39、ite_c=> -寫狀態(tài)3 sta_p<= write_d; Scl_oen_r <='1' - Sda_oen_r <= bit_data_wr; Sda_chk<='1' WHEN write_d=> -寫狀態(tài)4 sta_p<=bit_idle; bit_finish <='1'-寫完1位信號,給出標(biāo)志 Scl_oen_r <='0' Sda_oen_r <= bit_data_wr; Sda_chk<='0' WHEN OTHERS=>n
40、ull; 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ù)位信號,外接按鈕開關(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_finish1來自位模塊的1位傳送完成標(biāo)志
41、輸出cmd4輸出命令Bit_data_wr1向位模塊發(fā)送的數(shù)據(jù)Data_rxd8接收到的8位數(shù)據(jù),送給接收寄存器,Ack_finish1應(yīng)答完成標(biāo)志Ack_out1從總線上讀出的應(yīng)答信號(4) VHDL描述LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_Arith.ALL;USE IEEE.STD_LOGIC_Unsigned.ALL;ENTITY byte_txd_rxd ISPORT( clk_sys:INSTD_LOGIC; rst:INSTD_LOGIC; ack_in: IN STD_LOGIC; data_
42、txd: INSTD_LOGIC_VECTOR(7 DOWNTO 0); start,stop,write,read: IN STD_LOGIC; lose:INSTD_LOGIC; bit_data_rd:INSTD_LOGIC;-從位控制模塊讀入的一位數(shù)據(jù) bit_finish: IN STD_LOGIC;-1位傳送完成標(biāo)志 cmd:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); bit_data_wr:OUT STD_LOGIC;-待寫出的位數(shù)據(jù) ack_finish,ack_out:OUT STD_LOGIC; data_rxd:OUT STD_LOGIC_VECT
43、OR(7 DOWNTO 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_finish_r:STD_LOGIC;-完成1字節(jié)數(shù)據(jù)傳輸標(biāo)志SIGNAL en:STD_LOGIC;-使能信號SIGNAL ld_en,shift_en: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_done: STD_LOGIC;-完成1個字節(jié)數(shù)據(jù)移位完成標(biāo)志BEGINack_finish<=ack_finish_r;en<=(read OR write OR stop) AND (NOT Ack_finish_r);-操作使能PROCESS (clk_sys,rst) -生成移位寄存器內(nèi)容BEGIN IF rst='0' THEN shif
45、t_reg<=(OTHERS=>'0'); ELSIF RISING_EDGE(clk_sys) THEN IF 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) -進(jìn)行讀寫位計(jì)數(shù)BEGIN I
46、F rst='0' THEN cnt_rw<="000" ELSIF RISING_EDGE(clk_sys) THEN IF Ld_en='1' THEN -加載新數(shù)據(jù)時 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" ELS
47、E '0'-讀寫完1個字節(jié)(計(jì)數(shù)8次),給出標(biāo)志-字節(jié)傳送狀態(tài)控制PROCESS (clk_sys,rst) BEGIN IF rst='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)志置0 sck_o
48、ut<='0'-應(yīng)答輸出置0 ELSIF RISING_EDGE(clk_sys) THEN IF 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_wr<=shift_reg(7
49、); -取移位寄存器的最高位作為待寫出位 shift_en<='0'-禁止移位 ld_en<='0'- 禁止加載 ack_finish_r<='0' - 應(yīng)答完成標(biāo)志置0 CASE sta_c IS WHEN 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<=Byte_start;-起始狀態(tài) cmd&l
50、t;= "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;- -停止?fàn)顟B(tài) cmd<= "0010" -啟動位模塊發(fā)送停止位 ack_finish_r<='1'-產(chǎn)生傳送完成標(biāo)志 END IF; END IF; WHEN Byte_start=> IF bit_
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年天津商務(wù)職業(yè)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 2025年哈爾濱城市職業(yè)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2025至2031年中國高壓防水自粘帶行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國滋潤洗發(fā)露行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國標(biāo)準(zhǔn)型天平行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國多彩內(nèi)墻涂料行業(yè)投資前景及策略咨詢研究報(bào)告
- 企業(yè)數(shù)字化轉(zhuǎn)型與教育對接策略-深度研究
- 二零二五年度文化創(chuàng)意產(chǎn)業(yè)銀行信用貸款合同
- 2025年度工業(yè)油煙管道清洗及排放標(biāo)準(zhǔn)改造合同
- 二零二五年度電子商務(wù)平臺區(qū)塊鏈技術(shù)應(yīng)用合同范本
- 基于深度學(xué)習(xí)的醫(yī)學(xué)影像識別與分析
- 部編版《道德與法治》六年級下冊教材分析萬永霞
- 粘液腺肺癌病理報(bào)告
- 鑄牢中華民族共同體意識自評報(bào)告范文
- 巡察檔案培訓(xùn)課件
- 物流營銷(第四版) 課件 第六章 物流營銷策略制定
- 上海高考英語詞匯手冊列表
- PDCA提高患者自備口服藥物正確堅(jiān)持服用落實(shí)率
- 上海石油化工股份有限公司6181乙二醇裝置爆炸事故調(diào)查報(bào)告
- 家譜人物簡介(優(yōu)選12篇)
- 2023年中智集團(tuán)下屬中智股份公司招聘筆試題庫及答案解析
評論
0/150
提交評論