请选择 进入手机版 | 继续访问电脑版
查看: 184|回复: 3

[资料] 移植JAM Player到Nucleo-STM32F767ZI-144

[复制链接]

签到天数: 732 天

[LV.9]元老将成

发表于 2018-8-3 12:45:26 | 显示全部楼层 |阅读模式
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 IIjbc文件的生成和配置注意事项
       通过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)。
2.png

签到天数: 673 天

[LV.9]元老将成

发表于 2018-8-4 13:05:52 | 显示全部楼层
不错的资料
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部