1. 背景 最近有一个需求:项目用的IGBT驱动板上有一片CPLD,在现场做试验时需要改参数,不得不从功率柜上拆下来,使用JTAG重新烧写程序,但由于结构复杂,一拆一装需要6,7个小时,实在让人无法忍受,因此,需要研究一种CPLD在线配置的方法。 2. 问题 CPLD在线配置需要一个MCU和CPLD连接,MCU自身通过驱动板上的光纤接口和上位机连接,上位机通过一定的协议将配置文件发送给MCU,MCU再通过一定的时序去配置CPLD,但是问题是不知道CPLD的配置时序和数据格式,查遍Altera的资料,最后发现只能通过Jam STAPL这个东西来配置(某个论坛上有人说开发出来了一个U盘大小的配置工具,只要插到要配置的板件上就可以进行配置,不知道他用的方法是什么,应该和本文的方法大不相同,看了下面就会知道) 3. Jam STAPL介绍 Jam STAPL全称是The Jam Standard Test and Programming Language,由Altera的工程师发明,主要用于可编程器件的在线编程和测试,在1999年称为JEDEC标准JESD-71,很多可编程器件厂商、编程器厂商和测试工具厂商都支持这个标准。 Jam STAPL解决了一个问题:在配置可编程器件时,不同厂商的器件,相同厂商的不同器件都会有配置文件格式或者配置方法的差异,如果对每一种器件出一套方案,显然费时费力,而JAM STAPL的出现则屏蔽了这些差异,实现第三方工具的统一和兼容。 4. Jam STAPL工作原理 Jam STAPL包括两部分:Jam Composer和Jam Player;Jam Composer由可编程器件厂商提供,用来生成.jam文件,jam文件包含了对某个可编程器件进行配置的数据和算法;Jam Player读取jam文件的内容,将jam文件的指示转化为对JTAG接口的操作,可以完成对器件的测试和编程功能。 5. Jam文件 Jam文件有两种格式,一种是ASCII格式的,里面按照JESD-71A标准规定的语法编写,Altera推荐在上位机测试环境下使用这种格式;另一种是Jam byte-Code文件(.jbc),是二进制的,它是Jam文件经过编译之后的可执行文件,可以把Jam Player看做是一个虚拟机,它从jbc文件中获取指令和数据来执行jbc文件的操作,Altera推荐嵌入式环境下使用jbc文件,因为这样需要的资源比较少。 6. Jam STAPL Byte-Code Player的移植 本评测中要移植Jam Player到嵌入式微处理器中,所以使用jbc格式,Jam STAPLByte-Code Player的源代码可以在Altera官网下载到,但是里面是基于Windows或Linux桌面机的,但是移植到嵌入式微处理器中也很简单。 6.1接口函数移植jbi_jtag_io() jbi_export() jbi_delay() jbi_vector_map() jbi_vector_io() 本评测中的应用只是要实现CPLD的配置,只要实现前3个函数就行了 jbi_jtag_io()移植起来很简单,只要根据参数翻转IO即可,但是要先将IO配置为相应的模式 jbi_export()这个函数用来打印一些执行过程中要打印的内容,实际上分为几个函数: voidjbi_message() voidjbi_export_integer() voidjbi_export_boolean_array() 移植比jbi_jtag_io()还要简单,只要把printf函数换为自己的printf就行了,如: voidjbi_message(char *message_text) { xprintf("%s", message_text); } 6.2 内存管理配置 源代码中有两个函数void *jbi_malloc()和void jbi_free()用来管理内存分配,内存管理可以有两种方式,动态和静态,动态的就是直接调用malloc函数,静态的需要用户事先声明一个内存空间,所有的内存分配将在这段内存空间中进行,函数还具有记录内存使用情况的代码,这个功能很有用,可以知道最大内存使用情况来评估处理器是否可以满足使用,另外这部分代码也很有参考价值。 内存管理的函数不用移植,默认按动态方式管理,如果需要使用静态内存管理的方式,需要增加宏定义: #defineUSE_STATIC_MEMORY 360 这个宏定义将分配360KB的内存用于静态内存管理,另外加上一条宏定义来使能内存使用记录: #defineMEM_TRACKER 注:执行命令时发现,每次执行完命令,内存好像都没有释放(使用静态内存管理),所以在移植时加入了强制释放内存的语句 6.3 jbc文件存储方式 源代码基于桌面机,jbc文件是以文件的形式存储的,使用时需要读取到RAM中,如果嵌入式应用中也使用这种方式就不必修改什么,本评测中直接把jbc文件放在了ROM中,因此需要一些改动。 1. 添加jbc_program.c文件,里面包含jbc文件的数据jbi_data[]。 2. 在jbi_execute()函数调用时,用指针jbi_data和文件大小代替原来的参数file_buffer和file_length 由于源代码中使用jbc数据指针的函数都是用的unsignedchar*类型,jbi_data在rom中,用的是const unsigned char*,编译器会报错,所以将相关的函数声明和定义中的参数修改了一下。 进行到这里,差不多要结束了,最后外部只需要调用一个函数: int jam_player(int argc, char **argv) 这个函数尽量保持和Windows版本的main函数的格式一致 7 在Nucleo-STM32F767ZI-144上运行 移植到Nucleo-STM32F767ZI-144开发板上,连接超级终端,就可以输入命令了,几乎和Windows一样 下面是配置EP2C144C5 FPGA的过程: 可以看到,STAPL Byte-Code Player会打印出来jbc文件的信息,包括支持的操作和选项 注:输入的命令是“jam_player–v –aCONFIGURE led.jbc”,其中jam_player和led.jbc可以随便指定,因为这两个参数程序中不判断,只是为了和原来的指令格式保持一致 内存使用配置完之后会打印出内存占用情况,可以看到,仅仅是一个配置FPGA的SRAM就使用了315K的内存,其实最开始是想要烧写FPGA的配置芯片的,但是那个jbc文件是这个的3倍,并且还经过压缩了,运行时直接就不行了,打印出来的内存占用已经超过了500K,而STM32F767ZI的片上RAM有512KB,还是不能胜任,看来必须使用SDRAM才行。 配置速度 根据打印信息可以看到,配置用了2s,感觉和在QuartusII中使用STAPL Byte-Code Player相差不多,这也说明了M7速度惊人。 8 总结 移植完之后发现这种方法根本行不通,对处理器要求太高,不说成本,光是芯片体积也不合使用,不过倒是有解决办法,可以通过Nucleo-STM32F767ZI-144用串口连接一个低端的MCU,将IO的模拟指令通过串口发送给MCU,由MCU来模拟操作,但是这样的话,配置速度将会成百倍的降低,配置CPLD可能还可以,对容量较大的FPGA来说就有点无法接受了。 附录1-MCU和可编程器件连接 注:在配置完之后,要将MCU的IO设为input floating模式,这样不会跟JTAG仿真器冲突。 附录2-Quartus II中jbc文件的生成和配置注意事项 通过JTAG配置FPGA时有两种情况,一种是只配置SRAM,掉电之后就没有了,另外一种是将配置文件烧写到配置芯片中,掉电保存;如果要用jbc文件来执行配置,这两种情况生成jbc的方法也会不一样。 配置SRAM 这种情况只通过sof文件来生成jbc文件,步骤如下: 1. 在programer窗口addfile,选择.sof文件,注意将Program/Config和Verify打勾 2. 点击菜单File->Create JAM JBC SVF orISC file… 3. 在弹出的对话框的File Format一栏选择Jam STAPL Byte-Code 2.0,点击OK即可生成。 这样生成的jbc文件可以执行CONFIGURE操作,不能执行PROGRAM操作。 烧写配置芯片 这种情况也是要通过sof文件来生成jbc文件,但是要增加一些步骤: 1. QuartusII的主界面点击File->Convert ProgrammingFiles… 2. 在弹出对话框中的Programing File Type一栏选择JTAG Indirect Configuration File(.jic) 3. ConfigurationDevice选择EPS1 4. File name里面指定要生成的文件名字 5. 在Input Files to Convert中点击Flash Loader,在右侧点击Add Device,选择要配置的FPGA器件;点击OK,回到Input Files to Convert再点击SOF Data,点击右侧的Add File…,选择.sof文件,回到Input Files to Convert,点击Generate生成jic文件 6. 在Programmer界面,先Delete掉其他的文件,点击Add File,将刚生成的jic文件添加进去,将Program/Config、Verify和BlankCheck都打勾 7. 点击菜单File->Create JAM JBC SVF orISC file… 8. 在弹出的对话框的File Format一栏选择Jam STAPL Byte-Code 2.0,点击OK即可生成。 这样生成的jbc文件可以执行PROGRAM操作,但是也能执行CONFIGURE操作,这里就需要注意了,这里的CONFIGURE和前面那个不太一样,它并不是要将FPGA配置为所写的程序,而是将它配置为专门用来烧写配置芯片, 所以在STAPL Byte-Code Player中要先执行CONFIGURE指令,然后再执行PROGRAM指令,才可以成功烧写,如果直接执行PROGRAM指令(或Verify BlankCheck等),会报错(Unrecognized Device, ExitCode=6)。 ; o2 b) o' i0 ^9 ^6 z% u- q4 ~ |
刘氓兔的杂谈【001】-片上USB 高速PHY
【合集】STM32F7教程、资料大集合
基于STM32F746G-Discover的扩展电路板
F769 Discovery实现播放U盘音乐的播放器
STM32 VS Code Extension (在Ubuntu上开发STM32,ST官方vscode插件使用指南)
STM32F765@216MHz跑NES模拟器【代码】【视频】
基于STM32F7实现ADC软件触发+轮询采集
基于STM32F7进行ADC采集解决更新问题
基于STM32F7使用定时器经验分享
实现基于STM32F7中周期采集