版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
華北水利水電大學NorthChinaUniversityofWaterResourcesandElectricPower電子設計自動化課程設計題目I2C控制器學院 信息工程學院 專業(yè) 電子信息工程 姓名學號指導教師完成時間 2016.1.11 目錄TOC\o"1-5"\h\z摘要 1引言 1一.設計任務 21.1設計要求 2設計目的 2I2C總線簡介 2LM75A簡介 2二.系統(tǒng)設計詳述 32.1系統(tǒng)總體方案設計 32.2電路原理圖 4系統(tǒng)硬件電路設計 4溫度采集電路設計 4LM75A詳述 4\o"CurrentDocument"Verilog代碼設計 64.1IIC通信模塊 .74.2狀態(tài)機的設計 8溫度顯示模塊 8系統(tǒng)整合 9仿真波形及說明 10設計小組的分工及安排 10收獲和體會 11參考文獻 12\o"CurrentDocument"附錄: 12摘要:設計了一種基于FPGA和LM75A的溫度測量系統(tǒng)。采用數(shù)字溫度傳感器LM75A檢測環(huán)境溫度,并利用LM75A自帶的IIC總線接口傳輸數(shù)據(jù),通過數(shù)碼管將溫度實時顯示出來.關(guān)鍵字:關(guān)鍵字:FPGA;LM75A;IIC總線引言:目前溫度測量主要通過單片機來實現(xiàn)控制.但單片機是基于順序語言的,其描述過程繁瑣,信號采集頻率受單片機時鐘頻率的限制,難于實現(xiàn)高速的溫度測量且不易在線修改.由于傳感器多數(shù)采用的是分立元件,如熱敏電阻、熱電偶等,精度很低,遠遠不能滿足實際使用所需要的高精度測溫要求.筆者采用集成溫度傳感器,使傳統(tǒng)傳感器和集成電路融為一體,極大地提高了傳感器的性能,具有測溫精度高、復現(xiàn)性好、線性優(yōu)良、體積小、熱容量小、穩(wěn)定性好、輸出電信號大等優(yōu)點.更重要的是采用現(xiàn)場可編程門陣列(FPGA)實現(xiàn)溫度測量比采用單片機大大改善了設計效果,可實現(xiàn)高速的溫度測量.文中闡述了FPGA的實現(xiàn)方法及如何利用FPGA器件實現(xiàn)多路溫度測量.由于FPGA具有集成度高,高速、高效率,內(nèi)部有嵌入式陣列塊等特點,易于實現(xiàn)FIFO和ROM,可使整個溫度測量系統(tǒng)主要由硬件實現(xiàn).一.設計任務1.1設計要求:利用VerilogHDL設計I2C控制模塊,并在MagicSOPC實驗箱上實現(xiàn)。該控制模塊,可以通過I2C總線協(xié)議,實現(xiàn)總線數(shù)據(jù)傳輸,實現(xiàn)溫度傳感器LM75A的基本操作,并將溫度數(shù)值掃描顯示到數(shù)碼管上。1.2設計目的:了解串行總線熟悉I2C協(xié)議學習LM75A接口控制器編寫Singialtap在線監(jiān)測工具使用1.3.I2C總線簡介I2C總線是一種由PHILIPS公司推出的兩線式串行總線,用于IC(IntegratedCircuit)器件之間的互連。它通過SDA(串行數(shù)據(jù)線)及SCL(串行時鐘線)兩根線在連到該總線上的器件之間傳送信息,并根據(jù)地址識別每個器件。每個器件有一個唯一的地址,而且都可以作為一個發(fā)送器或接收器使用(由器件的功能決定)°I2C總線最主要的優(yōu)點是其簡單性和有效性。由于接口直接在組件之上,因此I2C總線占用的空間非常小,減少了電路板的空間和芯片管腳的數(shù)量,降低了互聯(lián)成本。I2C總線的另一個優(yōu)點是,它支持多主控制(multimastering),其中任何能夠進行發(fā)送和接收的設備都可以成為主設備,而當其從總線上接收信息時,又成為接收器(也叫從設備)。一個主控器能夠控制信號的傳輸和時鐘頻率。在任何時間點上只能有一個主控器。[4]連接多個I2C總線設備的可能性意味著超過一個以上主機可以同時嘗試初始化傳輸數(shù)據(jù),此時會產(chǎn)生仲裁過程進行總線使用權(quán)的裁決。SDA和SCL均為雙向線路,都通過一個上拉電阻連接到電源電壓的正端,當總線空閑時這兩條線路都是高電平。連接到總線的器件是通過線與的功能互連的,因此輸出級應設計為漏極開路或集電極開路。I2C總線上數(shù)據(jù)的傳輸速率在標準模式下可達100kbit/s,在快速模式下可達400kbit/s,在高速模式下可達3.4Mbit/s。[1]1.4LM75A簡介LM75A數(shù)字溫度傳感器是一種內(nèi)置帶隙溫度傳感器,應用工-△模數(shù)轉(zhuǎn)換技術(shù)提供過熱檢測輸出的溫度監(jiān)測器。LM75A內(nèi)部包含多個數(shù)據(jù)寄存器:(1)配置寄存器(Conf):用來存儲器件的配置,如:器件工作模式、OS工作模式、OS極性和OS故障隊列;(2)溫度寄存器(Temp):用來存儲讀取的數(shù)字溫度;設定點寄存器(Tos&Thyst):用來存儲可編程的過熱關(guān)斷和滯后限制。器件通過2線的串行I2C總線接口與控制器通信°LM75A包含一個開漏輸出(OS),當溫度超過編程限制的值時該輸出有效。LM75A有3個可選的邏輯地址管腳,使得同一總線上可同時連接8個器件而不發(fā)生地址沖突。LM75AOS輸出有2種可選的工作模式:OS比較器模式和OS中斷模式。OS輸出可選擇高電平或低電平有效。溫度寄存器可存放一個11位的二進制補碼,從而實現(xiàn)0.125°C的精度。在缺省模式下,OS工作在比較器模式,溫度閾值為80C,滯后75CO[2]二.系統(tǒng)設計詳述2.1系統(tǒng)總體方案設計FPGA不像單片機那樣逐條執(zhí)行程序,而是以并行運算為主,以硬件描述語言來完成電路設計。因此,基于FPGA的溫度測量系統(tǒng)具有運行速度更快,支持大量數(shù)據(jù)的高速處理等優(yōu)點。應用VerilogHDL(hardwaredescriptionlanguage)語言編寫的程序?qū)懭隖PGA后,能形成實際電路。FPGA的內(nèi)部程序是并行操作,所以硬件電路不會存在程序逐條執(zhí)行的問題,且FPGA硬件的數(shù)據(jù)處理速度非常快,可達到ns級別,因而本系統(tǒng)比單片機系統(tǒng)能更迅速、實時地監(jiān)測信號的變化和及時更新數(shù)據(jù)。[5]本文將Altera公司生產(chǎn)的FPGA芯片EP2C35F672C8作為處理器。此芯片有475個可自由分配的I/O口連接外設很方便。該芯片采用60nm低功耗工藝,與單片機系統(tǒng)相比,系統(tǒng)總功率消耗更低。在綜合考慮穩(wěn)定性、可實現(xiàn)性以及精確性之后,提出了基于FPGA和LM75A的溫度系統(tǒng)設計方案。該系統(tǒng)總體設計框圖1所示。圖1系統(tǒng)總體設計框圖2.2電路原理圖圖2LM75A與FPGA的接口電路分析:由于SDA、OS與SCL均為開漏輸出,必須加上拉電阻。A0A1A2為器件標識,000為LM75A的身份標識,故全部接地。驅(qū)動電壓為1.8-5.4V,故可接3.3V電壓源。三?系統(tǒng)硬件電路設計基于FPGA和LM75A的測溫系統(tǒng)總體分為2個部分:溫度采集電路、溫度顯示電路。3.1溫度采集電路設計溫度采集電路主要由LM75A組成(如圖3所示)。OS與VCC接口接3.3V電源,SDA與SCL分別接上拉電阻,與主控芯片IIC接口相連,A0,A1,A2接地。SUAVCCSflAl;OSAlcmA2IVI/?A176圖3溫度采集電路圖3.2LM75A詳述
LM75A是具有IIC接口的數(shù)字溫度傳感器,管腳有8個,分別為A2,A1,AO,OS,SCL(串行時鐘線),SDA(串行雙向數(shù)據(jù)線)VCC,GND。其內(nèi)部集成了很多器件,有IIC總線接口、邏輯控制接口、帶隙溫度傳感器、11位模擬轉(zhuǎn)數(shù)字轉(zhuǎn)換器以及各種寄存器等。存儲器件的某些配置的寄存器(Conf)、存儲數(shù)字溫度的寄存器(Temp)也都包含在內(nèi)。LM75A測溫最大范圍為-55~+125°C,測溫精度0.125C。SCL和SDA構(gòu)成IIC串行總線,可以實現(xiàn)多個器件之間的主從式通信;OS為過熱關(guān)斷輸出接口,外部可連接檢測器或中斷線,當溫度超過設定溫度值時該輸出有效;VCC,GND分別接系統(tǒng)電源和地;A0~A2是用戶自定義地址位,通過對AO,A1和A2的邏輯定義,可以使8個LM75A接在同一總線而不會有地址沖突。由于系統(tǒng)只采用了一個測溫器件測量溫度,所以電路中AO,A1,A2接地,邏輯地址為0。溫度寄存器(Temp)是一個由高8位字節(jié)和一個低8位字節(jié)組成的只讀寄存器,其中僅有高11位被存放到Temp數(shù)據(jù),其余低5位為0[8]。Temp數(shù)據(jù)的分辨率為0.125C,當讀到Temp寄存器時,所有16位數(shù)據(jù)都提供給總線。若Temp數(shù)據(jù)的最高有效位為邏輯0,則表示溫度是正值,溫度值(C)=+(Temp數(shù)據(jù))*0.125C;若Temp數(shù)據(jù)的最低有效位為邏輯1,則表示溫度是負值,溫度值(C)=-(-Temp數(shù)據(jù)+1)*0.125C。在進行溫度采集前,F(xiàn)PGA必須先對LM75A器件初始化,包括對LM75A的地址選擇,滯后寄存器、配置寄存器等的數(shù)據(jù)寫入等。初始化完成之后,從LM75A器件的Temp中讀取當前溫度。[2]LM75A的功能框圖如下:
圖圖4功能框圖LM75A的管腳描述如下:SDA1O8|VccSCL2A0OS3AlGND45|A2圖5LM75A的管腳描述圖管腳編號助記符描逑1SDA數(shù)7ioii°Fc申行雙向數(shù)據(jù)線.開漏愉出.■SCL數(shù)字輸入Fc串行時鐘輸人*3OS過熱關(guān)慚愉嘰開漏輸血4GND地*連接到系統(tǒng)地“>A2數(shù)?輸入。用戶定義的地址位2.Al數(shù)子輸入.用戶定丈的地址位1*-rAO數(shù)字輸入。用戶崔義的地址位Q。sVcc電源。表1LM75A的管腳描述表LM75A內(nèi)部溫度寄存器工作原理如下:TempMS字節(jié)TempLS字節(jié)MSBLSBMSBLSBB6B5B3B2BlBOB7B6B5B4BSB2HIBOTamp數(shù)據(jù)(11未愷用MSBLSBDIODPD$:廠DOD5D4DiD:DlDOXXXXX覩據(jù)I!位的T.mp數(shù)據(jù)左計算Trmp值9昉法:若D10=0溫度值(X)~+Ternp劑0瞎)耳讓125°C;若010=1」溫度值(T)--Temp數(shù)據(jù)的二進制辛嗣)泄]邛匸表2溫度寄存器工作原理四.Verilog代碼設計VHDL、AHDL、FPGA的設計輸入方法有原理圖和硬件描述語言(包括VerilogHDL等)2VHDL、AHDL、1) 從功能描述到物理實現(xiàn)完全符合設計者的設計思路。2) 設計可以重復利用,能應用在不同的產(chǎn)品設計中。3) 容易修改設計。設計者可以在門消耗以及時序2方面對FPGA的結(jié)構(gòu)進行比較,從而選擇最佳的設計方案。4) 設計周期短,效率高。采用自頂向下設計方法的效率可以達到傳統(tǒng)原理圖設計方法的2~4倍。鑒于自頂向下設計方法的諸多特點,本系統(tǒng)軟件部分采用自頂向下模塊化設計思想進行設計,主要包括IIC通信模塊、溫度顯示模塊等。4.1IIC通信模塊FPGA和LM75A兩者之間的通信嚴格按照IIC總線管理定義的規(guī)則。在LM75A檢測溫度時,須先對LM75A初始化,即對其配置寄存器寫入控制字進行工作模式的設定。寫配置寄存器時序如圖6所示。I2T亠rI; h土JI:I亠七I;7 !< ;;I■ ; 4 ■■d I■bLrLrLrLrutruVUtrLnArLArLn/JvrLTLnArLrLTL/j—I 士HL工応,圖6讀溫度寄存器時序通信開始前,IIC總線一定要有空間或者不忙,這就要求總線上的器件必須釋放SDA和SCL線。主機啟動起始信號S后,開始對配置寄存器寫入要選擇的器件地址,硬件電路圖中的A0,A1,A2與地相接,因此器件的邏輯地址是“000”,再將“00000001”寫入寄存器地址指針,等待器件響應一個系統(tǒng)時鐘周期后,再進行工作模式的寫入。完成上述步驟后,LM75A開始工作,若在正常工作模式下,每隔100ms進行一次轉(zhuǎn)換(模數(shù)轉(zhuǎn)換),轉(zhuǎn)換的結(jié)果存放在Temp寄存器中。FPGA讀取Temp寄存器中的數(shù)據(jù),對其處理后,就能得到溫度數(shù)據(jù)。FPGA讀取Temp寄存器中的數(shù)據(jù)也需嚴格按照IIC總線管理定義的規(guī)則。讀取溫度數(shù)據(jù)的時序圖如圖7所示。由于系統(tǒng)時鐘為50MHz,為了方便分頻,選擇用800kHz的頻率作為LM75A
的時鐘頻率,即SCL時鐘頻率為800kHz。由時序圖8可知,62個時鐘周期即可完成一次讀操作;該計數(shù)器控制SDA相對于SCL的相位關(guān)系,此時SDA的時鐘頻率為400kHz。吐匸JumiiTLiTrLrLrIz[吐匸JumiiTLiTrLrLrIz[丄孑& ?&盤jmrun/uVuYy| 8?件11出L「——4圖7讀溫度寄存器時序4.2狀態(tài)機的設計圖8圖8狀態(tài)轉(zhuǎn)換圖狀態(tài)編號狀態(tài)0起始/復位狀態(tài)1發(fā)送啟動信號2發(fā)送控制字3接收應答信號4發(fā)送指針地址5接收應答信號6董新啟動7發(fā)181^8制字E接收應答信號9讀顫高$位信號10發(fā)送應答11讀取低£位數(shù)據(jù)12気送韭應答1言號13停止表3狀態(tài)機狀態(tài)表4.3溫度顯示模塊系統(tǒng)采用6位八段共陽數(shù)碼管顯示溫度。為使6位數(shù)碼管動態(tài)顯示溫度,可采用動態(tài)掃描的方法依次點亮數(shù)碼管,當掃描速度達到某個范圍時,可利用人眼視覺暫留的特點,使人感覺4位數(shù)碼管是在同一時間顯示。動態(tài)掃描的頻率最好大于50Hz,每個數(shù)碼管顯示的時間要適中,不能過長或過短,時間過長則會出現(xiàn)閃爍的情況,時間過短發(fā)光二極管電流的導通時間也短,會導致數(shù)碼管亮度變暗。一般掃描時間控制在1~2ms左右。FPGA產(chǎn)生的掃描時間程序如下。//產(chǎn)生數(shù)碼管掃描的計數(shù)器,掃描時間為0.1msalways@(posedgesys_clkornegedgesys_rst_n)beginif(sys_rst_n==1'b0)scan_cnt<=16'b0;elsescan_cnt<=scan_cnt+16'b1;end其中,scan_cnt為16位寄存器,存儲計數(shù)值,記一次數(shù)的時間為1ms。syc_clk是系統(tǒng)時鐘信號,sys_ret_n是系統(tǒng)復位信號,c1~c4為數(shù)碼管位選信號,seg_a~seg_h分別接數(shù)碼管的發(fā)光二極管,其中 seg_h控制小數(shù)點。lm75_temp是FPGA從器件LM75A采集到的11位溫度數(shù)據(jù)經(jīng)過計算后的數(shù)據(jù),其算法是:lm75_temp<=(buff[10:0]*125)/10;//存儲在緩存器buff中的11位數(shù)據(jù)經(jīng)計算后,賦值給lm75—temp寄存器。由于lm75—temp里面寄存的為二進制數(shù)據(jù),所以需先轉(zhuǎn)成為BCD碼,才能輸出顯示。4.4系統(tǒng)整合在用VerilogHDL編程中,系統(tǒng)軟件部分采用模塊化設計。上文的IIC通信模塊和溫度顯示模塊為系統(tǒng)獨立模塊,故需編寫頂層模塊(命名為top)將2個模塊整合起來。top模塊能定義各個管腳接口,從而使系統(tǒng)與外界進行通信。top模塊通過頂層調(diào)用方法將iic(FPGA和LM75A通信模塊)和led(數(shù)碼管掃描顯示模塊)組合成為一個完整的系統(tǒng)。將完整的程序下載到FPGA芯片,系統(tǒng)即可測量環(huán)境溫度。kBfJitlenkEyJIter出匚AKeyjn[^^>-rsinIB=1:tjevkBfJitlenkEyJIter出匚AKeyjn[^^>-rsinIB=1:tjevri tevDidrat門lied汜=1: SEIl:jevrdratft (XjtfISJHIcl:retndsninnsin軸i2..mSEKF..D1 0l[?0] ”護訓£—Ada圖9頂層方案圖五?仿真波形及說明LrLTLTLn『LTLTLdOXUXO:■:■^■■■■■7JUUI.JUrfaMOLlYImom貳iXXKI二一□1lUTfThonH五?仿真波形及說明LrLTLTLn『LTLTLdOXUXO:■:■^■■■■■7JUUI.JUrfaMOLlYImom貳iXXKI二一□1lUTfThonH-Mia盯 5KJinijiSil#htfjd酣iHsdsi■511D-%3_nuiTZzrSJTSJSJSSTXT3]|lp?]1liX>LnuTipum]U圖10仿真波形仿真結(jié)果分析:Clk為外部輸入時鐘,為50MHZ,初始值為l,;rst_n為系統(tǒng)復位,初值為0;key_rd為讀信號,低電平有效;scl為iic的時鐘線;讀sda為iic的數(shù)據(jù)線;count為一個8位計數(shù)器,每計數(shù)31,clk_sys翻轉(zhuǎn)一次,即分頻產(chǎn)生800K的系統(tǒng)時鐘;,當clk_sys或rst_n為下降沿時,若總線忙,flag為1,scl翻轉(zhuǎn),產(chǎn)生近400K的時鐘,空閑時flag為0,scl為高;clk_sys上升沿或rst_n為下降沿;data_out為0,flag為1,sda_buffer為1,state轉(zhuǎn)為0狀態(tài),發(fā)送控制字,尋找從機,寫控制字10010000,從機發(fā)送應答信號sda為0,仿真顯示為高阻狀態(tài),之后寫指針,選定溫度寄存器,從機發(fā)送應答sda為高阻,flag為0;再次啟動,寫控制字,sda為10010001,進行讀操作,等待從機發(fā)送應答信號,sda為高阻態(tài),flag為0;主機讀數(shù)據(jù),讀數(shù)據(jù)高8位,發(fā)送應答,再讀低八位,讀數(shù)據(jù)時flag為低電平,sda為高阻態(tài)。之后發(fā)送非應答信號,scl為高電平時,sda由低變?yōu)楦唠娖剑礊橥V?。?設計小組的分工及安排設計小組成員:范亞君胡花欣段郁丹設計工作主要涉及查閱資料、原理分析、代碼編寫、仿真模擬、修正糾錯、設計報告等內(nèi)容.設計分工及安排:1月4號至5號到圖書館及網(wǎng)上查閱相關(guān)資料.根據(jù)硬件特性分析原理.三人分別進行初步編寫,然后互相修改各運行模塊和測試模塊;其中范亞君負責iic.v文件的編寫,胡花欣負責iic_tb.v和top_tb.v測試文件的編寫,段郁丹負責top.v、led.v和key_filter.v文件的編寫。在QuartusII13.0中進行仿真模擬,驗證其與預想結(jié)果是否一致,并進行仿真分析,做相關(guān)細節(jié)修改.仿真結(jié)果檢驗正確后,共同書寫設計報告書.七.收獲和體會本文設計實現(xiàn)了一種基于FPGA和LM75A的測溫系統(tǒng)。用FPGA的I/O引腳來模擬I2C總線實現(xiàn)主控制器,可以降低研制成本、節(jié)約空間和降低電路的復雜性,在實際應用中有重大意義。其設計簡單、功耗低、操作方便、響應快、測量精度高。該系統(tǒng)可用于室內(nèi)溫度測量、室外動植物生長環(huán)境溫度測量等測溫場所,該測溫系統(tǒng)還可擴展利用8個LM75A數(shù)字溫度傳感器測溫,從而實現(xiàn)多點大范圍測溫。通過這次課程設計,我們對FPGA的整個開發(fā)過程有了更加深入的了解,并有了實際動手操作的經(jīng)驗,讓我更好的掌握了相關(guān)知識。通過FPGA器件,我們可以方便、快速開發(fā)出很多復雜的數(shù)字電路以供實際需要,通過編寫代碼省去了許多硬件連接,增強了系統(tǒng)的可靠性。在設計過程中,我們經(jīng)常需要修改、完善系統(tǒng)的功能,這也只是改變代碼并下載到芯片中就行了,省去了很多時間。本次課程設計是3人一組完成,這也鍛煉了我們之間合作的能力,這是十分必要的,因此今后在工作中必須要加強與他人的合作。由于verilog理論課程是在上一個學期學習的,經(jīng)過一個暑假,很多知識點都有遺忘,這給我們完成課程設計帶來了一定困難,好在老師對我們精心指導,學校也提供實驗室給我們實驗,在我們的共同合作下,我們終于克服困難,完成了課程設計。八?參考文獻褚振勇,翁木云.FPGA設計及應用[M].西安:西安電子科技大學出版社,2002.LM75A數(shù)字溫度傳感器使用手冊楊新鵬.基于LM75A的多點溫度監(jiān)控系統(tǒng)設計[J].工業(yè)儀表與自動化裝置,2013.譚會生,張昌凡.EDA技術(shù)及應用[M].2版.西安:西安電子科技大學出版社,2004.夏宇聞.Verilog數(shù)字系統(tǒng)設計教程第3版北京航空航天大學出版社附錄:VerilogHDL程序清單程序清單名稱文件名iic模塊源碼iic.vi讓模塊測試文件iictb?v頂層模塊源碼top.V頂層模塊測試文件數(shù)碼管顯示模塊源陷top_tb.vled.v按鍵消抖模塊源碼key_filter.v表3程序清單VerilogHDL語言源代碼和測試代碼iic.v文件代碼moduleiic(clk, //外部輸入時鐘rst_n, //系統(tǒng)復位key_rd, //讀信號(低電平有效)scl, //iic的數(shù)據(jù)線sda, //iic的時鐘線data_out //輸出數(shù)據(jù));//系統(tǒng)輸入inputclk;//外部輸入時鐘inputrst_n;//系統(tǒng)復位inputkey_rd;//讀信號(低電平有效)//系統(tǒng)輸出outputregscl; //iic的時鐘線outputreg[15:0]data_out;//輸出數(shù)據(jù)inoutsda;//iic的數(shù)據(jù)線regsda_buffer;//寫入數(shù)據(jù)的中間寄存器regflag;//控制系統(tǒng)是否占有總線控制權(quán)assignsda=(flag)?sda_buffer:1'bz;/當flag為高電平時,系統(tǒng)擁有總線控制權(quán)//并發(fā)送sda_buffer中的數(shù)據(jù)。當flag為低電平時,//釋放總線。reg[7:0]count;//計數(shù)器regclk_sys;//系統(tǒng)時鐘// 分頻產(chǎn)生800Khz時鐘clk_sys always@(posedgeclkornegedgerst_n)beginif(!rst_n)beginclk_sys<=1'b0;count<=8'd0;endelseif(count<31)//分頻成為近800K的時鐘count<=count+1;elsebegincount<=8'd0;clk_sys<=~clk_sys;endend// reg[5:0]state;//狀態(tài)寄存器// 輸出scl always@(negedgeclk_sysornegedgerst_n)beginif(!rst_n)beginscl<=1'bl;//復位時,scl為高endelsebeginif(state>0)//當總線忙的時候,scl為近400K的時鐘scl<=~scl;elsescl<=l'bl;//空閑時,scl為高endend// reg[3:0]cnt;//發(fā)送或者接收數(shù)據(jù)的個數(shù)reg[7:0]memory;//發(fā)送或者接受數(shù)據(jù)的中間寄存器always@(posedgeclk_sysornegedgerst_n)beginif(!rst_n)begindata_out<=16'd0;flag<=1'b1; //復位時,系統(tǒng)獲得總線的控制權(quán)sda_buffer<=l'bl;//向iic的數(shù)據(jù)線上發(fā)送高電平state<=0;cnt<=0;memory<=8'd0;endelsecase(state)0:if(scl)beginif(!key_rd)//有按鍵按下beginsda_buffer<=1'b0; //發(fā)送啟動信號state<=1;memory<=8'bl001_0000;//準備控制字endelsestate<=0;endelsestate<=0;1:if((scl==0)&&(cnt<8))//發(fā)送八位控制字beginsda_buffer<=memory[7];cnt<=cnt+1;memory={memory[6:0],memory[7]};
state<=1;endelsebeginif((scl==0)&&(cnt==8))begincnt<=0;flag<=0;//釋放總線控制權(quán)state<=2;endelsebeginstate<=1;endend2://////
//
//if(!sda)////////
//
//beginstate<=3;memory<=8'b0000_0000;//指針寄存器temp地址endelsebeginstate<=0;end3:if((scl==0)&&(cnt<8))//發(fā)送指針地址beginflag<=1;//獲得總線控制權(quán)sda_buffer<=memory[7];cnt<=cnt+1;memory={memory[6:0],memory[7]};state<=3;endelsebeginif((scl==0)&&(cnt==8))begincnt<=0;flag<=0;//釋放總線控制權(quán)state<=4;endelse
beginstate<=3;endend4://if(!sda)//檢測應答信號beginstate<=5;end////////elsebeginstate<=0;end5:if(!scl)//scl==0beginflag<=1;//獲得總線控制權(quán)sda_buffer<=1;//拉咼iic的數(shù)據(jù)線(為發(fā)送啟動信號做準備)state<=6;end:if(scl)beginsda_buffer<=0;//發(fā)送啟動信號state<=7;memory<=8'b1001_0001;//控制字end:if((scl==0)&&(cnt<8))//發(fā)送八位控制字beginflag<=1;//獲得總線控制權(quán)sda_buffer<=memory[7];cnt<=cnt+1;memory<={memory[6:0],memory[7]};state<=7;endelsebeginif((scl==0)&&(cnt==8))begincnt<=0;flag<=0;//釋放總線控制權(quán)state<=8;endelsebeginstate<=7;endend8://if(!sda)//檢測應答信號beginstate<=9;end////////elsebeginstate<=0;end9:if((scl==1)&&(cnt<8))//接收數(shù)據(jù)begincnt<=cnt+1;data_out<={data_out[14:0],sda};state<=9;endelsebeginif((scl==0)&&(cnt==8))begincnt<=0;flag<=1;//獲得總線控制權(quán)state<=10;sda_buffer<=0;//發(fā)送應答信號endelsestate<=9;end:if(scl==0)beginflag<=0;state<=11;end:if((scl==1)&&(cnt<8))//接收數(shù)據(jù)begincnt<=cnt+1;data_out<={data_out[14:0],sda};state<=11;endelsebeginif((scl==0)&&(cnt==8))begincnt<=0;flag<=1;//獲得總線控制權(quán)state<=12;sdajbuffer<=1;//發(fā)送NOACK信號endelsestate<=11;end12:if(scl==0)beginsda_buffer<=0;//拉低iic的數(shù)據(jù)線(為發(fā)送停止信號做準備)state<=13;endelsestate<=12;13:if(scl==1)//發(fā)送停止信號beginsda_buffer<=1;state<=0;endelsestate<=13;default:state<=0endcaseendendmoduleiic_tb.v文件代碼'timescalelns/lpsmoduleiic_tb;//系統(tǒng)輸入regelk;//外部輸入時鐘regrst_n;//系統(tǒng)復位regkey_rd;//讀信號(低電平有效)//系統(tǒng)輸出wirescl;//iic的時鐘線wire[15:0]data_out;//輸出數(shù)據(jù)wiresda;//iic的數(shù)據(jù)線iiciic(.clk(clk),//外部輸入時鐘.rst_n(rst_n),//系統(tǒng)復位.key_rd(key_rd),//讀信號(低電平有效).scl(scl), //iic的時鐘.sda(sda), //iic的數(shù)據(jù)線.data_out(data_out)//輸出數(shù)據(jù));initialbeginclk=1;rst_n=0;key_rd=1;#1000.1rst_n=1;#10000key_rd=0;//讀信號有效#40000key_rd=1;//讀寫號釋放endalways#10clk=~clk;//50M的時鐘endmoduletop.v文件代碼moduletop(clk,rst_n,key_in,scl,sda,sel,//外部輸入時鐘//系統(tǒng)復位//讀信號(低電平有效)//iic的數(shù)據(jù)線//iic的時鐘線seg);inputclk;//外部輸入時鐘
inputrst_n;//系統(tǒng)復位
inputkey_in;//讀信號(低電平有效)//系統(tǒng)輸出outputscl; //iic的時鐘線inoutsda;//iic的數(shù)據(jù)線output[2:0]sel;output[7:0]seg;wirekey_out;wire[15:0]data_out;key_filterkey_filter(.clk(clk),.rst_n(rst_n),.key_in(key_in),.key_out(key_out));iiciic(.clk(clk),//外部輸入時鐘.rst_n(rst_n),//系統(tǒng)復位.key_rd(key_out),//讀信號(低電平有效).scl(scl),//iic的數(shù)據(jù)線.sda(sda),//iic的時鐘線.data_out(data_out)//輸出數(shù)據(jù)ledled(.clkledled(.clk.rst_n.data_in.sel.seg);(clk),(rst_n),(data_out),(sel),//位選(seg)//段選都是低電平點亮endmoduletop_tb.v文件代碼moduletop_tb;regclk; //外部輸入時鐘regrst_n; //系統(tǒng)復位regkey_in;//讀信號(低電平有效)wirescl; //iic的數(shù)據(jù)線wiresda; //iic的時鐘線wire[2:0]sel;wire[7:0]seg;initialbeginclk=1;rst_n=0;key_in=1;#1000.1rst_n=1;#10000key_in=0;//讀信號有效#40000key_in=1;//讀寫號釋放endalways#10clk=~clk;//50M的時鐘toptop(.clk(clk),//外部輸入時鐘.rst_n(rst_n),//系統(tǒng)復位.key_in(key_in),//讀信號(低電平有效).scl(scl),//iic的數(shù)據(jù)線.sda(sda),//iic的時鐘線.sel(sel),.seg(seg));endmodulekey_filter.v文件代碼'timescalelns/lpsmodulekey_filter(clk,rst_n,key_in,key_out);parameterMASK_TIME=l_00;//20ms/20ns=10飛inputclk;inputrst_n;inputkey_in;outputregkey_out;localparams0=1'b0;localparams1=1'b1;regtemp;reg[31:0]count;regstate;always@(posedgeclk,negedgerst_n)beginif(!rst_n)begincount<=0;key_
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 化妝品前臺工作總結(jié)
- 家電行業(yè)助理的崗位職責
- 藥房職位工作總結(jié)
- 安徽省阜陽市2023~2024學年九年級上學期期末質(zhì)量檢測化學試題
- 鐵路行業(yè)安全管理工作總結(jié)
- 工藝制造行業(yè)行政后勤工作總結(jié)
- 廣東省深圳市羅湖區(qū)2023-2024學年六年級上學期英語期末試卷
- 《如何提升招聘效能》課件
- 《汽車銷售整套資料》課件
- 《暴發(fā)性肝衰竭》課件
- 腫瘤科危急重癥護理
- 江蘇省蘇州市2024-2025學年第一學期八年級英語期末模擬試卷(一)(含答案)
- 2024-2030年中國加速器行業(yè)發(fā)展趨勢及運營模式分析報告版
- 護理查房深靜脈置管
- 運動障礙護理查房
- 計算與人工智能概論知到智慧樹章節(jié)測試課后答案2024年秋湖南大學
- 2024年度油漆涂料生產(chǎn)線租賃合同3篇
- Python數(shù)據(jù)分析與應用 課件 第12章 Seaborn
- 慶祝澳門回歸25周年主題班會 課件 (共22張)
- 《藥事管理與法規(guī)》期末考試復習題及答案
- 血液病染色體
評論
0/150
提交評論