版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第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自动按新的配置工作,但系统重新上电后,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,系统重新上电,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范围内进行对数音量调节,完成A/D转换后,还可以进行高通数字滤波,有效去除输入中的直流成分。一路麦克风输入可以在−6~34 dB范围内进行音量调节。这三路模拟输入都有单独的静音功能。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数据发送计数器
SDO //I2C控制器发送的串行数据); inputCLOCK; input[23:0]I2C_DATA; inputGO; inputRESET; inputW_R; inoutI2C_SDAT; outputI2C_SCLK; outputEND; outputACK; output[5:0]SD_COUNTER;//I2C数据发送计数器
outputSDO; //I2C控制器发送的串行数据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; //发送从设备地址
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
//发送从设备寄存器地址
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
//发送数据
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信号不正常,则返回第一步,重新发送数据;如果检测到传输结束且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; //输入的系统时钟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发生跳变之后的第一个BCLK的上升沿有效。右对齐数据格式的时序如图4.4(b)所示,数据的MSB在D/A转换器LRC或A/D转换器LRC发生跳变之前的第n个BCLK的上升沿有效,其中n为数据位数。I2S模式数据格式的时序如图4.4(c)所示,数据的MSB在D/A转换器LRC或A/D转换器LRC发生跳变之后的第二个BCLK的上升沿有效。DSP模式数据格式的时序如图4.4(d)所示,左声道数据的MSB在D/A转换器LRC或A/D转换器LRC发生正跳变之后的第一个或第二个(由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的新工程来验证正弦波发生器。
Altera公司为DE2平台提供的示范工程中,有一个工程DE2_top,DE2_top是一个非常简单的工程,其顶层文件DE2_top.v实现了DE2平台上FPGA所有引脚的定义,可将所有输入口置为三态,并打开所有的显示器,包括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模块使用锁相环产生了一个频率为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根据输出频率自动选择锁相环的设置;在Requestsettings中输入18.432,ALTPLL自动选择最相近的参数,即27 MHz经过十五倍倍频和二十七分频之后可得到18.409091 MHz的信号。图4.8设置输出c0的参数
(6)其他选项不改变,继续按提示完成向导。完成设计输入之后,用Assignments>ImportAssignments菜单导入DE2系统光盘中的引脚分配文件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系统,如图4.9所示。本例中将新系统命名为top_sys,将TargetHDL选为Verilog,按OK按钮。图4.9为使用SDRAM建立一个新的SOPC系统建立系统的步骤如下:
(1)从组件库中选择NiosⅡProcessor-AlteraCoporation,按鼠标右键弹出菜单,选中AddnewNiosⅡProcessor-AlteraCoporation。
(2)在弹出的NiosⅡCPU配置窗口中选择NiosⅡCore为NiosⅡ/e,JTAGDebugModule选择Level1,其他设置不变。
(3)单击Finish完成NiosⅡ处理器的添加。
(4)接下来把SDRAM控制器添加到系统中,在组件库的Memory组中选中SDRAMController,按鼠标右键弹出菜单,选中AddNewSDRAMController,弹出SDRAM配置对话框。
(5)将DataWidth修改为16位,其他设置保持默认,也可以根据自己的要求改变其他配置,点击Finish完成SDRAM控制器的添加。
(6)在系统模块列表中选中sdram_0,按鼠标右键弹出菜单,选择Rename,将模块的名称改为SDRAM。
(7)在系统中添加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菜单重新为系统中的所有模块分配地址,重新分配地址后的模块列表如图4.10所示。点击Next按钮,进入NiosⅡMorecpu_0settings,此时系统设置如图4.11所示,从图中可以看到,NiosⅡ处理器的复位地址(ResetAddress)、异常处理地址(ExceptionAddress)都设在onchip_memory_0中,断点位置(BreakLocation)设在JTAG调试模块中。单击Generate按钮生成系统。图4.10配置完成后系统中的模块图4.11NiosⅡ处理器的地址分配生成SOPC系统后,在QuartusⅡ系统中建立一个顶层文件,来例化这个Nios系统。在QuartusⅡ中用File>New菜单打开新建文件对话框,选中BlockDiagram,建立一个新的原理图文件(.bdf)。双击 .bdf文件中的空白处,打开Symbol窗口,在Symbol窗口的Libraries栏中展开Project项,选中top_sys,然后按OK按钮,将NiosⅡ处理器添加到原理图中,并将这个原理图文件以SDRAM.bdf的文件名保存。图4.12为系统添加除clk及reset_n之外的引脚,DRAM_DQ[15..0]为双向引脚,其他引脚均为输出引脚。图4.12NiosⅡ系统的引脚
DE2平台上的SDRAM时序(请参照IC42S6400-7Tdatasheet),要求将DE2所提供的50 MHz时钟延时3 ns或者相位延迟60°之后作为SDRAM的时钟输入DRAM_CLK,可以用锁相环产生这个时钟延迟。按下列步骤生成锁相环的代码:
(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,其余参数保持不变,完成锁相环的配置。生成锁相环之后,在SDRAM.bdf中的空白处双击,Project中会出现一个SDRAM_PLL,将SDRAM_PLL添加到 .bdf文件中,然后参照图4.13完成 .bdf文件。锁相环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文件作为系统文件。
(4)选择cpu_0作为处理器。
5)点击Finish完成工程创建。为工程新建一个文件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系统的步骤,将系统中的On-ChipMemory模块删除。
(2)将ResetAddress和ExceptionAddress都设在SDRAM中,重新生成top_sys,并且重新编译下载QuartusⅡ工程文件。
(3)在NiosⅡ IDE中,选中刚建立的工程,单击鼠标右键,选择SystemLibraryProperties,弹出系统库属性设置对话框。
(4)在系统库属性设置对话框中,将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系统中去。其余用法与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系统。用File>NewComponent菜单建立一个新组件,在对话框中选择HDLFiles,浏览并添加ext_sram.v文件。参照3.5.2小节中的步骤配置SRAM自定义组件,信号分配如图4.14所示。图4.14SRAM自定义组件的信号分配在AboutInterfaces页中,将Slavingaddressing设置为Memory类型,根据DE2平台上使用的SRAM时序(参考IS61LV25616AL数据手册)对ReadWait/WriteWait进行设置,如图4.15所示,其余选项不变。自定义组件添加完成后,在SOPCBuilder组件列表的UserLogic组中,增加了ext_sram组件,参照4.3.1小节中使用SDRAM的流程,建立一个新的SOPC系统,将ext_sram组件添加到新系统中,完成硬件系统设计,并在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上按单端输出连接,为满足工业标准,在模拟输出端用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所示,垂直和水平的时间周期都可以分为四个区间:同步脉冲a、同步脉冲结束与有效视频信号开始之间的时间间隔即后沿b、有效视频信号显示区间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的形式列出。控制器的输入频率应为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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度大米加工企业废弃物处理合作合同3篇
- 2024年甲乙双方关于购买家具的合同
- 办公环境的明灯创新型LED手电筒的贡献
- 办公环境中的安全生产管理与风险防范
- 2025中国铁路上海局集团限公司招聘577人高频重点提升(共500题)附带答案详解
- 2025中国联通广西分公司招聘88人高频重点提升(共500题)附带答案详解
- 2025中国移动浙江公司校园招聘580人高频重点提升(共500题)附带答案详解
- 2025中国电信河北沧州分公司校园招聘4人高频重点提升(共500题)附带答案详解
- 2025中国建筑一局(集团)限公司一公司广东分公司市场经理招聘高频重点提升(共500题)附带答案详解
- 2025中国化学工程重型机械化限公司招聘75人高频重点提升(共500题)附带答案详解
- 2024北京西城初一(上)期末数学(教师版)
- (2024年)中国传统文化介绍课件
- 宗亲捐款倡议书
- 蛇年春联对联240副
- 广东省广州天河区2023-2024学年八年级上学期期末数学试卷含答案
- 江苏省百校2025届高三上学期12月联考语文试题(含答案)
- 北京市朝阳区2023-2024学年四年级上学期期末英语试题
- 2024年职业卫生技术人员评价方向考试题库附答案
- 人体器官有偿捐赠流程
- 《了凡四训》课件
- 味精生产废水处理工程设计毕业设计
评论
0/150
提交评论