一直以来公司的硬件部选用的FPGA都是XILINX的,所以做项目时写的程序都是针对XILINX的器件,但是考虑到公司在降成本,将来换Altera的FPGA也不是没有可能,所以最近研究了一下,以前的代码当然大部分
都是通用的,但是项目中用到了XILINX的8bit嵌入式微处理器picoBlaze,这个处理器是专门针对XILINX的器件逻辑资源的结构而设计,占用资源极少,但是无法直接移植到其他厂家FPGA器件上,曾经试图看处理器的源码,但是好几次看了一点就放弃了,因为里面几乎所有模块全是用ISE的原语来实现,太难懂。后来在网上找到picoBlaze的一个克隆版,叫做pacoBlaze,这个全部用Verilog语言写成,因此是可以直接移植的,在XILINX器件上试了,可以用,占用约170个SLICE(约相当于Altera的340个LE),然后直接在QuartusII中测试,结果吓了一跳,竟然用了1500多个LE,结果发现处理器的register_file,scratch ram和stack全部被综合成用寄存器实现,16x8bit的寄存器,64x8bit的ram,32x10bit的stack,这样算下来占用的资源是不少,而在XILINX器件中,这些都可以被综合成分布式RAM,而且分布式RAM对于逻辑资源的利用率很高,例如8个SLICE(约等于16个LE)就能提供16x8bit的RAM,用来实现register_file,如果全部用寄存器来实现,需要128个LE,所以相差很多;后来翻了一下Altera的datasheet,发现他们的FPGA确实不能这么用,如果全部用寄存器来实现,还不如不用(其实scratch_ram可以用块RAM来实现,但是即使这样,register_file和stack占用的资源还是太多)。
解决办法还是有的,register_file用Altera的块RAM生成双口RAM来实现(只用了一个M4K的128bit,有点浪费),但是这个双口RAM是同步的,而XILINX的分布式RAM生成的双口RAM是异步的,中间差了一个时钟,这样原先2个clk执行一条指令变成了3个clk执行一条指令,性能打了折扣,但是速度换面积,不能两全其美;这样就开始在pacoblaze的基础上修改了代码,完成之后,先在XILINX器件上测试了一下(项目中的一个模块,功能稍复杂,用了600多条指令,如果在这个上面测试没有问题,就应该没什么大问题了),没有问题,然后在Altera器件上测试,综合之后只占用了211个LE,但是使用了4个M4K RAM,本来应该只要3个的,register_file,scratch ram和stack各用1个,查看了一下,原来register_file用两个M4K来实现,至于为什么,可以看文档Cyclone II Memory Blocks.pdf的第29页时序图(这种情况对于处理器没有影响),然后试着按这个时序图改写Verilog编码,结果还是用2个M4K来实现,只好用MegaWizard来实现,这样总共用了3个M4K,但是别忘了还有ROM呢,ROM最大支持1024条指令,即1024x18bit,用M4K来实现需要5个,最终总共消耗资源如下图所示
完成之后再开发板上编了一个简单的测试程序,数码管计数,没有问题
处理器的MIPS,这个应该是大家最关心的参数了吧,下面做两个对比吧,对比之前,先区别一下这几个版本的名字:
picoBlaze: XILINX官方原版处理器,占用资源极少,速度极快,但是只能用在XILINX器件上
pacoBlaze: picoBlaze的克隆版,可以移植到其他FPGA上
PSM : 本帖对pacoBlaze进行的修改,可以用于Altera FPGA并且占用较少资源,随便起的名字
对比1:picoBlaze和pacoBlaze在XILINX器件(XC3S700A-4)上速度的对比
picoBlaze : 140M/70MIPS 100 SLICE(约200个LE) 1Kx18bit块RAM 1个
pacoBlaze: 89M/44.5MIPS 179 SLICE(约358个LE) 1Kx18bit块RAM 1个
PSM : 110M/36.7MIPS 148 SLICE (约296个LE) 1Kx18bit块RAM 2个
可以看到,原版的性能超过后面两个许多,并且占用资源也少很多,已经优化到了极致;
对比2:PSM在XILINX器件(XC3S700A-4)和在Altera器件(EP2C5T144C8)上的速度对比
XILINX : 110M/36.7MIPS 148 SLICE (约296个LE) 1Kx18bit块RAM 2个
ALTERA : 75M/25MIPS 211 LE M4K 8 个
上述速度是模块单独综合之后的速度,实际的速度在优化布线之后会比这个快,但是外部连接了IO口之后又会增加延时,例如我在外部添加了两个8位宽的IO端口来控制数码管,最终速度为60M
下面是picoBlaze处理器的一些参数:
寄存器 :16个8bit通用寄存器
指令宽度 :18bit
程序空间 :1Kx18bit
片上RAM :64byte (PSM为256byte)
中断个数 :1个可屏蔽中断
IO :支持256个8位宽的IO端口(需要自己扩展)
picoBlaze只支持汇编语言,官方有一个汇编器,我自己编写了一个转换程序,可以将这个汇编器生成的HEX文
件转换为psm_rom.v并拷贝到psm文件夹下,这个文件会被综合成M4K格式的ROM,开发起来相对比较简单。
压缩包里的文件说明:
KCPSM3.zip —— picoBlaze官方的压缩包
pacoblaze-2.2.zip —— pacoBlaze官方压缩包
pacoblaze3.rar —— 自己誊写的pacoBlaze代码,由于官方的一个文件里面包括了4个版本,并且有很多宏定义
看起来比较乱,所以重新写了一下,只保留了第3个版本,兼容官方的KCPSM3,使用时只
要包含pacoblaze.v就行了,其他文件都被include了
psm.rar —— 自己修改的版本,1条指令周期需要3个CLK,可以移植到其他FPGA上的
psm_altera.rar —— 专用于Altera FPGA的版本,相对于PSM.rar版本,可以减少一个M4K
psm_demo.v —— 自己写的测试程序,实现了一个1s钟的周期中断和16个IO口
psm_rom.psm —— 汇编程序,控制8个数码管显示计数值,每个中断周期计数值加1
汇编器使用:
在PSM文件加下有一个Assembler文件夹,其中KCPSM3.EXE是官方的汇编器,另外有几个文件是这个汇编器必须
的:ROM_form.v,ROM_form.vhd,ROM_form.coe;运行汇编器汇编成功之后会生成许多文件,我自己编写了
一个转换程序psm_asm.exe,这个程序将生成的HEX文件转换为.v文件,这个.v文件可以直接用于工程,每次
修改完汇编程序,运行一下compile.bat,会自动生成.v文件,并将.v文件拷贝到psm文件夹下
|