Zynq动态更新FPGA比特流

AI助手已提取文章相关产品:

ZYNQ-7000的结构是ARM+FPGA,在脱离JTAG的情况下,PL的配置只能通过PS来完成。正常上电的加载顺序是,FLASH/SD - > FSBL -> PL BITSTREAM -> PS ELF,那么在整个系统全部加载完成以后是否有办法重新给PL配置程序呢?答案是肯定的。

XILINX官方的BSP裸机例程里有xdevcfg的驱动代码,里面有个例程叫做POLL_EXAMPLE,就是实现PS配置PL比特流的,可以将指定的DDR空间里的数据给FPGA加载,如果这段数据是正确的比特流,那么FPGA就可以成功加载。但是这个代码经过实测,在PL已经CONFIG DONE的情况下是不工作的,我们要对其进行修改。

首先要注意的是,加载所需要的文件是不能用.bit文件的,要用bin文件。而且在Bitstream Settings里面勾选_binfile option也是不行的,必须用命令生成。坑爹的xilinx网上一大抄文档都是说progmem命令的,但是这个命令在vivado里已经被删掉了,替代命令叫write_cfgmem。参数很恶心,如下:

write_cfgmem -format bin -loadbit "up 0x0 ZynqSys_wrapper.bit" -file ZynqSys_wrapper.bin -size 128 -force -interface SMAPx32 -disablebitswap

我用的芯片型号为7z015,生成的bin文件大小为0x3591C。

再回到刚才的例程,主函数签名有两个关键的宏定义,一个是BITSTREAM_LOCATION,默认的是0x40000001,这个地址实际上是GP-AXI MASTER地址空间的,并不是DDR里面的,比如我要把比特流放在0X30000000开始的位置,那么这里要改成0x30000001,如注释所写,最后两个比特为2‘b01代表这是最后一次DMA传输(实际上也就这一次)。地址最好四字节对齐。第二个宏定义是BITSTREAM_SIZE_WORDS,这里是以32bit表示的大小,即0x3591C / 4。所以前面生成的bin文件大小必须是4的倍数,如果不是,肯定有问题。

改完宏定义以后,用jtag模式启动zynq,加载这段程序,利用xilinx tools里面的dump/restore memory功能把bin文件拷贝到0x30000000的空间里去,执行程序,应该可以看到config_done有效了;然而如果上电的时候已经加载了PL比特流,这段程序仍然无用,因为需要对PL进行一次复位操作。文档UG585里面在一个极其猥琐的位置描述了如何通过PS对PL执行清除比特流并复位的操作流程:

Example : Configure PL via PCAP Bridge

3 Initialize the PL

a.Set devcfg.CTRL[PCFG_PROG_B] bit = 1;

b. Set [PCFG_PROG_B] bit = 0.
c. Wait for devcfg.STATUS [PCFG_INIT] bit = 0.
d. Set [PCFG_PROG_B] bit = 1.
e. Wait for [PCAP_INIT] bit = 1.

其中e这个步骤,我找了很久也没找到所谓的PCAP_INIT在哪里,不知道是否是笔误,我的理解是这里应该是PCFG_INIT,PCFG_INIT为1代表PL READY FOR BITSTREAM PROGRAMMING。

把这个流程加在xdevcfg_transfer函数的最前面,在加载操作以前先对PL执行复位。

这个加载操作是很快的,CONFIG_DONE指示灯闪一下就立刻亮了,配置成功。

注:由于不再做FPGA相关的开发,而且此文离撰写时间已经过去太久的时间,评论区的问题恕难以答复。

 

您可能感兴趣的与本文相关内容

### FPGA 比特流文件组成结构详解 #### 1. 比特流的概念与作用 比特流文件是FPGA配置的核心,该文件包含了定义器件内部逻辑互联以及I/O标准的信息。当对FPGA进行编程时,就是将这个比特流加载到设备中去,从而完成特定的功能设定[^3]。 #### 2. 比特流的主要部分 - **头部信息**:位于整个比特流文件的最前面,它包括了版本号、目标器件型号以及其他一些全局参数等基本信息。 - **帧数据(Frame Data)**:这是比特流中最重要的一部分内容,每一帧代表了一定数量的数据位,用来控制具体的配置开关矩阵的状态。这些帧按照一定的顺序排列并写入相应的存储位置,进而决定了各个CLB (Configurable Logic Block) 和IOBs(Input/Output Blocks) 的工作方式。值得注意的是,尽管有详细的文档描述如何访问配置控制器寄存器命令,但对于具体内存帧布局细节却缺乏公开资料[^2]。 - **校验码(CRC Checksum)**:为了确保上传至FPGA中的数据无误,在最后会附加一段用于验证完整性的循环冗余检验值。 #### 3. 配置流程概述 利用专用开发环境提供的工具链——比如ISE Design Suite 或 Vivado HLS —— 用户能够编写RTL级源代码并通过综合、映射、布局布线等一系列操作最终得到所需的bitstream文件。之后便可通过JTAG接口或者其他串行下载协议把此二进制序列送入待初始化的目标芯片内执行实际部署任务[^1]。 ```bash # 使用vivado工具生成比特流文件的例子 vivado -source create_bitstream.tcl ```
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值