fpga那些事-04.驅動篇_第1頁
fpga那些事-04.驅動篇_第2頁
fpga那些事-04.驅動篇_第3頁
fpga那些事-04.驅動篇_第4頁
fpga那些事-04.驅動篇_第5頁
已閱讀5頁,還剩16頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

實驗十六:IIC模(24LC04 煩歸麻煩,筆者終究還要吃飯,為了肚子,再麻煩的事情也要硬著頭皮捱過去...這也16.1IICIIC16.1IIC總線與IIC設備常見的示意圖。理想上,一條IIC總線允許千萬IIC設備占據在上...物理下,一條IIC總監究竟允許多少IIC設備占據其中必須根據設備地址位,即[7..4]記錄硬件ID,接續三位即[3..1]則記錄硬件地址,最后一位則是設備的訪問方向。結果如表16.1所示:16.1設備地址的位分配硬件IDIICIDID會隨著廠商還有設備的種類而有所改變。開發板上的IIC設備是某廠商的IIC器,即24LC04,硬件ID為4’b1010。至于硬IIC3IICIIC總線上僅允許占據8個而已。然而,開發板上的24LC04為3’b000。最后的方向存器24LC04,設備地址就是8’b1010_000_×。圖16.224LC04的寫操作(主機視角(二)主機發送設備地址(寫所以設備地址的方向是“寫”,所以方向位設置為0。圖16.324LC04的讀操作(主機視角(二)主機發送設備地址(寫(六)主機發送設備地址(讀(八)主機數據(九)從機沒有應答(主機無視應答未進入正題之前,請允許筆者加入一些小插曲。IIC總線是一種低速的總線,不過IIC總線有100Khz還有400Khz兩種速率提供選擇,要么100Khz,要么400Khz,要么兩者兼施,不管哪一種《整合篇》都曾實驗過。在此,實驗十六會以400Khz的速率筆者曾面,IIC總線之所以麻煩,因為IIC總線有大小不同的時序參數(時間選擇無視時序參數...那么,打從一開始還是不學為好IIC的總線時序有各種各樣的方法,但是筆者會選擇表達能力更高,控制能力更細的描述。知道IIC的總線時序是由一塊又一塊的拼圖拼湊而成,當在建模的時候,會針對各個拼圖作出局部性的描述。期間,也必須考慮各種時序參數,如表16.2所示:16.2各種時序參數(50Mhz量化相關參標Cck----CckigTeTGH----CckLowe----Reie----llie----Startle----StartSetup----DataIulie0----DataIutSetup5----StopSetupT----Opirmlk----BusFreei----ClockFrequency,既是頻率也是速率,在此是400KhzClockHighTimeSCLClockLowTimeSCLStartHoldTime,既起始位所需最小的保StartSetupTime,既起始位所需最小的建立時間DataInputHoldTimeDataInputSetupTimeOuputValidFromClock,既數據位經時鐘沿觸發以后的有效時間BusFreeTime,既總線的最小時間表示SCL信號的頻率,ClockHighTime表示SCL信號保持高電平所需的最小時間,ClockLowTime則表示SCL信號保持低電平所需的最小的時間。至于RiseTime與FallTime表示,SCL信號還有SDA信號由高變低或者由低變高時所需的最小時間,即上山與下山時間。HoldTime與SetupTime是用來評估數據是否成功打入寄存器的時序參數,算是典型中的典型。SetupTime表示建立時間,即數據寫入寄存器之前所需的穩定時間;反之,HoldTime則是保持時間,即數據打入寄存器之StartIIC總線的起始位,StopIIC總線的結束位,DataIIC總線的數據位,為了確保三者成功寫入從機,SetupTime與HoldTime必須得到滿足。OuputValidFromClock是關系數據位的時序參數,還有BusFreeTime是關系結束位的時序參數,在此先丟胃口一下。此外,為了簡化時序,筆者將各種參數的實際時間轉換為50Mhz量化以后的結果。對此,Verilog可以這樣表示,結果如代碼16.1所示:aaeFCLK=1d5,FHALF=1'2,FQUARTER=';araerHIH='0,TLOW=1d,TR=0d,TF=01;aaerTHD_STA=1'0,TSU_STA=1d0,TSU_STO=d;如代碼16.1所示,FCLK表示400Khz的周期,FHALF表示1/2周期,FQUARTER表1/4周期。至于為什么代碼16.1不見,DataInputHoldTime與BusFreeTime的時序(話題繼續之前,請讀者確保自己對“整合時序”有一定的理解,不然的話...接下來的內容,讀者一定會看到淚流滿面。圖16.4起始位起始位的物理時序。IICPS/2等傳輸協議的起始位,然而不同的是,IIC總線的起始位是SCL拉高TR+TSU_STA+THD_STA+TF之久,換之SDA則是拉高TRTHIGH然后拉低TF+TLOW。起始位總和所用掉的時間,恰恰好有一個速率的周期。對此,Verilog則可以這樣描述,結果如代碼16.2所示:ii=;rSCL<=11;if(C1==0)rSDA<=';eeif(C1==(TR+TG)rSDA<=';if(C1==(FCLK)-1)biC1<=';i<=i+'b;endeeC1<=C1+1'1;如代碼16.2所示,第2行的isQ=1表示設置SDA為輸出狀態(即時結果3行則表示SCL一直持續拉高狀態,第4~5行表示C1為0的時候SDA拉高,直到C1為TR+THIGH才拉低SDA。第6~7行表示一個步驟所逗留的時間。16.5結束16.5是結束位的時序圖,IIC設備的操作好壞一般都取決結束位。保險起見,SCL與SDA都事先拉低1/4周期,緊接著SCL會拉高TR+TSU_STO(或者1/2周期,最后又保持高電平1/2周期。反之,SDA會拉低1/2周期,隨之拉高TR+THIGH(或者1/2周期。對此,Verilog可以這樣表示,結果如代碼16.3所示:iiQ='b;if(C1==0)rSCL<=';seif(C1==FQUARTER)rSCL<='1;if(C1==0)rSDA<='0eeif(C1==FATER+TR+S_O)rSDA<=bif(C1==(FQUARTER+FCLK)-1)bgC1<=00i<=i+';eseC1<=C1+如代碼16.3所示,第2行表示SDA為輸出狀態(即時,第3~4行表示C1為0SCL,C11/45~6行表示,C10拉低SDA,C1為1/4周期TRTSU_STO就拉高SDA。第7~8圖16.6總線此外,結束位還有BusFreeTme這個時序參數,IIC總線在閑置的狀態下SCL與SDA等信號都持續高電平。主機發送結束位以示結束操作,然而主機持續拉高SCL信號與SDA信號TBUF以示總線。TBUF的有效時間從SCL信號與SDA信號拉高那一刻16.2所示,TBUF65個時鐘,結果如圖16.6所示,SDA信號拉高之后,SCL與SDA信號只要持續保持1/2周期(即62個時,基本上就能滿足TBUF。如果筆者是一位緊密控時狂人,可能無法接受這樣的結果,因為滿足TBUF少了3個時鐘,為此代碼16.3需要更動一下:if(C1==(FQUARTER+FCLK+3)-1)egnC1<=0d;i<=i+'b;eeC1<=C1+16.7數據位。IIC總線類似其他傳輸協議,它有時鐘信號也有上升沿與下降沿。如圖16.7所示,SCL信號的下降沿導致設備設置(更新)數據,上升沿則是鎖存()數據。期間,TF+TLOW表示時鐘信號的前半周期,TR+THIGH則表示后半周期。此外,為了確保數據成功打入寄存器,數據被上升沿鎖存哪一刻起,TSU_DAT還有THD_DAT必須得16.8數據位更新有效除此之外,為了確保數據有效被更新,也必須確保TAA得到滿足,結果如圖16.816.9寫一字節IIC總線一般都是一個字節一個字節讀寫數據,如圖16.9所示,那是寫一字節的理想 4,,:isQ=';rSDA<=[7-if(C1==0)rSCL<=';leif(C1==(TF+W))rSCL<='if(C1==FCLK-1)biC1<='0;i<=i+'b;leC1<=C1+'如代碼16.5所示,第1行有8個步驟,表示寫一個字節。第3isQ1SDA為輸出狀態。第4行表示從最開始更新SDA的數據位。第5~6行表示,C1為0拉低SCL,C1為TF+TLOW則拉高SCL。第7~8行表示該步驟逗留一個周期的時間。16.10應答位應答位是從機給予主機的回答,0為是1為否。然而,從旁,應答位也如圖16.10所示,上升沿會產生在TFTLOW之后,也是1/2周期。對此,Verilog可以這樣表示,結果如代碼16.6所示:isQ=';if(C1==FHALF)ic<=A;if(C1==0)rSCL<=b;eeif(C1==FHALF)rSCL<=';if(C1==FCLK-1)egnC1<=1d;i<=i+11;eeC1<=C1+1; 如代碼16.6所示,第2行表示SDA為輸入狀態。第4~5行表示,C1為0拉低SCL,C1為1/2周期則拉高SCL。第3行表示,C1為1/2周期的時候應答位。第6~7行表示該步驟逗留1個周期的時間。16.11讀一字節所謂讀一字節數據就是重復8次應答位。如圖16.11所示,SCL的下降沿導致從機至于Verilog則可以這樣表示,結果如代碼16.7所示:,,,isQ=';if(C1==FHALF)[7i]<=A;if(C1==0)rSCL<='0;leif(C1==FHALF)rSCL<=bif(C1==FCLK-1)biC1<='0;i<=i+'b;leC1<=C1+'如代碼16.7所示,第1行表示一字節。第3行表示SDA為輸入狀態,第5~6行表示,C10拉低SCL,C11/2周期則拉高SCL。第4行表示,C11/2周期的時候數據,而且數據位由高至低存入D1。第7~8行表示該步驟逗留一個周期的時間。16.12第二次起始位16.12所示,感覺上第二次起始位也是第一次起始位,不過為了促使改以這樣表示,結果如代碼16.8所示:isQ=';if(C1==0)rSCL<=';eeif(C1==FQUARTER)rSCL<=';s(ATb;if(C1==0)rSDA<=';eleif(C1==FQUARTER)rSDA<=';eleif(C1==(FQUARTER+TR+I))rSDA<=';if(C1==QUA+FCLK+FUAT-1)enC1<=1';i<=i+11leC1<=C1+'如代碼16.8所示,第2行表示SDA為輸出狀態。第3~5行表示,C1為0拉低SCL,C1為1/4周期拉高SCL,C1為1/4周期+TR+TSU_STA+THD_STA+TF便拉低SCL。第7~9行表示,C10SDA,C11/4SDA,C11/4周期TRTHIGH便拉低SDA11~1216.13實驗十六的建模圖圖16.13是實驗十六的建模圖,組合模塊iic_demo內容包含IIC模塊,操作還有SMG基礎模塊。首先操作會將數據純如IIC模塊,然后又從中,完后再將讀出的數據驅動SMG基礎模塊。圖16.14IIC模塊的建模圖圖16.14是IIC模塊的建模圖,左邊是頂層信號,右邊則是溝通用的問答信號,寫入地址iAddr,寫入數據iData,還有讀出數據oDall/Done有兩位,即表示該模塊modulemodule(inputCLOCK,outputinoutinputoutputinputinputoutput parameterFCLK=10'd125,FHALF=10'd62,FQUARTER=10'd31;//(1/400E+3)/(1/50E+6)parameterTHIGH=10'd30,TLOW=10'd65,TR=10'd15,TF=10'd15;parameterTHD_STA=10'd30,TSU_STA=10'd30,TSU_STO=parameterFF_Write1=parameterFF_Write2=5'd9,RDFUNC=以上內容為相關的速率還有時序參數。第15~16行則是相關的偽函數regregregregregalways@(posedgeCLOCKornegedgeRESETif(!RESET{i,Go}<={5'd0,5'd0C1<=D1<=elseif(iCall[1]case(iisQ=rSCL<=if(C1==0)rSDA<=elseif(C1==(TR+THIGH))rSDA<=if(C1==(FCLK)-1)beginC1<=10'd0;i<=i+1'b1;endelseC1<=C1+1'b1;以上內容為部分操作。第33行的iCall[1]為使能寫操作。步驟0用來產生起始位1://WriteDevicebeginD1<={4'b1010,3'b000,1'b0};i<=5'd7;Go<=i+1'b1;beginD1<=iAddr;i<=FF_Write1;Go<=i+1'b1;3://WritebeginD1<=iData;i<=FF_Write1;Go<=i+1'b1;34://StopisQ=if(C1==0)rSCL<=elseif(C1==FQUARTER)rSCL<=if(C1==0)rSDA<=elseif(C1==(FQUARTER+TR+TSU_STO))rSDA<=if(C1==(FQUARTER+FCLK)-1)beginC1<=10'd0;i<=i+1'b1;elseC1<=C1+以上內容為部分操作。步驟4用來產生結束位beginisDone<=1'b1;i<=i+1'b1;beginisDone<=1'b0;i<=5'd0;以上內容為部分操作。步驟5~6用來產生完成信號isQ=rSDA<=D1[14-if(C1==0)rSCL<=elseif(C1==(TF+TLOW))rSCL<=if(C1==FCLK-1)beginC1<=10'd0;i<=i+1'b1;endelseC1<=C1+1'b1;以上內容為部分操作。步驟7~14是寫一個字節的偽函數15://waitingforacknowledgeisQ=if(C1==FHALF)isAck<=if(C1==0)rSCL<=elseif(C1==FHALF)rSCL<=if(C1==FCLK-1)beginC1<=10'd0;i<=i+1'b1;endelseC1<=C1+1'b1;if(isAck!=0)i<=5'd0;elsei<=Go;elseif(iCall[0]case(i0://isQ=rSCL<=if(C1==0)rSDA<=elseif(C1==(TR+THIGH))rSDA<=if(C1==FCLK-1)beginC1<=10'd0;i<=i+1'b1;endelseC1<=C1+1'b1;1://WriteDevicebeginD1<={4'b1010,3'b000,1'b0};i<=5'd9;Go<=i+1'b1;beginD1<=iAddr;i<=FF_Write2;Go<=i+1'b1;3://StartagainisQ=if(C1==0)rSCL<=elseif(C1==FQUARTER)rSCL<=elseif(C1==(FQUARTER+TR+TSU_STA+THD_STA+)rSCL<=if(C1==0)rSDA<=elseif(C1==FQUARTER)rSDA<=elseif(C1==(FQUARTER+TR+THIGH))rSDA<=if(C1==(FQUARTER+FCLK+FQUARTER)-1)beginC1<=10'd0;i<=i+1'b1;elseC1<=C1+34://WriteDeviceAddr(ReadbeginD1<={4'b1010,3'b000,1'b1};i<=5'd9;Go<=i+1'b1;5://ReadbeginD1<=8'd0;i<=RDFUNC;Go<=i+1'b1;6://StopisQ=if(C1==0)rSCL<=elseif(C1==FQUARTER)rSCL<=if(C1==0)rSDA<=elseif(C1==(FQUARTER+TR+TSU_STO))rSDA<=if(C1==(FCLK+FQUARTER)-1)beginC1<=10'd0;i<=i+1'b1;elseC1<=C1+beginisDone<=1'b1;i<=i+1'b1;beginisDone<=1'b0;i<=5'd0;以上內容為部分操作。步驟4用來寫入設備地址(讀,并且調用偽函數。步驟5用來一個字節,并且調用偽函數。步驟6用來產生結束位。步驟7~8則用來產生完isQ=rSDA<=D1[16-if(C1==0)rSCL<=elseif(C1==(TF+TLOW))rSCL<=if(C1==FCLK-1)beginC1<=10'd0;i<=i+1'b1;endelseC1<=C1+1'b1;以上內容為部分操作。步驟9~16是用來寫一字節的偽函數17://waitingforacknowledgeisQ=if(C1==FHALF)isAck<=if(C1==0)rSCL<=elseif(C1==FHALF)rSCL<=if(C1==FCLK-1)beginC1<=10'd0;i<=i+1'b1;endelseC1<=C1+1'b1;if(isAck!=0)i<=5'd0;elsei<=Go;以上內容為部分操作。步驟17用來應答位,步驟18則用來判斷應答位isQ=if(C1==FHALF)D1[26-i]<=if(C1==0)rSCL<=elseif(C1==FHALF)rSCL<=if(C1==FCLK-1)beginC1<=10'd0;i<=i+1'b1;endelseC1<=C1+1'b1;以上內容為部分操作。步驟19~26是一字節的偽函數27://noacknowledgeisQ=//if(C1==100)isAck<=if(C1==0)rSCL<=elseif(C1==FHALF)rSCL<=if(C1==FCLK-1)beginC1<=10'd0;i<=Go;elseC1<=C1+以上內容為部分操作。步驟27用來無視應答位assignSCL=assignSDA=isQ?rSDA:1'bz;assignoDone=isDone;assignoData=247.(inputCLOCK,outputinoutoutputoutput wire.oDone(DoneU1//>.iAddr(D1//<.iData(D2//< .oData(DataU1//>wirewire.RESET(RESET.SCL(SCL.SDA(SDA//>//<>.iCall(isCall//<smg_basemod(.CLOCK(CLOCK.RESET(RESET.DIG(DIG//>.SEL(SEL//>.iData(D3//<regregregregalways@(posedgeCLOCKornegedgeRESET//if(!RESETi<={D1,D2}<={8'd0,8'd0D3<=isCall<=case(iif(DoneU1)beginisCall<=2'b00;i<=i+1'b1;elsebeginisCall<=2'b10;D1<=8'd0;D2<=8'hAB;if(DoneU1)beginisCall<=2'b00;i<=i+1'b1;elsebeginisCall<=2'b10;D1<=8'd1;D2<=8'hCD;if(DoneU1)beginisCall<=2'b00;i<=i+1'b1;elsebeginisCall<=2'b10;D1<=8'd2;D2<=8'hEF;if(DoneU1)beginD3[23:16]<=DataU1;isCall<=2'b00;i<=i+1'b1;elsebeginisCall<=2'b01;D1<=8'd0;if(DoneU1)beginD3[15:8]<=DataU1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論