具体实施方式
图2为本发明中逻辑器件组成一条JTAG编程链实施例框图。如图2所示,将不同和/或相同类型厂家的逻辑器件1-8组成一条JTAG链进行在线编程。本发明主要将不同和/或相同厂家的各个逻辑器件成一条JTAG链,并对所述JTAG链上的各个逻辑器件进行在线编程。
将各个逻辑器件形成一条JTAG链后,可以采用四种方式对各个逻辑器件进行在线编程:
第一种在线编程方式,分别生成包含JTAG链上各个逻辑器件位置信息、JTAG指令寄存器长度和JTAG链上单个逻辑器件编程内容的单个编程文件;所述各单个编程文件分别调用对应的移植代码,对相应逻辑器件进行在线编程;
图2包括8个逻辑器件,假设逻辑器件1为ALTERA公司的器件,逻辑器件3为LATTICE的器件;则逻辑器件1对应的1.pof编程文件需要调用ALTERA公司的编程工具生成移植代码JAMPLAYER识别的格式为.jbc的单个编程文件(包含JTAG链上各个逻辑器件位置信息、JTAG指令寄存器长度和JTAG链上逻辑器件1的编程内容),同理,逻辑器件3对应的3.jed编程文件需要调用LATTICE公司的编程工具生成移植代码ispVMEmdedded识别的格式为.vme的单个编程文件(包含JTAG链上各个逻辑器件位置信息、JTAG指令寄存器长度和JTAG链上逻辑器件3的编程内容)。这种编程方式需要生成对应器件的八个编程文件,通过调用不同厂家的移植代码把生成的包含单个器件编程内容的编程文件加载到相应逻辑器件中。
第二种在线编程方式,JTAG链上不同厂家编程工具分别生成几种不同格式的成链编程文件;所述成链编程文件包含JTAG链上各个逻辑器件位置信息、JTAG指令寄存器长度和JTAG链上相同厂家逻辑器件编程内容;各成链编程文件分别调用对应的移植代码,对JTAG链上的各个逻辑器件进行在线编程;
如图3所示,为第二种在线编程方式流程图:
步骤1’:JTAG链上不同厂家逻辑器件利用厂家工具分别生成几个不同格式的成链编程文件;所述成链编程文件包含JTAG链上各个逻辑器件位置信息、JTAG指令寄存器长度和JTAG链上相同厂家逻辑器件的编程内容及位置信息;
步骤2’:不同格式的成链编程文件分别调用对应的移植代码,对JTAG链上的对应的逻辑器件进行在线编程。
现结合图2下面对第二种在线编程方式的过程举例说明:
如图2所示的一条JTAG链中,逻辑器件1、3为ALTERA公司的器件,逻辑器件2、4为LATTICE公司的器件;下面对编程过程进行描述:
a)分别生成包含单个器件编程内容的单个编程文件。如逻辑器件1和3利用ALTERA公司的编程工具分别生成对应格式的单个编程文件1.pof、3.pof;逻辑器件2和4利用LATTICE公司的编程工具分别生成对应格式的单个编程文件2.jed、4.jed;
b)生成包含JTAG链上各个逻辑器件位置信息、JTAG指令寄存器长度及逻辑器件1、3编程内容的.jbc格式的成链编程文件,生成包含JTAG链上各个逻辑器件位置信息、JTAG指令寄存器长度和逻辑器件2、4编程内容的.vme格式的成链编程文件;
1.pof、3.pof单个编程文件需要调用ALTERA公司的编程工具生成移植代码JAMPLAYER识别的格式为.jbc的成链编程文件(只包含器件1、3的编程内容和JTAG链上各个逻辑器件位置、JTAG指令寄存器长度信息),同理,逻辑器件2、4对应的2.jed、4.jed单个编程文件需要调用LATTICE公司的编程工具生成移植代码ispVMEmdedded识别的格式为.vme的编程文件(只包含器件2、4的编程内容和JTAG链上各个逻辑器件位置信息、JTAG指令寄存器长度信息);
c)各种格式的成链编程文件分别调用对应的移植代码,对JTAG链上的逻辑器件进行在线编程:
只包含JTAG链上各个逻辑器件位置信息、JTAG指令寄存器长度和器件1、3的编程内容信息的.jbc格式的成链编程文件调用对应的移植代码JAMPLAYER对逻辑器件1、3进行在线编程;只包含JTAG链上各个逻辑器件位置信息、JTAG指令寄存器长度和器件2、4的编程内容的.vme格式的成链编程文件调用对应的移植代码ispVMEmdedded对逻辑器件2、4进行在线编程。
由上可知,一条JTAG链上有几个不同的厂家,需要生成几个只包含相同厂家逻辑器件编程内容的成链编程文件,通过调用不同厂家的移植代码把生成的成链编程文件加载到对应逻辑器件中。
第三种在线编程方式,JTAG链上不同厂家逻辑器件利用厂家工具分别生成几种不同格式的成链编程文件;所述成链编程文件包含JTAG链上各个逻辑器件位置信息、JTAG指令寄存器长度和JTAG链上相同厂家逻辑器件的编程内容;对生成的不同格式的成链编程文件进行解析,获取JTAG链上各个逻辑器件的编程内容,对JTAG链上的各个逻辑器件进行在线编程;
如图4所示,为第三种在线编程方式流程图:
步骤1”2:利用JTAG链上不同厂家编程工具分别生成几个不同格式的成链编程文件;
步骤2”:对生成的不同格式的成链编程文件进行解析,获取相应逻辑器件的编程内容,对JTAG链上的相应逻辑器件进行在线编程。
利用JTAG链上不同厂家的编程工具分别生成几种不同格式的成链编程文件的具体生成过程可参见第二种在线编程方式中a)和b)部分的描述。
下面对生成的不同格式的成链编程文件进行解析,获取相应逻辑器件的编程内容进行说明,参见图5,对成链编程文件解析获取相应逻辑器件的编程内容包括:
步骤21:根据成链编程文件的格式,执行对应格式的循环冗余(CRC)校验;如:输入的成链编程文件格式为.jbc,则执行jbc格式对应的校验,jbc_crc_check;
步骤22:判断循环冗余校验是否正确,当循环冗余校验正确时,执行步骤23;否则结束;
步骤23:根据成链编程文件的格式,解析JTAG链上各个逻辑器件的位置信息、JTAG指令寄存器长度信息及相应逻辑器件的编程内容。
生成所述的成链编程文件后,根据各个成链编程文件的格式(.jbc、.vme等格式)设置不同格式的解析过程,解析出具体的JTAG链上的逻辑器件信息、指令长度和编程内容等,完成对JTAG链上逻辑器件的加载和编程。
具体的:在获得成链编程文件后,根据成链编程文件的格式,如.jbc格式、vme格式执行对应格式的解析。每种格式的成链编程文件在固定位置会存储有固定的信息,表1所示为.jbc格式的成链编程文件格式:
表1.jbc格式的成链编程文件格式表
0x00 |
First_word(4A 41 4D 01) |
action_table(00 00 00 44) |
Proc_table(00 00 00 80) |
String_table(00 00 01 84) |
0x10 |
Note_strings(00 00 07 DF) |
Note_table(00 00 09 06) |
Symbol_table(00 00 09 6E) |
Data_section(00 00 15 6A) |
0x20 |
Code_section(00 00 3c 83) |
Debug_section |
Crc_section | | | | |
0x30 |
Action_count(00000005) |
Proc_count(00 00 00 14) | | | | |
Note_count(00 00 00 0D) |
0x40 |
Symbol_count(000000EC) |
Action1:name_id(00 00 031B) |
Act_desc_id |
Act_proc_id(0x00) |
0x50 |
Action2 | | | | |
Current_proc(0x08) |
Action3 |
0x60 | | | | |
0x0B | | | |
Action4 | | | | |
0x70 | | | |
0x0F |
Action5 | | | | |
0x12 | | | |
上表只是对.jbc文件的格式进行了一些简单分析,左边一列标的是地址。First_word(4A414D01)是固定的,还有可能是4A414D00,一个成链编程文件的首地址中如果是这两个值,则可以解析出为.jbc格式的成链编程文件,并且是由QUARTUS编程工具生成。接下来的action_table,procdure_table,string_table等存储的是变量的地址,这些变量都是指针形式,根据指针所指的地址从成链编程文件的相应位置检索出对应的信息值。因此.jbc格式的成链编程文件基本上是按照这种指针的一种排列结构组成的,把所有的有用信息全包含在内。根据这种格式的成链编程文件在对应位置读取相应的信息后,会获得文件的格式、版本信息、编译工具、JTAG链上各个逻辑器件的位置信息、相应逻辑器件的编程的数据内容等。
本实施例步骤22中,成链编程文件格式如果为.jbc格式,执行的jbc_crc_check校验结果与成链编程文件中的循环冗余数据Crc_section进行比较,如表1中0x28-0x2b位置处存放循环冗余数据Crc_section,为后续解析和在线编程提供了准确性保证。其它如.vme等格式的成链编程文件与.jbc格式的成链编程文件数据的存放位置和每个位置中数据的含义虽然不同,但只是存放格式不同,解析过程相似,在此不再一一例举。
在对不同格式成链编程文件的编程内容解析后,获得各个逻辑器件的位置信息、JTAG指令长度及各个逻辑器件的编程内容,然后对各个逻辑器件进行在线编程,后续会对逻辑器件进行编程内容加载的过程进行具体说明。
第四种在线编程方式,生成一个包含JTAG链上所有逻辑器件信息的串行向量格式的成链编程文件,利用所述成链编程文对JTAG链上任一逻辑器件进行在线编程。
下面结合图2和图6对逻辑器件第四种在线编程的方法进行说明。
图6为本发明逻辑器件在线编程的方法实施例三流程图。如图6所示,本实施例包括:
步骤1:生成包含一条JTAG链上各个逻辑器件位置信息、JTAG指令寄存器长度、各个逻辑器件编程内容的一个串行向量格式的成链编程文件;
步骤2:对所述成链编程文件进行解析,获取各个逻辑器件的编程内容,对JTAG链上各个逻辑器件进行在线编程。
本实施例步骤1需要生成一个成链编程文件,将一条JTAG链上不同或相同厂家的所有逻辑器件编程内容、JTAG指令寄存器长度和位置信息等包括在内。步骤1生成满足要求的一个成链编程文件的过程参见图7,包括:
步骤11:生成包含JTAG链上单个逻辑器件编程内容和JTAG指令寄存器长度的单个串行向量格式的编程文件;
步骤12:根据上述单个串行向量格式的编程文件及JTAG链上各个逻辑器件的位置,用任一编程工具生成或者对各个单个编程文件手工编辑生成一个串行向量格式的成链编程文件。
下面结合图2对串行向量格式成链编程文件的生成过程举例说明:例如,图2中1、3为ALTERA公司的器件,2、4为LATTICE公司的器件;生成一个包含逻辑器件1-4的串行向量格式的成链编程文件包括:
a)分别生成包含单个器件编程内容和JTAG指令寄存器长度的单个编程文件。如逻辑器件1和3利用ALTERA公司的编程工具分别生成对应格式的单个编程文件1.pof、3.pof;逻辑器件2和4利用LATTICE公司的编程工具分别生成对应格式的单个编程文件2.jed、4.jed;
b)要将JTAG链上各个逻辑器件不同格式的单个编程文件生成一个成链编程文件,需要先将不同格式的单个编程文件生成串行向量格式的编程文件,如:利用LATTICE公司的编程工具将2.jed和4.jed转换成串行向量格式(Serial Vector Format,简写为svf)的编程文件2.svf、4.svf。串行向量格式是不同编程工具都可以生成的文件格式,并且所有逻辑器件都支持这种格式的编程文件;
c)用任一编程工具,如:LATTICE公司的编程工具ispVM,将4个串行向量格式的单个编程文件生成一个包含器件1-4串行向量格式的成链编程文件,或者对各个单个编程文件手工编辑生成一个包含器件1-4串行向量格式的成链编程文件:
利用编程工具的链编辑功能,按照逻辑器件的位置先后,将4个单个串行向量格式的单个编程文件生成一个串行向量格式的成链编程文件,或者按照JTAG链上各个逻辑器件的位置次序,对各个单个串行向量格式编程文件手工编辑合并生成一个串行向量格式的成链编程文件。
因此,利用任一编程工具或者手工编辑可以生成一个串行向量格式的成链编程文件,该成链编程文件中包含JTAG链上各个逻辑器件的位置,编程内容和JTAG指令寄存器长度。在生成一个串行向量格式的成链编程文件之后,对所述成链编程文件进行解析,获得各个逻辑器件的编程内容,然后对JTAG链上任一逻辑器件进行在线编程。
串行向量格式定义了一套语法,用以描述JTAG指令和数据的扫描顺序和过程,以及指令和数据的内容,是JTAG通道链路动作的描述性语言。与.jbc或者.vme格式的成链编程文件不同(如表一所例举的.jbc格式的成链编程文件是难于识读的二进制代码,不易识读),串行向量格式的文件类似于C语言文件一样可读性比较高,这种格式的成链编程文件的内容是可读的,甚至可以根据需要进行编辑,从中可以直接解析出各个逻辑器件的编程指令、数据内容及位置信息等,获得各个逻辑器件信息后再对各个逻辑器件加载相应的编程内容。
第一种和第二种在线编程方式需要生成几个单个编程文件或成链编程文件;并分别调用对应的移植代码,对JTAG链上的各个逻辑器件进行在线编程,这两种编程方式和编程过程比较简单,但受到各厂家移植代码的限制;第三种在线编程方式也需要生成几个不同格式的成链编程文件,但后续编程时不调用厂家移植代码,对生成的不同格式的成链编程文件进行解析,解除了厂家对移植代码的私有保护;第四种在线编程方式同样实现了对一条JTAG链上逻辑器件的在线编程,生成一个串行向量格式的成链编程文件,并对所述串行向量格式的成链编程文件解析,用一个成链编程文件即可完成对所有逻辑器件的加载和编程。
第三种和第四种在线编程方式中,对成链编程文件解析获取各个逻辑器件的编程内容、指令长度和位置信息后,即可对JTAG链上各个逻辑器件进行在线编程,参见图8,对JTAG链上各个逻辑器件进行在线编程包括:
步骤31:根据各个逻辑器件位置信息、JTAG指令寄存器长度对指令进行处理,将需要编程的逻辑器件选定编程状态;
步骤32:将数据内容加入需要编程的逻辑器件。
步骤31中根据各个逻辑器件位置信息、JTAG指令寄存器长度对需要编程的逻辑器件送出编程指令,不需要编程的逻辑器件送出旁路指令,将对各个逻辑器件的指令按照位置依次发送,则只对需要编程的逻辑器件选定编程状态。
图9为图8实施例解析示意图。如图9所示,三个器件成一条JTAG链,从测试数据输入(Test Data Input,简称TDI)口输入数据,从测试数据输出(Test Data Output,简称TDO)口输出数据。对器件2进行编程,假设对成链编程文件解析后获知器件1的JTAG指令寄存器长度为6;器件3的JTAG指令寄存器长度为8;器件2的JTAG指令寄存器长度是10,在线编程(ISC_PROGRAM)的二进制指令是“0000010010”。在对器件2编程时,需要把在线编程(ISC_PROGRAM)指令送给器件2的指令寄存器,器件1和3都需要旁路(根据IEEE 1149.1标准,旁路指令全为“1”),因此在扫描指令周期,从TDI送入的二进制指令应该是“111111000001001011111111”,共24位。器件1接收到的指令就是“111111”,器件2接收到的指令就是“0000010010”,器件3接收到的指令就是“11111111”。器件1和3执行旁路操作,器件2开始执行在线编程操作,编程数据内容从TDI送给器件2,器件1和3处于旁路状态。
同理,将编程内容加入需要编程的逻辑器件过程为:对不需要编程的逻辑器件送出旁路数据(根据IEEE 1149.1和IEEE 1532标准,旁路数据送一位“0”即可)。对需要编程的逻辑器件,此逻辑器件的数据内容通过JTAG接口的TDI口串行地移入器件,获得编程内容。如器件2的编程数据为97位“****....**”,共97位数据,则对器件2写入编程内容时,需要把编程内容送给器件2的数据寄存器,器件1和3都需要旁路(只需要送出一位“0”即可),因此从TDI送入的二进制数据应该是“0****....**0”,共99位,器件1和器件3是旁路数据,只有器件2收到97位的编程数据。具体操作参照IEEE1149.1和IEEE 1532标准,在IEEE1149.1标准规范中,规定了串行移位和旁路的操作,在此不再详述。
图10为本发明对JTAG链上一逻辑器件进行在线编程的实施例二流程图。在生成包含JTAG链上各个逻辑器件位置信息、JTAG指令寄存器长度、各个逻辑器件编程内容的一个串行向量格式的成链编程文件或生成包含JTAG链上各个逻辑器件位置信息、JTAG指令寄存器长度和相同厂家逻辑器件编程内容的几个不同格式的成链编程文件后,通过对成链编程文件的解析,获得JTAG链上各个逻辑器件的位置、编程数据、指令长度后,在对JTAG链上某一逻辑器件进行编程时,包括:
步骤310:调用JTAG控制函数,使整个JTAG链处于编程状态;
步骤311:对编程指令进行处理,非编程器件用旁路指令替代;
步骤312:输出附加后的指令,选定需要编程的逻辑器件;
步骤32:输出编程数据,进行编程;
步骤4:对逻辑器件串行移位读出的编程数据进行校验,判断是否正确,是则结束,否则判断是否超过预设的次数,本实施例设定为3次,如果不超过3次则执行步骤310,重新编程,否则结束,表示编程失败。
在对某一逻辑器件进行在线编程后,对逻辑器件串行移位读出的编程数据进行校验,判断编程的数据内容是否与要加载的数据内容一致,保证对逻辑器件在线加载的准确性。
图11为本发明逻辑器件在线编程的装置实施例一示意图。如图10所示,本实施例包括:
获取模块1,与编程模块2连接,用于获取包含JTAG链上各个逻辑器件位置信息、JTAG指令寄存器长度和相同厂家逻辑器件编程内容的不同格式的成链编程文件或包含JTAG链上所有逻辑器件位置信息、JTAG指令寄存器长度、逻辑器件编程内容的串行向量格式的成链编程文件;
编程模块2,与获取模块1连接,用于解析成链编程文件,获得各个逻辑器件的编程内容并对JTAG链上任一逻辑器件进行在线编程。
图11实施例为实现本发明中逻辑器件在线编程方法的装置,可以实现在一条JTAG链上,用一个成链编程文件对JTAG链上不同厂家的逻辑器件进行在线编程,增强了逻辑器件编程的灵活性,占有较少的物理资源,减少文档管理的成本和编程复杂度。
图12为本发明编程模块内部结构实施例示意图。如图12所示,本实施例中,编程模块包括:
接口模块21,与解析模块22连接,读入成链编程文件,控制逻辑器件的JTAG接口,完成编程操作;所述接口模块21与可编程器件的JTAG接口连接,以输出并控制编程数据内容;
解析模块22,与接口模块21连接,根据获取的成链编程文件解析各个逻辑器件的编程内容;并对某一逻辑器件进行在线编程时将解析结果传入接口模块21;解析模块22进一步包括:
校验子模块221,与格式解析子模块222连接,对成链编程文件进行校验,通过时将成链编程文件传入格式解析子模块222;
格式解析子模块222,与校验子模块221及存储子模块223连接,根据成链编程文件的格式,对成链编程文件进行解析,获取JTAG链上各个逻辑器件的位置信息、JTAG指令寄存器长度信息及各个逻辑器件编程的数据内容;
存储子模块223,与格式解析子模块222连接,保存解析的各个逻辑器件编程的数据内容。
本实施例中校验子模块可以对成链编程文件进行校验,增加了准确性;格式解析模块可以根据成链编程文件不同的格式执行对应的解析,具体操作可参见本发明方法实施例的说明。
图12实施例中,所述编程模块还可以包括:调用模块23,与接口模块21连接,用于根据接口模块获取的包含JTAG链上各个逻辑器件位置信息、JTAG指令寄存器长度和相同厂家逻辑器件编程内容的不同格式的成链编程文件调用对应的移植代码,将编程内容传入接口模块21。
在生成满足只包含相同厂家逻辑器件编程内容的成链编程文件后,可以调用厂家的移植代码对链上逻辑器件进行在线编程,或者对不同格式的成链编程文件进行解析,然后对链上逻辑器件进行在线编程,所以编程模块可以包括解析模块或调用模块,也可以两者均包括,实现灵活的编程方式。
图13为本发明逻辑器件在线编程的装置实施例二示意图。图13中解析模块内部结构与图12类似,不同之处在于,解析模块中还包括:数据处理子模块224,与存储子模块223连接,根据各个逻辑器件位置信息、JTAG指令寄存器长度对编程指令或数据进行处理,将处理后的指令或数据发送给接口模块21。其它与图12中相同具体功能模块不再详述。
本发明实施例对于不同厂家的逻辑器件形成一条JTAG链,不需要移植不同厂家提供的编程代码,即可对JTAG链上的逻辑器件进行在线编程,增强了逻辑器件编程的灵活性;可以生成一个包含所有逻辑器件信息的串行向量格式的成链编程文件,利用一个成链编程文件对逻辑器件进行编程,减少了文档管理的成本、占有较少的物理资源,并且大大简化了不同厂家多个逻辑器件成链时对逻辑器件进行在线编程的复杂程度,特别适用于嵌入式编程,进行远程升级和维护。
最后应说明的是:以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的精神和范围。