2010电子设计大赛.ppt
2010年北京市大学生电子设计竞赛试题,要求用指定的FPGA平台结合SOPC技术构造一个乒乓球游戏机。系统结构如果所示,FPGA通过两条I/O信号输出两组脉宽调制波,经过低通滤波器提取脉宽调制的均值电压,输入到双通道示波器中。示波器工作在X/Y模式。示波器屏幕上的光点代表乒乓球。 乒乓球X/Y电压的控制下在屏幕上移动。,基本要求: 1.构造两组无源低通滤波器,使得FPGA可以用脉宽调制方式控制球的位置(20分) 2.用给定的运放制作一放大器,使光点运动范围在示波器的X轴,Y轴方向上可调(10分) 3.乒乓球可按抛物线自动在屏幕上左右弹射,球的落点为屏幕两侧边的中间。(20分),扩展要求: 1.使用两个按钮分别作为左侧击球钮和右侧击球钮。当乒乓球靠近屏幕左边时按下左侧击球钮,可将球击回右侧。右侧击球钮亦然。(10分) 2.建立成败机制,即球抵达边沿而未按下击球钮,记为击球失败,用LED灯光表示。(10分) 3.建立记分机制,在七段数码管上显示双方得分(10分) 4.特殊功能,在不调整放大器的情况下,连按两下击球钮能击出高抛球,轨迹抛物线曲率变大(20分),竞赛板卡,扩展I/0,RS232,VGA接口,电源,开关,按钮,七段数码管,扩展I/0,LED,器材,示波器、稳压源、函数信号发生器、导线、电烙铁、个人PC机、RS232串口线、Hep EXCD竞赛开发板、竞赛对插通用电路板、万用表、镊子、面包板、松香等。,电子元件,0.1uF电容若干、220uF电容若干 、1K电阻若干、10K电阻若干、51K电阻若干、100K电阻若干、10K电位器若干、LM324运放一片等。,设计思路,FPGA,无源低通 滤波器,无源低通 滤波器,增益可调 放大器,增益可调 放大器,X,Y,双踪示波器,PWM1 (线性),PWM2 (非线性),击球按钮,七段数码 管显示计分,硬件部分 无源低通滤波器分析,硬件部分 无源低通滤波器分析,硬件部分 无源低通滤波器,FH=1/sqrt(2*pi*RC),硬件部分 增益可调放大器,UI=UO*R1/(RF+R1) UO=UI*(1+RF/R1) 6AV+oo,硬件电路总体设计,软件部分 大思路,count (VHDL),Compare (C语言),PWM,软件部分 大思路,PWM,count (VHDL),Compare (C语言),软件部分 大思路,PWM1:VHDL在底层实现一个双向计数器,和一个比较器;而比较匹配值则由C语言实时通过驱动程序更新,从而产生脉宽可调波;PWM2则类似;C语言通过数组保存小球运动的抛物线的轨迹;还有复杂的击球以及计分模块。,slv_reg0(32位),slv_reg0(0 to 15) (16位),slv_reg0(16 to 31) (16位),C语言,线性控制 比较匹配值,非线性控制 比较匹配值,PWM1,PWM2,VHDL语言,API接口( slv_reg0 寄存器),PWMj(32位),软件部分 VHDL 框图,双向 计数器,双向 计数器,Bus2IP_Clk,逻辑矢量 -无符号,逻辑矢量 -无符号,slv_reg0(32位),slv_reg0(0 to 15) (16位),slv_reg0(16 to 31) (16位),逻辑矢量 -无符号,逻辑矢量 -无符号,比较器,比较器,PWM1,PWM2,分频器,divclk,divclk,Count1,count2,count_value2,count_value1,compare1,compare2,compare_value1,compare_value2,软件部分 VHDL 端口及信号量,PWM1 : out std_logic; PWM2 : out std_logic; signal divclk : std_logic; -分频时钟 signal count1 : std_logic_vector(0 to 15):=X“0000“;-计数器1 signal count_value1: unsigned(0 to 15); -无符号计数值1 signal count2 : std_logic_vector(0 to 15):=X“0000“;-计数器2 signal count_value2 : unsigned(0 to 15); -无符号计数值2 signal compare1 : std_logic_vector(0 to 15); -比较匹配值1 signal compare_value1: unsigned(0 to 15); -无符号比较匹配值1 signal compare2 : std_logic_vector(0 to 15); -比较匹配值2 signal compare_value2 : unsigned(0 to 15); -无符号比较匹配值2 signal dir1 : std_logic:='1' -计数器1计数方向标志1为增计数,0为减计数 signal dir2 : std_logic:='1' -计数器2计数方向标志1为增计数,0为减计数 signal slv_reg0 : std_logic_vector(0 to C_SLV_DWIDTH-1);,软件部分 VHDL 时钟分频,PWM_CLK_DIV_PROC:process(Bus2IP_Clk) variable count1:integer:=0; begin if(rising_edge(Bus2IP_Clk) then if (count1=5) then count1:=0; divclk=not divclk; else count1:=count1+1; end if; end if; end process PWM_CLK_DIV_PROC;,软件部分 VHDL,-逻辑矢量转换为无符号数以便比较 count_value1=unsigned(count1); count_value2=unsigned(count2); compare_value1=unsigned(compare1); compare_value2=unsigned(compare2);,软件部分 VHDL PWM 核心部分,PWM_PROC:process(divclk) begin if(rising_edge(divclk) then if count1 = X“07FF“ then dir1='0' elsif count1 = X“0000“ then dir1='1' end if;-计数器1计数范围0到7FF if count2 = X“0FFF“ then dir2='0' elsif count2 = X“0000“ then dir2='1' end if;-计数器2计数范围0到FFF -计数 if dir1 = '1' then count1 = count1 + 1; elsif dir1 ='0' then count1 = count1 - 1; end if;,if dir2 = '1' then count2 = count2 + 1; elsif dir2 = '0' then count2 = count2 - 1; end if; -两路比较器 if count_value1=compare_value1 then PWM1='1' else PWM1='0' end if; if count_value2=compare_value2 then PWM2='1' else PWM2='0' end if; end if; end process PWM_PROC;,软件部分 VHDL PWM 与C语言接口,compare1=slv_reg0(16 to 31); -C语言传递32为无符号值的低16位作为比较器1的比较值 compare2=slv_reg0(0 to 15); -C语言传递32为无符号值的高16位作为比较器2的比较值,软件部分 C语言 框图,开始,设备初始化 变量定义 数据计算,小球落到 两侧?,失败计分清零 改变运动方向,小球运动 到下一 轨迹点,N,Y,是否 可以击球?,计分加一 改变运动方向,N,Y,成功击球?,读取击球 按钮信息,N,Y,软件部分 C语言,/延时程序 void delay() volatile int i; for (i = 0; i 20000; i+); ,软件部分 C语言,Void fail() XGpio_DiscreteWrite( ,软件部分 C语言,int main (void) Xuint32 Status; /读取GPIO初始化状态 XGpio Push_Bottons_4Bit; /定义GPIO按钮 XGpio Led_8Bit; /定义GPIO Xuint32 DataRead; /读取按钮数据 Xuint32 PWM256; /抽样256个点,保存在数组 Xuint32 count=0x0; /定义计分变量 int i,j=2,dir=1,inside_flag,hit_flag; /定义轨迹方向变量、击球标志、可击球标志,软件部分 C语言 计算抛物线轨迹,Status = XGpio_Initialize( /设置为输出,软件部分 C语言 计算抛物线轨迹,for(i=0;i256;i+) PWMi=(i*16)*65536+2039-(255-i)*i/8; /计算256个点的轨迹值,高16为是线性轨迹,低16位为抛物线轨迹,软件部分 C语言,while(1) if(j=0) /如果运动到第0个点、失败,计分清零、改变轨迹方向 dir=1; SEG_CTRL_IP_mWriteSlaveReg0(XPAR_SEG_CTRL_IP_0_BASEADDR,0,0x0); XGpio_DiscreteWrite( ,软件部分 C语言,if(j=255) /如果运动到第255个点、失败,计分清零、改变轨迹方向 dir=0; SEG_CTRL_IP_mWriteSlaveReg0(XPAR_SEG_CTRL_IP_0_BASEADDR,0,0x0); XGpio_DiscreteWrite(,软件部分 C语言 核心语句,PWM_IP_mWriteSlaveReg0(XPAR_PWM_IP_0_BASEADDR,0,PWMj); /在一个时刻的点的轨迹(比较匹配值)通过API函数接口传递给底层硬件 delay();/延时 if(j=0 /小球运动到第56和199个点时清除击球标志,软件部分 C语言,if(inside_flag=1) ,竞赛感想,一、锻炼了动手能力 二、收获了自信 三、磨练了自己的意志 四、深化了对理论知识的理解 五、学到了很多书本上没有的新知识,竞赛建议,一、复习好模电,打好基础 二、自学DSP、FPGA、单片机,注重理 解其本质,对其中的逻辑关系要弄熟。 三、学好计算机组成原理。 四、学习独立查询英文数据手册。 五、自己买通用电路板进行焊接,调试,锻炼实际动手能力。 六、小组之间一定要配合默契,不懂的问题可以讨论,但是尽量自己独立解决。,一些必须掌握的基础知识,一、A/D D/A 二、七段数码管 三、VGA 四、GPIO 五、LED灯 六、运放电路设计 七、三极管高频放大电路 八、功率放大器,九、频率计 十、C语言 十一、LCD液晶显示模块 十二、调制解调电路 十三、单片机、DSP 十四、传输协议、差错控制 十五、滤波器设计,FPGA 竞赛板卡 按钮(4 Bit),Xuint32 Status; /读取GPIO初始化状态 XGpio Push_Bottons_4Bit; /定义GPIO按钮 Xuint32 DataRead; /读取按钮数据 Status = XGpio_Initialize( /读取按键信息 DataRead = 0x7 按钮1 DataRead = 0xB 按钮2 DataRead = 0xD 按钮3 DataRead = 0xE 按钮4,FPGA 竞赛板卡 LED(8 Bit),Xuint32 Status; /读取GPIO初始化状态 XGpio Led_8Bit; /定义GPIO Xuint32 DataWrite; /读取按钮数据 Status = XGpio_Initialize( /输出数据,FPGA 竞赛板卡 Switch(8 Bit),Xuint32 Status; /读取GPIO初始化状态 XGpio Switches_8Bit; /定义GPIO Xuint32 DataRead; /读取按钮数据 Status = XGpio_Initialize( /读取数据,FPGA 竞赛板卡 IP核与C语言,PWM_IP_mWriteSlaveReg0(XPAR_PWM_IP_0_BASEADDR,0,PWMj); /C语言=VHDL 例子:PWM ip核 Data=ADC_CTRL_IP_mReadSlaveReg0(XPAR_ADC_CTRL_IP_0_BASEADDR, 0); /VHDL=C语言 例子:ADC ip核 基地址从Xparameters.h查询,谢谢!预祝各位参加2011年全国电子设计大赛的同学取得好成绩!,