Altera 芯片代码实现远程更新

    通常在同一批次产品中,FPGA设计中只需要一套代码即可。但偶尔需要将代码实现更新而又不拆开设备情况下对代码进行更新,这就需要运用到代码远程更新功能了。

    代码远程更新的实现可以用网络和串口对FPGA发送命令和数据,使得FPGA进行代码切换。在本设计中,FPGA相关硬件无需更改,才有JTAG下载模式,通过千兆网口对FPGA下发切换程序命令和新的FPGA镜像,实现代码更新。

    本模块功能采用逻辑设计方式,需要用到altera下的两个IPcore(Altera Remote Update 和 Altera ASMI Parallel),其中Altera Remote Update 完成远程更新功能寄存器(启动地址、看门狗、使能)设置,而Altera ASMI Parallel完成Nor-FLASH程序数据更新,实现NOR-FLASH数据读写。

     对一般设计而言,设计人员可以在flash中烧写两套FPGA程序(比如对一个开发板点亮LED1和点亮LED2,当按下按钮时候,程序从点亮LED1跳变到LED2程序)

     注意,远程代码更新对不同altera FPGA芯片需要设置的寄存器不一样。


    altera官方参考设计:

    AN 603: Active Serial Remote SystemUpgrade Reference Design



  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在实际工程应用中,我们时常会遇到为解决某个老产品的BUG,需要在工程现场更新设备的FPGA代码,或者参加电信测试时需要现场升级设备FPGA程序以便于调试。公司现阶段所用的Altera FPGA程序代码一般存放于芯片配套的FLASH存储器中,而常见的对印制板上FLASH编程有几种方法,原始的方法是使用编程器,这种方法需要要将芯片取下,十分不便,或者通过JTAG接口连接到PC机上,但需要专用下载软件(一般由芯片生产厂商提供)。在测试现场或调测机房现场,要找到FPGA的专用下载线是比较困难的,且Altera FPGA的专用下载软件并不是每个PC设备上都有的。有时仅为了更新一个FPGA的程序就需要研发或客服人员亲自到现场去烧写程序,这既不便捷,也使得设备维护成本大大增加。  经过可行性与成本的考虑,我们找到一种既方便实用又低成本的方法来实现FPGA程序的在线现升级。即在MCU中(单片机或ARM均可)用软件来模拟XModem协议,将程序文件传输到FPGA的FLASH中。这种方法使用WINDOWS自带的超级终端软件来传送文件,无需安装专用软件,硬件支持仅需要一根通用串口线,只要在目标板MCU上增加一段实现XModem协议传输的代码,就可以方便的实现FPGA程序下载了。这种特点不仅方便了客服人员,也给研发和生产人员在现场调试和软件升级、修改中带来极大方便。
Altera芯片信号采集代码主要分为三个步骤:配置GPIO引脚、配置同步采样器和数据处理。以下是详细介绍: 1. 配置GPIO引脚 在设计过程中,需要确定使用哪些GPIO引脚进行信号采集。根据实际情况选择合适的引脚,然后在代码中进行配置。具体代码如下: #define DATA_PIN PIN_0 #define CLOCK_PIN PIN_1 IOWR_ALTERA_AVALON_PIO_DIRECTION(DATA_BASE, DATA_PIN | CLOCK_PIN); IOWR_ALTERA_AVALON_PIO_DATA(DATA_BASE, 0x00); 以上代码定义了2个引脚:DATA_PIN和CLOCK_PIN,然后配置这两个引脚为输出模式,并将数据设置为低电平。 2. 配置同步采样器 同步采样器是Altera芯片用于采集外部信号的组件。需要进行的配置包括:设置分频系数、设置引脚和启用采样器。具体代码如下: #define FREQUENCY_DIVIDER 10 alt_up_sd_card_dev *sd_card_dev; fpga_sram_configurations(); alt_up_audio_dev *audio; audio = alt_up_audio_open_dev("/dev/audio_0"); alt_up_audio_enable_write_interrupt(audio); int i; while(1) { for(i=0; i<FREQUENCY_DIVIDER; i++) { alt_up_audio_write_interrupt_pending(audio, 0); } IOWR_ALTERA_AVALON_PIO_DATA(DATA_BASE, 1 << CLOCK_PIN); alt_up_audio_disable_write_interrupt(audio); int status = alt_up_sd_card_is_Present(); if(status) sd_card_dev = alt_up_sd_card_open_dev("/dev/sd_card"); else{ printf("SD card not present!\n"); } int data = alt_up_sd_card_read(sd_card_dev); printf("Data: %d\n", data); } 以上代码设置了采样的分频系数,并且实现了读取信号数据并输出的功能。 3. 数据处理 在完成信号采集后,需要对采集到的原始数据进行处理。常见的处理方式包括数据滤波、去噪声等操作。具体代码如下: int filtered_data; while(1) { for(i=0; i<FREQUENCY_DIVIDER; i++) { alt_up_audio_write_interrupt_pending(audio, 0); } IOWR_ALTERA_AVALON_PIO_DATA(DATA_BASE, 1 << CLOCK_PIN); alt_up_audio_disable_write_interrupt(audio); int status = alt_up_sd_card_is_Present(); if(status) sd_card_dev = alt_up_sd_card_open_dev("/dev/sd_card"); else{ printf("SD card not present!\n"); } int raw_data = alt_up_sd_card_read(sd_card_dev); filtered_data = filter_data(raw_data); printf("Data: %d\n", filtered_data); } 在以上代码中,通过调用filter_data函数对采集到的原始数据进行处理,得到经过滤波后的数据,并输出到终端或写入存储器中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值