博客首页 | 排行榜 |

萤火虫的博客

沒有月亮,我們可以看星光;失去星光,還有溫暖的眼光;抱著希望,等待就少點感傷;彷彿不覺

个人档案
博文分类
[FPGA博客大赛]硬件软件化之mcu软核编程[1]  2010-02-21 13:52

1、pbasm简介:

pbasm全称picoblaze assembler.也就是专门针对picoblaze软核的编译器。他的输入是汇编语言。输出vhdl文件,可以和其他vhdl文件放到一起进行编译。这个编译器是开源的,做为开源项目,他的源码文件可以从sf.net上自由下载。为了更好的了解一下和学习picoblaze,我打算从这个编译器的源码文件开始学习。他的运行环境是基于linux,不过可以 用cygwin在windows下模拟。

2、pbasm程序框架介绍:
本程序由5个c语言文件和2个h头文件组成。其中主函数main在pbasm.c中,我们就先从认识它的总体结构入手。
主函数有6大块构成,如下图所示,我们分别来逐个介绍:


1、命令行分析模块:
因为没有用单独的函数实现,占用主函数行数最多的模块,有50行之多,这个模块主要由一个while大循环和后面一个判断源文件名两小块构成。从while循环里的构成,我们很容易看出,这个模块对命令行输入各参数的处理过程。其中-a参数的处理比较复杂一些。-a参数的实际意义是设置mcu软核的体系结构,我们知道PicoBlaze的体系大概分2种,一个是kcpsm-1只有256个指令空间,每条指令是16位的,,另一个是kcpsm3有1k的空间,指令是18位的,而且还多出4个特殊指令。这样在软件处理上,就需要根据不同的配置做不同的处理。这个切换的操作是在adb_lookup函数中完成的。其中参数key是命令行指定的体系参数。结构数组adbtab存有所有可能体系的信息。这样通过用key 和数组中的每一个结构比较,找到正确的体系后,将指针存到变量adb中,以便后面正确使用。
2、初始化模块:
这个模块主要是添加当前指定的mcu软核体系后,将它的相关信息加入到符号表中,以供后面的分析器使用,这里将添加的信息分成了5类处理:关键字,特殊关键字,指示符,寄存器和修饰符.关键字就是每条指令的名称,特殊关键字是针对kcpsm3的,有4个多出来的特殊字,指示符有三个:CONSTANT,NAMEREG,ADDRESS,有点像51里的EQU,ORG什么的.这三类信息都使用KEYWORKD_ADD方式加入到符号表里.寄存器就是s0-sf这16个寄存器,通过register_add加入到符号表.最后是指令的修饰符,有7个,其中N,NC,Z,NZ是Z和C标识位判断,INTERRUPT是提供给enable,disable指令用的, ENBLE和DISBLE是为RETURN指令提供的.修饰符通过modifier_add函数添加到系统符号表里.
3、分析器模块:
通过调用YYPASE函数,进行将源代码翻译成指令的工作.它的输入参数是源文件的句柄,输出参数是一个大的指令数组instr_list,这部分是在其他文件中实现的,而且涉及到LEX&YACC的东西,具体实现细节俺现在还没弄明白,等以后再说吧.
4、指令校验模块:
这一步是将生成的指令列表中的每一条指令,用其在系统符号表里的参数配置和原文建里的分析结果进行比较,如果有任意一个不匹配,就输出错误,并且退出程序.这一工作是在函数args_verify中完成的.
5、合并代码模块:
此模块功能将生成的机器码和已经存在的模板合并,生成新的文件.合并大概过程是:
A.只更改模板文件中{}标记符内的内容.
B.如果大括号内是'begin template',则开始合并工作.
C.如果大括号内是'INIT_',则替换成要生成的机器码[指令的低16位].
D.如果大括号内是'INITP_',则替换成要生成的机器码的高两位[指令是18位的].
整个合并过程是在merge函数中进行的,并且用了一个三个状态的小状态机.如下图所示:

 


其中c表示当前字符.
6、日志输出模块:
这一项是可选的,如果用户在命令行指定-l参数,则运行此模块.它主要生成一个机器码和源文件对照的日志纪录文件,用来检查编译器工作是否正确.整个处理过程在log_output函数中完成,生成的日志文件一共有3列,第一列是指令的地址列表,第二列是机器码列表,第三列是源文件列表.这个过程为了取得机器码列表,又对源文件编译了一遍.
至此,pbasm.c这个主要的源文件基本分析完成,在回顾对比一下上次的编译结果,看是否有新发现?
运行./pbasm  test.psm,用生成的test.vhd和rom_form.vhd文件比较,发现内容大部分一样,只是rom_form.vhd里{begin template}前面的内容,没有在test.vhd中出现.以前的{name}被换成了test;'{INIT_'被换成了一堆二进制数,这应该就是生成的机器码,我们再次验证一下,运行.\pbasm test.psm,打开生成的test.log文件,从地址00-0f的机器码,和INIT_00那一行从后往前看,是完全一样的,其他地址的数值依次比较后,也分别一样.

附件是pbasm的源码,如果有兴趣,可以参考学习:

pbasm_0.2_src.tar.gz

过年了,在牛尾巴上写了这么一篇文章,来年虎年再见,祝大家新年快乐。

类别:fpga |
上一篇:[FPGA博客大赛]硬件软件化之mcu软核编程[2]  | 下一篇:[FPGA博客大赛]硬件软件化之mcu软核编程[0]
以下网友评论只代表其个人观点,不代表本网站的观点或立场