搜索
bottom↓
回复: 73

非常好的FPGA量产烧程序及在线更新程序方法

  [复制链接]

出0入0汤圆

发表于 2012-8-9 23:00:40 | 显示全部楼层 |阅读模式
准确说来应该是用MCU配置FPGA,之前一直为生产时如何给FPGA烧程序烦恼,而且烧好后升级也麻烦。后来发现了这个文档,可以直接将FPGA的程序拷到MCU中,利用MCU来直接将配置文件加载到FPGA。这样以后升级时也只要升级MCU的程序即可。可以说是非常方便了。内容复制贴上来了。要看完整的就下附件吧。


用CPU配置Altera公司的FPGA
一. 概 述
目前很多产品都广泛用了FPGA,虽然品种不同,但编程方式几乎都一样:利用专用的EPROM对FPGA进行配置。专用的EPROM价格不便宜,且大不跟上都是一次性OPT方式编程。一旦更改FPGA设计,代价不小。 为了进一步降低产品的成本和升级成本,可以考虑利用板上现有CPU子系统中空闲的ROM空间存放FPGA的配置数据,并由CPU模拟专用EPROM对FPGA进行配置。 本文将以PowerPC860和EP1K30为例,讲解如何利用CPU来配置FPGA。

CPU配置FPGA的优点
与Configuration EPROM方式相比本设计有如下优点:
1. 降低硬件成本——省去了FPGA专用EPROM的成本,而几乎不增加其他成本。以ALTERA的10K系列为例,板上至少要配一片以上的EPC1,每片EPC1的价格要几十元,容量1M位。提供1Mb的存储空间,对于大部分单板来说(如860系统的单板),是不需要增加硬件的。即使增加1Mb存储空间,通用存储器也会比FPGA专用EPROM便宜。
2. 可多次编程——FPGA专用EPROM几乎都是OTP,一旦更换FPGA版本,旧版本的并不便宜的EPROM只能丢弃。如果使用本设计对FPGA配置,选用可擦除的通用存储器保存FPGA的编程数据,更换FPGA版本,无须付出任何硬件代价。这也是降低硬件成本的一个方面。
3. 实现真正"现场可编程"--FPGA的特点就是"现场可编程",只有使用CPU对FPGA编程才能体现这一特点。如果设计周全的话,单板上的FPGA可以做到在线升级。
4. 减少生产工序--省去了对"FPGA专用EPROM"烧结的工序,对提高生产率,降低生产成本等均有好处。对于双面再流焊的单板,更可省去手工补焊DIP器件的工序。
当然,与Configuration EPROM方式相比也有一些需要注意的的地方:
1. 需要CPU提供5根I/O线--一般来说,这并不困难。对于MPC860一类的CPU来说,区区5根I/O线是不成问题的。即使是某些设计中实在没有多余的I/O供配置使用,也可通过板上的PLD扩展。虽然这样做可能会增加成本,但获得的真正"现场可编程"的功能是非常宝贵的。
2. CPU的Boot应不依赖于FPGA--这在单板设计时需要特别考虑的。由于CPU对FPGA进行配置所需的资源很少,这一点比较容易做到。
设计摘要
本设计严格按照FPGA的PS配置流程进行,并在配置过程中始终监测工作状态,在完善的软件配合下,可纠正如上电次序导致配置不正常等错误。因此,采用此方法对FPGA进行配置,性能将优于Configuration EPROM方式。
本设计是利用板上现有CPU子系统中空闲的ROM空间存放FPGA的配置数据,并由CPU模拟专用EPROM对FPGA进行配置,以降低硬件成本并实现FPGA的在线升级。本设计已在MPC860和EP1K30环境下完成验证,适用于有5个多余I/O的CPU对Altera FPGA的配置。
参考资料
ALTERA:AN-116 Configuring SRAM-Based LUT DevicesALTERA: ACEX 1K Programmable Logic Device Family
二. 硬件设计
1.配置基本原理
RAM-Based FPGA由于SRAM工艺的特点,掉电后数据会消失。因此,每次系统上电后,均需对FPGA进行配置。对于Altera的FPGA,配置方法可分为:专用的EPROM (Configuration EPROM)、PS(Passive serial 无源串行)、PPS(Passive parallel synchronous 无源同步并行)、PPA(Passive parallel asynchronous 无源异步并行)、JTAG(不是所有器件都支持)。
本设计采用PS方式对FPGA进行配置,是基于如下几个方面的考虑:
1. PS方式连线最简单2. 与Configuration EPROM方式可以兼容(MSEL0、1设置不变)3. 与并行配置相比,误操作的几率小,可靠性高

只需利用CPU的5个I/O线,就可按图 2所指示的时序对FPGA 进行PS方式的配置。
2.配置电路的连接
CPU仅需要利用5个I/O脚与FPGA相连,就实现了PS方式的硬件连接,具体信号见下表(信号方向从CPU侧看):

信号名        I/O        说明
Data0        O        configuration data
DCLK        O        configuration clock
nCONFIG        O        device reset (a low to high transition starts the configuration within the device)
Conf_done        I        Status bit (gets checked after configuration, will be high if configuration complete)
nSTATUS        I        Status bit indicating an error during configuration if low
 

图 3 PS配置单片FPGA的硬件连接
 

图 4 PS配置多片FPGA的硬件连接
3.配置操作过程
CPU按下列步骤操作I/O口线,即可完成对FPGA的配置:
1. nCONFIG="0"、DCLK="0",保持2μS以上。2. 检测nSTATUS,如果为"0",表明FPGA已响应配置要求,可开始进行配置。否则报错。正常情况下,nCONFIG="0"后1μS内nSTATUS将为"0"。3. nCONFIG="1",并等待5μS。4. Data0上放置数据(LSB first),DCLK="1",延时。5. DCLK="0",并检测nSTATUS,若为"0",则报错并重新开始。6. 准备下一位数据,并重复执行步骤4、5,直到所有数据送出为止。7. 此时Conf_done应变成"1",表明FPGA的配置已完成。如果所有数据送出后,Conf_done不为"1",必须重新配置(从步骤1开始)。8. 配置完成后,再送出10个周期的DCLK,以使FPGA完成初始化。
注意事项:
1. DCLK时钟频率的上限对不同器件是不一样的,具体限制见下表:
型号        最高频率
ACEX1K、FLEX10KE、APEX20K        33MHz
FLEX10K        16MHz
APEXII、APEX20KE、APEX20KC        57MHz
Mercury        50MHz
2. 步骤7中FPGA完成初始化所需要的10个周期的DCLK是针对ACEX 1K和FLEX 10KE的。如果是APEX 20K,则需要40个周期。
3. 在配置过程中,如果检测到nSTATUS为"0",表明FPGA配置有错误,则应回到步骤1重新开始。
 
图 5 操作流程框图
 
 
4.实现在线升级
采用本模块的最大优点是可以实现单板FPGA的在线升级。要实现在线升级,单板设计必须考虑以下几个问题:
1. CPU的启动必须不依赖于FPGA,即CPU子系统应在FPGA被配置前可独立运行并访问所需资源。CPU对FPGA进行配置所需的资源很少,一般来说,仅RAM和BootROM的访问而已。2. FPGA配置前(或配置过程中)必须保证控制的设备处于非工作态或不影响其他设备工作的稳定态。3. 为了实现FPGA的在线升级,存放FPGA配置数据的存储器器必须是CPU可重写的,且此存储器应是非易失性的,以保证单板断电后,FPGA数据不需从后台重新获得。
具体过程
结合图6的实例,对FPGA在线升级作一具体描述。
图6 FPGA在线升级
1. 使用编译和连接工具,将FPGA的第一个版本与MPC860的工作程序连接在一起,分别占用地址为0x70000-0x7FFFF和0x00000-0x6FFFF的存储空间。2. 单板启动时,MPC860自动将0x70000-0x7FFFF的数据下载到FPGA中,完成FPGA配置。3. 当FPGA需升级时,将新的RBF配置文件放在后台计算机中。4. MPC860把BOOTROM的0x70000-0x7FFFF空间当作普通数据存储区,通过后台将新的RBF配置文件放在0x70000-0x7FFFF中。5. MPC860调用BOOTROM中的FPGA配置子程序,对FPGA从新下载数据,完成FPGA升级。
以MPC860和Altera EP1K30为例,电原理图如下:
图7 电原理图

软件
编程文件格式的转换
MAX+plusII或QuartusII生成的SOF或POF文件不能直接用于CPU配置FPGA中,需要进行数据转换才能得到软件可用的配置数据。在MaxplusII中的具体步骤如下:
1. 进入数据转换对话框

图1 进入数据转换对话框
2.选择需要转换的SOF文件,对于配置多个FPGA的场合,应选择所有的SOF文件并排好次序。输出文件的格式我们选则二进制的rbf(Sequential)。 (也可以选择其他格式,如HEX等,在CPU软件编写上会与本文例子略有区别,关于不同文件格式的区别,在altera的AN116号文档上有详细解释)

图2 选择相应的输出数据格式
在QuartusII软件的file菜单下,同样可以找到类似菜单进行格式转化。
 
CPU程序设计
以MPC860为例,我们可以将转换完成的RBF文件作为二进制文件,直接写到MPC860系统的某一ROM/Flash区域。由于这段数据的起始地址和长度都是已知的,相应的软件编写是很方便的。
本设计的CPU源程序
void InitPORT(void)
{ // 初始化PB口相应位:// PB24-输出,PB25-输入,PB26-输出,PB27-输入,PB28-输出IMMR->pip_pbpar=0x00000000;IMMR->pip_pbdir=0xFFFFF5AF;IMMR->pip_pbodr=0x00000000;IMMR->pip_pbdat=0xffffff57;}
UBYTE Fpga_DownLoad(void){ // FPGA配置UBYTE *Bootaddr;UWORD CountNum=0x0;UBYTE FpgaBuffer, i;
// 获得Boot区首地址Bootaddr=(UBYTE *)(IMMR->memc_or0 & IMMR->memc_br0 & 0xFFFF8000);
Set_nCONFIG(0); // nCONFIG="0",使FPGA进入配置状态Set_DCLK(0);DELAY5us();if (Read_nSTATUS() == 1){ // 检测nSTATUS,如果为"0",表明FPGA已响应配置要求,可开始进行配置。否则报错Err_LED(1);return 0;}Set_nCONFIG(1);DELAY5us();
// 开始输出配置数据:while(CountNum <= 0x0e74e){FpgaBuffer= *(Bootaddr+0x70000+CountNum);for (i=0; i<8; i++){ // DCLK="0"时,在Data0上放置数据(LSB first)Set_Data0(FpgaBuffer&0x01);Set_DCLK(1); // DCLK->"1",使FPGA读入数据FpgaBuffer >>= 1; // 准备下一位数据if (Read_nSTATUS() == 0){ // 检测nSTATUS,如果为"0",表明FPGA配置出错 Err_LED(1);return 0;}Set_DCLK(0);}CountNum++;}
// FPGA初始化:// ACEX 1K和FLEX 10KE需要10个周期,APEX 20K需要40个周期for(i=0; i<10; i++){Set_DCLK(1);DELAY100us();Set_DCLK(0);DELAY100us();}Set_Data0(0);if (Read_nCONF_Done() == 0){ // 检测nCONF_Done,如果为"0",表明FPGA配置未成功Err_LED(1);return 0;}return 1; // 成功返回}
// Data0输出void Set_Data0(UBYTE setting){ // PB24if (setting) IMMR->pip_pbdat |= 0x00000080;else IMMR->pio_pbdat &= 0xFFFFFF7F;}
// 读nSTATUS状态UBYTE Read_nSTATUS(void){ // PB25if (IMMR->pio_pbdat & 0x00000040) return 1;else return 0;}
// 设置nCONFIG电平void Set_nCONFIG(UBYTE setting){ // PB26if (setting) IMMR->pip_pbdat |= 0x00000020;else IMMR->pio_pbdat &= 0xFFFFFFDF;}
// 读nCONF_Done状态UBYTE Read_nCONF_Done(void){ // PB27if (IMMR->pio_pbdat & 0x00000010) return 1;else return 0;}
// 输出DCLKvoid Set_DCLK(UBYTE setting){ // PB28if (setting) IMMR->pio_pbdat |= 0x00000008;else IMMR->pio_pbdat &= 0xFFFFFFF7;}// 结束
我们已在某单板上实现了该设计。现以该单板为例,说明如何实现CPU对FPGA的配置。在该单板上是使用MPC860作CPU,BootROM采用SST39VF040,一片FPGA型号EP1K30QC208-3。我们在MCP860的PB口选5根线与EP1K30连接成PS配置方式,硬件连接参考第二章,Data0也由MPC860输出,信号定义见下表:
MPC860引脚        I/O        信号名称        EP1K30引脚
PB24        O        DATA0        156
PB25        I        nSTATUS        52
PB26        O        nCONFIG        105
PB27        I        CONF_DONE        2
PB28        O        DCLK        155
EP1K30所需要的配置数据为58kB(准确的长度参见生成的RBF文件),由于BootROM比较空,我们将配置数据安排在BootROM的0x70000~0x7FFFF区间内。第一次的配置数据可利用编程器将RBF文件当作二进制文件写到BootROM的起始地址为0x70000的区域,也可以通过860仿真器把数据写到指定位置。具体软件操作参见第二章。
FPGA在线更改配置
为检验FPGA在线升级的可能性,我们在CPU的BootROM中放置了不同逻辑的FPGA配置数据。CPU正常运行时,测试软件随意更换FPGA的配置数据。在每次配置完成后,FPGA均能实现相应的逻辑功能。如果和系统软件配合,在线更改EPROM中的配置数据,FPGA的在线升级是完全可以实现的。为了便于调试和实际生产,我们将FPGA的初始配置数据放置在BootROM中。如某些单板BootROM的写功能必须禁止,此时FPGA配置数据可放在其它存储器中,如存放应用程序的FLASH中,升级FPGA配置数据可以和升级应用程序一并完成。
电缆下载
为了提高调试进度,通常会采用电缆下载的方式。在单板上兼容这两种配置方式有多种办法,我们采用了比较简单又便于生产的"0欧姆电阻连接方式"。电气连接的示意图如下:

图1 兼容电缆下载
在最初调试FPGA时,R1~R5不焊,直接用电缆下载。同时,MPC860的程序中跳过FPGA配置的代码。等FPGA设计定型后(相当于准备使用EPC1时),焊上R1~R5,利用CPU配置FPGA。当然,R1~R5也可改用跳线或拨动开关。这两种连接方式在开发调试中比0欧姆电阻方便,但实际使用中可靠性不如0欧姆电阻高,如跳线会出现短路块脱落、拨动开关会出现接触不良等现象。而且,0欧姆电阻连接方式最便于生产,价格也最低。建议开发阶段的单板可以用跳线或拨动开关,转产时采用0欧姆电阻连接方式。
在使用下载电缆时需要注意电源的选择。由于Altera以前的Byteblaster下载电缆是5V供电的,有不少设计都把下载电缆插座接到5V电源上,这种5V供电的下载电缆可能导致不能忍受5V信号的CPU损坏。因此,使用本模块时,下载电缆应使用低电压版本的ByteblasterMV,下载插座的电源接3.3V。
使用、调试、维护说明
如果使用本模块出现配置出错,有如下可能:
错误原因        解决方法
配置数据有错        重新生成配置数据,并检查生成过程是否正确
CPU输出信号频率太高        控制DCLK频率,具体数据参见“操作过程”相关章节
CPU与FPGA连接有误        检查硬件连线
下载电缆影响        拔去下载电缆
CPU的I/O口故障        用示波器检查PB24~PB28信号波形
FPGA故障        更换FPGA
 
经验教训
本模块在设计过程中有如下几个要点,请使用者注意:
1. CPU的启动必须不依赖于FPGA,这在单板设计时需要特别考虑的。即CPU子系统应在FPGA被配置前可独立运行并访问所需资源。CPU对FPGA进行配置所需的资源很少,一般来说,仅RAM和BootROM的访问而已。当然,其他挂在CPU总线上的设备必须处于非访问态,FPGA所控制的设备也应处于非工作态或不影响其他设备工作的稳定态。
2. 为了实现FPGA的在线升级,存放FPGA配置数据的区域必须是CPU可重写的
3. 利用CPU配置FPGA,在使用者的主观感觉上会觉得FPGA"起来"得比较慢。这是因为FPGA的配置要等CPU启动完成后才进行。因此,应充分考虑FPGA所控制的设备在FPGA被配置完成前处于非工作态或不影响其他设备工作的稳定态。
4. 关于配置数据占用空间的问题。对于Altera的FPGA来说,每个确定型号的器件,配置数据的长度是一定的(和设计逻辑无关)。因此,一旦确定了FPGA的型号,配置数据占用EPROM的空间也可以在设计中确定。
5. 在使用中请保留下载电缆插座,以加快调试进度。
6. 下载成功后,软件应有指示,便于维护。
7. 要从系统的角度考虑现场升级,保护好FPGA数据。
8. 单板调试时电缆下载的问题。为了兼容两种下载方式,需要电缆下载时,可在CPU程序中跳过配置程序。
9. 如果单板有可能使用电缆下载,必须考虑CPU的I/O能否忍受下载电缆信号电平

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-8-9 23:10:47 | 显示全部楼层
给条裤子吧。

出0入0汤圆

发表于 2012-8-9 23:21:05 | 显示全部楼层
有空看看

出0入0汤圆

发表于 2012-8-9 23:42:19 | 显示全部楼层
nice 感谢分享

出0入0汤圆

发表于 2012-8-10 00:23:54 | 显示全部楼层
这什么年代的文章了- -
EPCS系列的配置芯片不挺便宜的么- -而且也不是一次性的- -|

出0入0汤圆

 楼主| 发表于 2012-8-10 00:59:13 | 显示全部楼层
dashashi 发表于 2012-8-10 00:23
这什么年代的文章了- -
EPCS系列的配置芯片不挺便宜的么- -而且也不是一次性的- -| ...

片子便宜与否是其次。生产的方便性与升级的易用性才是主要的。不知道你们量产时如何烧程序的,是否比这个更方便。

出0入0汤圆

发表于 2012-8-10 01:19:07 | 显示全部楼层
mcu_mouse 发表于 2012-8-10 00:59
片子便宜与否是其次。生产的方便性与升级的易用性才是主要的。不知道你们量产时如何烧程序的,是否比这个 ...

呃- -学生飘过- -只是看到那里感觉这文章应该是挺老的了

出0入0汤圆

发表于 2012-8-10 02:14:40 | 显示全部楼层
早些年(2000年以前)的确会用51等MCU配置CPLD/FPGA,现在这种方法已经凹凸了!

出0入442汤圆

发表于 2012-8-10 08:27:01 | 显示全部楼层
philoman 发表于 2012-8-10 02:14
早些年(2000年以前)的确会用51等MCU配置CPLD/FPGA,现在这种方法已经凹凸了! ...

现在依旧是用MCU配置FPGA的为多,大多数民用及通信的板子都是用CPLD或MCU配置。只有军工等不计成本的才会考虑EPCS或者XILINX的什么芯片。关键有一点:用MCU配置FPGA,可以实现方便的动态配置更新,而不需要每次都插上JTAG,然后用专用程序烧写了!你自己说说哪种方便?我现在手头有一片FX2,我直接用FX2配置FPGA,配置完后FPGA进入SlaveFIFO模式,比起插JTAG烧写再重启,方便太多了。

出100入85汤圆

发表于 2012-8-10 08:46:20 | 显示全部楼层
有没有确定能配置成功的完整的例子代码?

出0入0汤圆

 楼主| 发表于 2012-8-10 09:07:11 | 显示全部楼层
whatcanitbe 发表于 2012-8-10 08:46
有没有确定能配置成功的完整的例子代码?

我们是用在产品上的。代码也不是我写的。所以我没办法把代码发出来。不过我们写代码的小伙只用了一个下午就实现了这个功能。
资料已经发出来了。如果去实现就看各位自己了。

出0入0汤圆

发表于 2012-8-10 09:08:43 | 显示全部楼层
wye11083 发表于 2012-8-10 08:27
现在依旧是用MCU配置FPGA的为多,大多数民用及通信的板子都是用CPLD或MCU配置。只有军工等不计成本的才会 ...

这个没有好争论的,我做的板子里面都是EPCS或者XCFxxP,调试的时候JTAG,完了以后固化到PROM!早先我们这边也做过51配置,因为那时在线调试工具没有现在这么发达!

出0入0汤圆

发表于 2012-8-10 09:13:38 | 显示全部楼层
至今为止这种方法还有使用性,例如多通道智能采集器

出0入0汤圆

 楼主| 发表于 2012-8-10 09:27:16 | 显示全部楼层
这个主要是我之前生产时也没找到很好的方法(在网上到处找资料,可能是我搜索的方法不对,没有人说过量产应该怎么烧程序。也没找到在线烧录的工具)。FPGA也是另外一个人写的。他也搞不清楚量产时要如何烧。只有一个最笨的方法,直接把板子拿出来到电脑上烧。所以我就感觉非常麻烦。这时有另外一个同事找到了这个资料,就直接用2410来配置FPGA了。这个就省去了生产要烧程序的麻烦。而且我们的系统是可以在线升级的。这样FPGA也能同时跟着升级了。所以如果FPGA也要升级的话。之前的做法是必须寄回机器。而现在这么做就可以不用寄回了。所以个人觉得是非常方便的一个方法,就拿出来共享一下
头像被屏蔽

出0入0汤圆

发表于 2012-8-10 09:52:10 | 显示全部楼层
FPGA专用EPROM几乎都是OTP吗?

出0入0汤圆

发表于 2012-8-10 10:11:40 | 显示全部楼层
Altera的芯片的PS模式,就是用MCU来配置
我们也在用,用一个小单片机加一片SPI的Flash来替代EPCS,2块钱搞定
头像被屏蔽

出0入0汤圆

发表于 2012-8-10 11:28:05 | 显示全部楼层
cool !

出0入0汤圆

发表于 2012-8-10 14:20:55 | 显示全部楼层
mcu_mouse 发表于 2012-8-10 09:27
这个主要是我之前生产时也没找到很好的方法(在网上到处找资料,可能是我搜索的方法不对,没有人说过量产应 ...

请问楼主,这个FPGA的程序文件一般多大啊?譬如一个FLASH空间为64K的单片机,如果把FPGA的程序存起来的话,是不是基本就没有空间存自己的程序了?这么说来,只能在单片机外面挂一个存储芯片了?

出0入0汤圆

发表于 2012-8-10 15:46:56 | 显示全部楼层
mark标记,以后可能会用到

出0入0汤圆

发表于 2012-8-10 17:27:40 | 显示全部楼层
不错,支持一下

出0入0汤圆

发表于 2012-8-11 08:36:33 | 显示全部楼层
我的产品是用串行DATAFLASH,通过单片机的串口或网口,先将新升级FPGA代码下载到存储器中,再让单片机重新引导

出0入0汤圆

发表于 2012-8-11 09:13:51 | 显示全部楼层
水哥 发表于 2012-8-10 14:20
请问楼主,这个FPGA的程序文件一般多大啊?譬如一个FLASH空间为64K的单片机,如果把FPGA的程序存起来的话 ...

配置文件大小随FPGA规模成正比,64K对于大多数FPGA是不够滴

出0入0汤圆

发表于 2012-8-11 09:16:52 | 显示全部楼层
zkf0100007 发表于 2012-8-11 09:13
配置文件大小随FPGA规模成正比,64K对于大多数FPGA是不够滴

当然,采用比特流压缩技术可以大幅减小配置文件的大小

出0入0汤圆

发表于 2012-8-11 09:40:40 来自手机 | 显示全部楼层
曾经见过别人这样用,顶一个!

出0入4汤圆

发表于 2012-8-15 09:53:13 | 显示全部楼层
很想试验一把。

出0入0汤圆

发表于 2012-8-17 13:56:31 | 显示全部楼层
我做过用串口更新FPGA的配置信息,硬件上似乎比这样简单。

出0入0汤圆

 楼主| 发表于 2012-8-17 15:39:43 | 显示全部楼层
奋斗的小鸟 发表于 2012-8-17 13:56
我做过用串口更新FPGA的配置信息,硬件上似乎比这样简单。

能否发上来看看

出0入8汤圆

发表于 2012-8-17 16:33:42 | 显示全部楼层
本帖最后由 kebaojun305 于 2012-8-17 16:38 编辑

搂主写的这个思路是不错的  只不过有些内容已经过时了。

出0入0汤圆

发表于 2012-8-17 18:28:31 | 显示全部楼层
这个方法好,能远程升级FPGA程序。

出0入0汤圆

发表于 2012-8-19 19:47:48 | 显示全部楼层
帮楼主顶一下

出0入0汤圆

发表于 2012-8-22 13:20:59 | 显示全部楼层
mcu_mouse 发表于 2012-8-17 15:39
能否发上来看看

if(update_flag)
        {
            update_flag_RF = 0;
            //打开epcs
            my_epcs = alt_flash_open_dev("/dev/epcs_controller");
            if(my_epcs)
            {
                ret_code = alt_epcs_flash_get_info(my_epcs, &regions, &number_of_regions);
               
                //IOWR(DIR_485_BASE,0,0x1);//485发送使能   
                Send2Ipc(0x00FD,0x0000);  //回传准备好更新系统的命令
                delay1(1000);
               
               // IOWR(DIR_485_BASE,0,0x0);//485接收使能
                IORD_ALTERA_AVALON_UART_RXDATA(UART_BASE);//清接收缓冲区
                IOWR_ALTERA_AVALON_UART_STATUS(UART_BASE, 0);//清中断标志
                IOWR_ALTERA_AVALON_UART_DIVISOR(UART_BASE, BRL115200);  
                check_error = 2;
               
                //启动定时器5,计数等待
                startUpdate_count = 0;
                IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER5_BASE, 7);
                while(1)
                {
                    //当接收到第一个数包据后,开始更新,确保云台与机芯通讯正常
                    if(update_flag_RF == 1)
                    {
                        //关闭定时器
                        IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER5_BASE, 8);
                        //擦除8块
                        for(ii=0;ii<8;ii++)
                        {
                           alt_epcs_flash_erase_block(my_epcs, regions->offset+0x10000*ii);
                        }
                        
                        //启动更新
                        startUpdate_flag = 1;
                        break;
                    }else
                    {
                        //如果等待8秒后仍旧收不到机芯发送的数据,退出更新程序
                        if(startUpdate_count == 8)
                        {
                            //关闭定时器
                            IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER5_BASE, 8);
                            startUpdate_count = 0;
                            //更新标志位置0,退出更新
                            update_flag = 0;
                            update_flag_RF = 0;
                                                        
                            //不进行更新
                            startUpdate_flag = 0;
                            break;
                        }
                    }
                }
               
                while(startUpdate_flag == 1)
                {  
                    if(update_flag_RF==1)
                     {
                         update_flag_RF=0;
                         if (buffer_flag == 1)     
                         {   
                             update2_check = calcrc(&update2[1],256);  
                            // update2_check=update2_check&0xFF;
                             if(update2_check == ((update2[257]<<8)| update2[258]))  
                             {
                                update2_check = 0;
                                check_error = 0;                                 
                                alt_epcs_flash_write_block(my_epcs, 0, regions->offset+0x100*buffer_dataNum, &update2[1], 256);                                                                                                                  
                             }else
                             {
                                check_error = 1;                        
                             }                                          
                         }else if(buffer_flag == 2)
                         {
                             update1_check = calcrc(&update1[1],256);
                            // update1_check=update1_check&0xFF;
                             if(update1_check == ((update1[257]<<8)| update1[258]))  
                             {
                                update1_check = 0;
                                check_error = 0;
                                alt_epcs_flash_write_block(my_epcs, 0, regions->offset+0x100*buffer_dataNum, &update1[1], 256);
                             }else
                             {
                                check_error = 1;
                             }                                                                                                     
                          }                                          
                        
                         if(check_error == 0)
                         {
                            check_error = 2; //仅发送一次命令给主控板
                            buffer_dataNum++;                 
                            if(file_size == buffer_dataNum)//||((file_size - 1) == buffer_dataNum))
                            {
                               startUpdate_flag = 0;
                               Send_Check(0x00); //更新结束
                               IOWR(OUT_PIO_BASE,0,0xFF);                                                            
                            }                           
                            Send_Check(0x00); //ACK接收正确
                         }else if(check_error == 1)
                         {
                            check_error = 2; //仅发送一次,错误命令
                            Send_Check(0x15);   //错误                                                
                         }
                     }            
                }
                alt_flash_close_dev(my_epcs);
            }  
            else
            {
                update_flag = 0;
            }      
        }

这是串口更新部分的源代码,NIOSII实现的,如果FPGA资源够的话,与其做单片机的板子,还不如用NIOS核。希望对大家有帮助

出0入0汤圆

发表于 2012-8-30 17:48:43 | 显示全部楼层
马上要用FPGA,先MARK

出0入0汤圆

发表于 2012-8-30 17:57:54 | 显示全部楼层
这样一来程序存储在片外的FPGA 是不是安全性更高些

出0入0汤圆

发表于 2012-12-13 13:06:41 | 显示全部楼层
xiaohe669 发表于 2012-8-30 17:57
这样一来程序存储在片外的FPGA 是不是安全性更高些

FPGA   本身不支持加密的话 没用  直接在配置的那几根线上 引出  根据协议读取就破了

出0入17汤圆

发表于 2012-12-13 13:49:50 | 显示全部楼层
mark~~~~~~~~~~

出0入0汤圆

发表于 2012-12-14 17:46:59 | 显示全部楼层

出0入0汤圆

发表于 2012-12-14 23:33:57 | 显示全部楼层
mark!!!!!!!!!!

出0入0汤圆

发表于 2012-12-16 21:17:52 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2012-12-16 22:03:14 | 显示全部楼层
奋斗的小鸟 发表于 2012-8-22 13:20
if(update_flag)
        {
            update_flag_RF = 0;

quartus哪个格式生成的是16进制的数据呢?

出0入0汤圆

发表于 2012-12-18 09:25:21 | 显示全部楼层
mark。。。。。。。。。。。。。。。。。

出0入0汤圆

发表于 2012-12-18 09:36:11 | 显示全部楼层
我们99年时就这么干了。
不过楼主总结的非常详细。还是赞一个。

出0入0汤圆

发表于 2012-12-18 09:54:21 | 显示全部楼层
现在的XILINX的Z7000和Z7020都是使用这种方法来配置FPGA的,在配置前,ARM核必须先启动,然后ARM核会把FPGA的配置文件下载下去;

出0入0汤圆

发表于 2013-9-20 22:02:21 | 显示全部楼层
用MCU动态配置FPGA,系统动态重构,好想法。

出0入0汤圆

发表于 2013-9-20 23:45:33 | 显示全部楼层
MARK!!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2013-9-20 23:52:26 | 显示全部楼层
marking
                                               

出0入0汤圆

发表于 2013-9-21 13:11:25 | 显示全部楼层
mark!!

出0入53汤圆

发表于 2013-9-21 13:59:43 | 显示全部楼层
顶一下 标记

出0入0汤圆

发表于 2013-12-26 22:39:40 | 显示全部楼层
有时间一定看。。。

出0入0汤圆

发表于 2013-12-29 12:55:11 | 显示全部楼层
SPI FLASH价格不贵;
FPGA通过AS模式也可以实现自动升级的。只是大多数人都不知道而已。

ALTERA、lattice,xilinx三合一下载线商业发售158元。

出0入0汤圆

发表于 2014-1-4 08:38:06 来自手机 | 显示全部楼层
mark一下!

出0入0汤圆

发表于 2014-1-4 12:39:16 | 显示全部楼层
muok@sohu.com 发表于 2013-12-29 12:55
SPI FLASH价格不贵;
FPGA通过AS模式也可以实现自动升级的。只是大多数人都不知道而已。

请教下,FPGA设置为AS模式,怎么自动升级啊?

出0入0汤圆

发表于 2014-1-24 23:33:05 | 显示全部楼层
先mark一下,以后用得着。

出0入0汤圆

发表于 2014-1-25 08:29:37 | 显示全部楼层
谢谢分享,mark

出0入0汤圆

发表于 2014-1-25 08:32:52 | 显示全部楼层
留存,以后肯定有用。感谢Lz分享

出0入0汤圆

发表于 2014-2-2 20:32:45 | 显示全部楼层
mark一下,好长啊,感谢楼主分享

出0入0汤圆

发表于 2014-2-2 20:50:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2014-2-3 02:41:44 | 显示全部楼层
非常好的应用方式 支持LZ

出0入0汤圆

发表于 2014-5-31 15:26:35 | 显示全部楼层
方法很实用,支持

出0入0汤圆

发表于 2014-6-1 07:39:51 | 显示全部楼层
学习学习。。

出0入0汤圆

发表于 2014-9-11 11:26:34 | 显示全部楼层
不错,有机会要用下。

出0入0汤圆

发表于 2014-9-14 11:44:34 | 显示全部楼层
我用FPGA来配置CPU,本末倒置,还是楼主方法好!

出0入0汤圆

发表于 2014-9-14 12:37:03 | 显示全部楼层
fpga量产烧写,mark

出0入0汤圆

发表于 2014-9-14 19:31:47 | 显示全部楼层
正需要这样的东东,应该能适用PPC吧

出0入0汤圆

发表于 2014-9-16 19:38:50 | 显示全部楼层
学习了。看看

出50入0汤圆

发表于 2014-9-16 19:54:26 | 显示全部楼层
mark      

出0入0汤圆

发表于 2014-9-17 10:32:20 | 显示全部楼层
mark      

出0入0汤圆

发表于 2014-10-20 17:31:01 | 显示全部楼层
正在学习当中。。。。。。

出0入0汤圆

发表于 2014-10-20 19:28:38 | 显示全部楼层
这个似乎没有保密性?

出0入0汤圆

发表于 2014-10-20 21:06:56 | 显示全部楼层
E2PROM代替EPROM可以吗

出0入0汤圆

发表于 2014-10-24 13:47:33 | 显示全部楼层
那cpld 可以这样升级么

出0入0汤圆

发表于 2014-10-24 13:49:53 来自手机 | 显示全部楼层
马克,这方法一直可以的

出0入0汤圆

发表于 2014-10-24 14:17:27 | 显示全部楼层
好东西   

出0入0汤圆

发表于 2014-10-24 14:18:09 | 显示全部楼层
好东西   
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表