一直以来公司的硬件部选用的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文件夹下 
 |   
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册 
 
 
 
×
 
     
  
 |