前面已经简要的介绍了一下PicoBlaze。而这一次,我将介绍一下PicoBlaze的结构。以便让大家知道初步了解PicoBlaze的相关HDL文件和工具,为将来进行自己的PicoBlaze设计打下基础。
Xilinx对于PicoBlaze的IP核是免费提供的,你可以从如下网址进行下载:
http://www.xilinx.com/products/ipcenter/picoblaze-S3-V2-Pro.htm
需要注意的是,PicoBlaze对应Xilinx不同系列的CPLD和FPGA有不同的版本,因此在下载前你需要确认一下你所使用的硬件平台。这里我所使用的是Spartan3系列和Virtex-II Pro平台对应的PicoBlaze IP核。
同时,下载该IP核的充分条件为:

图 1 KCPSM3文件目录结构图
kcpsm3.vhd KCPSM3的核心VHDL描述
embedded_kcspm3.vhd 连接了program ROM的KCPSM3的VHDL描述文件 kcpsm3_int_test.vhd 压缩包自带的设计案例的VHDL文件 test_bench.vhd 对应kcpsm3_int_test.vhd的测试VHDL文件,相当于一个kcpsm3 test bench的模版 uart_clock.vhd 基于UART的实时时钟参考设计的VHDL文件 uart_tx.vhd UART发送器核,带有8位数据位,无奇偶校验,1位停止位,整型16字节FIFO缓冲器,占用了18个Slice uart_rx.vhd UART接收器核,带有8位数据位,无奇偶校验,1位停止位,整型16字节FIFO缓冲器,占用了22个Slice kcuart_tx.vhd UART发送器核,带有8位数据位,无奇偶校验,1位停止位。可作为发送器单独使用,但一般作为uart_tx的组成部分来使用 kcuart_rx.vhd UART接收器核,带有8位数据位,无奇偶校验,1位停止位。可作为发送器单独使用,但一般作为uart_rx的组成部分来使用 bbfifo_16x8.vhd 深度为16字节的FIFO,占用资源为8 Slice。在uart_tx和uart_rx中用到,也可作为FIFO单独使用 uart9_tx.vhd 带有奇偶校验和16字节FIFO的UART发送器 uart9_rx.vhd 带有奇偶校验和16字节FIFO的UART接收器 kcuart9_rx.vhd 带有奇偶校验的UART接收器 kcuart9_tx.vhd 带有奇偶校验的UART发送器 bbfifo9_16x9.vhd 深度为16字节的FIFO,占用资源为9 Slice。在uart_tx和uart_rx中用到,也可作为FIFO单独使用
如图 2所示,该图清楚地表明了PicoBlaze设计的HDL文件层次结构(对于用Verilog描述的设计也是这种结构,在此仅以VHDL为例);
图 2 PicoBlaze HDL层次结构图
KCPSM3.EXE KCPSM3的汇编程序 ROM_form.vhd 生成ROM的vhd文件模版 ROM_form.v 生成ROM文件的v文件模版 ROM_form.coe 生成ROM所需的系数的模版 cleanup.bat 批处理文件,能自动清理KCPSM3.EXE对*.psm汇编后产生的文件 int_test.psm 压缩包自带的设计案例的psm汇编文件 uclock.psm 基于UART的实时时钟的psm汇编文件
| PB_BMM.EXE | 能够定位FPGA配置文件中的Block Memory所在的数据段 (注1) |
| change_pb_bits.bat | 批处理文件,能够自动进行Block Memory中的数据修改 |
注1:该工具对于基于PicoBlaze设计的配置文件bitstream是可行的(这应该是因为基于PicoBlaze的设计结构简单),对于其他设计生成的bitstream文件不一定可行。
| hex2svfsetup.exe | JTAG用到的可执行程序 |
| hex2svf.exe | 同上 |
| svf2xsvf.exe | 同上 |
| playxsvf.exe | 同上 |
| jtag_loader.bat | 批处理文件,能够自动按顺序执行上述4个可执行程序 |
| JTAG_Loader_ROM_form.vhd | 包含了JTAG接口的ROM模版,VHDL格式 |
| Normal_ROM_form.vhd | 常规ROM模版,同前面的ROM_form.vhd |
| JTAG_Loader_ROM_form.v | 包含了JTAG接口的ROM模版,Verilog格式 |
| Normal_ROM_form.v | 常规ROM模版,同前面的ROM_form.v |
如果各位有使用过8051或者其他的8/16位的单片机的话就应该知道,主要的开发方式就是对其进行编程并将程序烧写进Flash中。基于PicoBlaze的开发方式也是也大致如此,稍有差别的就是需要将PicoBlaze认识并执行的程序经过Assembler转换成相应的HDL文件以存放在FPGA内部的Block Memory中(也正因为如此,PicoBlaze执行一条指令所需的时钟周期也是固定的)。下图是PicoBlaze核的一个结构框架图:
图 3 PicoBlaze结构框架图
图 3中,微控制器核心KCPSM3从Block Memory里面读取程序并按顺序执行。在这里我们可以看到PicoBlaze的存储空间为1024x18bit,也就是能够存放1024条位长为18的指令。而PicoBlaze支持的指令集也很精简,只有57条,包含了程序控制类(跳转,调用,返回),算数类(加,减,比较),逻辑类(与,或,异或),中断类(中断开启/关闭),移位/旋转类(左移/右移,左旋/右旋),输入/输出类(输入,输出)。
关于通用寄存器进行PicoBlaze设计的方法如下(也可以使用前面所说的DATA2MEM或者JTAG_loader工具来开发):
KCPSM3中一共有16个长度为8位的通用寄存器,每个寄存器都可以在汇编代码中分别命名。
关于中断
KCPSM3只支持1个中断信号,但实际上可以将多个中断信号用逻辑组合的方式变成一个来用(当然这样的话会降低单中断通道的性能)。
关于Scratch Pad Memory
我不知道Scratch Pad Memory该如何翻译。它的大小为64 Bytes,作用相当于一块临时存储区,比如在中断例程ISR中可以将其作为临时变量适用。
1. 首先在文本编辑器中用上述的这些指令实现特定的状态机,并以psm格式保存;
2. 然后按照图 4的流程生成符合能够存放在Block Memories中的ROM格式的vhd文件或者v文件,将vhd文件(或者v文件)作为PicoBlaze的Program在稍后的设计中以供调用;
3. 在ISE中建立一个工程,写一个顶层文件,将kcpsm3,program,transmitter和receiver等各模块包括进来,在这里使用UART的目的是将其作为PicoBlaze的控制台,分别用transmitter和receiver作PicoBlaze的输入控制和输出显示通道。
4. 编辑UCF文件,指定FPGA的输入输出管脚。
5. 然后就可以按照标准的Synthesis,Implement(Translate, Map, Place & Route),Generate Programming File以及最后的Download Bitstream的方式进行了。
图 5 由psm文件转换成ROM格式的vhd文件或v文件
以上是我自己对KCPSM中各个模块以及文档说明的理解,如有疏漏或错误之处,欢迎大家在此提出!让我们共同进步!
参考文献:
[1] PicoBlaze 8-bit Embedded Microcontroller User Guide, ug129,
Xilinx. Inc
[2] KCPSM3_Manual.pdf,
Available at
http://www.xilinx.com/products/ipcenter/picoblaze-S3-V2-Pro.htm
[3] JTAG_Loader_quick_guide.pdf,
Available at
http://www.xilinx.com/products/ipcenter/picoblaze-S3-V2-Pro.htm