

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 可編程數(shù)字系統(tǒng)設(shè)計(jì)</b></p><p> 題 目 基于FPGA的I2C接口程序?qū)崿F(xiàn)</p><p> 學(xué)生姓名 </p><p> 專(zhuān)業(yè)班級(jí) 電子信息工程10-2班 </p><p> 學(xué) 號(hào)
2、 </p><p> 院 (系) 電氣信息工程學(xué)院 </p><p> 指導(dǎo)教師 </p><p> 完成時(shí)間 </p><p> 給予FPGA的I2C接口程序?qū)崿F(xiàn)&
3、lt;/p><p><b> 摘 要</b></p><p> 串行擴(kuò)展接口的發(fā)展是新一代單片機(jī)技術(shù)的顯著特點(diǎn),其中I2C 總線(xiàn)功耗低,結(jié)構(gòu)簡(jiǎn)單,使用靈活,被廣泛應(yīng)用于視頻、音像等各類(lèi)設(shè)備中。</p><p> 本課題首先研究了IIC 總線(xiàn)的規(guī)范,簡(jiǎn)要介紹了Quartus Ⅱ設(shè)計(jì)平臺(tái),以及FPGA 的設(shè)計(jì)流程。在此基礎(chǔ)上,重點(diǎn)介紹了IIC
4、 接口的總體設(shè)計(jì)方案,詳細(xì)描述時(shí)序狀態(tài)機(jī)的工作原理和Verilog HDL 語(yǔ)言的實(shí)現(xiàn),以及在Quartus Ⅱ平臺(tái)上的時(shí)序仿真。本系統(tǒng)采用了自頂向下的設(shè)計(jì)方法,利用了Verilog HDL 語(yǔ)言的結(jié)構(gòu)描述風(fēng)格,把整個(gè)設(shè)計(jì)分成6 個(gè)模塊,時(shí)鐘分頻模塊,寄存器組模塊,數(shù)據(jù)接收模塊,數(shù)據(jù)發(fā)送模塊,輸出緩沖模塊,時(shí)序控制模塊,頂層模塊也采用語(yǔ)言描述。在QuartusⅡ平臺(tái)上,實(shí)現(xiàn)系統(tǒng)的功能和仿真。</p><p>
5、關(guān)鍵詞 現(xiàn)場(chǎng)可編程邏輯門(mén)陣列 IIC總線(xiàn) 狀態(tài)機(jī) 時(shí)序仿真</p><p><b> 1.緒論 </b></p><p> 1.1 IIC總線(xiàn)的優(yōu)點(diǎn) </p><p> 作為一種串行總線(xiàn),IIC總線(xiàn)雖沒(méi)有并行總線(xiàn)的數(shù)據(jù)吞吐能力,但它具有如下優(yōu)點(diǎn):</p><p> 1、僅由兩根信號(hào)線(xiàn)組成,節(jié)省了芯片I/O、節(jié)省P
6、CB面積、節(jié)省成本等。 </p><p> 2、總線(xiàn)上可同時(shí)掛接多個(gè)器件,器件之間是靠不同的編址來(lái)區(qū)分的,而不需要附加的I/O線(xiàn)或地址譯碼部件。 </p><p> 3、總線(xiàn)可裁減性好。在原有總線(xiàn)連接的基礎(chǔ)上可以隨時(shí)新增或者刪除器件。 </p><p> 4、總線(xiàn)電氣兼容性好。IIC總線(xiàn)規(guī)定器件之間以開(kāi)漏I/O互聯(lián),這樣,只要選取適當(dāng)?shù)纳侠娮杈湍茌p易實(shí)現(xiàn)3V
7、/5V邏輯電平的兼容,而不需要額外的轉(zhuǎn)換。 </p><p> 5、支持多種通信方式。一主多從是最常見(jiàn)的通信方式。此外還支持雙主機(jī)通信、多主機(jī)通信以及廣播模式等等。 </p><p> 6、兼顧高低速通信。IIC總線(xiàn)標(biāo)準(zhǔn)傳輸速率為100kbit/s,在快速模式下為400 kbps,高速模式下為3.4Mbit/s。IIC總線(xiàn)的通信速率也可以低至幾kbps以下,用以支持低速器件或者用來(lái)延長(zhǎng)
8、通信距離。 </p><p> IIC總線(xiàn)帶來(lái)的這些好處,得到了廣大工程師的青睞。在通信,音/視頻,智能儀表、工控領(lǐng)域都得到了應(yīng)用。 </p><p> 1.2 課題的主要工作</p><p> 作為一款經(jīng)典的串行通訊總線(xiàn),IIC總線(xiàn)接口IP核已被越來(lái)越廣泛的集成到SoC中。本文通過(guò)用Verilog HDL語(yǔ)言在FPGA上實(shí)現(xiàn)一個(gè)IIC總線(xiàn)接口,它可作為IP核
9、集成到SOC中。研究?jī)?nèi)容主要包括以下方面:</p><p> 1、深入研究IIC協(xié)議規(guī)范。 </p><p> 2、用Verilog HDL硬件描述語(yǔ)言設(shè)計(jì)基于FPGA的IIC總線(xiàn)接口,做到數(shù)據(jù)傳輸能夠有序、有效地進(jìn)行。 </p><p> 3、用QuartusⅡ軟件對(duì)每一個(gè)模塊進(jìn)行編譯生成單個(gè)電路模塊。</p><p> 4、在Qu
10、artusⅡ平臺(tái)上,對(duì)設(shè)計(jì)進(jìn)行分析、綜合、功能和時(shí)序仿真。 </p><p> 2 IIC總線(xiàn)協(xié)議研究 </p><p> 2.1 IIC總線(xiàn)概述 </p><p> 2.1.1 IIC總線(xiàn)簡(jiǎn)介 </p><p> IIC總線(xiàn)支持任何IC生產(chǎn)過(guò)程,包括CMOS、NMOS、雙極性,用兩根信號(hào)線(xiàn)進(jìn)行數(shù)據(jù)傳輸——串行數(shù)據(jù)線(xiàn)(SDA)和串行
11、時(shí)鐘線(xiàn)(SCL)。它允許若干兼容器件(如存儲(chǔ)器、A/D和D/A轉(zhuǎn)換器,以及LED、LCD驅(qū)動(dòng)器等)共享總線(xiàn)。圖2.1是IIC總線(xiàn)結(jié)構(gòu)。</p><p> 圖2.1 典型的IIC總線(xiàn)結(jié)構(gòu) </p><p> 每個(gè)器件都有唯一的地址,而且都可以作為一個(gè)發(fā)送器或接收器,由器件的功能確定,。IIC總線(xiàn)上所有器件依靠SDA發(fā)送的地址信號(hào)尋址,不需要片選線(xiàn)。任何時(shí)刻總線(xiàn)只能由一個(gè)主器件控制,各從
12、器件在總線(xiàn)空閑時(shí)啟動(dòng)數(shù)據(jù)傳送,由IIC總線(xiàn)仲裁來(lái)決定哪個(gè)主器件控制總線(xiàn)。表2-1給出了IIC總線(xiàn)常用的術(shù)語(yǔ)定義。 </p><p> 表2-1 IIC總線(xiàn)術(shù)語(yǔ)定義 </p><p> 2.1.2 IIC總線(xiàn)的電氣特性與結(jié)構(gòu) </p><p> 在系統(tǒng)中,IIC總線(xiàn)的典型接法如圖2.2所示,注意連接時(shí)需要共地。SDA和SCL都是雙向線(xiàn)路,為了使總線(xiàn)上所有電路的
13、輸出能實(shí)現(xiàn)“線(xiàn)與”功能,各個(gè)IIC總線(xiàn)的接口電路的輸出端必須是漏極開(kāi)路或集電極開(kāi)路結(jié)構(gòu),輸出端必須接上拉電阻,上拉電阻一般取值3~10KΩ。</p><p> 圖2.2 IIC總線(xiàn)的器件連接 </p><p><b> 開(kāi)漏結(jié)構(gòu)的好處是:</b></p><p> 1、當(dāng)總線(xiàn)空閑時(shí),這兩條信號(hào)線(xiàn)都保持高電平,因各設(shè)備都是開(kāi)漏輸出,上拉電
14、阻,使SDA和SCL線(xiàn)都保持高電平,不會(huì)消耗電流。任一設(shè)備輸出的低電平都使相應(yīng)的總線(xiàn)信號(hào)線(xiàn)變低,即總線(xiàn)上的所有器件都達(dá)到高電子狀態(tài)時(shí),IIC總線(xiàn)才能達(dá)到高電平,從而使總線(xiàn)上的高速器件和慢速器件工作同步。 </p><p> 2、電氣兼容性好。上拉電阻接5V電源就能與5V邏輯器件接口,上拉電阻接3V電源又能與3V邏輯器件接口。 </p><p> 3、因?yàn)槭情_(kāi)漏結(jié)構(gòu),所以不同器件的SD
15、A與SDA之間、SCL與SCL之可以直接相連,不需要額外的轉(zhuǎn)換電路。 </p><p> 2.2 IIC總線(xiàn)的位傳輸 </p><p> 由于IIC總線(xiàn)的器件有不同種類(lèi)的工藝,邏輯“0”或“1”的電平不是固定的。在IIC總線(xiàn)每傳輸一位數(shù)據(jù)就有一個(gè)時(shí)鐘脈沖相對(duì)應(yīng),其邏輯“0”或“1”的信號(hào)電平取決于該節(jié)點(diǎn)的正端電源Vdd的電壓。 </p><p> 2.2.1
16、數(shù)據(jù)的有效性 </p><p> IIC總線(xiàn)數(shù)據(jù)傳輸時(shí),在時(shí)鐘線(xiàn)高電平期間數(shù)據(jù)線(xiàn)上必須保持穩(wěn)定的邏輯電平狀態(tài),高電平為數(shù)據(jù)1,低電平為數(shù)據(jù)0。只有在時(shí)鐘線(xiàn)為低電平時(shí),才允許數(shù)據(jù)線(xiàn)上的電平狀態(tài)變化。如圖2.3所示。</p><p> 圖2.3 IIC總線(xiàn)上的數(shù)據(jù)有效性 </p><p> 2.2.2 總線(xiàn)數(shù)據(jù)傳輸?shù)钠鹗己徒K止 </p><p
17、> IIC總線(xiàn)數(shù)據(jù)傳輸定義了兩種時(shí)序狀態(tài),分別為起始信號(hào)和終止信號(hào),如圖2.4所示。 啟始信號(hào)(START),當(dāng)時(shí)鐘線(xiàn)SCL保持高電平期間,SDA由高電平向低電平切換,表示開(kāi)始傳送數(shù)據(jù),終止信號(hào)(STOP),當(dāng)時(shí)鐘線(xiàn)SCL保持高電平期間,SDA由低電平向高電平切換,表示停止傳送數(shù)據(jù)。 </p><p> 圖2.4 IIC總線(xiàn)上的起始和終止信號(hào) </p><p> 起始信號(hào)與
18、終止信號(hào)都是由主控制器產(chǎn)生,當(dāng)IIC總線(xiàn)出現(xiàn)起始信號(hào)時(shí),總線(xiàn)進(jìn)入“忙”狀態(tài),當(dāng)IIC總線(xiàn)上出現(xiàn)結(jié)束信號(hào)時(shí),總線(xiàn)進(jìn)入“空閑”狀態(tài)。掛接在IIC總線(xiàn)上的主從設(shè)備通過(guò)檢測(cè)起始信號(hào)和結(jié)束信號(hào)判斷總線(xiàn)的“忙”、“空閑”狀態(tài)。由于IIC總線(xiàn)協(xié)議不定義優(yōu)先級(jí)概念,因此任何新進(jìn)程的開(kāi)始必須等待當(dāng)前進(jìn)程的結(jié)束。使用硬件接口可以很容易地檢測(cè)起始和結(jié)束信號(hào),沒(méi)有這種接口的微機(jī)必須以每時(shí)鐘周期至少兩次對(duì)SDA取樣以檢測(cè)這種變化。 </p><
19、;p> 2.2.3 總線(xiàn)信號(hào)的時(shí)序 </p><p> 為了保證IIC總線(xiàn)數(shù)據(jù)的可靠傳送,對(duì)總線(xiàn)上的信號(hào)時(shí)序做了嚴(yán)格的規(guī)定,下面各圖中對(duì)主要信號(hào)時(shí)序做了定義。 </p><p> 圖2.5 主機(jī)向從機(jī)發(fā)送一個(gè)字節(jié)的時(shí)序 </p><p> 圖2.5所表示的是主機(jī)向從機(jī)發(fā)送一個(gè)字節(jié)的時(shí)序,主機(jī)向傳送一個(gè)7位的地址,第8位是讀/寫(xiě)位。在第9個(gè)時(shí)鐘時(shí)
20、,從機(jī)發(fā)出一個(gè)響應(yīng)信號(hào),接著傳輸8位的數(shù)據(jù),相應(yīng)地從機(jī)繼續(xù)發(fā)送一個(gè)響應(yīng)位,然后主機(jī)在時(shí)鐘線(xiàn)保持高電平期間,拉高數(shù)據(jù)線(xiàn),數(shù)據(jù)傳輸停止。 </p><p> 圖2.6 主機(jī)向從機(jī)接收1個(gè)字節(jié)數(shù)據(jù)的時(shí)序 </p><p> 圖2.6所表示的主機(jī)向從機(jī)接收一個(gè)字節(jié)的時(shí)序,前面8個(gè)時(shí)鐘周期與發(fā)送時(shí)序相同,不同的是在傳輸8位數(shù)據(jù)后,由主機(jī)發(fā)送響應(yīng)信號(hào),然后啟動(dòng)停止信號(hào)。</p>&
21、lt;p> 2.3 IIC總線(xiàn)上的數(shù)據(jù)傳輸 </p><p> 2.3.1總線(xiàn)的數(shù)據(jù)傳輸格式 </p><p> 圖2.10所示的是一個(gè)完整的數(shù)據(jù)傳輸格式。按照規(guī)定,在起始條件(S)之后,發(fā)送一個(gè)7位的從機(jī)地址。緊跟著的第8位是數(shù)據(jù)方向位(R/W),數(shù)據(jù)方向表明主控器和被控器的數(shù)據(jù)傳輸方向?!?’表示主控器發(fā)送數(shù)據(jù)(寫(xiě)),‘1’表示請(qǐng)求接收數(shù)據(jù)(讀)。數(shù)據(jù)傳輸一般由主機(jī)產(chǎn)生
22、停止位(P)終止。在這種傳輸中,也可以有不同的讀/寫(xiě)格式相結(jié)合。下面介紹3種傳輸格式, </p><p> 1、主控制器寫(xiě)操作 </p><p> 主機(jī)-發(fā)送器向從機(jī)發(fā)送n個(gè)數(shù)據(jù)字節(jié),方向不變。</p><p> 注 1-7是地址位,8位是讀寫(xiě)位,第9位是響應(yīng)位 </p><p> 圖2.10 完整的數(shù)據(jù)傳輸 </p>
23、<p> 2、主控制器讀操作 </p><p> 在第一個(gè)字節(jié)后,主控制器立即讀從控制器。在第一次響應(yīng)后,主控制器,發(fā)送器變成了主控制器,接收器,從控制器,接收器變成了從控制器,發(fā)送器。第一次響應(yīng)仍由從控制器產(chǎn)生。之前發(fā)送了一個(gè)不響應(yīng)信號(hào)(/A)的主機(jī)產(chǎn)生停止條件。 </p><p> 3、主控制器的讀寫(xiě)操作 </p><p> 在數(shù)據(jù)傳輸過(guò)程
24、中需要改變傳輸方向操作,這時(shí)起始條件和從控制器地址都會(huì)被重復(fù),但R/W位取反,它的方向由尋址字節(jié)的方向位決定。如果主控制器接收器發(fā)送一個(gè)重復(fù)起始條件,它之前應(yīng)該發(fā)送一個(gè)不響應(yīng)的信號(hào)/A,每個(gè)字節(jié)后都跟著一個(gè)響應(yīng)位,在序列中用A或/A模塊表示。尋址字節(jié)只表明器件地址及傳送方向,器件內(nèi)部的n個(gè)數(shù)據(jù)地址可以在I2C總線(xiàn)數(shù)據(jù)操作格式中用第一個(gè)數(shù)據(jù)字節(jié)指定。I2C總線(xiàn)被控制器在接收到起始信號(hào)后都必須復(fù)位他們的總線(xiàn)邏輯,以便對(duì)將要開(kāi)始的被控制器地址
25、的傳送進(jìn)行預(yù)處理。 </p><p> 2.4重復(fù)起始條件 </p><p> 主機(jī)與從機(jī)進(jìn)行通信時(shí),有時(shí)需要切換數(shù)據(jù)的收發(fā)方向。例如,訪(fǎng)問(wèn)某一具有I2C總線(xiàn)接口的EEPROM存儲(chǔ)器時(shí),主機(jī)先向存儲(chǔ)器輸入存儲(chǔ)單元的地址信息,發(fā)送數(shù)據(jù),,然后再讀取其中的存儲(chǔ)內(nèi)容,接收數(shù)據(jù),。在切換數(shù)據(jù)的傳輸方向時(shí),可以不必先產(chǎn)生停止條件再開(kāi)始下次傳輸,而是直接再一次產(chǎn)生開(kāi)始條件。I2C總線(xiàn)在已經(jīng)處于忙的
26、狀態(tài)下,再一次直接產(chǎn)生起始條件的情況被稱(chēng)為重復(fù)起始條件。重復(fù)起始條件常常簡(jiǎn)記為Sr。正常的起始條件和重復(fù)起始條件在物理波形上并沒(méi)有什么不同,區(qū)別僅僅是在邏輯方面。在進(jìn)行多字節(jié)數(shù)據(jù)傳輸過(guò)程中,只要數(shù)據(jù)的收發(fā)方向發(fā)生了切換,就要用到重復(fù)起始條件。 </p><p> 數(shù)據(jù)傳輸?shù)慕Y(jié)束信號(hào)由主IIC發(fā)出。剛剛結(jié)束一個(gè)進(jìn)程的用戶(hù)有立即啟動(dòng)一個(gè)新進(jìn)程的優(yōu)先權(quán),該用戶(hù)可以不發(fā)出結(jié)束信號(hào)而直接發(fā)出一個(gè)新的啟動(dòng)信號(hào)和另一個(gè)從II
27、C地址,從而不給其他用戶(hù)申請(qǐng)總線(xiàn)的機(jī)會(huì),以保持自己繼續(xù)使用總線(xiàn)的權(quán)利。 </p><p> 3 設(shè)計(jì)環(huán)境和設(shè)計(jì)方法 </p><p><b> 3.1 設(shè)計(jì)環(huán)境 </b></p><p> 本文中IIC總線(xiàn)接口的設(shè)計(jì)是利用Altera公司的設(shè)計(jì)軟件Quartus II,用Verilog HDL語(yǔ)言編程實(shí)現(xiàn)的。仿真部分采用Quartus I
28、I+Modelsim。 </p><p> Quartus II軟件是Altera提供的完整的多平臺(tái)設(shè)計(jì)環(huán)境,可以輕易地滿(mǎn)足特定地設(shè)計(jì)需求,是SOPC設(shè)計(jì)的綜合性環(huán)境。</p><p> 硬件描述語(yǔ)言(HDL)是一種形式化方法來(lái)描述數(shù)字電路和設(shè)計(jì)數(shù)字邏輯系統(tǒng)的語(yǔ)言,它是硬件設(shè)計(jì)人員與EDA工具之間溝通的橋梁,其主要目的是用來(lái)編寫(xiě)設(shè)計(jì)文件,建立電子系統(tǒng)行為級(jí)的模擬類(lèi)型。</p>
29、;<p> 3.2用Verilog HDL設(shè)計(jì)可綜合的狀態(tài)機(jī) </p><p> 基于狀態(tài)機(jī)的設(shè)計(jì)要點(diǎn): </p><p> (1)一個(gè)完備的狀態(tài)機(jī)應(yīng)該具有初始狀態(tài)和默認(rèn)狀態(tài)。當(dāng)芯片加電或者復(fù)位后,狀態(tài)機(jī)能夠自動(dòng)將所有的判斷條件復(fù)位,并進(jìn)入初始狀態(tài),起始狀態(tài)是指電路復(fù)位后所處的狀態(tài),選擇一個(gè)合理的起始狀態(tài)將使整個(gè)系統(tǒng)更簡(jiǎn)捷高效。當(dāng)轉(zhuǎn)移條件不滿(mǎn)足,或者狀態(tài)發(fā)生突變時(shí),狀
30、態(tài)機(jī)進(jìn)入一個(gè)默認(rèn)(default)狀態(tài),能保證邏輯不會(huì)陷入“死循環(huán)”,這是對(duì)狀態(tài)機(jī)健壯性的一個(gè)重要要求,即自動(dòng)恢復(fù)功能。在case語(yǔ)句的最后,不要忘了加上default分支語(yǔ)句,以避免鎖存器的產(chǎn)生。 </p><p><b> (3)建模 </b></p><p> 用兩條always語(yǔ)句對(duì)其建模比較好:一個(gè)always語(yǔ)句用于組合邏輯建模(既包括次態(tài)邏輯,也包括
31、輸出邏輯),一個(gè)always語(yǔ)句用于時(shí)序邏輯建模。組合邏輯建模采用阻塞式賦值,時(shí)序邏輯建模采用非阻塞式賦值。 </p><p> (4)時(shí)序方式選擇 </p><p> 根據(jù)觸發(fā)條件的不同,時(shí)序邏輯電路可以分為異步時(shí)序和同步時(shí)序邏輯。在異步時(shí)序邏輯中觸發(fā)條件很隨意,任何時(shí)刻都有可能發(fā)生,所以記憶狀態(tài)的觸發(fā)器輸出在任何時(shí)刻都有可能發(fā)生,而同步時(shí)序邏輯中表示狀態(tài)的觸發(fā)器輸出只能在惟一確定的
32、觸發(fā)條件發(fā)生時(shí)刻改變,例如只能由時(shí)鐘的上升沿或下降沿觸發(fā)。同步時(shí)序邏輯的觸發(fā)輸入至少可以維持一個(gè)時(shí)鐘周期后才會(huì)發(fā)生第二次觸發(fā),利用這一段時(shí)間,即在下一次觸發(fā)信號(hào)來(lái)到前,為電路的狀態(tài)改變創(chuàng)造了一個(gè)穩(wěn)定可靠的條件。因此,同步時(shí)序邏輯比異步時(shí)序邏輯具有更可靠、更簡(jiǎn)單的邏輯關(guān)系。 </p><p> 目前,綜合工具只支持同步時(shí)序邏輯的設(shè)計(jì),用Verilog設(shè)計(jì)可綜合的狀態(tài)機(jī)也都使用同步時(shí)序邏輯。實(shí)用的狀態(tài)機(jī)都應(yīng)設(shè)計(jì)為由
33、唯一時(shí)鐘邊沿觸發(fā)的同步運(yùn)行方式。</p><p> 4 IIC總線(xiàn)接口設(shè)計(jì) </p><p> IIC總線(xiàn)接口的設(shè)計(jì)是整個(gè)系統(tǒng)設(shè)計(jì)的關(guān)鍵之一,從本章起,開(kāi)始介紹IIC總線(xiàn)接口的內(nèi)部模塊的設(shè)計(jì)。在接口模塊設(shè)計(jì)中,主要介紹模塊要實(shí)現(xiàn)的功能和設(shè)計(jì)的思路,并給出用QuartusⅡ軟件對(duì)每一個(gè)模塊編譯生成的單個(gè)電路模塊。 </p><p><b> 4.1 實(shí)
34、現(xiàn)功能 </b></p><p> 本文主要通過(guò)是用Verilog HDL語(yǔ)言在FPGA上實(shí)現(xiàn)IIC總線(xiàn)接口,該接口接收來(lái)自高速設(shè)備或片上總線(xiàn)的讀寫(xiě)命令信號(hào)、地址信號(hào)、并行數(shù)據(jù)信號(hào),并把它們轉(zhuǎn)換為相應(yīng)的串行信號(hào)發(fā)送到Slave器件中去,它還發(fā)送應(yīng)答信號(hào),以便讓主器件來(lái)調(diào)節(jié)發(fā)送或接收數(shù)據(jù)的速度移配合從器件的接收,寫(xiě),和發(fā)送,讀,數(shù)據(jù)。鑒于IIC總線(xiàn)的規(guī)范,其接口主要完成的功能如下:</p>
35、<p> 1、具有軟件可編程系統(tǒng)時(shí)鐘頻率 </p><p> 2、軟件可編程響應(yīng)位 </p><p> 3、啟動(dòng)/停止/重啟/響應(yīng)各種觸發(fā)狀態(tài) </p><p><b> 4、支持系統(tǒng)擴(kuò)展 </b></p><p> 5、僅支持時(shí)鐘同步,不支持仲裁 </p><p> 6
36、、隨機(jī)讀取總線(xiàn)數(shù)據(jù)和狀態(tài) </p><p> 接口定義了2個(gè)傳輸速度:</p><p> 標(biāo)準(zhǔn)模式——100 Kbps </p><p> 快速模式——400 Kbps </p><p> 4.2 IIC總線(xiàn)接口的頂層設(shè)計(jì) </p><p> 為了實(shí)現(xiàn)和IIC器件的通訊,該IIC接口一方面要通過(guò)數(shù)據(jù)總線(xiàn)
37、與微處理器交換數(shù)據(jù),接收來(lái)自微處理器的控制信號(hào),命令與數(shù)據(jù),實(shí)現(xiàn)IIC接口與微處理器的通訊,另一方面要通過(guò)IIC總線(xiàn)與IIC器件交換數(shù)據(jù),發(fā)送IIC器件的數(shù)據(jù)和狀態(tài)響應(yīng)到微處理器,使它們之間能夠進(jìn)行通訊。 </p><p> 根據(jù)據(jù)總線(xiàn)接口要完成的功能,采用自上而下的設(shè)計(jì)方法,綜合考慮,設(shè)計(jì)如下: </p><p> 1、時(shí)鐘分頻模塊,由于通常FPGA的系統(tǒng)外部時(shí)鐘輸入都很高,如50M
38、Hz,,而IIC總線(xiàn)接口協(xié)議規(guī)定數(shù)據(jù)傳輸速率在標(biāo)準(zhǔn)模式下為100Kbit/s,快速模式下為400 kbit/s及高速模式下為3.4 Mbit/s。為了能產(chǎn)生正確的數(shù)據(jù)傳輸時(shí)序,需要一時(shí)鐘分頻器對(duì)輸入時(shí)鐘進(jìn)行分頻,然后再作為時(shí)序控制器的時(shí)鐘。通過(guò)該模塊實(shí)現(xiàn)頻率的可編程,產(chǎn)生總線(xiàn)工作時(shí)鐘;</p><p> 接收數(shù)據(jù)模塊,接受來(lái)自微處理器的數(shù)據(jù)信號(hào),同時(shí)輸出一個(gè)使時(shí)序控制模塊工作的觸發(fā)信號(hào),并反饋給處理器一個(gè)響應(yīng)信
39、號(hào),告訴處理器,已經(jīng)接收完數(shù)據(jù); </p><p> 3、時(shí)序控制模塊,控制整個(gè)系統(tǒng)工作的時(shí)序,并把8位并行數(shù)據(jù)轉(zhuǎn)換成串行</p><p> 4、發(fā)送數(shù)據(jù)模塊,反饋總線(xiàn)的工作信息; </p><p> 5、輸出緩沖器,是一個(gè)三態(tài)的緩沖器,可為總線(xiàn)時(shí)鐘和數(shù)據(jù)信號(hào)提供開(kāi)漏極輸出; </p><p> 6、寄存器組,包括了3個(gè)寄存器,各部分
40、的信息如表4-1所示。 </p><p> 表4-1 IIC總線(xiàn)接口寄存器 </p><p> 外部處理器發(fā)送出控制信號(hào)和地址信號(hào),不同的地址信號(hào)指向不同的寄存器,進(jìn)入不同的讀寫(xiě)狀態(tài)。當(dāng)?shù)刂沸盘?hào)是00時(shí),指向字地址寄存器,處理器進(jìn)入讀/寫(xiě)狀態(tài),把數(shù)據(jù)信號(hào)寫(xiě)入字地址寄存器或者從寄存器讀出,當(dāng)?shù)刂沸盘?hào)是01,10時(shí),外部處理器分別讀取數(shù)據(jù)寄存器和狀態(tài)寄存器。 </p>&l
41、t;p> parameter w_add=2'b00;//地址寄存器 </p><p> parameter d_add=2'b01;//數(shù)據(jù)寄存器 </p><p> parameter s_add=2'b10;//狀態(tài)寄存器 </p><p> 按照設(shè)計(jì)的要求,需要8位數(shù)據(jù)線(xiàn),2位地址線(xiàn),時(shí)鐘線(xiàn),復(fù)位,使能
42、信號(hào)線(xiàn),讀寫(xiě)命令線(xiàn),還有反饋信息的響應(yīng)線(xiàn)以及一位串行時(shí)鐘線(xiàn)和一位串行數(shù)據(jù)線(xiàn)。其詳細(xì)的輸入輸出接口信號(hào)及其功能如表4-2所示,l表示信號(hào)低電位有效,在整個(gè)設(shè)計(jì)中都應(yīng)用了這個(gè)規(guī)則,其中cs_l是芯片的使能信號(hào),和clk信號(hào)是同步的,只有當(dāng)它有效的時(shí)候,其它的地址、復(fù)位和命令信號(hào)才能啟動(dòng)。 </p><p> 表4-2 IIC總線(xiàn)接口信號(hào)表 </p><p> 綜上所述,整個(gè)設(shè)計(jì)分為6個(gè)模塊
43、,時(shí)鐘分頻器、時(shí)序控制器、數(shù)據(jù)接收器、數(shù)據(jù)發(fā)送器、輸出緩沖器、寄存器組。其結(jié)構(gòu)如圖4.1所示。 </p><p> 圖4.1 IIC總線(xiàn)接口結(jié)構(gòu)框圖 </p><p> 4.3 內(nèi)部模塊的設(shè)計(jì)和Verilog HDL實(shí)現(xiàn) </p><p> 4.3.1 時(shí)鐘分頻器 </p><p> 由于通常的FPGA系統(tǒng)外部時(shí)鐘輸入都很高,如50
44、MHz,,而IIC總線(xiàn)接口協(xié)議規(guī)定數(shù)據(jù)傳輸速率在標(biāo)準(zhǔn)模式下為100Kbit/s,快速模式下為400 kbit/s。為了能產(chǎn)生正確的數(shù)據(jù)傳輸時(shí)序,由時(shí)鐘分頻寄存器對(duì)輸入時(shí)鐘進(jìn)行分頻再作為時(shí)序控制器的時(shí)鐘。8 bit的計(jì)數(shù)器可以滿(mǎn)足大多數(shù)情況下的使用,但是如果微處理器的時(shí)鐘比較大,就需要更大的計(jì)數(shù)器。同樣地,如果IIC總線(xiàn)要求工作速度比較大,那么就需要一個(gè)相對(duì)小的計(jì)數(shù)器。系統(tǒng)復(fù)位時(shí),計(jì)數(shù)器清零,當(dāng)時(shí)鐘上升沿時(shí),計(jì)數(shù)器加1。在本設(shè)計(jì)中,假定外
45、部時(shí)鐘為50 MHz,總線(xiàn)工作在標(biāo)準(zhǔn)模式100 KHz,基于Verilog同步設(shè)計(jì)的需要,本地時(shí)鐘一般為SCL時(shí)鐘的整數(shù)倍,這里取2倍??梢郧蟮糜?jì)數(shù)器值NUM=50M/(100K*2)=250,換算為16進(jìn)制為FA。通過(guò)軟件編程可以實(shí)現(xiàn)數(shù)據(jù)傳輸速率的控制,</p><p> 其模塊的RTL級(jí)描述如圖4.2, </p><p> 圖4.2 時(shí)鐘分頻模塊RTL級(jí)描述 </p>
46、<p> 用Quartus II軟件編譯仿真之后生成一個(gè)器件模塊圖,其接口電路模塊圖形如圖4.3。 </p><p> 圖4.3 時(shí)鐘分頻模塊圖 </p><p> 4.3.2 數(shù)據(jù)接收模塊 </p><p> 數(shù)據(jù)接收模塊既要接受來(lái)自微處理器的數(shù)據(jù)信號(hào),同時(shí)也要輸出反饋信號(hào)和觸發(fā)信號(hào)。因此,該模塊需要一個(gè)字地址寄存器,同時(shí)要產(chǎn)生狀態(tài)機(jī)的觸發(fā)
47、信號(hào)。當(dāng)系統(tǒng)復(fù)位時(shí),初始化輸出的字地址,在使能信號(hào)和命令信號(hào)同時(shí)有效的情況下,當(dāng)?shù)刂沸盘?hào)為00,指向字地址寄存器時(shí),輸入的8位數(shù)據(jù)以字地址信息存儲(chǔ)起來(lái),并觸發(fā)一個(gè)i2c_go命令,這個(gè)命令是時(shí)序控制模塊工作的觸發(fā)信號(hào),并反饋給處理器一個(gè)響應(yīng)信號(hào),告訴處理器,已經(jīng)接收完數(shù)據(jù)。</p><p> 其模塊的RTL級(jí)描述如圖4.4, </p><p> 圖4.4 接收寄存器模塊RTL級(jí)描述
48、 </p><p> 用Quartus II軟件生成一個(gè)電路模塊圖如圖4.5所示, </p><p> 圖4.5 接收寄存器模塊 </p><p> 4.3.3發(fā)送寄存器 </p><p> 在這個(gè)模塊里包括三個(gè)寄存器,字地址寄存器,數(shù)據(jù)寄存器,狀態(tài)寄存器,根據(jù)處理器的地址信號(hào),指向不同的寄存器,輸出不同的信息,把總線(xiàn)的狀態(tài)反饋給處
49、理器。當(dāng)指向數(shù)據(jù)寄存器時(shí),把時(shí)序控制模塊重復(fù)讀取的總線(xiàn)上的數(shù)據(jù)信息以8位數(shù)據(jù)的形式反饋給處理器,如字地址,IIC器件的數(shù)據(jù),狀態(tài)等。字地址和數(shù)據(jù)都是8位的信號(hào)直接輸出,當(dāng)處理器的命令是指向狀態(tài)寄存器時(shí),輸出的8位的數(shù)據(jù)中,各個(gè)位的定義如表4-3所示:</p><p> 表4-3狀態(tài)寄存器位功能表</p><p> 用Quartus II軟件生成一個(gè)電路模塊圖如圖4.8, </p&
50、gt;<p> 圖4.8 發(fā)送寄存器模塊 </p><p> 4.3.4 時(shí)序控制模塊 </p><p> 時(shí)序控制模塊是接口的核心部分,它控制著整個(gè)系統(tǒng)的工作過(guò)程、數(shù)據(jù)傳輸,及通過(guò)控制SCL和SDA信號(hào)線(xiàn)來(lái)觸發(fā)開(kāi)始和停止信號(hào),該模塊包含一個(gè)狀態(tài)機(jī),用于控制系統(tǒng)工作的時(shí)序,同時(shí)當(dāng)主機(jī)要把數(shù)據(jù)寫(xiě)入IIC總線(xiàn)上的器件時(shí),因?yàn)閿?shù)據(jù)寄存器的位寬是8bit,而IIC總線(xiàn)上的數(shù)據(jù)
51、位寬是1bit,所以必須經(jīng)過(guò)并串轉(zhuǎn)換。即該模塊具有如下功能:</p><p> 1、控制IIC總線(xiàn)的周期;</p><p> 2、對(duì)輸入數(shù)據(jù)進(jìn)行并/串轉(zhuǎn)換; </p><p> 3、對(duì)總線(xiàn)上的數(shù)據(jù)進(jìn)行轉(zhuǎn)換;</p><p> 4、觸發(fā)IIC的時(shí)鐘信號(hào);</p><p> 5、觸發(fā)IIC的數(shù)據(jù)信號(hào); </
52、p><p> 6、觸發(fā)IIC總線(xiàn)的狀態(tài)信號(hào)。 </p><p> 采用FPGA模擬IIC總線(xiàn),由IIC總線(xiàn)規(guī)則可以看出,IIC在傳輸過(guò)程中有5個(gè)固定的狀態(tài),空閑、開(kāi)始、響應(yīng)、接收/發(fā)送、停止。傳輸?shù)倪^(guò)程也就是狀態(tài)間進(jìn)行變換的過(guò)程,因此很自然聯(lián)想到在編程時(shí)使用狀態(tài)機(jī)的方法。同時(shí)狀態(tài)間轉(zhuǎn)換要受到來(lái)自微控制器的信號(hào)的控制,因此需要采用Mealy型狀態(tài)機(jī)。并串轉(zhuǎn)換器,在這個(gè)模塊里,通過(guò)8 bit計(jì)
53、數(shù)器來(lái)實(shí)現(xiàn)。為了對(duì)運(yùn)行狀態(tài)進(jìn)行更一步的細(xì)分,在本設(shè)計(jì)中定義了15個(gè)狀態(tài),下面把各個(gè)狀態(tài)的定義如下解釋?zhuān)?</p><p> idle IIC總線(xiàn)空閑 </p><p> en_clk 時(shí)鐘啟動(dòng) </p><p> start1,start2,stop1 開(kāi)始和停止 <
54、/p><p> dev_add1,dev_add2 傳輸器件地址 </p><p> ack1,ack2,ack3,ack4 發(fā)送響應(yīng) </p><p> w_add 字地址 </p><p> wait1 等待 </p>&
55、lt;p> dis_clk1 暫停 </p><p> data 傳輸數(shù)據(jù) </p><p> 當(dāng)系統(tǒng)復(fù)位時(shí),初始化狀態(tài)為idle,當(dāng)復(fù)位無(wú)效,地址信號(hào)為00時(shí),指向字地址寄存器,這時(shí)產(chǎn)生一個(gè)啟動(dòng)狀態(tài)機(jī)的信號(hào),狀態(tài)機(jī)由空閑狀態(tài)進(jìn)入開(kāi)始狀態(tài),當(dāng)分頻器過(guò)來(lái)的脈沖信號(hào)從低向高跳變時(shí),傳輸開(kāi)始,同時(shí)位計(jì)數(shù)器也開(kāi)
56、始啟動(dòng)讀總線(xiàn)的動(dòng)作一定要讀完一個(gè)字節(jié)才結(jié)束。那么先傳輸?shù)氖?位器件地址,并產(chǎn)生一個(gè)響應(yīng)位,然后傳輸8位字地址和數(shù)據(jù),如果有中斷進(jìn)入等待或暫停狀態(tài),需要重新?tīng)顟B(tài)機(jī)啟動(dòng)。控制器根據(jù)所處狀態(tài)讀寫(xiě)總線(xiàn)器件。主機(jī)要讀取總線(xiàn)器件上的數(shù)據(jù)也必須通過(guò)狀態(tài)機(jī)來(lái)實(shí)現(xiàn),當(dāng)狀態(tài)機(jī)處于數(shù)據(jù)狀態(tài)時(shí),如果這時(shí)8位計(jì)數(shù)器的值為5,那么讀出數(shù)據(jù)的第5位就是當(dāng)時(shí)SDA上的邏輯值。以此類(lèi)推,其它的同樣。 其狀態(tài)機(jī)程序見(jiàn)附錄。</p><p> 簡(jiǎn)單
57、的流程圖如圖4.9所示。 </p><p> 圖4.9 狀態(tài)機(jī)工作流程圖 </p><p> 其生成的RTL級(jí)描述圖比較龐大,因此就不貼出了。用Quartus II軟件生成一個(gè)電路模塊圖如圖4.10。</p><p> 圖4.10 時(shí)序控制模塊圖 </p><p> 4.3.5輸出緩沖器 </p><p>
58、; 根據(jù)IIC總線(xiàn)的傳輸規(guī)范,總線(xiàn)的電氣特性為開(kāi)漏極輸出驅(qū)動(dòng),但是多數(shù)的可編程器件不提供開(kāi)漏極輸出特性,為了使SDA,SCL便于移植,均使用了三態(tài)驅(qū)動(dòng)模用Quartus II軟件生成一個(gè)電路模塊圖如圖4.12。</p><p> 圖4.12 輸出緩沖模塊 </p><p> 4.3.6 頂層文件 </p><p> 頂層文件可以用電路圖的輸入方式把5個(gè)子模
59、塊連接起來(lái),也可以通過(guò)硬件語(yǔ)言的例化語(yǔ)句來(lái)描述,在本設(shè)計(jì)中主要運(yùn)用語(yǔ)言描述的方法。</p><p> 5 IIC總線(xiàn)接口的仿真</p><p><b> 5.1 驗(yàn)證流程 </b></p><p> IIC總線(xiàn)接口的驗(yàn)證流程如圖5.1所示 。 </p><p> 圖5.1 IIC總線(xiàn)接口驗(yàn)證流程 </p&
60、gt;<p> 在圖5.1中,功能仿真就是常說(shuō)的前仿真,用于檢查RTL代碼的正確性,綜合后仿真用于檢查網(wǎng)表是否正確,疏忽大意或代碼風(fēng)格不嚴(yán)謹(jǐn)很容易導(dǎo)致綜合出來(lái)的網(wǎng)表的功能和預(yù)想不一致,綜合后仿真能發(fā)現(xiàn)這樣的問(wèn)題。PAR后仿真的意思是布局布線(xiàn),Place and Route,后仿真,也就是常說(shuō)的后仿真或時(shí)序仿真,它可以檢查網(wǎng)表和時(shí)序的正確性。</p><p><b> 5.2 整體構(gòu)思
61、</b></p><p> 為了確認(rèn)IIC總線(xiàn)接口是否能夠正確運(yùn)行,仿真驗(yàn)證時(shí)需要建立Testbench(測(cè)試環(huán)境),IIC總線(xiàn)接口驗(yàn)證的環(huán)境的結(jié)構(gòu)如圖5.2所示。整個(gè)結(jié)構(gòu)設(shè)計(jì)分為三個(gè)部分:第一部分是主設(shè)備仿真模塊,第二部分是IIC總線(xiàn)接口可仿真綜合模塊,第三部分是從設(shè)備仿真模塊。然后用一個(gè)測(cè)試臺(tái)程序?qū)⑷齻€(gè)模塊連接起來(lái),并產(chǎn)生激勵(lì)信號(hào)對(duì)IIC模塊的功能進(jìn)行仿真測(cè)試。</p><p
62、> 5.3 測(cè)試模塊搭建 </p><p> 1、micro module: 微處理器部分可以采用ZYE1502D實(shí)驗(yàn)箱上有的AT89C51單片機(jī),或者編寫(xiě)Testbench實(shí)現(xiàn)。為了仿真方便,在仿真時(shí)采用Testbench搭建。該micro模型給出了微處理器與IIC接口通訊的仿真程序。該模型能產(chǎn)生相應(yīng)的讀寫(xiě)信號(hào),地址信號(hào),并行數(shù)據(jù)信號(hào),并能接收從器件的應(yīng)答信號(hào),來(lái)調(diào)節(jié)發(fā)送或接收數(shù)據(jù)的速度。在這個(gè)程序中
63、,為了保證IIC接口的正確性,可以進(jìn)行完整的測(cè)試,寫(xiě)操作時(shí)輸入的地址信號(hào)和數(shù)據(jù)信號(hào)的數(shù)據(jù)由于較少,直接寫(xiě)入程序中。讀操作時(shí),將讀數(shù)對(duì)比可以驗(yàn)證程序的正確性。該程序通過(guò)調(diào)用四個(gè)任務(wù)實(shí)現(xiàn)上述功能,write,monitor_iic_rdy,read_data,kill_time。 </p><p> 2、iic_slave module: 該iic_slave模型提供了一個(gè)IIC存儲(chǔ)器。該從模型能夠偵測(cè)起始和終止
64、命令,在地址控制字時(shí)序后產(chǎn)生ACK,在數(shù)據(jù)讀之后置IIC總線(xiàn)三態(tài)。另外它通過(guò)比較“Slave Data Receive on Write”和“Slave Data Transmitted on Read”的信息,實(shí)現(xiàn)仿真時(shí)數(shù)據(jù)正確性的檢查。 </p><p> 3、clk_rst module:clk_rst模塊給測(cè)試平臺(tái)提供時(shí)鐘和復(fù)位信號(hào)。編輯clk_period參數(shù)更改時(shí)鐘頻率,改變r(jià)eset_time參數(shù)
65、就能改變復(fù)位信號(hào)的有效時(shí)間。 </p><p> 4、iic_tb,iic_tb是測(cè)試臺(tái)的頂層文件。它將IIC接口模型iic和測(cè)試程序的模型clk_rst、micro、iic_slave實(shí)例化,并連接起來(lái)。其主要程序:</p><p> i2c I2C(.data(data),.addr(addr),.rst_l(rst_l),.clock(clock),.cs
66、_l(cs_l), </p><p> .ack_l(ack_l),.rd_wr_l(rd_wr_l),.scl_pin(scl_pin),.sda_pin(sda_pin)); </p><p> clk_rst CLK(.clk(clock),.rst_l(rst_l)); </p><p> micro MICRO(.clk(clock),.rst_l(
67、rst_l),.data(data),.addr(addr),.cs_l(cs_l), </p><p> .ack_l(ack_l),.rd_wr_l(rd_wr_l)); </p><p> i2c_slave SEP(.sda(sda_pin),.scl(scl_pin)); <
68、/p><p><b> 5.4時(shí)序仿真</b></p><p> 做功能仿真時(shí),在Modelsim中建立工程,把IIC的所有verilog hdl文件,以及Testbench用到的verilog文件加入到工程中,然后編譯仿真。仿真波形如圖5.2,5.3所示。 </p><p> 圖5.2 iic_rst 仿真圖 </p><
69、;p> 圖5.3 功能仿真波形 </p><p> 由輸出結(jié)果可只,微處理器發(fā)送寫(xiě)地址10100000,響應(yīng)后寫(xiě)入數(shù)據(jù)55H,響應(yīng)后重新發(fā)啟動(dòng)信號(hào),發(fā)送讀地址10100001,響應(yīng)后讀出數(shù)據(jù),進(jìn)行比較。同樣操作,寫(xiě)入數(shù)據(jù)AAH并讀出比較,結(jié)果兩次數(shù)據(jù)讀回均正確無(wú)誤。 </p><p><b> 結(jié)束語(yǔ)</b></p><p>
70、本課題設(shè)計(jì)了基于FPGA的IIC接口的數(shù)個(gè)模塊,時(shí)鐘模塊、接收模塊、發(fā)送模塊、時(shí)序控制模塊和輸出緩沖模塊,其中時(shí)序控制模塊是設(shè)計(jì)的重點(diǎn)和難點(diǎn)。每個(gè)模塊都通過(guò)了功能仿真和時(shí)序仿真,仿真結(jié)果表明,各個(gè)模塊均完成了相應(yīng)的邏輯功能。</p><p> 整個(gè)設(shè)計(jì)都采用了同步方式,而且沒(méi)有使用特定公司的技術(shù)和IP核,這使得設(shè)計(jì)可以廣泛地重用,但也存在著可改進(jìn)之處:</p><p> 1、需要提高V
71、erilog HDL語(yǔ)言代碼的效率,要力求用最簡(jiǎn)潔,可綜合的描述方式描述模塊的結(jié)構(gòu)和功能,以使得芯片面積、功耗減小。 </p><p> 2、在基于FPGA的器件上,進(jìn)行邏輯綜合過(guò)程中,許多約束條件是相互矛盾的,這需要反復(fù)設(shè)定條件,以求電路結(jié)構(gòu)得到優(yōu)化。</p><p> 基于Verilog HDL語(yǔ)言的可移植性,及不依賴(lài)器件的特性,設(shè)計(jì)者能在更抽象的層次上把握和描述系統(tǒng)結(jié)構(gòu)和功能特性
72、,使設(shè)計(jì)更具靈活性。由于FPGA器件的快速發(fā)展,其容量可以將各種外圍器件的接口集成到FPGA內(nèi)部,這樣可以實(shí)現(xiàn)設(shè)計(jì)的小型化,低功耗,并且降低了設(shè)計(jì)的復(fù)雜度,而且利用FPGA在線(xiàn)可編程特點(diǎn),可以增加系統(tǒng)設(shè)計(jì)的靈活度,提高了設(shè)計(jì)效率。 </p><p> 在課題期間,通過(guò)不斷地學(xué)習(xí)、探索和實(shí)踐,掌握了Verilog HDL設(shè)計(jì)技術(shù)及其FPGA的應(yīng)用,提高了實(shí)際的工作能力和創(chuàng)新能力。 </p><
73、p> 最后感謝我的老師和同學(xué)們,在他們的監(jiān)督和幫助下讓我順利完成了本次的課程設(shè)計(jì)。</p><p><b> 參考文獻(xiàn) </b></p><p> [1]蘇建志,王冰鋒.IIC總線(xiàn)及其應(yīng)用.現(xiàn)代電子技術(shù),2004,22.</p><p> [2]趙輝.IIC總線(xiàn)技術(shù)及其應(yīng)用實(shí)例.微型電腦應(yīng)用,2005,31(4):61.</
74、p><p> [3]周立功.IIC總線(xiàn)概要.產(chǎn)品應(yīng)用手冊(cè),2006,3.</p><p> [4]石宗義.總線(xiàn)的時(shí)序分析及其模擬[J].太原理工大學(xué)學(xué)報(bào),2004,35(1):53. </p><p> [5]朱明程,黃強(qiáng).FPGA 動(dòng)態(tài)可重構(gòu)邏輯設(shè)計(jì)初探.半導(dǎo)體技術(shù),2000,25(4):19.</p><p> [6]褚振勇.FPGA
75、 設(shè)計(jì)及應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2006.</p><p> [7]王毓銀.數(shù)字電路邏輯設(shè)計(jì)[M].北京:高等教育出版社,1999.</p><p> [8]李洪偉.基于QuartusII 的FPGA/CPLD 設(shè)計(jì)[M].北京:電子工業(yè)出版社,2006.</p><p><b> 附錄1</b></p>
76、<p><b> 時(shí)鐘分頻器程序</b></p><p> module iic_clk(clock,rst_l,scl_cnt_en,scl_tick); </p><p><b> //端口列表 </b></p><p> input clock;//外部系統(tǒng)處理器時(shí)鐘 </p&g
77、t;<p> input rst_l;//外部復(fù)位信號(hào),低有效 </p><p> input scl_cnt_en;//來(lái)自時(shí)序控制器的計(jì)數(shù)使能信號(hào) </p><p> output scl_tick;//狀態(tài)機(jī)的工作時(shí)鐘 </p><p> //registers&wires </p&g
78、t;<p> reg scl_tick; </p><p> reg [7:0] cntr;//分頻計(jì)數(shù)值 </p><p><b> //分頻 </b></p><p> always@(posedge clock or negedge rst_l) </p><p> i
79、f(!rst_l) </p><p> cntr<= #1 8'b0; </p><p> else if(scl_cnt_en) </p><p> cntr<= #1 8'b0; </p><p><b> else </b></p><p> cntr&
80、lt;=8'b0; </p><p> always@(posedge clock or negedge rst_l) </p><p> if(!rst_l) </p><p> scl_tick<= #1 1'b0; </p><p> else if(cntr= =8'hFA) </p>
81、<p> cl_tick<= #1 1'b1; </p><p><b> else </b></p><p> scl_tick<= #1 1'b0; </p><p> endmodule </p><p><b> 附錄2</b></p
82、><p><b> 數(shù)據(jù)接收模塊程序 </b></p><p> `timescale 1 ns/100 ps </p><p> module iic_wreg(data, addr, rst_l, clock, scl_cnt_en, rd_wr_l, cs_l, wrd_add,iic_go, ack_l); //端口列表 </p
83、><p> input [7:0] data;//處理器輸出的數(shù)據(jù)碼 </p><p> input [1:0] addr;//處理器輸出的地址碼 </p><p> input rst_l;//復(fù)位信號(hào) </p><p> input clock;//系統(tǒng)時(shí)鐘 </p><p>
84、; input cs_l, scl_cnt_en;//系統(tǒng)使能信號(hào) </p><p> input rd_wr_l;//命令信號(hào) </p><p> output [7:0] wrd_add;//字地址 </p><p> output iic_go;//iic總線(xiàn)啟動(dòng)信號(hào) </p><p>
85、; output ack_l;//反饋給處理器的響應(yīng)信號(hào) </p><p><b> //寄存器型 </b></p><p> reg [7:0] wrd_add; </p><p> reg iic_go; </p><p> reg ack_l; <
86、;/p><p><b> //寄存器參數(shù) </b></p><p> parameter w_add=2'b00;//地址寄存器 </p><p> parameter d_add=2'b01;//數(shù)據(jù)寄存器 </p><p> parameter s_add=2'b10;/
87、/狀態(tài)寄存器 </p><p> always@(posedge clock or negedge rst_l) </p><p> if(!rst_l) </p><p> wrd_add <= #1 8'b0; </p><p> else if(cs_l&&!rd_wr_l&&(ad
88、dr= =w_add)) </p><p> wrd_add <= #1 data; </p><p> always@(posedge clock or negedge rst_l) </p><p> if(!rst_l) </p><p> iic_go<= #1 1'b0; </p><
89、p> else if(cs_l&&!rd_wr_l&&(addr= =w_add)) </p><p> iic_go<= #1 1'b1;//iic總線(xiàn)的啟動(dòng)信號(hào) </p><p> else if(scl_cnt_en) </p><p> iic_go<= #1 1'b0; </p
90、><p><b> //反饋?lái)憫?yīng)信號(hào) </b></p><p> always@(posedge clock or negedge rst_l) </p><p> if(!rst_l) </p><p> ack_l<= #1 1'b1; </p><p> else if(
91、cs_l) </p><p> ack_l<= #1 1'b0; </p><p><b> else </b></p><p> ack_l<= #1 1'b1; </p><p> endmodule </p><p><b> 附錄3</
92、b></p><p><b> 發(fā)送寄存器程序</b></p><p> `timescale 1 ns/100 ps </p><p> module iic_rreg(wrd_add,iic_rdata,iic_rdy,iic_act,ack_err,addr,data_o); </p><p> in
93、put [7:0] wrd_add;//iic word address </p><p> input [7:0] iic_rdata;//iic read data </p><p> input iic_rdy;//iic status bit </p><p> input iic_act;//iic c
94、ycle active </p><p> input ack_err;//ack error </p><p> input [1:0] addr;//cpu address </p><p> output [7:0] data_o;//muxed cpu data output </p><p>&l
95、t;b> //寄存器型 </b></p><p> reg[7:0] data_o;//muxed cpu data output </p><p><b> //參數(shù) </b></p><p> Parameter w_add=2'b00;//字地址寄存器 </p>&l
96、t;p> parameter d_add=2'b01;//數(shù)據(jù)寄存器 </p><p> parameter s_add=2'b10;//狀態(tài)寄存器 </p><p><b> //數(shù)據(jù)多用輸出 </b></p><p> always@(addr or wrd_add or ack_err o
97、r iic_rdata or iic_rdy) </p><p> case(addr) </p><p> w_add::data_o<= #1 wrd_add; </p><p> d_add::data_o<= #1 iic_rdata; </p><p> s_add:data_o<= #1{iic_rdy,
98、ack_err,5'b0,iic_act}; </p><p> default:data_o<= #1{iic_rdy,ack_err,5'b0,iic_act}; </p><p><b> endcase </b></p><p> endmodule </p><p><b>
99、; 附錄4</b></p><p><b> 狀態(tài)機(jī)程序</b></p><p> `timescale 1 ns/100 ps </p><p> module iic_st(rst_l,clock,scl_tick,iic_go,wrd_add,sda_pin,sda,scl,scl_cnt_en,
100、 iic_rdy, iic_act, iic_rdata, ack_err); //端口列表 </p><p> input rst_l;//復(fù)位 </p><p> input clock;//系統(tǒng)時(shí)鐘 </p><p> input scl_tick;//scl的時(shí)鐘 </p><
101、p> input iic_go;//啟動(dòng)iic總線(xiàn)周期 </p><p> input [7:0] wrd_add;//iic器件地址 </p><p> input sda_pin;//iic數(shù)據(jù)多用輸入 </p><p> output sda;//iic總線(xiàn)數(shù)據(jù)輸出 </p><p> ou
102、tput scl;//iic總線(xiàn)時(shí)鐘輸出 </p><p> output scl_cnt_en;//總線(xiàn)計(jì)數(shù)使能端 </p><p> output iic_rdy;//總線(xiàn)準(zhǔn)備好 </p><p> output iic_act;//總線(xiàn)周期響應(yīng) </p><p> output [7:0] iic
103、_rdata;//總線(xiàn)上的數(shù)據(jù) </p><p> output ack_err;//響應(yīng)錯(cuò)誤 </p><p><b> //寄存器型 </b></p><p> reg sda; </p><p> reg scl; </p><p> reg
104、 scl_cnt_en; </p><p> reg iic_rdy; </p><p> reg [7:0] iic_rdata; </p><p> reg[14:0] iic_state; </p><p> reg [2:0] bit_cntr; </p><p> reg
105、 scl_en; </p><p> reg en_cntr; </p><p> reg cntr_done; </p><p> reg ack_err; </p><p> wire iic_act; </p><p><b> //參數(shù) </b&g
106、t;</p><p> parameter idle = 4'b0000; // state 0 </p><p> parameter en_clk = 4'b0001; // state 1 </p><p> parameter start1 = 4'b1100; // stat
107、e C </p><p> parameter dev_add1 = 4'b1000; // state 8 </p><p> parameter ack1 = 4'b0100; // state 4 </p><p> parameter w_add = 4'b1010; // st
108、ate A </p><p> parameter ack2 = 4'b0101; // state 5 </p><p> parameter wait1 = 4'b0011; // state 3 </p><p> parameter dis_clk1 = 4'b1111; //
109、state F </p><p> parameter start2 = 4'b1101; // state D </p><p> parameter dev_add2 = 4'b1001; // state 9 </p><p> parameter ack3 = 4'b0110; /
110、/ state 6 </p><p> parameter data = 4'b1011; // state B </p><p> parameter ack4 = 4'b0111; // state 7 </p><p> parameter stop1 = 4'b1110;
111、 // state E </p><p><b> //狀態(tài)機(jī) </b></p><p> always @(posedge clock or negedge rst_l) </p><p> if (!rst_l) </p><p> iic_state <= #1 idle; </p>
112、<p> else case(iic_state) </p><p> idle : if (iic_go) </p><p> iic_state <= #1 en_clk; </p><p> en_clk : if (scl_tick) </p><p> iic_state <= #1
113、 start1; </p><p> start1 : if (scl_tick) </p><p> iic_state <= #1 dev_add1; </p><p> dev_add1 : if (cntr_done && scl_tick) </p><p&g
114、t; iic_state <= #1 ack1; </p><p> ack1 : if (scl_tick && scl) </p><p> iic_state <= #1 w_add; </p><p> w_add : if (cntr_done && scl_tick)
115、 </p><p> iic_state <= #1 ack2; </p><p> ack2 : if (scl_tick && scl) </p><p> iic_state <= #1 dis_clk1; </p><p> dis_clk1 : if
116、 (scl_tick && scl) </p><p> iic_state <= #1 wait1; </p><p> wait1 : if (scl_tick) </p><p> iic_state <= #1 start2; </p><p> start2 : if (scl_t
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于fpga的i2c接口程序?qū)崿F(xiàn)課程設(shè)計(jì)
- i2c課程設(shè)計(jì)--基于arm的i2c接口設(shè)計(jì)
- 基于fpga的i2c串行總線(xiàn)接口電路設(shè)計(jì)
- arm課程設(shè)計(jì)--基于arm的i2c接口設(shè)計(jì)
- 用FPGA實(shí)現(xiàn)8051內(nèi)核及外設(shè)I2C接口擴(kuò)展的研究.pdf
- 嵌入式課程設(shè)計(jì)---i2c 總線(xiàn)接口設(shè)計(jì)
- 基于fpga的i2c實(shí)驗(yàn)verilog源代碼說(shuō)明書(shū)
- 基于dsp與cpld的i2c總線(xiàn)接口的設(shè)計(jì)與實(shí)現(xiàn)
- 基于fpga的液晶控制器接口課程設(shè)計(jì)
- WM8731的I2C配置模塊的FPGA設(shè)計(jì)_袁海林.pdf
- 基于fpga的數(shù)字時(shí)鐘課程設(shè)計(jì)
- 基于stm32f10的i2c接口通信設(shè)計(jì)【開(kāi)題報(bào)告】
- i2c芯片的驅(qū)動(dòng)程序
- 基于FPGA的UART接口設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于fpga的vga接口顯示設(shè)計(jì)與實(shí)現(xiàn)
- fpga課程設(shè)計(jì)---基于fpga多功能電子鐘設(shè)計(jì)
- 基于I2C總線(xiàn)接口的低功耗10bit ADC的設(shè)計(jì).pdf
- 基于FPGA的NVMe接口設(shè)計(jì).pdf
- 基于FPGA的PCI接口設(shè)計(jì).pdf
- 基于fpga的交通燈課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論