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