




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
課程設計課程名稱—電子技術綜合設計與實訓題目名稱基于VHDL的串行同步通信SPI設計學生學院—自動化 專業(yè)班級—電子信息科學與技術學 號_3107001554 學生姓名____陳振添 指導教師____蔡述庭 2009年12月21日廣東工業(yè)大學課程設計任務書題目名稱基于VHDL的串行同步通信SPI設計學生學院自動化專業(yè)班級電子信息科學與技術姓名陳振添學號3107001554一、課程設計的內容設計一個同步串行通訊SPI二、課程設計的要求與數據設計要求包括:深入了解串行通信的方案內容和協議,思考設計方法2?設計串行通信方案,并寫好傳輸程序VHDL。3?下載到DE2板調試,檢測其可行性。三、課程設計應完成的工作利用VHDL語言編程實現SPI;利用DE2板對所設計的思想進行驗證;總結VHDL設計結果,撰寫課程設計報告。
四、課程設計進程安排序號設計各階段內容地點起止日期1任務的確定-spi實驗2號樓21412.142查找資料實驗2號樓30712.153編寫SPI的各個模塊VHDL程序實驗2號樓21612.164仿真,分配管腳實驗2號樓21412.175驗證修改驗收實驗2號樓21412.186整理說明書,報告實驗樓12.19五、應收集的資料及主要參考文獻PIC單片機原理及應用(第3版)北京航天航空大學出版社黃智偉,王彥?FPGA系統(tǒng)設計與實踐[M]?北京:電子工業(yè)出版社,2005發(fā)出任務書日期:年月日指導教師簽名:計劃完成日期:年月日基層教學單位責任人簽章主管院長簽章:摘要本設計是用Quartus作為開發(fā)環(huán)境,以DE2板為硬件平臺實現的SPI同步串行通訊。設計過程方便。根據接收和發(fā)送兩個主要部分實現了SPI的基本功能。此外,該設計還實現了波特率發(fā)生器,數碼管顯示的功能。用DE2板實現具有電路簡潔,開發(fā)周期短的優(yōu)點。充分利用了EDA設計的優(yōu)點。開發(fā)過程用了VHDL硬件描述語言進行描述,從底層設計,分模塊進行,充分提高了設計者的數字邏輯設計的概念。關鍵詞:SPI,同步串行通訊,Quartus,DE2板,VHDL硬件描述語言。目錄TOC\o"1-5"\h\z\o"CurrentDocument"1引言 6\o"CurrentDocument"2SPI簡介 6\o"CurrentDocument"2.1SPI協議和工作原理 6\o"CurrentDocument"2.2波特率 7\o"CurrentDocument"3模塊設計 7\o"CurrentDocument"3.1頂層模塊RTL綜合 7\o"CurrentDocument"3.2波特率發(fā)生器模塊 9\o"CurrentDocument"3.3SDO數據發(fā)送模塊 10\o"CurrentDocument"3.4SDI數據接收模塊 113.5數碼管顯示模塊 12\o"CurrentDocument"4實驗驗證 13\o"CurrentDocument"實驗驗證方案選擇 13實驗現象 13\o"CurrentDocument"5結論與問題討論 13\o"CurrentDocument"完成設計要求的程度 13\o"CurrentDocument"遇到的問題及解決方法 14\o"CurrentDocument"存在的不足及改進思路 14心得體會 14\o"CurrentDocument"參考文獻 151引言串行擴展通信接口是器件間進行數據交換的平臺和重要渠道。主控同步串行通信模塊主要應用于系統(tǒng)內部近距離的串行通訊,如SPI,「C等。SPI是英文SerialPeripheralInterface的縮寫,中文意思是串行外圍設備接口,SPI是Motorola公司推出的一種同步串行通訊方式,是一種三線同步總線,因其硬件功能很強,與SPI有關的軟件就相當簡單,使CPU有更多的時間處理其他事務。SPI簡介2?1SPI協議和工作原理顧名思義,串行接口的數據傳輸方式是串行的,即數據是一位一位地進行傳輸雖然串行接口的傳輸方式導致其傳輸速度會比較慢,但是它卻具有較強的抗干擾能力,并能有較長的傳輸距離,RS232口的最大傳輸距離為15m。SPI接口主要應用在EEPROM,FLASH,實時時鐘,AD轉換器,還有數字信號處理器和數字信號解碼器之間。SPI,是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時為PCB的布局上節(jié)省空間,提供方便,正是出于這種簡單易用的特性,現在越來越多的芯片集成了這種通信協議,比如AT91RM9200.SPI的通信原理很簡單,它以主從方式工作,這種模式通常有一個主設備和一個或多個從設備,需要至少4根線,事實上3根也可以(單向傳輸時)。也是所有基于SPI的設備共有的,它們是SDI(數據輸入),SDO(數據輸出),SCK(時鐘),CS(片選)。(1) SDO-主設備數據輸出,從設備數據輸入(2) SDI-主設備數據輸入,從設備數據輸出(3) SCLK-時鐘信號,由主設備產生(4)CS-從設備使能信號,由主設備控制其中CS是控制芯片是否被選中的,也就是說只有片選信號為預先規(guī)定的使能信號時(高電位或低電位),對此芯片的操作才有效。這就允許在同一總線上連接多個SPI設備成為可能。接下來就負責通訊的3根線了。通訊是通過數據交換完成的,這里先要知道SPI是串行通訊協議,也就是說數據是一位一位的傳輸的。這就是SCK時鐘線存在的原因,由SCK提供時鐘脈沖,SDI,SDO則基于此脈沖完成數據傳輸。數據輸出通過SDO線,數據在時鐘上升沿或下降沿時改變,在緊接著的下降沿或上升沿被讀取。完成一位數據傳輸,輸入也使用同樣原理。這樣,在至少8次時鐘信號的改變(上沿和下沿為一次),就可以完成8位數據的傳輸。SPI是一個環(huán)形總線結構,由ss(cs)、sck、sdi、sdo構成,其時序其實很簡單,主要是在sck的控制下,兩個雙向移位寄存器進行數據交換。假設下面的8位寄存器裝的是待發(fā)送的數據10101010,上升沿發(fā)送、下降沿接收、高位先發(fā)送。那么第一個上升沿來的時候數據將會是sdo=l;寄存器中的10101010左移一位,后面補入送來的一位未知數x,成了0101010x。下降沿到來的時候,sdi上的電平將鎖存到寄存器中去,那么這時寄存器=0101010sdi,這樣在8個時鐘脈沖以后,兩個寄存器的內容互相交換一次。這樣就完成里一個spi時序。2.2波特率這是一個衡量通信速度的參數。它表示每秒鐘傳送的bit的個數。例如300波特表示每秒鐘發(fā)送300個bit。當我們提到時鐘周期時,我們就是指波特率例如如果協議需要4800波特率,那么時鐘是4800Hz。這意味著串口通信在數據線上的采樣率為4800Hz。通常電話線的波特率為14400,28800和36600。波特率可以遠遠大于這些值,但是波特率和距離成反比。串行口每秒發(fā)送或接收數據的碼元數為傳碼,單位為波特,也叫波特率。若發(fā)送或接收一位數據所需時間為T,則波特率為1/T,相應的發(fā)送或接收時鐘為1/THz。發(fā)送和接收設備的波特率應一致。位同步是實現收發(fā)雙方的碼元同步,由數據傳輸系統(tǒng)的同步控制電路實現。發(fā)送端由發(fā)送時鐘的定時脈沖對數據序列取樣再生,接收端由接收時鐘的定時脈沖對接收數據序列取樣判斷,恢復原來的數據序列。因此,接收時鐘和發(fā)送時鐘必須同頻同相,這是由接收端的定時提取和鎖相環(huán)電路實現的。傳碼率與位同步必須同時滿足。否則,接收設備接收不到有效信息。模塊設計3?1頂層模塊RTL綜合頂層文件設計,將波特率發(fā)生模塊,數據發(fā)送模塊,數據接收模塊,和數碼顯示模塊通過例化語句組合成總的頂層模塊。其中數據發(fā)送模塊為并行輸入串行輸出模塊,在時鐘的上升沿發(fā)送一位數據,共需要8個時鐘脈沖即可發(fā)送完一字節(jié)數據。數據接收模塊為串行輸入并行輸出模塊,串行輸入的數據來自數據發(fā)送模塊,在時鐘的上升沿接收數據,即由“自己發(fā)送的數據自己同步接收”來模擬主從器件間數據的全雙工傳輸。數碼管顯示模塊則是循環(huán)顯示0~8數字,每循環(huán)一次代表傳輸完一字節(jié)。以下是頂層模塊VHDL源程序:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityspiisport(clk,stop,load:instd_logic;data_in:std_logic_vector(7downto0);deng_out:outstd_logic_vector(7downto0);shuma_out:outstd_logic_vector(6downto0));endspi;architectureoneofspiiscomponentsdiport(clk_sdi:instd」ogic;sdi_in:instd_logic;load:instd_logic;shuma:outintegerrange0to8;sdi_out:outstd」ogic_vector(7downto0));endcomponent;componentsdoport(clk_sdo,load:instd_logic;sdo_in:instd_logic_vector(7downto0);sdo_out:outstd」ogic);endcomponent;componentSHUMGport(num:inINTEGERRANGE0TO8;dout:outstd」ogic_vector(6downto0));endcomponent;componentfenpinport(clk,stop:instd_logic;clok:outstd_logic);endcomponent;signalA,B:std_logic;signalC:INTEGERrange0to8;beginu1:sdiportmap(sdi_out=>deng_out,clk_sdi=>A,sdi_in=>B,shuma=>C,load=>load);u2:sdoportmap(sdo_out=>B,sdo_in=>data_in,load=>load,clk_sdo=>A);u3:SHUMGportmap(dout=>shuma_out,num=>C);u4:fenpinportmap(clk=>clk,stop=>stop,clok=>A);endone;綜合后為:
3?2波特率發(fā)生器模塊由于SPI同步串行通訊的缺點是波特率不高,通常常用的SPI波特率有2400,4800,9600,19200等比較低的波特率,晶振的頻率一般都比較高,需要分頻后才能供給SPI使用。假設采用6MHZ的晶振作為外部時鐘,那么要產生9600波特率的時鐘信號,則需要對6MHZ的時鐘進行625分頻。除此之外,為了提高接收電路接收數據的準確度,采取“過采樣法”對發(fā)送來的同一個數據進行多次采樣,這里對數據進行三次采樣取平均值。輸入6MHz的時鐘,經過計數分頻后得到9600Hz的接收時鐘信號和脈沖出現的頻率是波特率的3倍的采樣時鐘信號。下面是實現該功能的VHDL程序:libraryieee;useieee.std_logic_1164.all;entityfenpinisport(clk,stop:instd_logic;clok,clk3:outstd_logic);endfenpin;architectureoneoffenpinisbeginprocess(clk)variablecounter:integerrange0to625;beginifstop='1'thenifclk'eventandclk='1'thenifcounter=625thencounter:=0;clokv=T;elsecounter:=counter+1;clok<='0';endif;endif;if(counter=106orcounter=313orcounter=520)thenclk3<='1';elseclk3<='0';endif;endif;endprocess;endone;N=iinsValueat10.03ns_^0elkA0stQpA1cl-itA0clk3A0其中,clk為6MHz的時鐘;clok為9600Hz的接收時鐘;clk3為脈沖出現的頻率是波特率的3倍的采樣時鐘。
3?3SDO數據發(fā)送模塊發(fā)送電路是在時序脈沖的控制下,利用移位寄存器并行輸入串行輸出的把數據一位一位的送出去。VHDL源程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitysdoisport(clk_sdo,load:instd_logic;sdo_in:instd_logic_vector(7downto0);sdo_out:outstd_logic);endsdo;architectureoneofsdoissignalbuff:std_logic_vector(7downto0);beginprocess(clk_sdo)beginifclk_sdo'eventandclk_sdo=Tthenifload='Tthenbuff<=sdo_in;elsebuff(7downto1)<=buff(6downto0);endif;endif;sdo_out<=buff(7);endprocess;endone;—1.aa.d日--E.i0_lT—1.aa.d日--E.i0_lTL[f]-3do_in[B]/5-Edo_in[5]-呂山:j_in[U]/8-sdo_in[2]-sdo_ijL[l]10-E II[ID]anEdijuTLt和010101010 clk_Edo其中,sdo_in:instd_logic_vector(7downto0);為并行輸入端口8位數據,clk_sdo為輸入端口發(fā)送時鐘;sdo_out:outstd_logic為輸出串行端口;當load=‘1'則把待發(fā)送的數據送入數據緩沖區(qū)BUFF,然后根據時鐘的上升沿的到來把數據一位一位的從緩沖器送給串行輸出。如圖所示,第一次裝載待發(fā)送數據10101010,第二次裝載待發(fā)送數據01010101于緩沖區(qū),共2字節(jié)數據,從仿真圖上可以看到,串行輸出分貝輸出了2字節(jié)數據:10101010,3?4SDI數據接收模塊接收電路的功能是在時鐘控制下,采樣串行輸入端口上的數據,執(zhí)行采樣判斷,檢測幀同步標志,把后續(xù)數據依次送達對應的并行輸出端口上。下面是實現上述功能的VHDL源程序:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitysdiisport(clk_sdi:instd_logic;sdi_in:instd_logic;shuma:outintegerrange0to8;sdi_out:outstd_logic_vector(7downto0));endsdi;architectureoneofsdiissignalbuff:std_logic_vector(7downto0);beginprocess(clk_sdi)variablecout:integerrange0to8;beginifclk_sdi'eventandclk_sdi='1'thenifcout=8thencout:=0;sdi_out<=buff;elsebuff(7-cout)v=sdi_in;cout:=cout+1;endif;endif;shuma<=cout;endprocess;endone;數據一位一位的接收,接收一位就把它存放于接收緩沖寄存器,等待緩沖器滿后就并行輸出數據由程序讀取。如仿真圖所示,串行傳來的兩字節(jié)數據10101010和01010101,數碼管循環(huán)顯示從0~8,當顯示8時代表緩沖器滿,并串行輸出數據,SDI_OUT為串行輸出的數據。I_^0I_^0clk_zdisdL_in02日EdL_DUt■_Z3-sdi_ijTLt[7]-5iii_i:iTLt[6]妙5-5iii_i:iTLt[5]■/6-sdi_i:iTlt[4]妙丁-sdi_i:iTlt[3]■/8-Edi_out[2]■_/9-Eili_i:iTit[1]11-cdi[□]C^ll0sh?arJinrLrwLTrLTrLrLruLruuuwjLrjLrLrLrmruTn::::::1(0]IK [HO]!^|[:::ir !! !!!h■/■I i/Tl1 1-ii11111 ill i ! Iiii 11 ill 1 1 IIII I1 II IIII 11i 1 1 1 1 i IIIIII 1 1' J !1 1 1 1 1 1 1 1 1 III I 1 1 111ii11111 IIII IIII 11 IIII IIII I1 IIII IIII 1IIII1IIIIIII1■iiii■II1I11IIII1I1I1111111IIII1I111—ii11111 IIII IIII 11 IIII IIII 11 1 1 1 S i BillI ■ 1 1 1 1 IIII 1 I 1 I 1I ■ 1 1 1 1 IIII 1 I 1 I 1—1 1 1 1 11 1 1 1 11 1 1 1 1—1 IIII IIII 11 IIII IIII 11 IIII IIII II I 1 I 1 1 IIII 1 I 1 I 11 1 1 1 1 1 IIII 1 I 1 1 11 1 1 1 1 1 1 Illi Illi 11 1 1 1 1 1 1 Illi Illi 1I ■ 1 1 1 1 IIII 1 I 1 I 11 1 1 1 1 1 IIII 1 I 1 1 1111111111111111111 IIII IIII 11 IIII IIII I1 IIII IIII I IIII 1 III II II 1III 1 1 1 i IIII 1 1 1 1 1J!i i i i i i s i I 4 -~ r i 1i i i i i iiii iiii ii i i i i iiii iiii i—4 ■ > i 1 1 1 I D 1 Dili 1 I 1 i 01 1 1 1 1 1 IIII 1 I 1 1 1I ■ 1 1 1 1 IIII 1 I 1 I 1—i i i i i iiii iiii ii i i i i iiii iiii iill I I n I Dili I I I I I13.5數碼管顯示模塊libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitySHUMGisport(num:inINTEGERRANGE0TO8;dout:outstd_logic_vector(6downto0));endSHUMG;architecturea1ofSHUMGisbeginwithnumselectdout<="1111110"when0,"0110000"when1,"1101101"when2,"1111001"when3,"0110011"when4,"1011011"when5,"1011111"when6,"1110000"when7,"1111111"when8,"0000000"whenothers;enda1;數碼管顯示模塊用來方便表示出數據傳輸的過程,從0~8循環(huán)顯示,8代表數據傳輸完畢準備傳送或接收下一字節(jié)數據。實驗驗證4.1實驗驗證方案選擇由于要在DE2板上驗證SPI有一定難度。我們的方案一就是利用串口調試助手,PC機作為從器件,目標板做為主器件進行SPI通訊。我們的方案二是完全在DE2板上模擬主從同步串行通訊,但是由于考慮到DE2板上可以用的驗證設備(開關和LED燈)不夠,所以我們決定在DE2版上對所設計的SPI模塊進行調整,自己發(fā)送的數據自己接收,模擬實現了主從之間通過不串行通訊。在這里我們采用的是方案2,優(yōu)點是易于實現。我們把SDO發(fā)送數據模塊直接接到了SDI數據接收模塊,因此我們只要驗證:通過發(fā)送以自己數據,待8個時序脈沖后數據發(fā)送完的同時也被接收,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論