fpga那些事-04.驅(qū)動篇_第1頁
fpga那些事-04.驅(qū)動篇_第2頁
fpga那些事-04.驅(qū)動篇_第3頁
fpga那些事-04.驅(qū)動篇_第4頁
fpga那些事-04.驅(qū)動篇_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余16頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

實(shí)驗(yàn)十六:IIC模(24LC04 煩歸麻煩,筆者終究還要吃飯,為了肚子,再麻煩的事情也要硬著頭皮捱過去...這也16.1IICIIC16.1IIC總線與IIC設(shè)備常見的示意圖。理想上,一條IIC總線允許千萬IIC設(shè)備占據(jù)在上...物理下,一條IIC總監(jiān)究竟允許多少IIC設(shè)備占據(jù)其中必須根據(jù)設(shè)備地址位,即[7..4]記錄硬件ID,接續(xù)三位即[3..1]則記錄硬件地址,最后一位則是設(shè)備的訪問方向。結(jié)果如表16.1所示:16.1設(shè)備地址的位分配硬件IDIICIDID會隨著廠商還有設(shè)備的種類而有所改變。開發(fā)板上的IIC設(shè)備是某廠商的IIC器,即24LC04,硬件ID為4’b1010。至于硬IIC3IICIIC總線上僅允許占據(jù)8個而已。然而,開發(fā)板上的24LC04為3’b000。最后的方向存器24LC04,設(shè)備地址就是8’b1010_000_×。圖16.224LC04的寫操作(主機(jī)視角(二)主機(jī)發(fā)送設(shè)備地址(寫所以設(shè)備地址的方向是“寫”,所以方向位設(shè)置為0。圖16.324LC04的讀操作(主機(jī)視角(二)主機(jī)發(fā)送設(shè)備地址(寫(六)主機(jī)發(fā)送設(shè)備地址(讀(八)主機(jī)數(shù)據(jù)(九)從機(jī)沒有應(yīng)答(主機(jī)無視應(yīng)答未進(jìn)入正題之前,請?jiān)试S筆者加入一些小插曲。IIC總線是一種低速的總線,不過IIC總線有100Khz還有400Khz兩種速率提供選擇,要么100Khz,要么400Khz,要么兩者兼施,不管哪一種《整合篇》都曾實(shí)驗(yàn)過。在此,實(shí)驗(yàn)十六會以400Khz的速率筆者曾面,IIC總線之所以麻煩,因?yàn)镮IC總線有大小不同的時序參數(shù)(時間選擇無視時序參數(shù)...那么,打從一開始還是不學(xué)為好IIC的總線時序有各種各樣的方法,但是筆者會選擇表達(dá)能力更高,控制能力更細(xì)的描述。知道IIC的總線時序是由一塊又一塊的拼圖拼湊而成,當(dāng)在建模的時候,會針對各個拼圖作出局部性的描述。期間,也必須考慮各種時序參數(shù),如表16.2所示:16.2各種時序參數(shù)(50Mhz量化相關(guān)參標(biāo)Cck----CckigTeTGH----CckLowe----Reie----llie----Startle----StartSetup----DataIulie0----DataIutSetup5----StopSetupT----Opirmlk----BusFreei----ClockFrequency,既是頻率也是速率,在此是400KhzClockHighTimeSCLClockLowTimeSCLStartHoldTime,既起始位所需最小的保StartSetupTime,既起始位所需最小的建立時間DataInputHoldTimeDataInputSetupTimeOuputValidFromClock,既數(shù)據(jù)位經(jīng)時鐘沿觸發(fā)以后的有效時間BusFreeTime,既總線的最小時間表示SCL信號的頻率,ClockHighTime表示SCL信號保持高電平所需的最小時間,ClockLowTime則表示SCL信號保持低電平所需的最小的時間。至于RiseTime與FallTime表示,SCL信號還有SDA信號由高變低或者由低變高時所需的最小時間,即上山與下山時間。HoldTime與SetupTime是用來評估數(shù)據(jù)是否成功打入寄存器的時序參數(shù),算是典型中的典型。SetupTime表示建立時間,即數(shù)據(jù)寫入寄存器之前所需的穩(wěn)定時間;反之,HoldTime則是保持時間,即數(shù)據(jù)打入寄存器之StartIIC總線的起始位,StopIIC總線的結(jié)束位,DataIIC總線的數(shù)據(jù)位,為了確保三者成功寫入從機(jī),SetupTime與HoldTime必須得到滿足。OuputValidFromClock是關(guān)系數(shù)據(jù)位的時序參數(shù),還有BusFreeTime是關(guān)系結(jié)束位的時序參數(shù),在此先丟胃口一下。此外,為了簡化時序,筆者將各種參數(shù)的實(shí)際時間轉(zhuǎn)換為50Mhz量化以后的結(jié)果。對此,Verilog可以這樣表示,結(jié)果如代碼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所示,F(xiàn)CLK表示400Khz的周期,F(xiàn)HALF表示1/2周期,F(xiàn)QUARTER表1/4周期。至于為什么代碼16.1不見,DataInputHoldTime與BusFreeTime的時序(話題繼續(xù)之前,請讀者確保自己對“整合時序”有一定的理解,不然的話...接下來的內(nèi)容,讀者一定會看到淚流滿面。圖16.4起始位起始位的物理時序。IICPS/2等傳輸協(xié)議的起始位,然而不同的是,IIC總線的起始位是SCL拉高TR+TSU_STA+THD_STA+TF之久,換之SDA則是拉高TRTHIGH然后拉低TF+TLOW。起始位總和所用掉的時間,恰恰好有一個速率的周期。對此,Verilog則可以這樣描述,結(jié)果如代碼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表示設(shè)置SDA為輸出狀態(tài)(即時結(jié)果3行則表示SCL一直持續(xù)拉高狀態(tài),第4~5行表示C1為0的時候SDA拉高,直到C1為TR+THIGH才拉低SDA。第6~7行表示一個步驟所逗留的時間。16.5結(jié)束16.5是結(jié)束位的時序圖,IIC設(shè)備的操作好壞一般都取決結(jié)束位。保險(xiǎn)起見,SCL與SDA都事先拉低1/4周期,緊接著SCL會拉高TR+TSU_STO(或者1/2周期,最后又保持高電平1/2周期。反之,SDA會拉低1/2周期,隨之拉高TR+THIGH(或者1/2周期。對此,Verilog可以這樣表示,結(jié)果如代碼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為輸出狀態(tài)(即時,第3~4行表示C1為0SCL,C11/45~6行表示,C10拉低SDA,C1為1/4周期TRTSU_STO就拉高SDA。第7~8圖16.6總線此外,結(jié)束位還有BusFreeTme這個時序參數(shù),IIC總線在閑置的狀態(tài)下SCL與SDA等信號都持續(xù)高電平。主機(jī)發(fā)送結(jié)束位以示結(jié)束操作,然而主機(jī)持續(xù)拉高SCL信號與SDA信號TBUF以示總線。TBUF的有效時間從SCL信號與SDA信號拉高那一刻16.2所示,TBUF65個時鐘,結(jié)果如圖16.6所示,SDA信號拉高之后,SCL與SDA信號只要持續(xù)保持1/2周期(即62個時,基本上就能滿足TBUF。如果筆者是一位緊密控時狂人,可能無法接受這樣的結(jié)果,因?yàn)闈M足TBUF少了3個時鐘,為此代碼16.3需要更動一下:if(C1==(FQUARTER+FCLK+3)-1)egnC1<=0d;i<=i+'b;eeC1<=C1+16.7數(shù)據(jù)位。IIC總線類似其他傳輸協(xié)議,它有時鐘信號也有上升沿與下降沿。如圖16.7所示,SCL信號的下降沿導(dǎo)致設(shè)備設(shè)置(更新)數(shù)據(jù),上升沿則是鎖存()數(shù)據(jù)。期間,TF+TLOW表示時鐘信號的前半周期,TR+THIGH則表示后半周期。此外,為了確保數(shù)據(jù)成功打入寄存器,數(shù)據(jù)被上升沿鎖存哪一刻起,TSU_DAT還有THD_DAT必須得16.8數(shù)據(jù)位更新有效除此之外,為了確保數(shù)據(jù)有效被更新,也必須確保TAA得到滿足,結(jié)果如圖16.816.9寫一字節(jié)IIC總線一般都是一個字節(jié)一個字節(jié)讀寫數(shù)據(jù),如圖16.9所示,那是寫一字節(jié)的理想 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個步驟,表示寫一個字節(jié)。第3isQ1SDA為輸出狀態(tài)。第4行表示從最開始更新SDA的數(shù)據(jù)位。第5~6行表示,C1為0拉低SCL,C1為TF+TLOW則拉高SCL。第7~8行表示該步驟逗留一個周期的時間。16.10應(yīng)答位應(yīng)答位是從機(jī)給予主機(jī)的回答,0為是1為否。然而,從旁,應(yīng)答位也如圖16.10所示,上升沿會產(chǎn)生在TFTLOW之后,也是1/2周期。對此,Verilog可以這樣表示,結(jié)果如代碼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為輸入狀態(tài)。第4~5行表示,C1為0拉低SCL,C1為1/2周期則拉高SCL。第3行表示,C1為1/2周期的時候應(yīng)答位。第6~7行表示該步驟逗留1個周期的時間。16.11讀一字節(jié)所謂讀一字節(jié)數(shù)據(jù)就是重復(fù)8次應(yīng)答位。如圖16.11所示,SCL的下降沿導(dǎo)致從機(jī)至于Verilog則可以這樣表示,結(jié)果如代碼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行表示一字節(jié)。第3行表示SDA為輸入狀態(tài),第5~6行表示,C10拉低SCL,C11/2周期則拉高SCL。第4行表示,C11/2周期的時候數(shù)據(jù),而且數(shù)據(jù)位由高至低存入D1。第7~8行表示該步驟逗留一個周期的時間。16.12第二次起始位16.12所示,感覺上第二次起始位也是第一次起始位,不過為了促使改以這樣表示,結(jié)果如代碼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為輸出狀態(tài)。第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實(shí)驗(yàn)十六的建模圖圖16.13是實(shí)驗(yàn)十六的建模圖,組合模塊iic_demo內(nèi)容包含IIC模塊,操作還有SMG基礎(chǔ)模塊。首先操作會將數(shù)據(jù)純?nèi)鏘IC模塊,然后又從中,完后再將讀出的數(shù)據(jù)驅(qū)動SMG基礎(chǔ)模塊。圖16.14IIC模塊的建模圖圖16.14是IIC模塊的建模圖,左邊是頂層信號,右邊則是溝通用的問答信號,寫入地址iAddr,寫入數(shù)據(jù)iData,還有讀出數(shù)據(jù)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=以上內(nèi)容為相關(guān)的速率還有時序參數(shù)。第15~16行則是相關(guān)的偽函數(shù)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;以上內(nèi)容為部分操作。第33行的iCall[1]為使能寫操作。步驟0用來產(chǎn)生起始位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+以上內(nèi)容為部分操作。步驟4用來產(chǎn)生結(jié)束位beginisDone<=1'b1;i<=i+1'b1;beginisDone<=1'b0;i<=5'd0;以上內(nèi)容為部分操作。步驟5~6用來產(chǎn)生完成信號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;以上內(nèi)容為部分操作。步驟7~14是寫一個字節(jié)的偽函數(shù)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;以上內(nèi)容為部分操作。步驟4用來寫入設(shè)備地址(讀,并且調(diào)用偽函數(shù)。步驟5用來一個字節(jié),并且調(diào)用偽函數(shù)。步驟6用來產(chǎn)生結(jié)束位。步驟7~8則用來產(chǎn)生完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;以上內(nèi)容為部分操作。步驟9~16是用來寫一字節(jié)的偽函數(shù)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;以上內(nèi)容為部分操作。步驟17用來應(yīng)答位,步驟18則用來判斷應(yīng)答位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;以上內(nèi)容為部分操作。步驟19~26是一字節(jié)的偽函數(shù)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+以上內(nèi)容為部分操作。步驟27用來無視應(yīng)答位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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論