《FPGA與SOPC設(shè)計(jì)教程》課件第4章_第1頁
《FPGA與SOPC設(shè)計(jì)教程》課件第4章_第2頁
《FPGA與SOPC設(shè)計(jì)教程》課件第4章_第3頁
《FPGA與SOPC設(shè)計(jì)教程》課件第4章_第4頁
《FPGA與SOPC設(shè)計(jì)教程》課件第4章_第5頁
已閱讀5頁,還剩344頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章DE2平臺(tái)應(yīng)用4.1DE2平臺(tái)內(nèi)嵌的USBBlaster及FPGA配置4.2音頻編/解碼4.3使用SDRAM及SRAM4.4視頻D/A轉(zhuǎn)換器4.5彩色LCM顯示器4.6用DE2平臺(tái)實(shí)現(xiàn)視頻解碼4.7USBOTG4.8網(wǎng)絡(luò)接口4.9RS232接口4.10DE2控制面板4.11DE2高級(jí)應(yīng)用范例4.12LCM及CIS在DE2平臺(tái)上的應(yīng)用范例4.1DE2平臺(tái)內(nèi)嵌的USBBlaster及FPGA配置

CycloneⅡ系列FPGA支持AS、PS和JTAG等三種配置模式,DE2平臺(tái)上集成了USBBlaster,可以為EP2C35提供兩種配置模式:JTAG模式和AS(主動(dòng)串行)模式。DE2平臺(tái)上內(nèi)嵌的USBBlaster的原理框圖如圖4.1所示。圖4.1DE2平臺(tái)上內(nèi)嵌的USBBlaster原理框圖

JTAG及EPCS16的編程邏輯由CPLDEPM3128AT完成。用SW19來選擇FPGA是編程模式還是運(yùn)行模式,在編程模式下,USBBlaster可通過AS模式對(duì)EPCS16進(jìn)行編程;在運(yùn)行模式下,上電后,F(xiàn)PGA從EPCS16中讀取配置數(shù)據(jù),對(duì)FPGA進(jìn)行配置。CycloneⅡ系列FPGA支持在AS模式配置時(shí)的配置數(shù)據(jù)壓縮,即將配置數(shù)據(jù)壓縮后保存在配置器件中,上電配置時(shí)將壓縮后的配置數(shù)據(jù)讀入FPGA,F(xiàn)PGA對(duì)壓縮數(shù)據(jù)流實(shí)時(shí)解壓后寫入RAM中完成對(duì)FPGA的配置。配置數(shù)據(jù)在配置器件中進(jìn)行壓縮存儲(chǔ)可以使總的配置數(shù)據(jù)量縮減35%~55%。這種壓縮在DE2上是沒有必要的,因?yàn)镋PCS16的存儲(chǔ)器容量足以配置EP2C35,而且EPCS16中剩余的空間還可以用來保存用戶數(shù)據(jù)。當(dāng)SW19置于運(yùn)行位置時(shí),可通過JTAG模式對(duì)FPGA進(jìn)行配置。JTAG模式不支持配置數(shù)據(jù)的壓縮。JTAG模式配置完成后,F(xiàn)PGA自動(dòng)按新的配置工作,但系統(tǒng)重新上電后,F(xiàn)PGA仍然自動(dòng)從EPCS16中讀取配置數(shù)據(jù)來配置FPGA。

AS模式和JTAG模式通過不同的信號(hào)連線對(duì)FPGA進(jìn)行配置。EPM3128AT通過圖4.1中的JTAG2配置FPGA,通過配置信號(hào)連線從EPCS16中讀取AS模式的配置數(shù)據(jù)。EPM3128AT與FPGA之間還有一個(gè)類似于JTAG的數(shù)據(jù)鏈路,DE2控制面板使用這個(gè)數(shù)據(jù)鏈路實(shí)現(xiàn)與FPGA的通信。使用JTAG模式配置FPGA的步驟如下:

(1)打開DE2平臺(tái)電源。

(2)用USB電纜通過DE2的USBBlaster接口(J9)將DE2平臺(tái)與電腦相連。

(3)將SW19置于RUN。

(4)在QuartusⅡ中或NiosⅡ?IDE中指定SOF文件并用JTAG模式配置FPGA。

AS模式下配置FPGA的步驟如下:

(1)打開DE2平臺(tái)電源。

(2)用USB電纜通過DE2的USBBlaster接口(J9)將DE2平臺(tái)與電腦相連。

(3)將SW19置于PROG。

(4)在QuartusⅡ中指定POF文件并用AS模式對(duì)EPCS16編程。

(5)將SW19置于RUN,系統(tǒng)重新上電,F(xiàn)PGA自動(dòng)從EPCS16中讀取配置數(shù)據(jù),對(duì)FPGA進(jìn)行配置。圖4.1中,F(xiàn)T232BM芯片實(shí)現(xiàn)了USB與并行數(shù)據(jù)接口的轉(zhuǎn)換,F(xiàn)T232BM的配置信息保存在EEPROM芯片93C46中,EEPROM中的數(shù)據(jù)如下:如果93C46中的信息丟失,將DE2平臺(tái)通過USBBlaster接口連接到PC上時(shí),PC會(huì)自動(dòng)識(shí)別到一個(gè)“USB<>SerialCable”的設(shè)備。此時(shí),先從FT232BM原廠網(wǎng)站上下載原始驅(qū)動(dòng)程序,下載地址為/Drivers/D2XX.htm,將此驅(qū)動(dòng)程序作為“USB<>SerialCable”的驅(qū)動(dòng)程序安裝到電腦上。然后再?gòu)纳舷螺dMPROG軟件,重新配置,用MPROG軟件可重新配置USBBlaseter,并能夠?qū)?shù)據(jù)寫入93C46中。USBBlaster具體配置如下:DeviceType:FT232BMUSBVID/PID:OwnVID&PIDVendorID:09FBProductorID:6001USBVersionNumber:USB1.1PullDownIOPinsinUSBSuspend:YESManufacture:AlteraProductDescription:USB-BlasterUSBPowerOption:BusPowered,MaxBusPower150milliAmpsSerialNumberPrefix:91也可以通過JP3對(duì)93C46編程,參照本書附錄A中的圖A.20,93C46的CLK、DO、CS、GND引腳分別與JP3的6、7、8、10腳相連,將通用編程器通過自制電纜與JP3相連,在編程軟件中手動(dòng)輸入EEPROM數(shù)據(jù),然后將數(shù)據(jù)寫入93C46即可,這種方法只有對(duì)相關(guān)技術(shù)非常熟悉的用戶可用。圖A.20中JP3與EPM3128AT相連的JTAG1是CPLDEPM3128AT的配置JTAG連線。4.2音頻編/解碼4.2.1音頻編/解碼硬件芯片WM8731

DE2的音頻輸入/輸出由Wolfson公司的低功耗立體聲音24位音頻編/解碼芯片WM8731完成。WM8731的音頻采樣速率為8~96?kHz可調(diào);提供2線與3線兩種與主控制器的接口方式;支持四種音頻數(shù)據(jù)格式:I2S模式、左對(duì)齊模式、右對(duì)齊模式和DSP模式。

WM8731包含了線路輸入、麥克風(fēng)輸入及耳機(jī)輸出。兩路線路輸入RLINEIN和LLINEIN能以1.5?dB的步距在+12~?34.5?dB范圍內(nèi)進(jìn)行對(duì)數(shù)音量調(diào)節(jié),完成A/D轉(zhuǎn)換后,還可以進(jìn)行高通數(shù)字濾波,有效去除輸入中的直流成分。一路麥克風(fēng)輸入可以在?6~34?dB范圍內(nèi)進(jìn)行音量調(diào)節(jié)。這三路模擬輸入都有單獨(dú)的靜音功能。D/A轉(zhuǎn)換器輸出、線路輸入旁路及麥克風(fēng)輸入經(jīng)過側(cè)音電路后可相加作為輸出,可以直接驅(qū)動(dòng)線路輸出(LOUT和ROUT),也可以通過耳機(jī)放大器輸出,以驅(qū)動(dòng)耳機(jī)(RHPOUT和LHPOUT)。耳機(jī)放大電路的增益可以在+6~?73?dB范圍內(nèi)以1?dB步距進(jìn)行調(diào)整。

DE2音頻部分電路如圖4.2所示。DE2平臺(tái)上的LINEOUT(J3)接在經(jīng)過耳機(jī)放大器放大的耳機(jī)輸出上,可以直接驅(qū)動(dòng)耳機(jī)。LINEIN(J2)經(jīng)過隔直電容輸入,而MICIN(J1)則直接輸入。圖4.2DE2音頻部分電路

WM8731的MODE腳接地,選擇了2線控制器接口,控制器通過I2C總線控制WM8731,圖中的I2C_SCLK和I2C_SDAT接口是從FPGA引出的I2C總線,與視頻解碼器共用控制總線。2線模式下,通過引腳CSB選擇WM8731在I2C總線上的地址,若CSB引腳接地,則讀地址為0x34,寫地址為0x35。總線數(shù)據(jù)B[15:0]中,B[15:9]是WM8731中控制寄存器的地址,B[8:0]是寄存器中的數(shù)值。WM8731寄存器的地址分配及定義如表4.1所示。圖4.3為WM8731I2C總線的時(shí)序。圖4.3WM8731I2C總線的時(shí)序4.2.2WM8731控制電路的實(shí)現(xiàn)對(duì)WM8731的控制通過I2C總線來實(shí)現(xiàn),代碼4.1是用VerilogHDL實(shí)現(xiàn)I2C控制器的參考代碼。本例中只實(shí)現(xiàn)了I2C寫數(shù)據(jù),而沒有實(shí)現(xiàn)完整的I2C控制器。在這個(gè)I2C控制器中,輸入CLOCK是I2C控制器的時(shí)鐘輸入,在對(duì)這個(gè)I2C控制器進(jìn)行例化時(shí),要提供一個(gè)滿足I2C標(biāo)準(zhǔn)的時(shí)鐘。I2C控制器每次傳輸24位數(shù)據(jù),前8位是從設(shè)備地址SLAVE_ADDR,接下來8位是從設(shè)備的寄存器地址SUB_ADDR,最后8位是數(shù)據(jù)。WM8731的I2C通信數(shù)據(jù)格式中有7位寄存器地址和9位數(shù)據(jù),與I2C控制器的數(shù)據(jù)格式定義不一致,實(shí)際傳輸時(shí),SUB_ADDR的高7位為寄存器地址,最后1位是9位數(shù)據(jù)的最高位。本例中,I2C控制器使用33個(gè)I2C時(shí)鐘周期完成1次傳輸24位數(shù)據(jù)。第1個(gè)時(shí)鐘周期用于初始化控制器,第2、3個(gè)周期用于啟動(dòng)傳輸,第4~30個(gè)周期用于傳輸數(shù)據(jù)(其中包含24位數(shù)據(jù)和3個(gè)ACK),最后3個(gè)周期用以停止傳輸??刂破髦惺褂昧艘粋€(gè)6位計(jì)數(shù)器SD_COUNTER對(duì)傳輸周期計(jì)數(shù)。在開始傳輸之前與終止傳輸之后,I2C_SCLK信號(hào)都應(yīng)該保持高電平。I2C的起始條件(START)與終止條件(STOP)由I2C_SCLK與I2C_SDAT配合完成,在代碼中增加了一個(gè)1位寄存器SCLK,用以產(chǎn)生START條件和STOP條件。在START之前、STOP之后,SCLK=1;產(chǎn)生START條件之后,至產(chǎn)生STOP條件之前,SCLK=0。數(shù)據(jù)傳輸期間,I2C_SCLK由CLOCK提供。代碼4.1I2C控制器代碼。moduleI2C_Controller( CLOCK, //I2C控制器時(shí)鐘輸入

I2C_SCLK, //I2C總線時(shí)鐘信號(hào)輸出

I2C_SDAT, //I2C總線數(shù)據(jù)信號(hào)

I2C_DATA, //要傳輸?shù)臄?shù)據(jù)DATA:[SLAVE_ADDR,SUB_ADDR,DATA] GO, //啟動(dòng)傳輸

END, //傳輸結(jié)束標(biāo)志

ACK, //ACK信號(hào)輸出

RESET, //I2C控制器復(fù)位信號(hào)

//以下信號(hào)為測(cè)試信號(hào)

SD_COUNTER, //I2C數(shù)據(jù)發(fā)送計(jì)數(shù)器

SDO //I2C控制器發(fā)送的串行數(shù)據(jù)); inputCLOCK; input[23:0]I2C_DATA; inputGO; inputRESET; inputW_R; inoutI2C_SDAT; outputI2C_SCLK; outputEND; outputACK; output[5:0]SD_COUNTER;//I2C數(shù)據(jù)發(fā)送計(jì)數(shù)器

outputSDO; //I2C控制器發(fā)送的串行數(shù)據(jù)regSDO;regSCLK;regEND;reg[23:0]SD;reg[5:0]SD_COUNTER;wireI2C_SCLK=SCLK|(((SD_COUNTER>=4)&(SD_COUNTER<=30))?~CLOCK:0);wireI2C_SDAT=SDO?1'bz:0; //如果輸出數(shù)據(jù)為1,I2C_SDAT設(shè)為高阻regACK1,ACK2,ACK3;wireACK=ACK1|ACK2|ACK3; //ACK信號(hào)always@(negedgeRESETorposedgeCLOCK)beginif(!RESET)beginSCLK=1;SDO=1;ACK1=0;ACK2=0;ACK3=0;END=1;endelsecase(SD_COUNTER) 6'd0:beginACK1=0;ACK2=0;ACK3=0;END=0;SDO=1;SCLK=1;end //I2CSTART 6'd1:beginSD=I2C_DATA;SDO=0;end 6'd2:SCLK=0; //發(fā)送從設(shè)備地址

6'd3:SDO=SD[23];

6'd4:SDO=SD[22]; 6'd5:SDO=SD[21]; 6'd6:SDO=SD[20]; 6'd7:SDO=SD[19]; 6'd8:SDO=SD[18]; 6'd9:SDO=SD[17]; 6'd10:SDO=SD[16]; 6'd11:SDO=1'b1; //ACK

//發(fā)送從設(shè)備寄存器地址

6'd12:beginSDO=SD[15];ACK1=I2C_SDAT;end 6'd13:SDO=SD[14];

6'd14:SDO=SD[13]; 6'd15:SDO=SD[12]; 6'd16:SDO=SD[11]; 6'd17:SDO=SD[10]; 6'd18:SDO=SD[9]; 6'd19:SDO=SD[8]; 6'd20:SDO=1'b1; //ACK

//發(fā)送數(shù)據(jù)

6'd21:beginSDO=SD[7];ACK2=I2C_SDAT;end 6'd22:SDO=SD[6]; 6'd23:SDO=SD[5]; 6'd24:SDO=SD[4]; 6'd25:SDO=SD[3]; 6'd26:SDO=SD[2]; 6'd27:SDO=SD[1]; 6'd28:SDO=SD[0];

6'd29:SDO=1'b1; //ACK //I2CSTOP 6'd30:beginSDO=1'b0;SCLK=1'b0;ACK3=I2C_SDAT;end 6'd31:SCLK=1'b1; 6'd32:beginSDO=1'b1;END=1;endendcaseendendmodule代碼4.2是音頻編/解碼器配置的參考設(shè)計(jì)。模塊I2C_Audio_Config的時(shí)鐘輸入為DE2平臺(tái)上的50?MHz時(shí)鐘,I2C控制器時(shí)鐘為20?kHz,由50?MHz時(shí)鐘分頻得到。音頻編/解碼器配置數(shù)據(jù)存儲(chǔ)在查找表LUT_DATA中,LUT_DATA數(shù)據(jù)為16位,包括了WM8731的寄存器地址和寄存器數(shù)據(jù),共對(duì)10個(gè)寄存器的內(nèi)容進(jìn)行配置,配置時(shí)逐個(gè)寫入寄存器的值,寄存器索引代碼為L(zhǎng)UT_INDEX。每個(gè)寄存器的配置分為三步,并用mSetup_ST表示當(dāng)前進(jìn)行到了哪一步。第一步準(zhǔn)備數(shù)據(jù),將8位的從設(shè)備地址與LUT_DATA合并為24位數(shù)據(jù)mI2C_DATA,并將mI2C_GO置1,啟動(dòng)I2C傳輸;第二步檢測(cè)傳輸結(jié)束信號(hào),如果檢測(cè)到傳輸結(jié)束(mI2C_END=1),但ACK信號(hào)不正常,則返回第一步,重新發(fā)送數(shù)據(jù);如果檢測(cè)到傳輸結(jié)束且ACK信號(hào)正常,則進(jìn)入第三步,將寄存器索引LUT_INDEX加1,準(zhǔn)備下一個(gè)數(shù)據(jù)的傳輸。代碼4.2音頻編/解碼器配置代碼。moduleI2C_Audio_Config( iCLK, //時(shí)鐘輸入

iRST_N, //復(fù)位信號(hào)

I2C_SCLK, //I2C總線時(shí)鐘信號(hào)輸出

I2C_SDAT ); //I2C總線數(shù)據(jù)信號(hào)input iCLK;input iRST_N;output I2C_SCLK;inout I2C_SDAT;//內(nèi)部寄存器及連線reg [15:0] mI2C_CLK_DIV;reg [23:0] mI2C_DATA;reg mI2C_CTRL_CLK;reg mI2C_GO;wire mI2C_END;wire mI2C_ACK;reg [15:0] LUT_DATA;reg [5:0] LUT_INDEX;reg [3:0] mSetup_ST;//時(shí)鐘參數(shù)parameter CLK_Freq = 50000000; //輸入的系統(tǒng)時(shí)鐘50?MHzparameter I2C_Freq = 20000; //I2C總線時(shí)鐘20?kHz//存儲(chǔ)音頻編/解碼器配置數(shù)據(jù)的查找表容量parameter LUT_SIZE = 10;//音頻編/解碼器配置數(shù)據(jù)索引parameter SET_LIN_L = 0;parameter SET_LIN_R = 1;parameter SET_HEAD_L = 2;parameter SET_HEAD_R = 3;parameter A_PATH_CTRL = 4;parameter D_PATH_CTRL = 5;parameter POWER_ON = 6;parameter SET_FORMAT = 7;parameter SAMPLE_CTRL = 8;parameter SET_ACTIVE = 9;//////50?MHz時(shí)鐘分頻得到20?kHz的I2C控制時(shí)鐘//////always@(posedgeiCLKornegedgeiRST_N)begin if(!iRST_N) begin mI2C_CTRL_CLK <= 0; mI2C_CLK_DIV <= 0; end else begin if(mI2C_CLK_DIV <(CLK_Freq/I2C_Freq)) mI2C_CLK_DIV <= mI2C_CLK_DIV+1; else begin mI2C_CLK_DIV <= 0; mI2C_CTRL_CLK <= ~mI2C_CTRL_CLK; end endend////例化I2C控制器///I2C_Controlleru0(.CLOCK(mI2C_CTRL_CLK), //I2C控制器工作時(shí)鐘.I2C_SCLK(I2C_SCLK), //I2C總線時(shí)鐘信號(hào)

.I2C_SDAT(I2C_SDAT), //I2C總線數(shù)據(jù)信號(hào)

.I2C_DATA(mI2C_DATA), //DATA:[SLAVE_ADDR,SUB_ADDR,DATA] .GO(mI2C_GO), //啟動(dòng)傳輸

.END(mI2C_END), //傳輸結(jié)束標(biāo)志

.ACK(mI2C_ACK), //ACK .RESET(iRST_N) );//////////////////////?配置過程控制?////////////////////////////always@(posedgemI2C_CTRL_CLKornegedgeiRST_N)begin if(!iRST_N) //復(fù)位

begin LUT_INDEX <= 0; mSetup_ST <= 0; mI2C_GO <= 0; end else begin if(LUT_INDEX<LUT_SIZE) begin case(mSetup_ST) 0:begin //第一步:準(zhǔn)備數(shù)據(jù),啟動(dòng)傳輸

mI2C_DATA <= {8'h34,LUT_DATA}; mI2C_GO <= 1; mSetup_ST <= 1; end 1: begin if(mI2C_END)//第二步:檢驗(yàn)傳輸是否正常結(jié)束

begin if(!mI2C_ACK) mSetup_ST <= 2; else mSetup_ST <= 0; mI2C_GO <= 0; end end 2:begin //傳輸結(jié)束,改變LUT_INDEX的值,準(zhǔn)備傳輸下一個(gè)數(shù)據(jù)

LUT_INDEX <= LUT_INDEX+1; mSetup_ST <= 0; end endcase end endend/////////////////////?配置數(shù)據(jù)查找表?////////////////////////// alwaysbegin case(LUT_INDEX) SET_LIN_L :LUT_DATA <= 16'h001A; SET_LIN_R :LUT_DATA <= 16'h021A; SET_HEAD_L :LUT_DATA <= 16'h047B; SET_HEAD_R :LUT_DATA <= 16'h067B; A_PATH_CTRL :LUT_DATA <= 16'h08F8; D_PATH_CTRL :LUT_DATA <= 16'h0A06;

POWER_ON :LUT_DATA <= 16'h0C00;

SET_FORMAT :LUT_DATA <= 16'h0E01; SAMPLE_CTRL :LUT_DATA <= 16'h1002;

SET_ACTIVE :LUT_DATA <= 16'h1201; endcaseendendmodule4.2.3用WM8731D/A轉(zhuǎn)換器產(chǎn)生正弦波可以將WM8731的工作模式配置成主模式或從模式。主模式工作時(shí),由WM8731控制數(shù)字音頻數(shù)據(jù)接口的時(shí)序,從模式工作時(shí)WM8731響應(yīng)來自音頻數(shù)據(jù)接口的時(shí)序。WM8731的音頻數(shù)據(jù)格式有四種模式:左對(duì)齊、右對(duì)齊、I2S及DSP模式。與音頻數(shù)據(jù)傳輸有關(guān)的引腳如表4.2所示。音頻數(shù)據(jù)傳輸是串行傳輸,A/D轉(zhuǎn)換器LRC(或D/A轉(zhuǎn)換器LRC)提供左/右聲道的同步信號(hào),也確定了采樣速率,其頻率即為采樣頻率,BCLK是數(shù)字音頻位時(shí)鐘,提供位同步信號(hào)。左對(duì)齊數(shù)據(jù)格式的時(shí)序如圖4.4(a)所示,數(shù)據(jù)的MSB在D/A轉(zhuǎn)換器LRC或A/D轉(zhuǎn)換器LRC發(fā)生跳變之后的第一個(gè)BCLK的上升沿有效。右對(duì)齊數(shù)據(jù)格式的時(shí)序如圖4.4(b)所示,數(shù)據(jù)的MSB在D/A轉(zhuǎn)換器LRC或A/D轉(zhuǎn)換器LRC發(fā)生跳變之前的第n個(gè)BCLK的上升沿有效,其中n為數(shù)據(jù)位數(shù)。I2S模式數(shù)據(jù)格式的時(shí)序如圖4.4(c)所示,數(shù)據(jù)的MSB在D/A轉(zhuǎn)換器LRC或A/D轉(zhuǎn)換器LRC發(fā)生跳變之后的第二個(gè)BCLK的上升沿有效。DSP模式數(shù)據(jù)格式的時(shí)序如圖4.4(d)所示,左聲道數(shù)據(jù)的MSB在D/A轉(zhuǎn)換器LRC或A/D轉(zhuǎn)換器LRC發(fā)生正跳變之后的第一個(gè)或第二個(gè)(由LRP確定)BCLK的上升沿有效,右聲道的數(shù)據(jù)緊隨左聲道數(shù)據(jù)之后。圖4.4WM8731的音頻數(shù)據(jù)接口時(shí)序(a)左對(duì)齊;(b)右對(duì)齊;(c)?I2S模式;(d)?DSP模式代碼4.3是用WM8731產(chǎn)生正弦波。WM8731工作在從模式,數(shù)字音頻接口的時(shí)序由FPGA產(chǎn)生。代碼4.3用WM8731產(chǎn)生正弦波。moduleAUDIO_D/A轉(zhuǎn)換器( //數(shù)據(jù)音頻輸出引腳oAUD_BCK,oAUD_DATA,oAUD_LRCK,//控制信號(hào)iCLK_18_4,iRST_N ); //音頻信號(hào)參數(shù)parameter REF_CLK =18432000; //18.432?MHzparameter SAMPLE_RATE=48000; //48?kHzparameter DATA_WIDTH=16; //16?Bitsparameter CHANNEL_NUM =2; //雙通道parameter SIN_SAMPLE_DATA=48; //正弦波每個(gè)周期的采樣點(diǎn)數(shù)output oAUD_DATA;output oAUD_LRCK;output reg oAUD_BCK;input iCLK_18_4;input iRST_N;reg [3:0] BCK_DIV;reg [8:0] LRCK_1X_DIV;reg [7:0] LRCK_2X_DIV;reg [6:0] LRCK_4X_DIV;reg [3:0] SEL_Cont;reg [5:0] SIN_Cont; //數(shù)據(jù)計(jì)數(shù)器值,表明當(dāng)前數(shù)據(jù)是正弦波每個(gè)周期的第幾個(gè)點(diǎn)reg [DATA_WIDTH-1:0] Sin_Out;//正弦波輸出數(shù)據(jù)reg LRCK_1X;reg LRCK_2X;reg LRCK_4X;////////////?生成AUD_BCK信號(hào)//////////////always@(posedgeiCLK_18_4ornegedgeiRST_N)begin if(!iRST_N) begin BCK_DIV <= 0; oAUD_BCK <= 0; end else begin if(BCK_DIV>=REF_CLK/(SAMPLE_RATE*DATA_WIDTH*CHANNEL_NUM*2)-1) begin BCK_DIV <= 0; oAUD_BCK <= ~oAUD_BCK; end else BCK_DIV <= BCK_DIV+1; endend////////////生成AUD_LRCK信號(hào)//////////////always@(posedgeiCLK_18_4ornegedgeiRST_N)begin if(!iRST_N) begin LRCK_1X_DIV <= 0; LRCK_2X_DIV <= 0; LRCK_4X_DIV <= 0; LRCK_1X <= 0; LRCK_2X <= 0; LRCK_4X <= 0; end else begin //LRCK1X if(LRCK_1X_DIV>=REF_CLK/(SAMPLE_RATE*2)-1) begin LRCK_1X_DIV <= 0; LRCK_1X <= ~LRCK_1X; end else LRCK_1X_DIV<= LRCK_1X_DIV+1; //LRCK2X if(LRCK_2X_DIV>=REF_CLK/(SAMPLE_RATE*4)-1) begin LRCK_2X_DIV<= 0; LRCK_2X <= ~LRCK_2X; end else LRCK_2X_DIV <= LRCK_2X_DIV+1; //LRCK4X if(LRCK_4X_DIV >=REF_CLK/(SAMPLE_RATE*8)-1) begin LRCK_4X_DIV<= 0; LRCK_4X <= ~LRCK_4X; end else LRCK_4X_DIV <=LRCK_4X_DIV+1; end end assign oAUD_LRCK = LRCK_1X;//////////生成正弦查找表地址//////////////always@(negedgeLRCK_1XornegedgeiRST_N)begin if(!iRST_N) SIN_Cont <= 0; else begin if(SIN_Cont<SIN_SAMPLE_DATA-1) SIN_Cont <= SIN_Cont+1; else SIN_Cont <= 0; endend//////////輸出數(shù)據(jù)//////////////always@(negedgeoAUD_BCKornegedgeiRST_N)begin if(!iRST_N) SEL_Cont <= 0; else SEL_Cont <= SEL_Cont+1;endassign oAUD_DATA =Sin_Out[~SEL_Cont]; ////////////正弦表//////////////always@(SIN_Cont)begincase(SIN_Cont)0:Sin_Out<=0;1:Sin_Out<=4276;2:Sin_Out<=8480;3:Sin_Out<=12539;4:Sin_Out<=16383;5:Sin_Out<=19947;6:Sin_Out<=23169;7:Sin_Out<=25995;8:Sin_Out<=28377;9:Sin_Out<=30272;10:Sin_Out<=31650;11:Sin_Out<=32486;12:Sin_Out<=32767;13:Sin_Out<=32486;14:Sin_Out<=31650;15:Sin_Out<=30272;16:Sin_Out<=28377;17:Sin_Out<=25995;18:Sin_Out<=23169;19:Sin_Out<=19947;20:Sin_Out<=16383;21:Sin_Out<=12539;22:Sin_Out<=8480;23:Sin_Out<=4276;24:Sin_Out<=0;25:Sin_Out<=61259;26:Sin_Out<=57056;27:Sin_Out<=52997;28:Sin_Out<=49153;29:Sin_Out<=45589;30:Sin_Out<=42366;31:Sin_Out<=39540;32:Sin_Out<=37159;33:Sin_Out<=35263;34:Sin_Out<=33885;35:Sin_Out<=33049;36:Sin_Out<=32768;37:Sin_Out<=33049;38:Sin_Out<=33885;39:Sin_Out<=35263;40:Sin_Out<=37159;41:Sin_Out<=39540;42:Sin_Out<=42366;43:Sin_Out<=45589;44:Sin_Out<=49152;45:Sin_Out<=52997;46:Sin_Out<=57056;47:Sin_Out<=61259; default : Sin_Out <= 0; endcaseendendmodule接下來建立一個(gè)叫做audio_test的新工程來驗(yàn)證正弦波發(fā)生器。

Altera公司為DE2平臺(tái)提供的示范工程中,有一個(gè)工程DE2_top,DE2_top是一個(gè)非常簡(jiǎn)單的工程,其頂層文件DE2_top.v實(shí)現(xiàn)了DE2平臺(tái)上FPGA所有引腳的定義,可將所有輸入口置為三態(tài),并打開所有的顯示器,包括LCM、HEX0~HEX17、LEDG0~LEDG8及LEDR0~LEDR17。同時(shí),可以將DE2_top.v中引腳定義及初始化的內(nèi)容復(fù)制過來,再加入與本設(shè)計(jì)有關(guān)的模塊。代碼4.4是audio_test.v的代碼,其中略去了從DE2_top.v中復(fù)制的內(nèi)容。模塊Reset_Delay用以產(chǎn)生延時(shí)復(fù)位信號(hào),參見代碼4.5。音頻編/解碼器芯片需要18.432?MHz的時(shí)鐘輸入,Audio_PLL模塊使用鎖相環(huán)產(chǎn)生了一個(gè)頻率為18.409091MHz的時(shí)鐘信號(hào)。Audio_PLL模塊是用QuartusⅡ的MegaWizardPlug-InManager生成的,具體步驟如下:

(1)使用Tools>MegaWizardPlug-InManager菜單啟動(dòng)向?qū)В鐖D4.5所示。圖4.5啟動(dòng)MegaWizardPlug-InManager

(2)選擇Creatanewcustommegafunctionvariation。

(3)在宏功能列表中的I/O組中選擇ALTPLL,選擇文件輸出類型為VerilogHDL,輸出文件名稱為Audio_PLL.v,如圖4.6所示。圖4.6選擇ALTPLL并輸入文件名

(4)在向?qū)У牡?頁(page3of10)中輸入inclock0的頻率為27?MHz,如圖4.7所示。圖4.7確定輸入時(shí)鐘頻率

(5)其他選項(xiàng)不變,在第6頁(page6of10)的輸出c0設(shè)置頁,如圖4.8所示,選中Usethisclock選項(xiàng),則c0的參數(shù)設(shè)置框有效;選中Enteroutputclockfrequency,這樣可以讓ALTPLL根據(jù)輸出頻率自動(dòng)選擇鎖相環(huán)的設(shè)置;在Requestsettings中輸入18.432,ALTPLL自動(dòng)選擇最相近的參數(shù),即27?MHz經(jīng)過十五倍倍頻和二十七分頻之后可得到18.409091?MHz的信號(hào)。圖4.8設(shè)置輸出c0的參數(shù)

(6)其他選項(xiàng)不改變,繼續(xù)按提示完成向?qū)?。完成設(shè)計(jì)輸入之后,用Assignments>ImportAssignments菜單導(dǎo)入DE2系統(tǒng)光盤中的引腳分配文件DE2_pin_assignments.csv,完成引腳分配。完全編譯工程后,將生成的audiotest.sof文件下載到FPGA中,在DE2的LINEOUT插座上接上耳機(jī),可聽到1?kHz單音頻的聲音,輸出信號(hào)音量比較大,注意將耳機(jī)音量調(diào)小,以免損傷聽力,也可以用示波器查看輸出。代碼4.4audio_test.v。moduleaudio_test(//將DE2_top.v中引腳定義及初始化的內(nèi)容復(fù)制到此處Reset_Delayr0(.iCLK(CLOCK_50),.oRESET(DLY_RST) );Audio_PLLp1(.inclk0(CLOCK_27),.c0(AUD_CTRL_CLK));I2C_Audio_Configu3(.iCLK(CLOCK_50), .iRST_N(DLY_RST), .I2C_SCLK(I2C_SCLK), .I2C_SDAT(I2C_SDAT) );AUDIO_D/A轉(zhuǎn)換器 u4(.oAUD_BCK(AUD_BCLK), .oAUD_DATA(AUD_D/A轉(zhuǎn)換器DAT), .oAUD_LRCK(AUD_D/A轉(zhuǎn)換器LRCK), .iCLK_18_4(AUD_CTRL_CLK), .iRST_N(KEY[0]) );endmodule代碼4.5產(chǎn)生延時(shí)復(fù)位的代碼。module Reset_Delay(iCLK,oRESET);input iCLK;outputreg oRESET;reg [15:0] Cont;always@(posedgeiCLK)begin if(Cont!=16'hFFFF) begin Cont <= Cont+1; oRESET <= 1'b0; end else oRESET <= 1'b1;endendmodule4.3使用SDRAM及SRAM4.3.1在NiosⅡ中使用SDRAM建立一個(gè)新的QuartusⅡ工程,并且對(duì)工程命名,本例中為工程命名為SDRAMTest,選擇CycloneⅡEP2C35F672C6芯片。工程建立以后,用Tools>SOPCBuilder菜單啟動(dòng)SOPCBuilder,建立一個(gè)新的SOPC系統(tǒng),如圖4.9所示。本例中將新系統(tǒng)命名為top_sys,將TargetHDL選為Verilog,按OK按鈕。圖4.9為使用SDRAM建立一個(gè)新的SOPC系統(tǒng)建立系統(tǒng)的步驟如下:

(1)從組件庫中選擇NiosⅡProcessor-AlteraCoporation,按鼠標(biāo)右鍵彈出菜單,選中AddnewNiosⅡProcessor-AlteraCoporation。

(2)在彈出的NiosⅡCPU配置窗口中選擇NiosⅡCore為NiosⅡ/e,JTAGDebugModule選擇Level1,其他設(shè)置不變。

(3)單擊Finish完成NiosⅡ處理器的添加。

(4)接下來把SDRAM控制器添加到系統(tǒng)中,在組件庫的Memory組中選中SDRAMController,按鼠標(biāo)右鍵彈出菜單,選中AddNewSDRAMController,彈出SDRAM配置對(duì)話框。

(5)將DataWidth修改為16位,其他設(shè)置保持默認(rèn),也可以根據(jù)自己的要求改變其他配置,點(diǎn)擊Finish完成SDRAM控制器的添加。

(6)在系統(tǒng)模塊列表中選中sdram_0,按鼠標(biāo)右鍵彈出菜單,選擇Rename,將模塊的名稱改為SDRAM。

(7)在系統(tǒng)中添加On-ChipMemory以保存NiosⅡ軟件,在組件庫中的Memory組中選中On-ChipMemory,按鼠標(biāo)右鍵彈出菜單,選中AddNewOn-ChipMemory,彈出On-ChipMemory配置對(duì)話框。

(8)將TotalMemorySize改為40?KB,其他選項(xiàng)設(shè)置保持默認(rèn),點(diǎn)擊Finish完成On-ChipMemory的添加。

(9)為了方便調(diào)試SDRAM,添加8位LED燈作為指示,在組件庫的Others組中選中PIO(ParallelI/O),按鼠標(biāo)右鍵彈出菜單,選中AddNewPIO(ParallelI/O),彈出PIO配置對(duì)話框。

(10)保持默認(rèn)選項(xiàng)不變,單擊Finish完成添加,然后將該模塊名稱改為L(zhǎng)ED。添加完所有的模塊后,用System>Auto-AssignBaseAddresses菜單重新為系統(tǒng)中的所有模塊分配地址,重新分配地址后的模塊列表如圖4.10所示。點(diǎn)擊Next按鈕,進(jìn)入NiosⅡMorecpu_0settings,此時(shí)系統(tǒng)設(shè)置如圖4.11所示,從圖中可以看到,NiosⅡ處理器的復(fù)位地址(ResetAddress)、異常處理地址(ExceptionAddress)都設(shè)在onchip_memory_0中,斷點(diǎn)位置(BreakLocation)設(shè)在JTAG調(diào)試模塊中。單擊Generate按鈕生成系統(tǒng)。圖4.10配置完成后系統(tǒng)中的模塊圖4.11NiosⅡ處理器的地址分配生成SOPC系統(tǒng)后,在QuartusⅡ系統(tǒng)中建立一個(gè)頂層文件,來例化這個(gè)Nios系統(tǒng)。在QuartusⅡ中用File>New菜單打開新建文件對(duì)話框,選中BlockDiagram,建立一個(gè)新的原理圖文件(.bdf)。雙擊?.bdf文件中的空白處,打開Symbol窗口,在Symbol窗口的Libraries欄中展開Project項(xiàng),選中top_sys,然后按OK按鈕,將NiosⅡ處理器添加到原理圖中,并將這個(gè)原理圖文件以SDRAM.bdf的文件名保存。圖4.12為系統(tǒng)添加除clk及reset_n之外的引腳,DRAM_DQ[15..0]為雙向引腳,其他引腳均為輸出引腳。圖4.12NiosⅡ系統(tǒng)的引腳

DE2平臺(tái)上的SDRAM時(shí)序(請(qǐng)參照IC42S6400-7Tdatasheet),要求將DE2所提供的50?MHz時(shí)鐘延時(shí)3?ns或者相位延遲60°之后作為SDRAM的時(shí)鐘輸入DRAM_CLK,可以用鎖相環(huán)產(chǎn)生這個(gè)時(shí)鐘延遲。按下列步驟生成鎖相環(huán)的代碼:

(1)用Tools>MegaWizardPlug-InManager菜單建立一個(gè)新的Megafunction。

(2)在InstalledPlug-Ins中的I/O中選擇ALTPLL,并將輸出文件命名為SDRAM_CLK。

(3)在向?qū)У牡?頁中將inclock0的輸入頻率改為50?MHz。

(4)取消向?qū)У?頁的所有選項(xiàng)。

(5)將向?qū)У?頁中的ClockPhaseShift項(xiàng)設(shè)為60?deg或3?ns,其余參數(shù)保持不變,完成鎖相環(huán)的配置。生成鎖相環(huán)之后,在SDRAM.bdf中的空白處雙擊,Project中會(huì)出現(xiàn)一個(gè)SDRAM_PLL,將SDRAM_PLL添加到?.bdf文件中,然后參照?qǐng)D4.13完成?.bdf文件。鎖相環(huán)SDRAM_PLL的Verilog代碼在當(dāng)前工程的目錄中,名為SDRAM_PLL.v,可以用Quartus打開并查看其內(nèi)容。圖4.13完成之后的頂層設(shè)計(jì)文件完成頂層文件的設(shè)計(jì)之后,可以從DE2_pin_assignments.csv中導(dǎo)入引腳分配,保存工程,然后完整編譯工程并將工程下載到FPGA中去。具體過程可參照第3章的相關(guān)內(nèi)容。硬件設(shè)計(jì)完成之后,在NiosⅡIDE中通過軟件測(cè)試SDRAM的連接是否正確。按以下步驟完成測(cè)試:

(1)?NiosⅡ?IDE中,用New>C/C++Applications菜單建立一個(gè)新工程。

(2)選擇BlankProject模板。

(3)選擇硬件設(shè)計(jì)所在目錄中的top_sys.ptf文件作為系統(tǒng)文件。

(4)選擇cpu_0作為處理器。

5)點(diǎn)擊Finish完成工程創(chuàng)建。為工程新建一個(gè)文件SDRAM.c,文件中的內(nèi)容如代碼4.6所示。代碼4.6測(cè)試SDRAM的代碼。#include"system.h"#include"altera_avalon_pio_regs.h"intmain(){IOWR(SDRAM_BASE,0,3); //對(duì)SDRAM中0地址位寫數(shù)據(jù)3IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,IORD(SDRAM,0));//讀取SDRAM中0地址位數(shù)據(jù)并使LED顯示return0;}測(cè)試代碼中先向SDRAM的地址0寫入數(shù)據(jù)3,然后再將SDRAM中地址0的數(shù)據(jù)讀出來并在LED上顯示。編譯工程時(shí),選中工程并按鼠標(biāo)右鍵,在彈出的菜單中選擇RunasHardware下載并運(yùn)行程序,此時(shí)LEDR1和LEDR0亮,LEDR2~LEDR7不亮,表明SDRAM可用??稍诖舜a基礎(chǔ)上編寫更復(fù)雜的測(cè)試代碼和應(yīng)用代碼。需要注意的是,SOPCBuilder中將程序存儲(chǔ)器默認(rèn)為On-ChipMemory。可以按照下列步驟將ProgramMemory設(shè)定在SDRAM中:

(1)參照前文建立SOPC系統(tǒng)的步驟,將系統(tǒng)中的On-ChipMemory模塊刪除。

(2)將ResetAddress和ExceptionAddress都設(shè)在SDRAM中,重新生成top_sys,并且重新編譯下載QuartusⅡ工程文件。

(3)在NiosⅡ?IDE中,選中剛建立的工程,單擊鼠標(biāo)右鍵,選擇SystemLibraryProperties,彈出系統(tǒng)庫屬性設(shè)置對(duì)話框。

(4)在系統(tǒng)庫屬性設(shè)置對(duì)話框中,將ProgramMemory設(shè)置成SDRAM,選擇OK按鈕完成設(shè)置。完成以上步驟之后,將測(cè)試代碼修改為如代碼4.7所示的內(nèi)容,在這個(gè)代碼中,NiosⅡ處理器直接點(diǎn)亮LEDR0~LEDR7,編譯并運(yùn)行測(cè)試代碼,LEDR0~LEDR7全亮,說明程序已經(jīng)在SDRAM中成功運(yùn)行。代碼4.7程序在SDRAM中運(yùn)行的測(cè)試代碼。#include"system.h"#include"altera_avalon_pio_regs.h"intmain(){IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xff);

return0;}4.3.2在NiosⅡ中使用SRAM由于SOPCBuilder組件庫中沒有現(xiàn)成的SRAM組件,因此需要自己編寫SRAM與Avalon總線模塊的接口文件,并將SRAM作為自定義組件加入到SOPC系統(tǒng)中去。其余用法與SDRAM相同。為SRAM接口建立一個(gè)新的Verilog文件,命名為ext_sram.v,如代碼4.8所示。代碼4.8SRAM接口代碼ext_sram.v。module SRAM_16Bit_512K( //Avalon總線模塊側(cè)信號(hào)

oDATA,iDATA,iADDR, iWE_N,iOE_N, iCE_N,iRST_N, iUB_N,iLB_N, //SRAM側(cè)信號(hào)

SRAM_DQ, SRAM_ADDR, SRAM_UB_N, SRAM_LB_N, SRAM_WE_N, SRAM_CE_N, SRAM_OE_N );input [15:0] iDATA;output [15:0] oDATA;input [17:0] iADDR;input iWE_N,iOE_N;input iCE_N,iRST_N;input iUB_N,iLB_N;inout [15:0] SRAM_DQ;output [17:0] SRAM_ADDR;output SRAM_UB_N,SRAM_LB_N,SRAM_WE_N,SRAM_CE_N,SRAM_OE_N;assign SRAM_DQ =SRAM_WE_N?16'hzzzz:iDATA;assign oDATA = SRAM_DQ;assign SRAM_ADDR = iADDR;assign SRAM_WE_N = iWE_N;assign SRAM_OE_N = iOE_N;assign SRAM_CE_N = iCE_N;assign SRAM_RST_N = iRST_N;assign SRAM_UB_N = iUB_N;assign SRAM_LB_N = iLB_N;endmodule建立一個(gè)新的QuartusⅡ工程,并且對(duì)工程命名,本例中為工程命名為SRAM,選擇CycloneⅡ?EP2C35F672C6芯片。工程建立以后,用Tools>SOPCBuilder菜單啟動(dòng)SOPCBuilder,新建一個(gè)名為top_sys的SOPC系統(tǒng)。用File>NewComponent菜單建立一個(gè)新組件,在對(duì)話框中選擇HDLFiles,瀏覽并添加ext_sram.v文件。參照3.5.2小節(jié)中的步驟配置SRAM自定義組件,信號(hào)分配如圖4.14所示。圖4.14SRAM自定義組件的信號(hào)分配在AboutInterfaces頁中,將Slavingaddressing設(shè)置為Memory類型,根據(jù)DE2平臺(tái)上使用的SRAM時(shí)序(參考IS61LV25616AL數(shù)據(jù)手冊(cè))對(duì)ReadWait/WriteWait進(jìn)行設(shè)置,如圖4.15所示,其余選項(xiàng)不變。自定義組件添加完成后,在SOPCBuilder組件列表的UserLogic組中,增加了ext_sram組件,參照4.3.1小節(jié)中使用SDRAM的流程,建立一個(gè)新的SOPC系統(tǒng),將ext_sram組件添加到新系統(tǒng)中,完成硬件系統(tǒng)設(shè)計(jì),并在NiosⅡ?IDE中編寫測(cè)試軟件對(duì)SRAM進(jìn)行測(cè)試。圖4.15SRAM接口設(shè)置4.4視頻D/A轉(zhuǎn)換器4.4.1視頻D/A轉(zhuǎn)換器

ADV7123最高可以支持100?Hz刷新頻率時(shí)1600×1200像素的分辨率。ADV7123內(nèi)含三路最高可達(dá)240MS/s(萬百抽樣/秒)的10位視頻D/A轉(zhuǎn)換器,時(shí)鐘頻率為50?MHz,輸出1?MHz時(shí)的SFDR為?70?dB;時(shí)鐘頻率為140?MHz,輸出40?HMz信號(hào)時(shí)的SFDR為?53?dB。D/A轉(zhuǎn)換器的輸出電流范圍為2~26?mA,TTL兼容輸入,單電源工作電壓為+5?V/+3.3?V,+3.3?V工作時(shí)最小功耗為30?mW。

RGB顯示的視頻信號(hào)電平如圖4.16所示,圖中的IRE單位是國(guó)際無線電工程師學(xué)會(huì)制定的國(guó)際通用電視電平計(jì)算法,它以消隱電平為零電平基準(zhǔn)點(diǎn),向上將0.7?V(p-p值)的視頻信號(hào)分為10等分,每一單元為10?IRE;向下將?0.3?V(p-p值)的同步信號(hào)分為4等分,每一單元為10?IRE,該計(jì)量方式以整數(shù)為單位,非常方便。有一些資料中直接認(rèn)為1?IRE為0.7?V,則同步電平為?43?IRE,實(shí)際上都是?0.3?V。在一些設(shè)計(jì)中,同步信號(hào)在三種顏色的信號(hào)中都出現(xiàn),而目前常用的設(shè)計(jì)中,同步信號(hào)只在綠色信號(hào)中出現(xiàn),即所謂綠同步(SyncOnGreen)。綠色信號(hào)的范圍為0~1.0?V,紅色和藍(lán)色信號(hào)的范圍為0~0.7?V。RGB模擬輸出實(shí)際上是電流輸出,一般在模擬視頻傳輸線兩端各有一個(gè)75?Ω的終端電阻,當(dāng)輸出電平為0.7?V時(shí),輸出電流為18.67?mA;輸出電平為1.0?V時(shí),輸出電流為26.67?mA。圖4.16RGB顯示的視頻信號(hào)電平高速視頻D/A轉(zhuǎn)換器ADV7123的原理框圖如圖4.17所示。ADV7123由完全獨(dú)立的三個(gè)10位高速D/A轉(zhuǎn)換器組成,RGB視頻數(shù)據(jù)分別從R9~R0、G9~G0和B9~B0輸入,在時(shí)鐘CLOCK的上升沿鎖存到數(shù)據(jù)寄存器中,然后經(jīng)高速D/A轉(zhuǎn)換器轉(zhuǎn)換成模擬信號(hào)。三個(gè)獨(dú)立的視頻D/A轉(zhuǎn)換器都是電流型輸出,可以接成差分輸出,也可以接成單端輸出,DE2上按單端輸出連接,為滿足工業(yè)標(biāo)準(zhǔn),在模擬輸出端用75?Ω的電阻接地。消隱及同步邏輯控制輸出信號(hào)的同步和消隱,低電平有效的BLANK信號(hào)是復(fù)合消隱信號(hào),當(dāng)BLANK為低電平時(shí),模擬視頻輸出消隱電平,此時(shí)從R9~R0、G9~G0和B9~B0輸入的所有數(shù)據(jù)被忽略。同樣是低電平有效的SYNC信號(hào)是復(fù)合同步信號(hào),控制輸出信號(hào)的同步,SYNC為低電平時(shí),D/A轉(zhuǎn)換器關(guān)斷40?IRE的電流源。ADV7123只有在綠色輸出通道才有同步信號(hào)出現(xiàn)。BLANK和SYNC信號(hào)都是在CLOCK的上升沿被鎖存的。圖4.17ADV7123原理框圖

DE2平臺(tái)上視頻D/A轉(zhuǎn)換器部分的原理如圖4.18所示,F(xiàn)PGA輸出視頻數(shù)據(jù)信號(hào)VGA_R0~VGA_R9、VGA_G0~VGA_G9、VGA_B0~VGA_B9,分別連接到ADV7123的R0~R9、G0~G9和B0~B9。另外FPGA為ADV7123提供消隱信號(hào)VGA_BLANK、同步信號(hào)VGA_SYNC及時(shí)鐘信號(hào)VGA_CLOCK。輸出到VGA顯示器的水平同步信號(hào)VGA_HS和垂直同步信號(hào)VGA_VS由FPGA直接給出。圖4.18DE2視頻D/A轉(zhuǎn)換器原理圖

VGA顯示的基本時(shí)序如圖4.19所示,垂直和水平的時(shí)間周期都可以分為四個(gè)區(qū)間:同步脈沖a、同步脈沖結(jié)束與有效視頻信號(hào)開始之間的時(shí)間間隔即后沿b、有效視頻信號(hào)顯示區(qū)間c及有效視頻信號(hào)結(jié)束與同步脈沖開始之間的時(shí)間間隔即前沿d。圖4.19VGA顯示的基本時(shí)序不同配置的VGA模式,水平同步時(shí)間參數(shù)如表4.3所示,垂直同步時(shí)間參數(shù)如表4.4所示。4.4.2VGA顯示器應(yīng)用示例代碼4.9是一個(gè)帶十字光標(biāo)的VGA顯示控制器代碼,控制器的信號(hào)包括如下內(nèi)容:

(1)用于控制信號(hào)的光標(biāo)屬性。①光標(biāo)使能輸入:iCursor_EN,寬度為1位。②光標(biāo)橫坐標(biāo):iCursor_X,寬度為10位。③光標(biāo)縱坐標(biāo):iCursor_Y,寬度為10位。④光標(biāo)紅色信號(hào)強(qiáng)度:iCursor_R,寬度為10位。⑤光標(biāo)綠色信號(hào)強(qiáng)度:iCursor_G,寬度為10位。⑥光標(biāo)藍(lán)色信號(hào)強(qiáng)度:iCursor_B,寬度為10位。

(2)顯示數(shù)據(jù)的輸入信號(hào)。①紅色信號(hào)輸入數(shù)據(jù)iRed。②綠色信號(hào)輸入數(shù)據(jù)iGreen。③藍(lán)色信號(hào)輸入數(shù)據(jù)iBlue。

(3)控制信號(hào):包括時(shí)鐘信號(hào)iCLK及控制器復(fù)位信號(hào)iRST_N。

(4)?RAM地址輸出oAddress及當(dāng)前坐標(biāo)輸出oCoord_X和oCoord_Y。

(5)輸出到VGAD/A轉(zhuǎn)換器的信號(hào)。①紅色數(shù)據(jù)信號(hào)輸出:oVGA_R。②綠色數(shù)據(jù)信號(hào)輸出:oVGA_G。③藍(lán)色數(shù)據(jù)信號(hào)輸出:oVGA_B。④同步信號(hào)輸出:oVGA_SYNC。⑤消隱信號(hào)輸出:oVGA_BLANK。⑥時(shí)鐘輸出:oVGA_CLOCK。

(6)輸出到VGA接口的信號(hào)。①水平同步信號(hào)輸出:oVGA_H_SYNC。②垂直同步信號(hào)輸出:oVGA_V_SYNC。

VGA顯示的相關(guān)參數(shù)在代碼中以parameter的形式列出。控制器的輸入頻率應(yīng)為25.175?MHz,VGA控制器工作時(shí),需要外接一個(gè)RAM以保存當(dāng)前顯示的數(shù)據(jù),控制器根據(jù)不同時(shí)刻在VGA顯示器上顯示的像素位置,計(jì)算出RAM中當(dāng)前數(shù)據(jù)存放的地址并輸出RAM地址(oAddress信號(hào)),外接RAM控制器從該地址中讀取數(shù)據(jù),返回給VGA控制器(iRed,iGreen,iBlue),VGA控制器將顯示數(shù)據(jù)輸出到VGAD/A轉(zhuǎn)換器。如果在頂層設(shè)計(jì)中使用VGA_Controller模塊,那么可以通過光標(biāo)位置坐標(biāo)、光標(biāo)使能信號(hào)和光標(biāo)顏色信號(hào)來控制光標(biāo)的顯示。如果允許光標(biāo)顯示,則代碼中通過判斷當(dāng)前像素位置的橫坐標(biāo)或縱坐標(biāo)是否與光標(biāo)坐標(biāo)一致來確定當(dāng)前像素是顯示從RAM中讀取的數(shù)據(jù)還是顯示光標(biāo)的顏色,從而實(shí)現(xiàn)光標(biāo)的顯示,使用此VGA控制器的具體代碼不在此列出。代碼4.9VGA控制器代碼。module VGA_Controller( iCursor_EN, //光標(biāo)使能信號(hào)輸入

iCursor_X, //光標(biāo)橫坐標(biāo)

iCursor_Y, //光標(biāo)縱坐標(biāo)

iCursor_R, //光標(biāo)紅色信號(hào)強(qiáng)度

iCursor_G, //光標(biāo)綠色信號(hào)強(qiáng)度

iCursor_B, //光標(biāo)藍(lán)色信號(hào)強(qiáng)度

iRed, //紅色信號(hào)輸入數(shù)據(jù)

iGreen, //綠色信號(hào)輸入數(shù)據(jù)

iBlue, //藍(lán)色信號(hào)輸入數(shù)據(jù)

oAddress, //RAM地址輸出 oCoord_X, //輸出橫坐標(biāo)

oCoord_Y, //輸出縱坐標(biāo)

//輸出到VGA的信號(hào)

oVGA_R, //紅色數(shù)據(jù)信號(hào)輸出

oVGA_G, //綠色數(shù)據(jù)信號(hào)輸出

oVGA_B, //藍(lán)色數(shù)據(jù)信號(hào)輸出

oVGA_H_SYNC, //水平同步信號(hào)輸出

oVGA_V_SYNC, //垂直同步信號(hào)輸出

oVGA_SYNC, //同步信號(hào)輸出

oVGA_BLANK, //消隱信號(hào)輸出

oVGA_CLOCK, //時(shí)鐘輸出

iCLK, //時(shí)鐘輸入

iRST_N); //控制器復(fù)位信號(hào)輸入//水平參數(shù)(單位:像素)parameterH_SYNC_CYC=96;parameterH_SYNC_BACK=45+3;parameter H_SYNC_ACT=640; parameter H_SYNC_FRONT=13+3;parameter H_SYNC_TOTAL=800;//垂直參數(shù)(單位:線)parameter V_SYNC_CYC=2;parameter V_SYNC_BACK=30+2;parameter V_SYNC_ACT=480;parameter V_SYNC_FRONT=9+2;parameter V_SYNC_TOTAL=525;//起始偏移parameter X_START=H_SYNC_CYC+H_SYNC_BACK+4;parameter Y_START=V_SYNC_CYC+V_SYNC_BACK;//主控制器側(cè)信號(hào)output reg [19:0] oAddress;output reg [9:0] oCoord_X;output reg [9:0] oCoord_Y;input iCursor_EN;input [9:0] iCursor_X;input [9:0] iCursor_Y;input [9:0] iCursor_R;input [9:0] iCursor_G;input [9:0] iCursor_B;input [9:0] iRed;input [9:0] iGreen;input [9:0] iBlue;//VGA信號(hào)output [9:0] oVGA_R;output [9:0] oVGA_G;output [9:0] oVGA_B;output reg oVGA_H_SYNC;output reg oVGA_V_SYNC;output oVGA_SYNC;output oVGA_BLANK;output oVGA_CLOCK;//控制信號(hào)input iCLK;input iRST_N;//內(nèi)部寄存器及連線reg [9:0] H_Cont;reg [9:0] V_Co

溫馨提示

  • 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)論