




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第4章DE2平臺應用4.1DE2平臺內嵌的USBBlaster及FPGA配置4.2音頻編/解碼4.3使用SDRAM及SRAM4.4視頻D/A轉換器4.5彩色LCM顯示器4.6用DE2平臺實現視頻解碼4.7USBOTG4.8網絡接口4.9RS232接口4.10DE2控制面板4.11DE2高級應用范例4.12LCM及CIS在DE2平臺上的應用范例4.1DE2平臺內嵌的USBBlaster及FPGA配置
CycloneⅡ系列FPGA支持AS、PS和JTAG等三種配置模式,DE2平臺上集成了USBBlaster,可以為EP2C35提供兩種配置模式:JTAG模式和AS(主動串行)模式。DE2平臺上內嵌的USBBlaster的原理框圖如圖4.1所示。圖4.1DE2平臺上內嵌的USBBlaster原理框圖
JTAG及EPCS16的編程邏輯由CPLDEPM3128AT完成。用SW19來選擇FPGA是編程模式還是運行模式,在編程模式下,USBBlaster可通過AS模式對EPCS16進行編程;在運行模式下,上電后,FPGA從EPCS16中讀取配置數據,對FPGA進行配置。CycloneⅡ系列FPGA支持在AS模式配置時的配置數據壓縮,即將配置數據壓縮后保存在配置器件中,上電配置時將壓縮后的配置數據讀入FPGA,FPGA對壓縮數據流實時解壓后寫入RAM中完成對FPGA的配置。配置數據在配置器件中進行壓縮存儲可以使總的配置數據量縮減35%~55%。這種壓縮在DE2上是沒有必要的,因為EPCS16的存儲器容量足以配置EP2C35,而且EPCS16中剩余的空間還可以用來保存用戶數據。當SW19置于運行位置時,可通過JTAG模式對FPGA進行配置。JTAG模式不支持配置數據的壓縮。JTAG模式配置完成后,FPGA自動按新的配置工作,但系統(tǒng)重新上電后,FPGA仍然自動從EPCS16中讀取配置數據來配置FPGA。
AS模式和JTAG模式通過不同的信號連線對FPGA進行配置。EPM3128AT通過圖4.1中的JTAG2配置FPGA,通過配置信號連線從EPCS16中讀取AS模式的配置數據。EPM3128AT與FPGA之間還有一個類似于JTAG的數據鏈路,DE2控制面板使用這個數據鏈路實現與FPGA的通信。使用JTAG模式配置FPGA的步驟如下:
(1)打開DE2平臺電源。
(2)用USB電纜通過DE2的USBBlaster接口(J9)將DE2平臺與電腦相連。
(3)將SW19置于RUN。
(4)在QuartusⅡ中或NiosⅡ?IDE中指定SOF文件并用JTAG模式配置FPGA。
AS模式下配置FPGA的步驟如下:
(1)打開DE2平臺電源。
(2)用USB電纜通過DE2的USBBlaster接口(J9)將DE2平臺與電腦相連。
(3)將SW19置于PROG。
(4)在QuartusⅡ中指定POF文件并用AS模式對EPCS16編程。
(5)將SW19置于RUN,系統(tǒng)重新上電,FPGA自動從EPCS16中讀取配置數據,對FPGA進行配置。圖4.1中,FT232BM芯片實現了USB與并行數據接口的轉換,FT232BM的配置信息保存在EEPROM芯片93C46中,EEPROM中的數據如下:如果93C46中的信息丟失,將DE2平臺通過USBBlaster接口連接到PC上時,PC會自動識別到一個“USB<>SerialCable”的設備。此時,先從FT232BM原廠網站上下載原始驅動程序,下載地址為/Drivers/D2XX.htm,將此驅動程序作為“USB<>SerialCable”的驅動程序安裝到電腦上。然后再從上下載MPROG軟件,重新配置,用MPROG軟件可重新配置USBBlaseter,并能夠將數據寫入93C46中。USBBlaster具體配置如下:DeviceType:FT232BMUSBVID/PID:OwnVID&PIDVendorID:09FBProductorID:6001USBVersionNumber:USB1.1PullDownIOPinsinUSBSuspend:YESManufacture:AlteraProductDescription:USB-BlasterUSBPowerOption:BusPowered,MaxBusPower150milliAmpsSerialNumberPrefix:91也可以通過JP3對93C46編程,參照本書附錄A中的圖A.20,93C46的CLK、DO、CS、GND引腳分別與JP3的6、7、8、10腳相連,將通用編程器通過自制電纜與JP3相連,在編程軟件中手動輸入EEPROM數據,然后將數據寫入93C46即可,這種方法只有對相關技術非常熟悉的用戶可用。圖A.20中JP3與EPM3128AT相連的JTAG1是CPLDEPM3128AT的配置JTAG連線。4.2音頻編/解碼4.2.1音頻編/解碼硬件芯片WM8731
DE2的音頻輸入/輸出由Wolfson公司的低功耗立體聲音24位音頻編/解碼芯片WM8731完成。WM8731的音頻采樣速率為8~96?kHz可調;提供2線與3線兩種與主控制器的接口方式;支持四種音頻數據格式:I2S模式、左對齊模式、右對齊模式和DSP模式。
WM8731包含了線路輸入、麥克風輸入及耳機輸出。兩路線路輸入RLINEIN和LLINEIN能以1.5?dB的步距在+12~?34.5?dB范圍內進行對數音量調節(jié),完成A/D轉換后,還可以進行高通數字濾波,有效去除輸入中的直流成分。一路麥克風輸入可以在?6~34?dB范圍內進行音量調節(jié)。這三路模擬輸入都有單獨的靜音功能。D/A轉換器輸出、線路輸入旁路及麥克風輸入經過側音電路后可相加作為輸出,可以直接驅動線路輸出(LOUT和ROUT),也可以通過耳機放大器輸出,以驅動耳機(RHPOUT和LHPOUT)。耳機放大電路的增益可以在+6~?73?dB范圍內以1?dB步距進行調整。
DE2音頻部分電路如圖4.2所示。DE2平臺上的LINEOUT(J3)接在經過耳機放大器放大的耳機輸出上,可以直接驅動耳機。LINEIN(J2)經過隔直電容輸入,而MICIN(J1)則直接輸入。圖4.2DE2音頻部分電路
WM8731的MODE腳接地,選擇了2線控制器接口,控制器通過I2C總線控制WM8731,圖中的I2C_SCLK和I2C_SDAT接口是從FPGA引出的I2C總線,與視頻解碼器共用控制總線。2線模式下,通過引腳CSB選擇WM8731在I2C總線上的地址,若CSB引腳接地,則讀地址為0x34,寫地址為0x35??偩€數據B[15:0]中,B[15:9]是WM8731中控制寄存器的地址,B[8:0]是寄存器中的數值。WM8731寄存器的地址分配及定義如表4.1所示。圖4.3為WM8731I2C總線的時序。圖4.3WM8731I2C總線的時序4.2.2WM8731控制電路的實現對WM8731的控制通過I2C總線來實現,代碼4.1是用VerilogHDL實現I2C控制器的參考代碼。本例中只實現了I2C寫數據,而沒有實現完整的I2C控制器。在這個I2C控制器中,輸入CLOCK是I2C控制器的時鐘輸入,在對這個I2C控制器進行例化時,要提供一個滿足I2C標準的時鐘。I2C控制器每次傳輸24位數據,前8位是從設備地址SLAVE_ADDR,接下來8位是從設備的寄存器地址SUB_ADDR,最后8位是數據。WM8731的I2C通信數據格式中有7位寄存器地址和9位數據,與I2C控制器的數據格式定義不一致,實際傳輸時,SUB_ADDR的高7位為寄存器地址,最后1位是9位數據的最高位。本例中,I2C控制器使用33個I2C時鐘周期完成1次傳輸24位數據。第1個時鐘周期用于初始化控制器,第2、3個周期用于啟動傳輸,第4~30個周期用于傳輸數據(其中包含24位數據和3個ACK),最后3個周期用以停止傳輸??刂破髦惺褂昧艘粋€6位計數器SD_COUNTER對傳輸周期計數。在開始傳輸之前與終止傳輸之后,I2C_SCLK信號都應該保持高電平。I2C的起始條件(START)與終止條件(STOP)由I2C_SCLK與I2C_SDAT配合完成,在代碼中增加了一個1位寄存器SCLK,用以產生START條件和STOP條件。在START之前、STOP之后,SCLK=1;產生START條件之后,至產生STOP條件之前,SCLK=0。數據傳輸期間,I2C_SCLK由CLOCK提供。代碼4.1I2C控制器代碼。moduleI2C_Controller( CLOCK, //I2C控制器時鐘輸入
I2C_SCLK, //I2C總線時鐘信號輸出
I2C_SDAT, //I2C總線數據信號
I2C_DATA, //要傳輸的數據DATA:[SLAVE_ADDR,SUB_ADDR,DATA] GO, //啟動傳輸
END, //傳輸結束標志
ACK, //ACK信號輸出
RESET, //I2C控制器復位信號
//以下信號為測試信號
SD_COUNTER, //I2C數據發(fā)送計數器
SDO //I2C控制器發(fā)送的串行數據); inputCLOCK; input[23:0]I2C_DATA; inputGO; inputRESET; inputW_R; inoutI2C_SDAT; outputI2C_SCLK; outputEND; outputACK; output[5:0]SD_COUNTER;//I2C數據發(fā)送計數器
outputSDO; //I2C控制器發(fā)送的串行數據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; //如果輸出數據為1,I2C_SDAT設為高阻regACK1,ACK2,ACK3;wireACK=ACK1|ACK2|ACK3; //ACK信號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ā)送從設備地址
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ā)送從設備寄存器地址
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ā)送數據
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是音頻編/解碼器配置的參考設計。模塊I2C_Audio_Config的時鐘輸入為DE2平臺上的50?MHz時鐘,I2C控制器時鐘為20?kHz,由50?MHz時鐘分頻得到。音頻編/解碼器配置數據存儲在查找表LUT_DATA中,LUT_DATA數據為16位,包括了WM8731的寄存器地址和寄存器數據,共對10個寄存器的內容進行配置,配置時逐個寫入寄存器的值,寄存器索引代碼為LUT_INDEX。每個寄存器的配置分為三步,并用mSetup_ST表示當前進行到了哪一步。第一步準備數據,將8位的從設備地址與LUT_DATA合并為24位數據mI2C_DATA,并將mI2C_GO置1,啟動I2C傳輸;第二步檢測傳輸結束信號,如果檢測到傳輸結束(mI2C_END=1),但ACK信號不正常,則返回第一步,重新發(fā)送數據;如果檢測到傳輸結束且ACK信號正常,則進入第三步,將寄存器索引LUT_INDEX加1,準備下一個數據的傳輸。代碼4.2音頻編/解碼器配置代碼。moduleI2C_Audio_Config( iCLK, //時鐘輸入
iRST_N, //復位信號
I2C_SCLK, //I2C總線時鐘信號輸出
I2C_SDAT ); //I2C總線數據信號input iCLK;input iRST_N;output I2C_SCLK;inout I2C_SDAT;//內部寄存器及連線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;//時鐘參數parameter CLK_Freq = 50000000; //輸入的系統(tǒng)時鐘50?MHzparameter I2C_Freq = 20000; //I2C總線時鐘20?kHz//存儲音頻編/解碼器配置數據的查找表容量parameter LUT_SIZE = 10;//音頻編/解碼器配置數據索引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時鐘分頻得到20?kHz的I2C控制時鐘//////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控制器工作時鐘.I2C_SCLK(I2C_SCLK), //I2C總線時鐘信號
.I2C_SDAT(I2C_SDAT), //I2C總線數據信號
.I2C_DATA(mI2C_DATA), //DATA:[SLAVE_ADDR,SUB_ADDR,DATA] .GO(mI2C_GO), //啟動傳輸
.END(mI2C_END), //傳輸結束標志
.ACK(mI2C_ACK), //ACK .RESET(iRST_N) );//////////////////////?配置過程控制?////////////////////////////always@(posedgemI2C_CTRL_CLKornegedgeiRST_N)begin if(!iRST_N) //復位
begin LUT_INDEX <= 0; mSetup_ST <= 0; mI2C_GO <= 0; end else begin if(LUT_INDEX<LUT_SIZE) begin case(mSetup_ST) 0:begin //第一步:準備數據,啟動傳輸
mI2C_DATA <= {8'h34,LUT_DATA}; mI2C_GO <= 1; mSetup_ST <= 1; end 1: begin if(mI2C_END)//第二步:檢驗傳輸是否正常結束
begin if(!mI2C_ACK) mSetup_ST <= 2; else mSetup_ST <= 0; mI2C_GO <= 0; end end 2:begin //傳輸結束,改變LUT_INDEX的值,準備傳輸下一個數據
LUT_INDEX <= LUT_INDEX+1; mSetup_ST <= 0; end endcase end endend/////////////////////?配置數據查找表?////////////////////////// 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轉換器產生正弦波可以將WM8731的工作模式配置成主模式或從模式。主模式工作時,由WM8731控制數字音頻數據接口的時序,從模式工作時WM8731響應來自音頻數據接口的時序。WM8731的音頻數據格式有四種模式:左對齊、右對齊、I2S及DSP模式。與音頻數據傳輸有關的引腳如表4.2所示。音頻數據傳輸是串行傳輸,A/D轉換器LRC(或D/A轉換器LRC)提供左/右聲道的同步信號,也確定了采樣速率,其頻率即為采樣頻率,BCLK是數字音頻位時鐘,提供位同步信號。左對齊數據格式的時序如圖4.4(a)所示,數據的MSB在D/A轉換器LRC或A/D轉換器LRC發(fā)生跳變之后的第一個BCLK的上升沿有效。右對齊數據格式的時序如圖4.4(b)所示,數據的MSB在D/A轉換器LRC或A/D轉換器LRC發(fā)生跳變之前的第n個BCLK的上升沿有效,其中n為數據位數。I2S模式數據格式的時序如圖4.4(c)所示,數據的MSB在D/A轉換器LRC或A/D轉換器LRC發(fā)生跳變之后的第二個BCLK的上升沿有效。DSP模式數據格式的時序如圖4.4(d)所示,左聲道數據的MSB在D/A轉換器LRC或A/D轉換器LRC發(fā)生正跳變之后的第一個或第二個(由LRP確定)BCLK的上升沿有效,右聲道的數據緊隨左聲道數據之后。圖4.4WM8731的音頻數據接口時序(a)左對齊;(b)右對齊;(c)?I2S模式;(d)?DSP模式代碼4.3是用WM8731產生正弦波。WM8731工作在從模式,數字音頻接口的時序由FPGA產生。代碼4.3用WM8731產生正弦波。moduleAUDIO_D/A轉換器( //數據音頻輸出引腳oAUD_BCK,oAUD_DATA,oAUD_LRCK,//控制信號iCLK_18_4,iRST_N ); //音頻信號參數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; //正弦波每個周期的采樣點數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; //數據計數器值,表明當前數據是正弦波每個周期的第幾個點reg [DATA_WIDTH-1:0] Sin_Out;//正弦波輸出數據reg LRCK_1X;reg LRCK_2X;reg LRCK_4X;////////////?生成AUD_BCK信號//////////////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信號//////////////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//////////輸出數據//////////////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接下來建立一個叫做audio_test的新工程來驗證正弦波發(fā)生器。
Altera公司為DE2平臺提供的示范工程中,有一個工程DE2_top,DE2_top是一個非常簡單的工程,其頂層文件DE2_top.v實現了DE2平臺上FPGA所有引腳的定義,可將所有輸入口置為三態(tài),并打開所有的顯示器,包括LCM、HEX0~HEX17、LEDG0~LEDG8及LEDR0~LEDR17。同時,可以將DE2_top.v中引腳定義及初始化的內容復制過來,再加入與本設計有關的模塊。代碼4.4是audio_test.v的代碼,其中略去了從DE2_top.v中復制的內容。模塊Reset_Delay用以產生延時復位信號,參見代碼4.5。音頻編/解碼器芯片需要18.432?MHz的時鐘輸入,Audio_PLL模塊使用鎖相環(huán)產生了一個頻率為18.409091MHz的時鐘信號。Audio_PLL模塊是用QuartusⅡ的MegaWizardPlug-InManager生成的,具體步驟如下:
(1)使用Tools>MegaWizardPlug-InManager菜單啟動向導,如圖4.5所示。圖4.5啟動MegaWizardPlug-InManager
(2)選擇Creatanewcustommegafunctionvariation。
(3)在宏功能列表中的I/O組中選擇ALTPLL,選擇文件輸出類型為VerilogHDL,輸出文件名稱為Audio_PLL.v,如圖4.6所示。圖4.6選擇ALTPLL并輸入文件名
(4)在向導的第3頁(page3of10)中輸入inclock0的頻率為27?MHz,如圖4.7所示。圖4.7確定輸入時鐘頻率
(5)其他選項不變,在第6頁(page6of10)的輸出c0設置頁,如圖4.8所示,選中Usethisclock選項,則c0的參數設置框有效;選中Enteroutputclockfrequency,這樣可以讓ALTPLL根據輸出頻率自動選擇鎖相環(huán)的設置;在Requestsettings中輸入18.432,ALTPLL自動選擇最相近的參數,即27?MHz經過十五倍倍頻和二十七分頻之后可得到18.409091?MHz的信號。圖4.8設置輸出c0的參數
(6)其他選項不改變,繼續(xù)按提示完成向導。完成設計輸入之后,用Assignments>ImportAssignments菜單導入DE2系統(tǒng)光盤中的引腳分配文件DE2_pin_assignments.csv,完成引腳分配。完全編譯工程后,將生成的audiotest.sof文件下載到FPGA中,在DE2的LINEOUT插座上接上耳機,可聽到1?kHz單音頻的聲音,輸出信號音量比較大,注意將耳機音量調小,以免損傷聽力,也可以用示波器查看輸出。代碼4.4audio_test.v。moduleaudio_test(//將DE2_top.v中引腳定義及初始化的內容復制到此處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轉換器 u4(.oAUD_BCK(AUD_BCLK), .oAUD_DATA(AUD_D/A轉換器DAT), .oAUD_LRCK(AUD_D/A轉換器LRCK), .iCLK_18_4(AUD_CTRL_CLK), .iRST_N(KEY[0]) );endmodule代碼4.5產生延時復位的代碼。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建立一個新的QuartusⅡ工程,并且對工程命名,本例中為工程命名為SDRAMTest,選擇CycloneⅡEP2C35F672C6芯片。工程建立以后,用Tools>SOPCBuilder菜單啟動SOPCBuilder,建立一個新的SOPC系統(tǒng),如圖4.9所示。本例中將新系統(tǒng)命名為top_sys,將TargetHDL選為Verilog,按OK按鈕。圖4.9為使用SDRAM建立一個新的SOPC系統(tǒng)建立系統(tǒng)的步驟如下:
(1)從組件庫中選擇NiosⅡProcessor-AlteraCoporation,按鼠標右鍵彈出菜單,選中AddnewNiosⅡProcessor-AlteraCoporation。
(2)在彈出的NiosⅡCPU配置窗口中選擇NiosⅡCore為NiosⅡ/e,JTAGDebugModule選擇Level1,其他設置不變。
(3)單擊Finish完成NiosⅡ處理器的添加。
(4)接下來把SDRAM控制器添加到系統(tǒng)中,在組件庫的Memory組中選中SDRAMController,按鼠標右鍵彈出菜單,選中AddNewSDRAMController,彈出SDRAM配置對話框。
(5)將DataWidth修改為16位,其他設置保持默認,也可以根據自己的要求改變其他配置,點擊Finish完成SDRAM控制器的添加。
(6)在系統(tǒng)模塊列表中選中sdram_0,按鼠標右鍵彈出菜單,選擇Rename,將模塊的名稱改為SDRAM。
(7)在系統(tǒng)中添加On-ChipMemory以保存NiosⅡ軟件,在組件庫中的Memory組中選中On-ChipMemory,按鼠標右鍵彈出菜單,選中AddNewOn-ChipMemory,彈出On-ChipMemory配置對話框。
(8)將TotalMemorySize改為40?KB,其他選項設置保持默認,點擊Finish完成On-ChipMemory的添加。
(9)為了方便調試SDRAM,添加8位LED燈作為指示,在組件庫的Others組中選中PIO(ParallelI/O),按鼠標右鍵彈出菜單,選中AddNewPIO(ParallelI/O),彈出PIO配置對話框。
(10)保持默認選項不變,單擊Finish完成添加,然后將該模塊名稱改為LED。添加完所有的模塊后,用System>Auto-AssignBaseAddresses菜單重新為系統(tǒng)中的所有模塊分配地址,重新分配地址后的模塊列表如圖4.10所示。點擊Next按鈕,進入NiosⅡMorecpu_0settings,此時系統(tǒng)設置如圖4.11所示,從圖中可以看到,NiosⅡ處理器的復位地址(ResetAddress)、異常處理地址(ExceptionAddress)都設在onchip_memory_0中,斷點位置(BreakLocation)設在JTAG調試模塊中。單擊Generate按鈕生成系統(tǒng)。圖4.10配置完成后系統(tǒng)中的模塊圖4.11NiosⅡ處理器的地址分配生成SOPC系統(tǒng)后,在QuartusⅡ系統(tǒng)中建立一個頂層文件,來例化這個Nios系統(tǒng)。在QuartusⅡ中用File>New菜單打開新建文件對話框,選中BlockDiagram,建立一個新的原理圖文件(.bdf)。雙擊?.bdf文件中的空白處,打開Symbol窗口,在Symbol窗口的Libraries欄中展開Project項,選中top_sys,然后按OK按鈕,將NiosⅡ處理器添加到原理圖中,并將這個原理圖文件以SDRAM.bdf的文件名保存。圖4.12為系統(tǒng)添加除clk及reset_n之外的引腳,DRAM_DQ[15..0]為雙向引腳,其他引腳均為輸出引腳。圖4.12NiosⅡ系統(tǒng)的引腳
DE2平臺上的SDRAM時序(請參照IC42S6400-7Tdatasheet),要求將DE2所提供的50?MHz時鐘延時3?ns或者相位延遲60°之后作為SDRAM的時鐘輸入DRAM_CLK,可以用鎖相環(huán)產生這個時鐘延遲。按下列步驟生成鎖相環(huán)的代碼:
(1)用Tools>MegaWizardPlug-InManager菜單建立一個新的Megafunction。
(2)在InstalledPlug-Ins中的I/O中選擇ALTPLL,并將輸出文件命名為SDRAM_CLK。
(3)在向導的第3頁中將inclock0的輸入頻率改為50?MHz。
(4)取消向導第4頁的所有選項。
(5)將向導第6頁中的ClockPhaseShift項設為60?deg或3?ns,其余參數保持不變,完成鎖相環(huán)的配置。生成鎖相環(huán)之后,在SDRAM.bdf中的空白處雙擊,Project中會出現一個SDRAM_PLL,將SDRAM_PLL添加到?.bdf文件中,然后參照圖4.13完成?.bdf文件。鎖相環(huán)SDRAM_PLL的Verilog代碼在當前工程的目錄中,名為SDRAM_PLL.v,可以用Quartus打開并查看其內容。圖4.13完成之后的頂層設計文件完成頂層文件的設計之后,可以從DE2_pin_assignments.csv中導入引腳分配,保存工程,然后完整編譯工程并將工程下載到FPGA中去。具體過程可參照第3章的相關內容。硬件設計完成之后,在NiosⅡIDE中通過軟件測試SDRAM的連接是否正確。按以下步驟完成測試:
(1)?NiosⅡ?IDE中,用New>C/C++Applications菜單建立一個新工程。
(2)選擇BlankProject模板。
(3)選擇硬件設計所在目錄中的top_sys.ptf文件作為系統(tǒng)文件。
(4)選擇cpu_0作為處理器。
5)點擊Finish完成工程創(chuàng)建。為工程新建一個文件SDRAM.c,文件中的內容如代碼4.6所示。代碼4.6測試SDRAM的代碼。#include"system.h"#include"altera_avalon_pio_regs.h"intmain(){IOWR(SDRAM_BASE,0,3); //對SDRAM中0地址位寫數據3IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,IORD(SDRAM,0));//讀取SDRAM中0地址位數據并使LED顯示return0;}測試代碼中先向SDRAM的地址0寫入數據3,然后再將SDRAM中地址0的數據讀出來并在LED上顯示。編譯工程時,選中工程并按鼠標右鍵,在彈出的菜單中選擇RunasHardware下載并運行程序,此時LEDR1和LEDR0亮,LEDR2~LEDR7不亮,表明SDRAM可用。可在此代碼基礎上編寫更復雜的測試代碼和應用代碼。需要注意的是,SOPCBuilder中將程序存儲器默認為On-ChipMemory。可以按照下列步驟將ProgramMemory設定在SDRAM中:
(1)參照前文建立SOPC系統(tǒng)的步驟,將系統(tǒng)中的On-ChipMemory模塊刪除。
(2)將ResetAddress和ExceptionAddress都設在SDRAM中,重新生成top_sys,并且重新編譯下載QuartusⅡ工程文件。
(3)在NiosⅡ?IDE中,選中剛建立的工程,單擊鼠標右鍵,選擇SystemLibraryProperties,彈出系統(tǒng)庫屬性設置對話框。
(4)在系統(tǒng)庫屬性設置對話框中,將ProgramMemory設置成SDRAM,選擇OK按鈕完成設置。完成以上步驟之后,將測試代碼修改為如代碼4.7所示的內容,在這個代碼中,NiosⅡ處理器直接點亮LEDR0~LEDR7,編譯并運行測試代碼,LEDR0~LEDR7全亮,說明程序已經在SDRAM中成功運行。代碼4.7程序在SDRAM中運行的測試代碼。#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組件庫中沒有現成的SRAM組件,因此需要自己編寫SRAM與Avalon總線模塊的接口文件,并將SRAM作為自定義組件加入到SOPC系統(tǒng)中去。其余用法與SDRAM相同。為SRAM接口建立一個新的Verilog文件,命名為ext_sram.v,如代碼4.8所示。代碼4.8SRAM接口代碼ext_sram.v。module SRAM_16Bit_512K( //Avalon總線模塊側信號
oDATA,iDATA,iADDR, iWE_N,iOE_N, iCE_N,iRST_N, iUB_N,iLB_N, //SRAM側信號
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建立一個新的QuartusⅡ工程,并且對工程命名,本例中為工程命名為SRAM,選擇CycloneⅡ?EP2C35F672C6芯片。工程建立以后,用Tools>SOPCBuilder菜單啟動SOPCBuilder,新建一個名為top_sys的SOPC系統(tǒng)。用File>NewComponent菜單建立一個新組件,在對話框中選擇HDLFiles,瀏覽并添加ext_sram.v文件。參照3.5.2小節(jié)中的步驟配置SRAM自定義組件,信號分配如圖4.14所示。圖4.14SRAM自定義組件的信號分配在AboutInterfaces頁中,將Slavingaddressing設置為Memory類型,根據DE2平臺上使用的SRAM時序(參考IS61LV25616AL數據手冊)對ReadWait/WriteWait進行設置,如圖4.15所示,其余選項不變。自定義組件添加完成后,在SOPCBuilder組件列表的UserLogic組中,增加了ext_sram組件,參照4.3.1小節(jié)中使用SDRAM的流程,建立一個新的SOPC系統(tǒng),將ext_sram組件添加到新系統(tǒng)中,完成硬件系統(tǒng)設計,并在NiosⅡ?IDE中編寫測試軟件對SRAM進行測試。圖4.15SRAM接口設置4.4視頻D/A轉換器4.4.1視頻D/A轉換器
ADV7123最高可以支持100?Hz刷新頻率時1600×1200像素的分辨率。ADV7123內含三路最高可達240MS/s(萬百抽樣/秒)的10位視頻D/A轉換器,時鐘頻率為50?MHz,輸出1?MHz時的SFDR為?70?dB;時鐘頻率為140?MHz,輸出40?HMz信號時的SFDR為?53?dB。D/A轉換器的輸出電流范圍為2~26?mA,TTL兼容輸入,單電源工作電壓為+5?V/+3.3?V,+3.3?V工作時最小功耗為30?mW。
RGB顯示的視頻信號電平如圖4.16所示,圖中的IRE單位是國際無線電工程師學會制定的國際通用電視電平計算法,它以消隱電平為零電平基準點,向上將0.7?V(p-p值)的視頻信號分為10等分,每一單元為10?IRE;向下將?0.3?V(p-p值)的同步信號分為4等分,每一單元為10?IRE,該計量方式以整數為單位,非常方便。有一些資料中直接認為1?IRE為0.7?V,則同步電平為?43?IRE,實際上都是?0.3?V。在一些設計中,同步信號在三種顏色的信號中都出現,而目前常用的設計中,同步信號只在綠色信號中出現,即所謂綠同步(SyncOnGreen)。綠色信號的范圍為0~1.0?V,紅色和藍色信號的范圍為0~0.7?V。RGB模擬輸出實際上是電流輸出,一般在模擬視頻傳輸線兩端各有一個75?Ω的終端電阻,當輸出電平為0.7?V時,輸出電流為18.67?mA;輸出電平為1.0?V時,輸出電流為26.67?mA。圖4.16RGB顯示的視頻信號電平高速視頻D/A轉換器ADV7123的原理框圖如圖4.17所示。ADV7123由完全獨立的三個10位高速D/A轉換器組成,RGB視頻數據分別從R9~R0、G9~G0和B9~B0輸入,在時鐘CLOCK的上升沿鎖存到數據寄存器中,然后經高速D/A轉換器轉換成模擬信號。三個獨立的視頻D/A轉換器都是電流型輸出,可以接成差分輸出,也可以接成單端輸出,DE2上按單端輸出連接,為滿足工業(yè)標準,在模擬輸出端用75?Ω的電阻接地。消隱及同步邏輯控制輸出信號的同步和消隱,低電平有效的BLANK信號是復合消隱信號,當BLANK為低電平時,模擬視頻輸出消隱電平,此時從R9~R0、G9~G0和B9~B0輸入的所有數據被忽略。同樣是低電平有效的SYNC信號是復合同步信號,控制輸出信號的同步,SYNC為低電平時,D/A轉換器關斷40?IRE的電流源。ADV7123只有在綠色輸出通道才有同步信號出現。BLANK和SYNC信號都是在CLOCK的上升沿被鎖存的。圖4.17ADV7123原理框圖
DE2平臺上視頻D/A轉換器部分的原理如圖4.18所示,FPGA輸出視頻數據信號VGA_R0~VGA_R9、VGA_G0~VGA_G9、VGA_B0~VGA_B9,分別連接到ADV7123的R0~R9、G0~G9和B0~B9。另外FPGA為ADV7123提供消隱信號VGA_BLANK、同步信號VGA_SYNC及時鐘信號VGA_CLOCK。輸出到VGA顯示器的水平同步信號VGA_HS和垂直同步信號VGA_VS由FPGA直接給出。圖4.18DE2視頻D/A轉換器原理圖
VGA顯示的基本時序如圖4.19所示,垂直和水平的時間周期都可以分為四個區(qū)間:同步脈沖a、同步脈沖結束與有效視頻信號開始之間的時間間隔即后沿b、有效視頻信號顯示區(qū)間c及有效視頻信號結束與同步脈沖開始之間的時間間隔即前沿d。圖4.19VGA顯示的基本時序不同配置的VGA模式,水平同步時間參數如表4.3所示,垂直同步時間參數如表4.4所示。4.4.2VGA顯示器應用示例代碼4.9是一個帶十字光標的VGA顯示控制器代碼,控制器的信號包括如下內容:
(1)用于控制信號的光標屬性。①光標使能輸入:iCursor_EN,寬度為1位。②光標橫坐標:iCursor_X,寬度為10位。③光標縱坐標:iCursor_Y,寬度為10位。④光標紅色信號強度:iCursor_R,寬度為10位。⑤光標綠色信號強度:iCursor_G,寬度為10位。⑥光標藍色信號強度:iCursor_B,寬度為10位。
(2)顯示數據的輸入信號。①紅色信號輸入數據iRed。②綠色信號輸入數據iGreen。③藍色信號輸入數據iBlue。
(3)控制信號:包括時鐘信號iCLK及控制器復位信號iRST_N。
(4)?RAM地址輸出oAddress及當前坐標輸出oCoord_X和oCoord_Y。
(5)輸出到VGAD/A轉換器的信號。①紅色數據信號輸出:oVGA_R。②綠色數據信號輸出:oVGA_G。③藍色數據信號輸出:oVGA_B。④同步信號輸出:oVGA_SYNC。⑤消隱信號輸出:oVGA_BLANK。⑥時鐘輸出:oVGA_CLOCK。
(6)輸出到VGA接口的信號。①水平同步信號輸出:oVGA_H_SYNC。②垂直同步信號輸出:oVGA_V_SYNC。
VGA顯示的相關參數在代碼中以parameter的形式列出??刂破鞯妮斎腩l率應為25.175?MHz,VGA控制器工作時,需要外接一個RAM以保存當前顯示的數據,控制器根據不同時刻在VGA顯示器上顯示的像素位置,計算出RAM中當前數據存放的地址并輸出RAM地址(oAddress信號),外接RAM控制器從該地址中讀取數據,返回給VGA控制器(iRed,iGreen,iBlue),VGA控制器將顯示數據輸出到VGAD/A轉換器。如果在頂層設計中使用VGA_Controller模塊,那么可以通過光標位置坐標、光標使能信號和光標顏色信號來控制光標的顯示。如果允許光標顯示,則代碼中通過判斷當前像素位置的橫坐標或縱坐標是否與光標坐標一致來確定當前像素是顯示從RAM中讀取的數據還是顯示光標的顏色,從而實現光標的顯示,使用此VGA控制器的具體代碼不在此列出。代碼4.9VGA控制器代碼。module VGA_Controller( iCursor_EN, //光標使能信號輸入
iCursor_X, //光標橫坐標
iCursor_Y, //光標縱坐標
iCursor_R, //光標紅色信號強度
iCursor_G, //光標綠色信號強度
iCursor_B, //光標藍色信號強度
iRed, //紅色信號輸入數據
iGreen, //綠色信號輸入數據
iBlue, //藍色信號輸入數據
oAddress, //RAM地址輸出 oCoord_X, //輸出橫坐標
oCoord_Y, //輸出縱坐標
//輸出到VGA的信號
oVGA_R, //紅色數據信號輸出
oVGA_G, //綠色數據信號輸出
oVGA_B, //藍色數據信號輸出
oVGA_H_SYNC, //水平同步信號輸出
oVGA_V_SYNC, //垂直同步信號輸出
oVGA_SYNC, //同步信號輸出
oVGA_BLANK, //消隱信號輸出
oVGA_CLOCK, //時鐘輸出
iCLK, //時鐘輸入
iRST_N); //控制器復位信號輸入//水平參數(單位:像素)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;//垂直參數(單位:線)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;//主控制器側信號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信號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;//控制信號input iCLK;input iRST_N;//內部寄存器及連線reg [9:0] H_Cont;reg [9:0] V_Co
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆廣東省普寧市華僑中學高三第二次調研化學試卷含解析
- 河南許昌普高2025屆高三第五次模擬考試化學試卷含解析
- 2025屆廣西貴港市覃塘高級中學高三下學期聯(lián)合考試化學試題含解析
- 2025年LED超大屏幕顯示器項目建議書
- 湖北省鄂東南示范高中教改聯(lián)盟2025年高三下學期聯(lián)合考試化學試題含解析
- 護理小講課:高血壓
- 中考數學高頻考點專項練習:專題15 考點35 與圓有關的計算 (1)及答案
- 2025屆陜西省商洛市丹鳳中學高考考前模擬化學試題含解析
- 三效定格管理體系
- 打造多彩現場教學課件
- 2024中國山東省集中供熱行業(yè)發(fā)展趨勢預測及投資戰(zhàn)略咨詢報告
- 七年級數學新北師大版(2024)下冊第一章《整式的乘除》單元檢測習題(含簡單答案)
- 2024員工質量意識培訓
- 《冠心病》課件(完整版)
- 經緯度數轉換工具
- NB_T 10438-2020《風力發(fā)電機組 電控偏航控制系統(tǒng)技術條件》_(高清最新)
- 導向系統(tǒng)設計(課堂PPT)
- 混凝土凝結時間計算及報告(樣表)
- 高中生物 第4節(jié)細胞的癌變課件 新人教版必修1
- 石料生產線項目投資建設方案
- 基于單片機的智能溫變暖手寶的設計
評論
0/150
提交評論