FPGA嵌入式項(xiàng)目開發(fā)(第3篇 多媒體開發(fā)實(shí)例)_第1頁
FPGA嵌入式項(xiàng)目開發(fā)(第3篇 多媒體開發(fā)實(shí)例)_第2頁
FPGA嵌入式項(xiàng)目開發(fā)(第3篇 多媒體開發(fā)實(shí)例)_第3頁
FPGA嵌入式項(xiàng)目開發(fā)(第3篇 多媒體開發(fā)實(shí)例)_第4頁
FPGA嵌入式項(xiàng)目開發(fā)(第3篇 多媒體開發(fā)實(shí)例)_第5頁
已閱讀5頁,還剩97頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

FPGA嵌入式項(xiàng)目開發(fā)(第3篇多媒體開發(fā)實(shí)例)目錄\h第6章視頻采集處理系統(tǒng)設(shè)計(jì)\h6.1視頻采集處理系統(tǒng)概述\h6.1.1視頻采集模塊\h6.1.2視頻輸出模塊\h6.2視頻采集處理系統(tǒng)硬件接口電路\h6.2.1SAA7113視頻采集電路\h6.2.2SAA7121視頻編碼處理電路\h6.3視頻采集處理系統(tǒng)軟件設(shè)計(jì)\h6.3.1創(chuàng)建QuartusII工程項(xiàng)目\h6.3.2創(chuàng)建PLL宏模塊\h6.3.3創(chuàng)建ROM宏模塊\h6.3.4創(chuàng)建MASK_ROM宏模塊與ADD_MASK例化\h6.3.5I2C總線接口控制器\h6.3.6SAA7113芯片I2C命令集\h6.3.7SAA7121芯片I2C命令\h6.3.8視頻采集處理系統(tǒng)原理圖連線\h6.3.9引腳配置\h6.4實(shí)例總結(jié)\h第7章音頻采集系統(tǒng)設(shè)計(jì)\h7.1音頻采集系統(tǒng)概述\h7.1.1音頻編解碼工作原理\h7.1.2音頻編碼過程介紹\h7.1.3IIS音頻接口總線\h7.2音頻采集系統(tǒng)硬件設(shè)計(jì)\h7.2.1數(shù)字立體聲音頻編解碼芯片AIC23應(yīng)用介紹\h7.2.2硬件電路\h7.3程序設(shè)計(jì)與代碼\h7.3.1創(chuàng)建QuartusII工程\h7.3.2創(chuàng)建宏模塊\h7.3.3創(chuàng)建VerilogHDL文件\h7.3.4創(chuàng)建硬件模塊原理圖\h7.3.5軟件仿真與驗(yàn)證\h7.4實(shí)例總結(jié)\h第8章VGA視頻輸出應(yīng)用\h8.1VGA接口概述\h8.1.1VGA接口定義\h8.1.2VGA顯像原理\h8.1.3VGA工業(yè)標(biāo)準(zhǔn)與工作時(shí)序\h8.2VGA芯片ADV7123概述\h8.2.1ADV7123引腳功能描述\h8.2.2ADV7123芯片接口功能說明\h8.3VGA硬件接口電路設(shè)計(jì)\h8.4VGA硬件系統(tǒng)與程序設(shè)計(jì)\h8.4.1創(chuàng)建QuartusII工程項(xiàng)目\h8.4.2創(chuàng)建PLL宏模塊\h8.4.3編寫VGA控制器時(shí)序代碼\h8.4.4模塊原理圖連線\h8.4.5引腳配置\h8.4.6程序仿真\h8.5實(shí)例總結(jié)第6章視頻采集處理系統(tǒng)設(shè)計(jì)隨著視頻處理技術(shù)的發(fā)展和日益增強(qiáng)的行業(yè)需求,視頻圖像采集與處理的應(yīng)用越來越廣泛。現(xiàn)場可編程門陣列FPGA則是一種高密度可編程邏輯器件,很容易在嵌入式系統(tǒng)的基礎(chǔ)上構(gòu)建視頻圖像采集、處理及傳輸系統(tǒng)。本實(shí)例采用應(yīng)用廣泛的SAA7113和SAA7121芯片來實(shí)現(xiàn)視頻信號(hào)的采集和輸出。6.1視頻采集處理系統(tǒng)概述本實(shí)例的視頻采集處理系統(tǒng)是基于Altera-FPGA的CycloneII處理器的新一代視頻處理系統(tǒng),它對(duì)模擬視頻信號(hào)進(jìn)行數(shù)字化、實(shí)時(shí)壓縮或編碼后實(shí)現(xiàn)實(shí)時(shí)圖像輸出。圖6-1所示的是一個(gè)簡單的視頻采集處理系統(tǒng)的硬件結(jié)構(gòu)圖,SAA7113視頻解碼器支持4路模擬視頻信號(hào)輸入,由FPGA核心處理器控制其完成對(duì)模擬輸入信號(hào)的模數(shù)轉(zhuǎn)換(ADC),輸出符合ITU656等數(shù)據(jù)格式的數(shù)字碼流,數(shù)字碼流輸入到FPGA核心處理器進(jìn)行處理,處理完后由SAA7121視頻編碼器組成的視頻輸出模塊輸出信號(hào)。圖6-1視頻采集處理系統(tǒng)硬件結(jié)構(gòu)圖6.1.1視頻采集模塊視頻采集芯片選用Philips公司的9位視頻輸入處理器SAA7113,SAA7113芯片的主要作用是把輸入的模擬視頻信號(hào)解碼成標(biāo)準(zhǔn)的“VPO”數(shù)字信號(hào),相當(dāng)于一種“A/D”器件。SAA7113芯片兼容全球各種視頻標(biāo)準(zhǔn),在我國應(yīng)用時(shí)必須根據(jù)我國的視頻標(biāo)準(zhǔn)來配置內(nèi)部的寄存器,即初始化,否則SAA7113芯片就不能按要求輸出??梢哉f對(duì)SAA7113芯片的應(yīng)用就是如何初始化。設(shè)計(jì)中通過FPGA處理器模擬I2C總線時(shí)序?qū)AA7113芯片進(jìn)行配置。配置成功后,DVD播放器(也可以接VCD或模擬攝像頭)模擬信號(hào)通過4路模擬信號(hào)輸入通道的其中一路送入,SAA7113芯片將自動(dòng)解碼出符合ITU-656標(biāo)準(zhǔn)的數(shù)字碼流,這串碼流的特征是包含視頻信號(hào)、定時(shí)基準(zhǔn)信號(hào)和輔助信號(hào)等。1.SAA7113視頻解碼芯片概述SAA7113是Philips公司生產(chǎn)的一種高集成度視頻解碼芯片,它支持隔行掃描和多種數(shù)據(jù)輸出格式,可通過其I2C接口對(duì)芯片內(nèi)部電路進(jìn)行控制。該芯片具有如下特點(diǎn):●支持4路模擬輸入,內(nèi)置信號(hào)源選擇器——4路CVBS或2路S視頻(Y/C)信號(hào);●有兩個(gè)模擬預(yù)處理通道;●內(nèi)置兩個(gè)模擬抗混疊濾波器;●兩個(gè)片內(nèi)9位視頻A/D轉(zhuǎn)換器;●兼容PAL、NTSC、SECAM多種制式,行/場同步信號(hào)自動(dòng)檢測;●多種數(shù)據(jù)輸出格式,8位“VPO”總線輸出標(biāo)準(zhǔn)的ITU-656、YUV4:2:2格式。SAA7113芯片內(nèi)部功能框圖如圖6-2所示。SAA7113芯片的控制主要包括對(duì)輸入模擬信號(hào)的預(yù)處理,色度、亮度、對(duì)比度及飽和度的控制,輸出數(shù)據(jù)格式及輸出圖像同步信號(hào)的選擇控制等。在SAA7113芯片所提供的多種數(shù)據(jù)輸出格式中,ITU-656格式能直接輸出與像素時(shí)鐘相對(duì)應(yīng)的像素灰度值,因此在對(duì)灰度圖像進(jìn)行采集時(shí),ITU-656數(shù)據(jù)格式比其他格式更具優(yōu)勢。圖6-2SAA7113芯片內(nèi)部功能框圖2.SAA7113芯片引腳功能描述SAA7113芯片采用QFP44封裝,其引腳排列圖如圖6-3所示,相關(guān)引腳功能定義如表6-1所列。圖6-3SAA7113芯片封裝示意圖表6-1SAA7113芯片引腳功能定義續(xù)表6-1SAA7113芯片的模擬與數(shù)字部分均采用3.3V供電,數(shù)字I/O接口可兼容5V。SAA7113芯片需外接24.576MHz晶振,內(nèi)部鎖相環(huán)(LLC)則可輸出27MHz的系統(tǒng)時(shí)鐘。芯片具有上電自動(dòng)復(fù)位功能,另有外部片選信號(hào)(CE)低電平復(fù)位以后輸出總線變?yōu)槿龖B(tài),待復(fù)位信號(hào)變高后自動(dòng)恢復(fù)。時(shí)鐘丟失、電源電壓降低都會(huì)引起芯片的自動(dòng)復(fù)位。3.SAA7113芯片寄存器簡述SAA7113芯片的寄存器地址從00H開始,其中14H、18H~1EH、20H~3FH、63H~FFH均為保留地址,00H、1FH、60H~62H為只讀寄存器,只有以下寄存器可以讀寫:●01H~05H(前端輸入通道部分);●06H~13H、15H~17H(解碼部分);●40H~60H(常規(guī)分離數(shù)據(jù)部分)。SAA7113中的寄存器簡要說明如表6-2所列,其中默認(rèn)值為芯片復(fù)位后的寄存器默認(rèn)值,設(shè)置值為可以適用于我國PAL制式的設(shè)置參數(shù),這些參數(shù)只供參考,詳細(xì)信息請(qǐng)讀者參考SAA7113芯片的數(shù)據(jù)手冊(cè)。表6-2SAA7113芯片寄存器配置續(xù)表6-26.1.2視頻輸出模塊視頻輸出模塊主要由SAA7121視頻編碼芯片組成。視頻輸出模塊將SAA7113視頻采集模塊解碼,并將FPGA處理器處理后輸出的ITU-RBT.656格式的數(shù)字視頻數(shù)碼流從芯片的視頻數(shù)據(jù)引腳MP0~MP7輸入,經(jīng)過SAA7121芯片內(nèi)的數(shù)據(jù)管理模塊分離出Y、Cb、Cr信號(hào),然后再送到片內(nèi)相應(yīng)的數(shù)模轉(zhuǎn)換模塊將數(shù)字視頻信號(hào)轉(zhuǎn)換為復(fù)合視頻信號(hào),最后由CVBS或者Y、C(即S端子)輸出。簡單地說SAA7121視頻輸出模塊是實(shí)現(xiàn)視頻D/A轉(zhuǎn)換,完成視頻編碼的功能,將數(shù)字視頻信息轉(zhuǎn)換成場頻為50Hz的模擬全電視信號(hào)。1.SAA7121視頻編碼芯片概述SAA7121是Philips公司的一種高集成度視頻編碼芯片,廣泛應(yīng)用于VCD,DVD等影碟機(jī)。SAA7121視頻編碼芯片支持NTSC-M、PAL-B/G等電視制式。采用I2C控制方式,通過8位數(shù)據(jù)總線接收解壓縮的視頻數(shù)據(jù),再由內(nèi)置編碼器將數(shù)字亮度信號(hào)與色度信號(hào)同時(shí)編碼成模擬的CVSB和S視頻信號(hào)。該芯片具有如下特點(diǎn):●3個(gè)片內(nèi)10位視頻D/A轉(zhuǎn)換器分別對(duì)應(yīng)Y(亮度信號(hào))、C(色度信號(hào))和CVBS(復(fù)合視頻信號(hào)),兩倍過采樣;●實(shí)時(shí)載波控制;●支持主(Master)和從(Slave)模式;●多種數(shù)據(jù)輸出格式,支持PAL和NTSC視頻制式,其像素頻率為13.5MHz。SAA7121視頻編碼芯片主要由數(shù)據(jù)管理單元、編碼器、輸出接口、l0位D/A轉(zhuǎn)換器、同步時(shí)鐘電路和I2C總線接口組成,其內(nèi)部功能方框圖如圖6-4所示。圖6-4SAA7121內(nèi)部功能框圖2.引腳功能及數(shù)據(jù)SAA7121芯片采用QFP44封裝,其引腳排列圖如圖6-5所示,相關(guān)引腳功能定義如表6-3所列。圖6-5SAA7121芯片封裝示意圖表6-3SAA7121芯片引腳功能定義續(xù)表6-33.SAA7121圖文電視傳輸時(shí)序SAA7121圖文電視傳輸時(shí)序如圖6-6所示。圖6-6圖文電視傳輸時(shí)序●tFD:輸入數(shù)據(jù)TTX插入和將圖文電視插入到CVBS/Y輸出信號(hào)所需要的時(shí)間?!駎PD:TTXRQ請(qǐng)求信號(hào)為傳輸TTX數(shù)據(jù)的管道延遲時(shí)間?!駎TTX:超前水平同步脈沖的時(shí)間,PAL制式時(shí)為10.2ms或NTSC制式時(shí)為10.5ms。●tTTXWin:插入TTX數(shù)據(jù)窗口的時(shí)間。4.I2C總線接口操作SAA7121芯片通過I2C總線實(shí)現(xiàn)對(duì)芯片的配置,其I2C總線最大支持400kHz的頻率。芯片可以工作在主或從兩種模式下,通過I2C的配置,使芯片工作在不同的模式下。SAA7121支持7位從地址尋址,其完成的I2C總線地址格式如表6-4所列,相關(guān)位功能定義如表6-5所列。表6-4I2C總線地址格式表6-5I2C總線地址格式位功能定義續(xù)表6-55.同步模式SAA7121芯片支持兩種同步模式,一種是主模式,一種是從模式。(1)從模式。在從模式,電路從端口RCV1接收同步場信號(hào);從端口RCV2接受行信號(hào)的輸入,并根據(jù)接收的行場信號(hào)從MP0~7端口接收有效視頻數(shù)據(jù),芯片內(nèi)的行場信號(hào)需與RCV1和RCV2一致。(2)主模式。在主模式下,芯片接收CCIR656格式的數(shù)據(jù),并從接收的數(shù)據(jù)中解析出行場信號(hào)用作整個(gè)芯片的行場信號(hào),同時(shí)根據(jù)CCIR656標(biāo)準(zhǔn)格式數(shù)據(jù)解析出有效的視頻數(shù)據(jù)。6.輸入電平和格式SAA7121芯片要求輸入數(shù)據(jù)格式中Y、CB、CR數(shù)據(jù)滿足“CCIR601”標(biāo)準(zhǔn)。針對(duì)C、CVBS輸出,色差信號(hào)的振幅偏差可以被獨(dú)立的增益控制設(shè)置補(bǔ)償,亮度增益可以被設(shè)置成預(yù)先的值,設(shè)置7.5IRE的亮度精度區(qū)別,或者不設(shè)置。CCIR601和CCIR656標(biāo)準(zhǔn)信號(hào)組成分別如表6-6和6-7所列。表6-6CCIR601信號(hào)注:參考電平以彩色條為標(biāo)準(zhǔn),100%白色,100%振幅,100%色度飽和。表6-7CCIR656標(biāo)準(zhǔn)格式數(shù)據(jù)信號(hào)7.SAA7121典型應(yīng)用電路SAA7121視頻編碼器典型的應(yīng)用電路原理圖如圖6-7所示。CVBS模擬信號(hào)與S端子(Y/C分量)輸出端口都需要串接75Ω終端電阻。圖6-7SAA7121典型應(yīng)用電路6.2視頻采集處理系統(tǒng)硬件接口電路本實(shí)例的視頻采集處理系統(tǒng)硬件的外圍電路設(shè)計(jì)主要包括兩個(gè)部分:第一個(gè)部分是由SAA7113芯片組成的視頻采集及外圍電路,另外一個(gè)部分是由SAA7121芯片組成的視頻編碼處理及外圍電路。6.2.1SAA7113視頻采集電路SAA7113視頻采集電路如圖6-8所示。視頻輸入信號(hào)源可以是DVD/VCD或者是模擬攝像頭通過AI11通道輸入,通過I2C總線接口配置SAA7113,經(jīng)過A/D轉(zhuǎn)換后輸出8位“VPO”信號(hào)。圖6-8SAA7113視頻采集電路6.2.2SAA7121視頻編碼處理電路SAA7121視頻編碼處理電路如圖6-9所示。數(shù)據(jù)碼流由MP0~MP7引腳輸入,經(jīng)過D/A編碼處理后,輸出CVBS模塊視頻信號(hào)。圖6-9SAA7121視頻編碼處理電路6.3視頻采集處理系統(tǒng)軟件設(shè)計(jì)本章的視頻采集處理系統(tǒng)應(yīng)用設(shè)計(jì)是基于視頻輸入輸出環(huán)路演示,即模擬視頻信號(hào)從視頻解碼器SAA7113進(jìn)行A/D轉(zhuǎn)換,再由SAA7121視頻編碼器進(jìn)行D/A轉(zhuǎn)換,最終輸出實(shí)時(shí)視頻圖像。FPGA處理器則通過I2C總線對(duì)視頻編解碼芯片和工作模式進(jìn)行控制。詳細(xì)軟件設(shè)計(jì)步驟如下。6.3.1創(chuàng)建QuartusII工程項(xiàng)目打開QuartusII開發(fā)環(huán)境,創(chuàng)建新工程并配置工程文件相關(guān)參數(shù),單擊“Finish”按鈕,完成工程項(xiàng)目創(chuàng)建。6.3.2創(chuàng)建PLL宏模塊本實(shí)例需要使用PLL時(shí),PLL宏模塊具體創(chuàng)建的方法和步驟如下。(1)選擇QuartusII開發(fā)環(huán)境,選擇主菜單“Tools”→“MegaWizardPlug-InManager”命令,彈出添加宏模塊對(duì)話框,選擇“Createanewcustommagafuctionvaria-tion”選項(xiàng),單擊“Next”,進(jìn)入下一配置。(2)在宏模塊左側(cè)欄中選擇“I/O”→“ALTPLL”,完成對(duì)應(yīng)FPGA芯片型號(hào)信息、文件名及保存路徑配置。(3)PLL時(shí)鐘參數(shù)配置。在配置頁面中設(shè)置參考時(shí)鐘頻率為“50MHz”,然后設(shè)置相關(guān)參數(shù)。接下來配置時(shí)鐘相移角度及分頻值參數(shù)配置,一共設(shè)置了3個(gè)時(shí)鐘輸出c0、c1、e0,相關(guān)參數(shù)如圖6-10、圖6-11、圖6-12所示。圖6-10PLL時(shí)鐘c0輸出參數(shù)設(shè)置圖6-11PLL輸出c1參數(shù)設(shè)置圖6-12PLL輸出e0參數(shù)設(shè)置(4)PLL模塊輸出文件代碼選項(xiàng)設(shè)置。PLL宏模塊輸出文件與程序代碼選項(xiàng)的相關(guān)設(shè)置如圖6-13所示。完成配置后,在QuartusII工程項(xiàng)目中,即可將PLL模塊添加到新創(chuàng)建的原理圖文件。圖6-13PLL模塊輸出文件選項(xiàng)設(shè)置6.3.3創(chuàng)建ROM宏模塊本實(shí)例需要?jiǎng)?chuàng)建兩個(gè)ROM宏模塊,一個(gè)用于SAA7113寄存器初始化配置,另外一個(gè)用于SAA7121寄存器初始化配置。ROM宏模塊具體創(chuàng)建的方法和步驟如下。1.SAA_ROM創(chuàng)建創(chuàng)建一個(gè)ROM宏模塊并命名為“SAA_ROM”,用于SAA7113寄存器初始化配置。(1)SAA_ROM參數(shù)配置。SAA_ROM輸出寬度和位數(shù)如圖6-14所示,輸出端口位數(shù)如圖6-15所示。圖6-14SAA_ROM參數(shù)配置圖6-15SAA_ROM輸出端口參數(shù)配置(2)SAA_ROM初始化文件選擇。Mif文件可采用MATLAB語言創(chuàng)建,主要用于初始化ROM。有關(guān)mif文件的創(chuàng)建方法請(qǐng)讀者參考其他文獻(xiàn)。本實(shí)例對(duì)應(yīng)的mif文件選項(xiàng)設(shè)置如圖6-16所示。圖6-16SAA_ROM初始化文件配置(3)SAA_ROM輸出文件選項(xiàng)。在完成SAA_ROM相關(guān)參數(shù)配置后,即可設(shè)置其輸出文件選項(xiàng),如圖6-17所示。至此完成了SAA7113寄存器對(duì)應(yīng)的ROM配置。圖6-17SAA_ROM文件輸出選項(xiàng)2.ENC_ROM創(chuàng)建創(chuàng)建一個(gè)ROM宏模塊并命名為“ENC_ROM”,用于SAA7121寄存器初始化配置,ENC_ROM初始化文件配置如圖6-18所示。其創(chuàng)建步驟和方法同SAA_ROM類似,此處省略介紹。圖6-18ENC_ROM初始化文件配置6.3.4創(chuàng)建MASK_ROM宏模塊與ADD_MASK例化創(chuàng)建一個(gè)ROM宏模塊并命名為“mask_rom”,如圖6-19所示。其創(chuàng)建步驟和方法同SAA_ROM類似,此處省略介紹。圖6-19mask_rom參數(shù)設(shè)置完成mask_rom宏模塊創(chuàng)建后,新建VerilogHDL程序代碼“add_mask”,限于篇幅該部分程序代碼省略介紹,請(qǐng)讀者參考光盤文件,例化后如圖6-20所示。圖6-20ADD_MASK例化6.3.5I2C總線接口控制器本實(shí)例的SAA7113視頻解碼器和SAA7121視頻編碼器相關(guān)配置都需要經(jīng)過I2C總線接口進(jìn)行,I2C總線接口控制器的程序代碼如下。

modulei2c_control(clk_in,rst,cmd_gen_start,cmd_gen_stop,cmd_send,data_in,

busy,scl,sda,wait_ack);

inputclk_in,rst;

inputcmd_gen_start,cmd_gen_stop,cmd_send;

outputbusy;

input[7:0]data_in;

outputscl;

inoutsda;

outputwait_ack;//測試應(yīng)答

regbusy;

regscl;

//內(nèi)部regs

reg[9:0]CS,NS;

reg[3:0]start_cnt;//開始條件計(jì)數(shù)器

reg[2:0]scl_low_cnt;//SCL低電平計(jì)數(shù)器

reg[3:0]scl_high_cnt;//SCL高電平計(jì)數(shù)器

reg[3:0]stop_set_cnt;//停止條件計(jì)數(shù)器

reg[3:0]tbuf_cnt;//停止重新開始間隔計(jì)數(shù)器

/*7個(gè)數(shù)據(jù)位,1個(gè)應(yīng)答位,如果用僅用單向傳輸,應(yīng)答時(shí)由主機(jī)將SDA置高*/

reg[8:0]temp_data;

reg[3:0]bit_cnt;//位計(jì)數(shù)器

regsda_out;

regsda_in;

regwait_ack;//等待應(yīng)答時(shí)的標(biāo)志信號(hào)

regstart_end,stop_end;

regwait_end;

regscl_low_end,scl_high_end;

regsend_over;

/*開始條件SCL高電平持續(xù)的時(shí)間>4μs,此處取10個(gè)時(shí)鐘周期(時(shí)鐘2MHz),即5μs采用減

法計(jì)數(shù)*/

regsending_data;

parameterSTART_HOLD=4'b1000;

/*開始條件SCL低電平持續(xù)時(shí)間>4.7μs的一半,即約為5個(gè)時(shí)鐘周期,采用減法計(jì)數(shù)*/

parameterSCL_LOW_CNT=3'b011;

/*SCL高電平持續(xù)時(shí)間>4ns,這里取10個(gè)時(shí)鐘周期,為5μs,采用減法計(jì)數(shù)*/

parameterSCL_HIGH_CNT=4'b1000;

parameterBIT_CNT=4'b1000;//位計(jì)數(shù)值共8位

/*停止條件建立時(shí)間>4.0μs,此處取10個(gè)時(shí)鐘周期,即5μs采用減法計(jì)數(shù)*/

parameterSTOP_SETUP=4'b1000;

/*停止和啟動(dòng)條件之間的總線空閑時(shí)間>4.7μs,取10個(gè)時(shí)鐘周期,為5μs,采用減法計(jì)數(shù)/

*parameterTUBF=4'b1000;

/*開始條件SCL高電平持續(xù)的時(shí)間>4μs,此處取100個(gè)時(shí)鐘周期(時(shí)鐘為20MHz),即5μs采

用減法計(jì)數(shù)*/

parameterSTART_HOLD=7'b110_0010;

/*開始條件SCL低電平持續(xù)時(shí)間>4.7μs的一半,即約為50個(gè)時(shí)鐘周期,采用減法計(jì)數(shù)*/

parameterSCL_LOW_CNT=6'b11_0000;

/*SCL高電平持續(xù)時(shí)間>4ns,這里取100個(gè)時(shí)鐘周期為5μs,采用減法計(jì)數(shù)*/

parameterSCL_HIGH_CNT=7'b110_0010;

parameterBIT_CNT=4'b1000;//位計(jì)數(shù)值共8位

/*停止條件建立時(shí)間>4.0μs,此處取100個(gè)時(shí)鐘周期,即5μs采用減法計(jì)數(shù)*/

parameterSTOP_SETUP=7'b110_0010;

/*停止和啟動(dòng)條件之間的總線空閑時(shí)間>4.7μs,取100個(gè)時(shí)鐘周期為5μs,采用減法計(jì)

數(shù)*/

parameterTUBF=7'b110_0010;

parameterIDLE=10'b00_0000_0000,

GEN_START=10'b00_0000_0001,

SCL_AFTER_START=10'b00_0000_0010,

WAIT_CMD=10'b00_0000_0100,

READ_DATA=10'b00_0000_1000,

SCL_LOW1=10'b00_0001_0000,

SCL_HIGH=10'b00_0010_0000,

SCL_LOW2=10'b00_0100_0000,

SCL_BEFOR_STOP=10'b00_1000_0000,

GEN_STOP=10'b01_0000_0000,

STOP_WAIT=10'b10_0000_0000;

/*************I

2

C總線控制狀態(tài)機(jī)**********************/

always@(posedgeclk_inornegedgerst)

begin

if(~rst)

CS<=IDLE;

else

CS<=NS;

end

always@(CSorcmd_gen_startorcmd_sendorcmd_gen_stoporscl_low_endorscl_high

_endorstart_endorsend_overorstop_endorwait_end)

begin

case(CS)

IDLE:

begin

if(cmd_gen_start)

NS=GEN_START;

else

NS=IDLE;

end

GEN_START://產(chǎn)生開始條件

begin

if(start_end)

NS=SCL_AFTER_START;

else

NS=GEN_START;

end

SCL_AFTER_START:

begin

if(scl_low_end)

NS=SCL_LOW1;

else

NS=SCL_AFTER_START;

end

WAIT_CMD:

begin

if(cmd_gen_start)

NS=GEN_START;

elseif(cmd_send)

NS=READ_DATA;

elseif(cmd_gen_stop)

NS=SCL_BEFOR_STOP;

else

NS=WAIT_CMD;

end

READ_DATA:

begin

NS=SCL_LOW1;

end

SCL_LOW1://SCL_LOW1--SCL_HIGH--SCL_LOW2為傳送1bit的一個(gè)周期

begin

if(scl_low_end)

NS=SCL_HIGH;

else

NS=SCL_LOW1;

end

SCL_HIGH:

begin

if(scl_high_end)

NS=SCL_LOW2;

else

NS=SCL_HIGH;

end

SCL_LOW2:

begin

if(scl_low_end)

/*如果8位數(shù)據(jù)發(fā)送完畢,并且收到ACK信號(hào)就回到IDLE狀態(tài),等待命令*/

if(send_over)

NS=WAIT_CMD;

else

NS=SCL_LOW1;

else

NS=SCL_LOW2;

end

SCL_BEFOR_STOP:

begin

if(scl_low_end)

NS=GEN_STOP;

else

NS=SCL_BEFOR_STOP;

end

GEN_STOP:

begin

if(stop_end)

NS=STOP_WAIT;

else

NS=GEN_STOP;

end

STOP_WAIT:

begin

if(wait_end)

NS=IDLE;

else

NS=STOP_WAIT;

end

default:

NS=IDLE;

endcase

end

always@(posedgeclk_inornegedgerst)

begin

if(~rst)

begin

scl<=1;

busy<=0;

sda_out<=1;

sda_in<=1'bz;

start_cnt<=4'b0;

scl_low_cnt<=3'b0;

scl_high_cnt<=4'b0;

stop_set_cnt<=0;

tbuf_cnt<=4'b0;

bit_cnt<=8'b0;

start_end<=0;

scl_low_end<=0;//標(biāo)示SCL低電平結(jié)束

scl_high_end<=0;//標(biāo)示SCL高電平結(jié)束

stop_end<=0;

send_over<=0;//標(biāo)示8bit數(shù)據(jù)傳輸完畢

temp_data<=0;

sending_data<=0;

end

else

case(NS)

IDLE:

begin

scl<=1;

busy<=0;

sda_out<=1;

sda_in<=1'bz;

start_cnt<=START_HOLD;

scl_low_cnt<=SCL_LOW_CNT;

scl_high_cnt<=SCL_HIGH_CNT;

stop_set_cnt<=STOP_SETUP;

tbuf_cnt<=TUBF;

bit_cnt<=0;

start_end<=0;

scl_low_end<=0;

scl_high_end<=0;

stop_end<=0;

send_over<=0;

wait_ack<=0;

wait_end<=0;

temp_data<=0;

end

GEN_START:

begin

scl<=1;

busy<=1;//通知CMD模塊,總線忙

sda_out<=0;

start_end<=0;

temp_data<={data_in[7:0],1'b1};

if(&start_cnt)

begin

start_cnt<=START_HOLD;

start_end<=1;

end

else

start_cnt<=start_cnt-1;

end

SCL_AFTER_START://產(chǎn)生開始條件之后的SCL低電平

begin

scl<=0;

busy<=1;

sda_out<=0;

start_end<=0;

if(&scl_low_cnt)

begin

scl_low_cnt<=SCL_LOW_CNT;

scl_low_end<=1;

end

else

scl_low_cnt<=scl_low_cnt-1;

end

WAIT_CMD:

begin

scl<=0;

sda_out<=0;

busy<=0;

start_cnt<=START_HOLD;

scl_low_cnt<=SCL_LOW_CNT;

scl_high_cnt<=SCL_HIGH_CNT;

stop_set_cnt<=STOP_SETUP;

tbuf_cnt<=TUBF;

bit_cnt<=0;

start_end<=0;

scl_low_end<=0;

scl_high_end<=0;

stop_end<=0;

send_over<=0;

wait_ack<=0;

wait_end<=0;

end

READ_DATA:

begin

scl<=0;

sda_out<=0;

busy<=0;

wait_ack<=0;

temp_data<={data_in[7:0],1'b1};//從CMD模塊中讀取要發(fā)送的

數(shù)據(jù)

end

SCL_LOW1:

begin

scl<=0;

busy<=1;//通知總線忙

start_end<=0;

sending_data<=1;

sda_out<=temp_data[8];

scl_low_end<=0;

if(&scl_low_cnt)

begin

scl_low_cnt<=SCL_LOW_CNT;

scl_low_end<=1;

end

else

scl_low_cnt<=scl_low_cnt-1;

end

SCL_HIGH:

begin

scl<=1;

busy<=1;

scl_low_end<=0;

scl_high_end<=0;

sending_data<=1;

if(wait_ack)//如果是

等待接收應(yīng)答位,由sda_in接收應(yīng)答信號(hào)

sda_in<=sda;

if(&scl_high_cnt)

begin

scl_high_cnt<=SCL_HIGH_CNT;

scl_high_end<=1;

end

else

scl_high_cnt<=scl_high_cnt-1;

end

SCL_LOW2:

begin

scl<=0;

busy<=1;

scl_high_end<=0;

scl_low_end<=0;

send_over<=0;

sending_data<=1;

if(&scl_low_cnt)

begin

scl_low_end<=1;

scl_low_cnt<=SCL_LOW_CNT;

temp_data<={temp_data[7:0],1'b0};

if(bit_cnt==BIT_CNT-1)

wait_ack<=1;

if(bit_cnt==BIT_CNT)

begin

bit_cnt<=0;

sending_data<=0;

/*發(fā)送完一個(gè)字節(jié)后,如果收到應(yīng)答信號(hào),就給出信號(hào)標(biāo)示一個(gè)字節(jié)數(shù)據(jù)傳送完畢*/

if(~sda_in)

begin

send_over<=1;

sending_data<=0;

wait_ack<=0;

end

end

else

bit_cnt<=bit_cnt+1;

end

else

scl_low_cnt<=scl_low_cnt-1;

end

SCL_BEFOR_STOP:

begin

scl<=0;

sda_out<=0;

busy<=1;

scl_low_end<=0;

if(&scl_low_cnt)

begin

scl_low_end<=1;

scl_low_cnt<=SCL_LOW_CNT;

end

else

scl_low_cnt<=scl_low_cnt-1;

end

GEN_STOP://產(chǎn)生停止條件

begin

scl<=1;

sda_out<=0;

busy<=1;

scl_low_end<=0;

if(&stop_set_cnt)

begin

stop_set_cnt<=STOP_SETUP;

stop_end<=1;

end

else

stop_set_cnt<=stop_set_cnt-1;

end

STOP_WAIT://停止后,要開始,需要等待一段時(shí)間

begin

scl<=1;

sda_out<=1;

busy<=1;

stop_end<=0;

if(&tbuf_cnt)

begin

tbuf_cnt<=TUBF;

wait_end<=1;

end

else

tbuf_cnt<=tbuf_cnt-1;

end

default:

begin

scl<=1;

busy<=0;

sda_out<=1;

sda_in<=1'bz;

start_cnt<=START_HOLD;

scl_low_cnt<=SCL_LOW_CNT;

scl_high_cnt<=SCL_HIGH_CNT;

tbuf_cnt<=TUBF;

bit_cnt<=0;

start_end<=0;

scl_low_end<=0;

scl_high_end<=0;

send_over<=0;

wait_ack<=0;

wait_end<=0;

sending_data<=0;

end

endcase

end

assignsda=wait_ack?1'bz:sda_out;

endmodule

程序編寫完成后,將I2C總線接口控制器的程序代碼例化。6.3.6SAA7113芯片I2C命令集SAA7113視頻解碼器相關(guān)的控制需要FPGA處理器通過I2C總線接口發(fā)送指令,SAA7113芯片I2C控制命令的程序代碼如下。

modulei2c_cmd_7113(clk_in,rst,cmd_gen_start,cmd_send,cmd_gen_stop,data_to_i2c,

busy,ram_addr,ram_data,end_7113,led1,led2);

inputclk_in,rst;

inputbusy;//來自i2c_control模塊,標(biāo)示總線狀態(tài)

input[7:0]ram_data;

/*產(chǎn)生開始條件,發(fā)送數(shù)據(jù),結(jié)束條件的命令信號(hào)*/

outputcmd_gen_start,cmd_send,cmd_gen_stop;

output[7:0]data_to_i2c;

output[6:0]ram_addr;

outputend_7113;

outputled1,led2;//LED指示燈,用于指示狀態(tài)

//regs輸出

regcmd_gen_start,cmd_gen_stop,cmd_send;

reg[7:0]data_to_i2c;

reg[6:0]ram_addr;

regend_7113;

//內(nèi)部regs

reggroup_addr;

reg[8:0]state;

regled1,led2;

parameterDEV_ADDR=8'h4A;

/*SAA7113芯片I

2

C命令狀態(tài)機(jī)*/

parameter

IDLE=9'b0_0000_0000,

GEN_START=9'b0_0000_0001,

WAIT_START_END=9'b0_0000_0010,

SEND_SUB_ADDR=9'b0_0000_0100,

WAIT_SUBADDR_ACK=9'b0_0000_1000,

SEND_DATA=9'b0_0001_0000,

WAIT_DATA_ACK=9'b0_0010_0000,

GEN_STOP=9'b0_0100_0000,

WAIT_STOP_END=9'b0_1000_0000,

HALT=9'b1_0000_0000;

always@(posedgeclk_inornegedgerst)

begin

if(~rst)

begin

cmd_gen_start<=0;

cmd_send<=0;

cmd_gen_stop<=0;

group_addr<=0;

ram_addr<=0;

state<=IDLE;

end_7113<=0;

led1<=1;

led2<=1;

end

else

case(state)

IDLE:

begin

cmd_send<=0;

cmd_gen_stop<=0;

group_addr<=0;

ram_addr<=0;

if(~busy)

begin

state<=GEN_START;

cmd_gen_start<=1;

data_to_i2c<=DEV_ADDR;

end

end

GEN_START:

begin

if(busy)

begin

cmd_gen_start<=0;

state<=WAIT_START_END;

end

else

state<=GEN_START;

end

WAIT_START_END:

begin

if(~busy)

begin

state<=SEND_SUB_ADDR;

cmd_send<=1;

data_to_i2c<=group_addr?8'h40:8'h01;

ram_addr<=group_addr?7'h40:8'h01;

led2<=0;

end

end

SEND_SUB_ADDR:

begin

if(busy)

begin

cmd_send<=0;

state<=WAIT_SUBADDR_ACK;

end

end

WAIT_SUBADDR_ACK:

begin

if(~busy)

begin

state<=SEND_DATA;

cmd_send<=1;

data_to_i2c<=ram_data;

end

end

SEND_DATA:

begin

if(busy)

begin

cmd_send<=0;

ram_addr<=ram_addr+1;

state<=WAIT_DATA_ACK;

end

end

WAIT_DATA_ACK:

begin

if(~busy)

begin

if((ram_addr==7'h18&&~group_addr)|(ram_addr==7'h60&&group_addr))

begin

state<=GEN_STOP;

cmd_gen_stop<=1;

end

else

begin

state<=SEND_DATA;

cmd_send<=1;

data_to_i2c<=ram_data;

end

end

end

GEN_STOP:

begin

if(busy)

begin

cmd_gen_stop<=0;

state<=WAIT_STOP_END;

end

end

WAIT_STOP_END:

begin

if(~busy)

begin

if(~group_addr)

begin

state<=GEN_START;

cmd_gen_start<=1;

group_addr<=1;

data_to_i2c<=DEV_ADDR;

end

else

state<=HALT;

end

else

state<=WAIT_STOP_END;

end

HALT:

begin

state<=HALT;

led1<=0;

end_7113<=1;

end

default:

state<=IDLE;

endcase

end

endmodule

程序編寫完成后,需要將程序代碼例化。6.3.7SAA7121芯片I2C命令SAA7121芯片的控制類似于SAA7113,它也需要FPGA處理器通過I2C總線接口發(fā)送指令,SAA7121芯片I2C控制命令的程序代碼如下。

modulei2c_cmd_7121(clk_in,rst,cmd_gen_start,cmd_send,cmd_gen_stop,data_to_i2c,

busy,ram_addr,ram_data,end_7121,led3,led4);

inputclk_in,rst;

inputbusy;

input[7:0]ram_data;

outputcmd_gen_start,cmd_send,cmd_gen_stop;

output[7:0]data_to_i2c;

output[6:0]ram_addr;

outputend_7121;

outputled3,led4;

//regs輸出

regcmd_gen_start,cmd_gen_stop,cmd_send;

reg[7:0]data_to_i2c;

reg[6:0]ram_addr;

regend_7121;

//內(nèi)部regs

reggroup_addr;

reg[8:0]state;

regled3,led4;//LED指示燈,用于指示狀態(tài).

parameterDEV_ADDR=8'h88;//SAA7121地址=88H.

/*SAA7121芯片I

2

C命令狀態(tài)機(jī)*/

parameter

IDLE=9'b0_0000_0000,

GEN_START=9'b0_0000_0001,

WAIT_START_END=9'b0_0000_0010,

SEND_SUB_ADDR=9'b0_0000_0100,

WAIT_SUBADDR_ACK=9'b0_0000_1000,

SEND_DATA=9'b0_0001_0000,

WAIT_DATA_ACK=9'b0_0010_0000,

GEN_STOP=9'b0_0100_0000,

WAIT_STOP_END=9'b0_1000_0000,

HALT=9'b1_0000_0000;

always@(posedgeclk_inornegedgerst)

begin

if(~rst)

begin

cmd_gen_start<=0;

cmd_send<=0;

cmd_gen_stop<=0;

group_addr<=0;

ram_addr<=0;

end_7121<=0;

state<=IDLE;

led3<=1;

led4<=1;

end

else

case(state)

IDLE:

begin

cmd_send<=0;

cmd_gen_stop<=0;

group_addr<=0;

溫馨提示

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

評(píng)論

0/150

提交評(píng)論