<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > EDA/PCB > 設計應用 > 用Verilog HDL實(shí)現I2C總線(xiàn)功能

用Verilog HDL實(shí)現I2C總線(xiàn)功能

作者: 時(shí)間:2007-03-09 來(lái)源:網(wǎng)絡(luò ) 收藏
摘要:簡(jiǎn)述了I2C總線(xiàn)的特點(diǎn);介紹了開(kāi)發(fā)FPGA時(shí)I2C總線(xiàn)模塊的設計思想;給出并解釋了用Verilog HDL實(shí)現部分I2C總線(xiàn)功能的程序,以及I2C總線(xiàn)主從模式下的仿真時(shí)序圖。 關(guān)鍵詞:I2C總線(xiàn) FPGA Verilog HDL 時(shí)序 開(kāi)發(fā)FPGA時(shí),利用EDA工具設計芯片實(shí)現系統功能已經(jīng)成為支撐電子設計的通用平臺,并逐步向支持系統級的設計方向發(fā)展。在軟件設計過(guò)程中,越來(lái)越強調模塊化設計。I2C總線(xiàn)是Philips公司推出的雙向兩線(xiàn)串行通訊標準,具有接口線(xiàn)少、通訊效率高等特點(diǎn)。把I2C總線(xiàn)設計成相應的模塊,有利于相關(guān)FPCA的開(kāi)發(fā)。 目前有一些介紹相關(guān)開(kāi)發(fā)的資料,但都是利用VHDL語(yǔ)言或AHDL語(yǔ)言實(shí)現的。本文給出利用Verilog HDL語(yǔ)言設計的I2C總線(xiàn)模塊。 1 I2C總線(xiàn)概述 I2C總線(xiàn)系統由兩根總線(xiàn)即SCL(串行時(shí)鐘)線(xiàn)和SDA(串行數據)線(xiàn)構成。這種總線(xiàn)可以設計成很多種通訊配置,但本文只討論主從系統的應用。主器件控制總線(xiàn)通訊,開(kāi)始/結束傳送、發(fā)送信息并產(chǎn)生I2C系統時(shí)鐘。在寫(xiě)操作過(guò)程中,從器件一旦被主控器件尋址,就執行特定的相應功能。在讀操作過(guò)程中,主控器件從從器件那里獲得數據。在整個(gè)主從傳送過(guò)程中,所有的事件都通過(guò)主控器件的SCL時(shí)鐘線(xiàn)達到同步。連到總線(xiàn)上的器件的接口形式必須是漏極開(kāi)路或集電極開(kāi)路輸出狀態(tài)。通過(guò)上拉電阻,使得兩根總線(xiàn)在空閑的狀態(tài)下都為高電平狀態(tài)。因此I2C總線(xiàn)上具有線(xiàn)與功能,即總線(xiàn)上的所有器件都達到高電子狀態(tài)時(shí),I2C總線(xiàn)才能達到高電平狀態(tài),從而使總線(xiàn)上的高速器件和慢速器件工作同步。 在I2C協(xié)議中,從器件地址是一個(gè)唯一的7位地址。接下來(lái)是一個(gè)讀寫(xiě)方向標志位,讀狀態(tài)是高電平、寫(xiě)狀態(tài)是低電子。 2 I2C模塊的設計與實(shí)現 根據I2C協(xié)議中傳輸過(guò)程的特點(diǎn),I2C模塊可以劃分為字節發(fā)送模塊、字節接收模塊、開(kāi)始條件模塊、停止條件模塊。其中,字節發(fā)送模塊、字節接收模塊和停止條件模塊為基本模塊。在開(kāi)始條件模塊中,因為需要發(fā)送從器件地址,所以要調用字節發(fā)送模塊。 下面給出用Verilog HDL語(yǔ)言實(shí)現字節發(fā)送模塊的關(guān)鍵程序。相關(guān)變量的聲明在此略去。程序在Max+PlusII環(huán)境下編譯、調試、仿真。 assign en_sdao=tempen_sdao;//設置SDA三態(tài)輸出使能 assign send_byte_over=tempsend_byte_over; assign NO_ACK=tempNO_ACK; assign sdao=tempsda; assign sclo=tempscl; always@(posedge send_byte_clk) begin case(send_byte_zt) sendbit 1: begin if(send_byte_num==0) begin shiftdata[7:0]=indata[7:0]; end shiftdata=shiftdata1; tempsda=shiftdata[8]; tempscl=1; //置SCL為高電平 send_byte_zt=delay_1; send_byte_num=send_byte_num+1; end delay_1: //延時(shí)三個(gè)周期 begin if(delay_counter>=2) begin send_byte_zt=sendbit2; delay_counter=0; end else begin delay_counter=delay_counter+1; send_byte_zt=send_byte_zt; end end sendbit2: begin tempsc1=0; //SCL置零 send_byte_zt=delay_2; end delay_2: //延時(shí)三個(gè)周期 begin if(delay_counter>=2) begin send_byte_zt=sendbit3; delay_counter=0; end else begin delay_counter=delay_counter+1; send_byte_zt=send_byte_zt; end end sendbit3: //判斷是否字節中所有位都發(fā)送完畢 begin if(send_byte_num=8) begin send_byte_zt=sendbit1; end else begin send_byte_zt=ForACK1; send_byte_num=0; end end ForACK1: begin tempsda=1; //釋放數據線(xiàn),等待應答信號 send_byte_zt=delay_ACK; end delay_ACK: //延時(shí) begin if(delay_counter>=3) begin send_byte_zt=ForACK2; delay_counter=0; end else begin delay_counter=delay_counter+1; send_byte_zt=send_byte_zt; tempscl=1; end end ForACK2: begin send_byte_zt=AckYESNO; tempen_sdao=0; //輸出SDA使能信號,控制sdao和sdai end AckYESNO: begin if(sdai) //如果應答信號sdai為1,NO_ACK置1 begin tempNO_ACK=1; //設置未應答標志信號 end tempsc1=0; //終止應答位 send_byte_zt=Finish_delay; end Finish_delay: //延時(shí) begin if(delay_counter>=2) begin tempsend_byte_over=1; send_byte_zt=FinishACK1; delay_counter=0; end else begin delay_counter=delay_counter+1; send_byte_zt=send_byte_zt; end end FinishACK1: begin send_byte_zt=sendbit1; send_byte_num=0; end default: begin send_byte_zt=sendbit1; send_byte_num=0; end endcase end 程序中sdao、sclo為輸出信號,sdai為應答信號,en_sdao是對sdao和sdai進(jìn)行切換的信號。I2C總線(xiàn)具有SDA和SCL兩根信號線(xiàn),所以在整個(gè)模塊設計中,把sdao/sclo和sdai/scli作為兩組信號。當需要向外部SDA信號線(xiàn)上輸出信息時(shí),sdao連到SDA信號線(xiàn)上;當需要從外部SDA信號線(xiàn)上讀入信息時(shí),置sdao成高阻態(tài),sdai連到SDA信號線(xiàn)上。en_sdao信號作為這一過(guò)程的切換信號。在程序中定義了一些狀態(tài)信號:NO_ACK、send_byte_over。其中,NO_ACK信號判斷從器件是否對發(fā)送的信號給予了應答。send_byte_over信號判斷字節是否傳輸完畢。這些信號可以傳遞給上一層設計模塊,以控制程序的流程。為了使I2C總線(xiàn)能夠有效地通訊,必須考慮信號的建立和保持時(shí)間,所以程序中設置了相應的延時(shí)部分。另外,在以clk為觸發(fā)信號的過(guò)程模塊中,定義send_byte_clk信號為時(shí)鐘信號的兩倍頻信號,并加入字節發(fā)送模塊使能信號start_send_byte控制模塊工作于篇幅所限,略去該過(guò)程模塊。 字節發(fā)送模塊的仿真測試結果如圖1所示。 根據I2C總線(xiàn)標準,利用Verilog HDL很容易實(shí)現字節接收模塊、開(kāi)始條件模塊、停止條件模塊這三個(gè)模塊。圖2是數據發(fā)送過(guò)程的仿真測試結果。從器件的7位地址為101011,向從器件發(fā)送的數據為00010111。aensclo和aensdao分別是sclo/scli和sdao/sdai的切換信號。 圖3是數據接收過(guò)程的仿真測試結果。從器件的7位地址為0011001,從器件發(fā)送的數據為11111111。ensclo和ensdao分別是sclo/scli和sdao/sdai的切換信號。 將圖2和圖3所模擬的I2C總線(xiàn)時(shí)序與I2C總線(xiàn)協(xié)議中相關(guān)要求進(jìn)行比較,滿(mǎn)足I2C總線(xiàn)的時(shí)序要求。 對各個(gè)模塊進(jìn)行多層次處理,形成I2C總線(xiàn)模塊。 以該I2C總線(xiàn)模塊為基礎,編寫(xiě)FPGA與AT24C01A(ATMEL公司生產(chǎn)的E2PROM)的通訊程序。然后把相關(guān)程序下載到EPF10Kl0LC84-3中,與AT24C01A進(jìn)行實(shí)際通訊實(shí)驗,效果良好。

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>