版主: 51FPGA |
winthony
![]()
最后登陆时间:2014-12-10 11:58:59 |
|
此贴由winthony于2013-04-07 19:02:07最后编辑
|
|
winthony
![]()
最后登陆时间:2014-12-10 11:58:59 |
呵呵,事情比较多,慢慢更新。 先说说器件选型吧。这次项目是要做一块视频处理验证平台,要求带有VGA,HDMI,DVI常用的视频接口,LVDS信号输入输出,MCU与PC通信,并且可以通过MCU进行寄存器读写操作,预留必要的调试接口。逻辑资源的要求不高,满足应用即可。 首先进行的是外围接口芯片选型,确定接口芯片功能型号以后就可以确定需要使用的IO数量。经过统计,外围接口芯片需要的IO有三百多根,加上测试预留的几十根IO,一共需要FPGA最少有400根左右的GPIO。再加上逻辑资源的要求,最终确定选择Xilinx公司的V4系列,XC4VLX60FF668。逻辑资源满足要求,IO数量448正好能满足要求,FPGA的IO基本都用上了,物尽其用。 就FPGA板的设计,最初的器件选型很关键,关系到设计难易,项目成本等很多因素。最需要注意的就是逻辑资源和IO数量。除此以外,PLL,DLL,全局时钟,RAM,等等资源就根据项目要求具体选择了。芯片选好了就开始原理图的设计工作 |
winthony
![]()
最后登陆时间:2014-12-10 11:58:59 |
原理图设计
FPGA原理图设计是个很幸福的事情。由于FPGA的芯片特性,给设计人员提供了最大的自由度,你可以完全的按照自己的设计意图进行设计,受到的器件方面的限制不大,当然也有些需要注意的地方。 1、JTAG电路。说JTAG是FPGA设计最重要的部分一点都不过分。只要最终设计的JTAG接口能够正常工作,芯片可以正常下载调试,其他外设的小设计失误,经常能够通过其他方式解决。但是JTAG接口电路一旦设计错误,一块板子设计的再好也是废品了。不过这部分电路难度并不大,网上的资料很多,Xilinx官方也提供很完善的设计指南,一般不会有问题。需要注意的一点就是JTAG电压问题。支持2.5V和3.3V,两种设计略有区别。 2、差分信号。查分信号是FPGA常用的输入输出信号。FPGA的IO管脚定义也都是N/P成对的。需要注意的是有些管脚不支持差分信号输出,在设计的时候需要特别注意。 3、时钟管脚。时钟是FPGA设计另一个很重要的方面。每个项目对时钟的要求不尽相同,要根据项目要求设计系统时钟结构。需要注意的是FPGA有专用的时钟管脚,单端时钟输入要用到时钟管脚的P端。 4、存储芯片。一般的项目都会带有RAM芯片。SDRAM,DDR,DDR2,或者DDR3。RAM芯片在布线的时候有等长要求,FPGA芯片对RAM芯片的支持也有需要注意的地方,比如要求使用一个BANK,有专用的数据管脚等等。因为要用到DLLPLL,需要注意使用的BANK位置。 5、电源。FPGA对电源的要求较高,FPGA的内核电流一般都很大,不过针对不同的FPGA系列有各种电源解决方案可供选择。参考各公司的参考设计一般都不会有太大问题。TI也有电源模块供选择,简化了设计难度。对自己的设计能力有信心也可以自己设计,难度并不大。
|
winthony
![]()
最后登陆时间:2014-12-10 11:58:59 |
封装设计
原理图设计前期最重要的事情可能就是做FPGA的封装了。每颗FPGA芯片少则几百根多则上千根管脚,做封装的时候如果不小心做错了,后面检查和改起来就很麻烦,不过也有些简单的方法可以解决这个问题。
Altium Designer比较简单,自带了现有FPGA的封装,用户直接调用就可以使用。 Cadence Allegro的封装设计支持Excel输入,从官网上下载pinmapping文档就可以。也可以用ISE的partgen命令生成pinmapping文档,也比较方便。 PCB封装的话推荐LP Wizard,经济实惠量又足,简单设置以后就能自动生成PCB封装,支持多种设计工具,非常方便。 |
winthony
![]()
最后登陆时间:2014-12-10 11:58:59 |
这回说说IIC接口吧。 IIC接口可以说是最简单的总线协议了。SCL和SDA两根线就组成了一个总线,可以连接多个主机从机,通过简单的协议控制总线占用。在实际使用过程中经常作为芯片的配置接口。芯片的寄存器配置初始化设置多采用IIC接口或者稍有改进的IIC接口。虽然是一个简单的接口,功能也很简单,不过要注意的东西也有一些。
很多参考设计里IIC总线的上拉电阻是4.7K。为什么选择这个阻值呢? IIC的两根总线信号都是开漏输出,器件本身只输出低电平,高电平需要外部的上拉电阻实现。上拉电阻阻值的大小决定了驱动电流的大小,如果上拉电阻的阻值过小,比如100欧姆,假设3V的系统电压,驱动电流就会有30mA,这么大的电流很容易损坏端口。相反,上拉电阻阻值过大又可能驱动能力不够。 除了驱动能力考虑意外,还有一个信号上升时间的考虑。在信号从低变高的过程中,上拉电阻和线上电容组成了一个等效的RC电路,上升时间近似等于上拉电阻和线上电容的乘积。线上电容包括引脚电容,器件电容,信号线上电容等等。这些因素是我们比较难控制的。那么我们可以通过改变上拉电阻来简单的控制总线上信号的上升时间。4.7k电阻基本上能满足绝大部分IIC速率和实际设计的要求。 当然最后一个原因就是成本。上拉电阻选取本身就是一个范围,4.7K是一个中值,另外也是标准电阻,经济实惠量又足,不需要买百分之一精度的电阻。
在一些特殊的设计场合,如总线上连接的器件较多,总线布线较长或者IIC的高速应用等情况下,我们可以适当的减小上拉电阻的选择,如2.2K,1.5K等等,减少信号的上升时间,以适应设计的要求。
|
此贴由winthony于2013-04-03 11:56:07最后编辑
|
|
winthony
![]()
最后登陆时间:2014-12-10 11:58:59 |
把FPGA当空气 提到IIC接口,说说本次设计里遇到的一个小问题。 本次的FPGA板上有多个接口芯片需要初始化配置,因此板上预留了一个MCU用来做控制。从板子的结构考虑,把接口芯片和MCU的IIC总线都连到了FPGA上。把FPGA当成透明的连接线,把MCU和接口芯片的IIC总线连接在一起。 开始想的比较简单,在FPGA内部把几根线连起来不就行了。但是细想起来还真不是这么简单。 如果信号是简单的输入或者输出,单向信号,用FPGA把两根信号先在内部连起来是非常简单可靠的。但是IIC的两根信号线不是简单的输入或者输出,SDA信号是双向的(总线协议里SCL也是双向信号,在多个主机的时候有判决作用,这次的应用只有一个主机,所以SCL可以看成是单向的,主机发送,从机接收)。在每次的读写操作时,主机发送控制指令,从机都要反馈ACK信号给主机。而双向信号在FPGA里就不能这么简单的连接起来了。怎么解决呢。
分析一下IIC总线信号。IIC总线都是开漏的,也就是本身只发送低电平,高电平是通过上拉电阻实现的。也就是说,无论主机从机,只有在输出低电平的时候才会往总线上发送信号,其他情况下总线都是被上拉电阻上拉到高电平。无论主机从机,只要有一个设备往总线上发送出低电平,如果是用线连接,其他设备就会同时收到这个低电平信号。现在我们就要在FPGA内部模拟总线上的这种情况。
具体实现。所有的SDA设为输入输出口,一般情况下,禁用信号线的输出。检测每根信号线的输入。当有一根信号线为低时,使能其他信号线的输出,禁用输入,然后把其他信号线拉低。当检测到上升沿时,恢复到初始状态,禁用输出,检测输入。如此反复。也就是一旦检测到低电平,就把其他信号线拉低。检测到上升沿,就把状态恢复,继续检测低电平。 实际系统测试,效果良好,一个主机控制四个从机没压力。由于这次的应用是单主机的形式,如果有多个主机还会复杂些,要加上SCL的判断,不过原理是一样的。 没想到要把FPGA当空气也不是这么容易的。 |
winthony
![]()
最后登陆时间:2014-12-10 11:58:59 |
|
winthony
![]()
最后登陆时间:2014-12-10 11:58:59 |
winthony的原帖 HXW718059156的原帖把FPGA当空气 提到IIC接口,说说本次设计里遇到的一个小问题。 本次的FPGA板上有多个接口芯片需要初始化配置,因此板上预留了一个MCU用来做控制。从板子的结构考虑,把接口芯片和MCU的IIC总线都连到了FPGA上。把FPGA当成透明的连接线,把MCU和接口芯片的IIC总线连接在一起。 开始想的比较简单,在FPGA内部把几根线连起来不就行了。但是细想起来还真不是这么简单。 如果信号是简单的输入或者输出,单向信号,用FPGA把两根信号先在内部连起来是非常简单可靠的。但是IIC的两根信号线不是简单的输入或者输出,SDA信号是双向的(总线协议里SCL也是双向信号,在多个主机的时候有判决作用,这次的应用只有一个主机,所以SCL可以看成是单向的,主机发送,从机接收)。在每次的读写操作时,主机发送控制指令,从机都要反馈ACK信号给主机。而双向信号在FPGA里就不能这么简单的连接起来了。怎么解决呢。
分析一下IIC总线信号。IIC总线都是开漏的,也就是本身只发送低电平,高电平是通过上拉电阻实现的。也就是说,无论主机从机,只有在输出低电平的时候才会往总线上发送信号,其他情况下总线都是被上拉电阻上拉到高电平。无论主机从机,只要有一个设备往总线上发送出低电平,如果是用线连接,其他设备就会同时收到这个低电平信号。现在我们就要在FPGA内部模拟总线上的这种情况。
具体实现。所有的SDA设为输入输出口,一般情况下,禁用信号线的输出。检测每根信号线的输入。当有一根信号线为低时,使能其他信号线的输出,禁用输入,然后把其他信号线拉低。当检测到上升沿时,恢复到初始状态,禁用输出,检测输入。如此反复。也就是一旦检测到低电平,就把其他信号线拉低。检测到上升沿,就把状态恢复,继续检测低电平。 实际系统测试,效果良好,一个主机控制四个从机没压力。由于这次的应用是单主机的形式,如果有多个主机还会复杂些,要加上SCL的判断,不过原理是一样的。 没想到要把FPGA当空气也不是这么容易的。 确实,但为啥一定要经过FPGA呢? 和板子的具体结构有关系,另外接口芯片除了MCU控制以外,也需要FPGA直接配置,所以就都连接到FPGA里面了 |
winthony
![]()
最后登陆时间:2014-12-10 11:58:59 |
单片机
板上预留了一颗silicon labs的小MCU,C8051F380.选型并没有特殊的考虑,只是手头上正好有几颗芯片。预留MCU实现和PC上位机的串口通信。上位机可以通过MCU的串口访问板上资源,以及配置FPGA逻辑,芯片寄存器参数设置等等。 用到的MCU资源比较简单,就是UART,IIC和一些GPIO。毕业到现在做过DSP,ARM,FPGA等等,MCU还真是第一次做。上手的感觉就是充分利用好芯片公司提供的例程,加速项目研发进度。silicon labs提供了芯片各个接口的测试例程。可移植性好,提供的程序都能在板子上直接运行。 根据项目需求,参考UART例程,很方便的和PC机建立串口连接。通过解析串口指令,执行不同的操作。完成初始化配置,寄存器修改,数据读取,EEPROM读写等等操作。 忍不住吐槽一下,MCU的资源确实挺有限,开始定义全局变量的时候没考虑这么多,结果程序怎么都编译不通过,原来是资源不够了。后面对程序又做了很大的修改。在单片机的变成方面,资源还是要好好考虑的事情,少用全局变量。 程序调试方面还是比较顺利的,其中并没有遇到太大的问题。只是在一些寄存器的配置方面要注意,多读芯片的datasheet,清楚寄存器的具体应用,大部分寄存器的每个bit都有不同的功能。因此在给寄存器赋值的时候最好只修改你要改变的某一位或者某几位。而不是简单的给寄存器直接赋值。养成好习惯,不至于程序复杂的时候不好查找问题。
|
此贴由winthony于2013-04-07 16:46:31最后编辑
|
|
winthony
![]()
最后登陆时间:2014-12-10 11:58:59 |
上位机
这块板子用到的PC端上位机其实就是一个简易版的串口调试助手。用VB写起来比较简单。VB用起来比较傻瓜,上手快,功能也都比较直观。只是要把程序做的健壮还是有些小细节要考虑到。 添加serialport控件来支持串口就好了。 串口建立连接的时候要判断串口是否存在或者是否被占用。可以用try/catch命令。 openfiledialog控件来打开文档。FileStream、BinaryReader读取文档数据。ReadBytes按照byte读取文档数据。 SerialPort1.ReadExisting读取串口数据,SerialPort1.Write对串口写数据 MessageBox.Show弹出消息对话框 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)休眠几个毫秒 |