国产在线导航,欧美日本中文,黄色在线观看网站永久免费乱码,chinese国产在线视频,亚洲欧洲第一视频,天天做人人爱夜夜爽2020毛片,亚洲欧美中文字幕在线网站

現(xiàn)在位置:范文先生網(wǎng)>理工論文>電子通信論文>用Verilog HDL實現(xiàn)I2C總線功能

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

時間:2023-02-20 23:35:10 電子通信論文 我要投稿
  • 相關(guān)推薦

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

摘要:簡述了I2C總線的特點;介紹了開發(fā)FPGA時I2C總線模塊的設(shè)計思想;給出并解釋了用Verilog HDL實現(xiàn)部分I2C總線功能的程序,以及I2C總線主從模式下的仿真時序圖。

    關(guān)鍵詞:I2C總線 FPGA Verilog HDL 時序

開發(fā)FPGA時,利用EDA工具設(shè)計芯片實現(xiàn)系統(tǒng)功能已經(jīng)成為支撐電子設(shè)計的通用平臺,并逐步向支持系統(tǒng)級的設(shè)計方向發(fā)展。在軟件設(shè)計過程中,越來越強(qiáng)調(diào)模塊化設(shè)計。I2C總線是Philips公司推出的雙向兩線串行通訊標(biāo)準(zhǔn),具有接口線少、通訊效率高等特點。把I2C總線設(shè)計成相應(yīng)的模塊,有利于相關(guān)FPCA的開發(fā)。 目前有一些介紹相關(guān)開發(fā)的資料,但都是利用VHDL語言或AHDL語言實現(xiàn)的。本文給出利用Verilog HDL語言設(shè)計的I2C總線模塊。

1 I2C總線概述

I2C總線系統(tǒng)由兩根總線即SCL(串行時鐘)線和SDA(串行數(shù)據(jù))線構(gòu)成。這種總線可以設(shè)計成很多種通訊配置,但本文只討論主從系統(tǒng)的應(yīng)用。主器件控制總線通訊,開始/結(jié)束傳送、發(fā)送信息并產(chǎn)生I2C系統(tǒng)時鐘。在寫操作過程中,從器件一旦被主控器件尋址,就執(zhí)行特定的相應(yīng)功能。在讀操作過程中,主控器件從從器件那里獲得數(shù)據(jù)。在整個主從傳送過程中,所有的事件都通過主控器件的SCL時鐘線達(dá)到同步。連到總線上的器件的接口形式必須是漏極開路或集電極開路輸出狀態(tài)。通過上拉電阻,使得兩根總線在空閑的狀態(tài)下都為高電平狀態(tài)。因此I2C總線上具有線與功能,即總線上的所有器件都達(dá)到高電子狀態(tài)時,I2C總線才能達(dá)到高電平狀態(tài),從而使總線上的高速器件和慢速器件工作同步。

在I2C協(xié)議中,從器件地址是一個唯一的7位地址。接下來是一個讀寫方向標(biāo)志位,讀狀態(tài)是高電平、寫狀態(tài)是低電子。
(范文先生網(wǎng)www.qkfawen.com收集整理)
2 I2C模塊的設(shè)計與實現(xiàn)

根據(jù)I2C協(xié)議中傳輸過程的特點,I2C模塊可以劃分為字節(jié)發(fā)送模塊、字節(jié)接收模塊、開始條件模塊、停止條件模塊。其中,字節(jié)發(fā)送模塊、字節(jié)接收模塊和停止條件模塊為基本模塊。在開始條件模塊中,因為需要發(fā)送從器件地址,所以要調(diào)用字節(jié)發(fā)送模塊。

下面給出用Verilog HDL語言實現(xiàn)字節(jié)發(fā)送模塊的關(guān)鍵程序。相關(guān)變量的聲明在此略去。程序在Max+PlusII環(huán)境下編譯、調(diào)試、仿真。

assign en_sdao=tempen_sdao;//設(shè)置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=shiftdata<<1;

tempsda=shiftdata[8];

tempscl=1; //SCL為高電平

send_byte_zt=delay_1;

send_byte_num=send_byte_num+1;

end

delay_1: //延時三個周期

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: //延時三個周期

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: //判斷是否字節(jié)中所有位都發(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; //釋放數(shù)據(jù)線,等待應(yīng)答信號

send_byte_zt=delay_ACK;

end

delay_ACK: //延時

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使能信號,控制sdaosdai

end

AckYESNO:

begin

if(sdai) //如果應(yīng)答信號sdai為1,NO_ACK置1

begin

tempNO_ACK=1; //設(shè)置未應(yīng)答標(biāo)志信號

end

tempsc1=0; //終止應(yīng)答位

send_byte_zt=Finish_delay;

end

Finish_delay: //延時

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為應(yīng)答信號,en_sdao是對sdao和sdai進(jìn)行切換的信號。I2C總線具有SDA和SCL兩根信號線,所以在整個模塊設(shè)計中,把sdao/sclo和sdai/scli作為兩組信號。當(dāng)需要向外部SDA信號線上輸出信息時,sdao連到SDA信號線上;當(dāng)需要從外部SDA信號線上讀入信息時,置sdao成高阻態(tài),sdai連到SDA信號線上。en_sdao信號作為這一過程的切換信號。在程序中定義了一些狀態(tài)信號:NO_ACK、send_byte_over。其中,NO_ACK信號判斷從器件是否對發(fā)送的信號給予了應(yīng)答。send_byte_over信號判斷字節(jié)是否傳輸完畢。這些信號可以傳遞給上一層設(shè)計模塊,以控制程序的流程。為了使I2C總線能夠有效地通訊,必須考慮信號的建立和保持時間,所以程序中設(shè)置了相應(yīng)的延時部分。另外,在以clk為觸發(fā)信號的過程模塊中,定義send_byte_clk信號為時鐘信號的兩倍頻信號

,并加入字節(jié)發(fā)送模塊使能信號start_send_byte控制模塊工作于篇幅所限,略去該過程模塊。

字節(jié)發(fā)送模塊的仿真測試結(jié)果如圖1所示。

根據(jù)I2C總線標(biāo)準(zhǔn),利用Verilog HDL很容易實現(xiàn)字節(jié)接收模塊、開始條件模塊、停止條件模塊這三個模塊。圖2是數(shù)據(jù)發(fā)送過程的仿真測試結(jié)果。從器件的7位地址為101011,向從器件發(fā)送的數(shù)據(jù)為00010111。aensclo和aensdao分別是sclo/scli和sdao/sdai的切換信號。

圖3是數(shù)據(jù)接收過程的仿真測試結(jié)果。從器件的7位地址為0011001,從器件發(fā)送的數(shù)據(jù)為11111111。ensclo和ensdao分別是sclo/scli和sdao/sdai的切換信號。

    將圖2和圖3所模擬的I2C總線時序與I2C總線協(xié)議中相關(guān)要求進(jìn)行比較,滿足I2C總線的時序要求。

對各個模塊進(jìn)行多層次處理,形成I2C總線模塊。

以該I2C總線模塊為基礎(chǔ),編寫FPGA與AT24C01A(ATMEL公司生產(chǎn)的E2PROM)的通訊程序。然后把相關(guān)程序下載到EPF10Kl0LC84-3中,與AT24C01A進(jìn)行實際通訊實驗,效果良好。


【用Verilog HDL實現(xiàn)I2C總線功能】相關(guān)文章:

應(yīng)用McBSP實現(xiàn)I2C總線控制器08-06

基于DSP與CPLD的I2C總線接口的設(shè)計與實現(xiàn)08-06

基于Verilog HDL設(shè)計的自動數(shù)據(jù)采集系統(tǒng)04-12

用P89C664實現(xiàn)I2C總線大批量數(shù)據(jù)的自動存儲08-06

基于Verilog HDL的CMOS圖像敏感器驅(qū)動電路設(shè)計04-12

基于Verilog-HDL的軸承振動噪聲電壓峰值檢測08-06

基于CPLD的系統(tǒng)中I2C總線的設(shè)計08-06

基于VHDL的I2C總線控制核設(shè)計08-06

PCI總線仲裁器的設(shè)計與實現(xiàn)08-06