标题：PicoBlaze处理器
产品简介
  PicoBlazeXilinx公司的嵌入式解决方案以3类RISC结构的微处理器为核心，涵盖了系统硬件设计和软件调试的各个方面。3类嵌入式内核分别为：PicoBlaze、MicroBlaze和PowerPC，其中PicoBlaze和MicroBlaze是可裁剪的软核处理器，PowerPC为硬核处理器。 [1]
PicoBlaze是8位微处理器，在Xilinx公司的Virtex、Spartan-II系列以上FPGA与CoolRunner-II系列以上的CPLD器件设计中以IP核的方式提供，使用是免费的。
PicoBlaze起初命名为KCPSM，是Constant(K) Coded Programmable State Machine的简称，意为常量编码可编程状态机。KCPSM还有个别称叫Ken Chapman's PSM ，Ken Chapman是Xilinx的微控制器设计者之一。
PicoBlaze是由VHDL语言在早期开发的小型8位软处理器内核包，其汇编器是简单的DOS可执行文件KCPSM2.exe或KCPSM3.exe，用汇编语言编写的程序经过编译后放入FPGA的块RAM存储器区。在XC3S500E的FPGA中，只用到了96个Silice，也就是只占用到5%的逻辑资源。PicoBlaze执行一条命令需要2个时钟周期，在Spartan3E Starter Kit板上以50MHz时钟为例，PicoBlaze也能达到25MIPS的性能。[2]
处理器版本
  PicoBlaze各版本详细对比KCPSM其支持类型有Virtex, Virtex-E, Spartan-II and Spartan-IIE FPGAsKCPSM2其支持类型有Virtex-II, Virtex-II Pro FPGAsKCPSM3其支持类型有Spartan-3, Virtex-4, Virtex-II, Virtex-II Pro, Virtex-5, Spartan™-6,  Virtex™-6 FPGAs
各版本的详细对比请点击右上角展开大图。
处理器应用框架
Picoblaze提供49个不同指令，16个寄存器（CPLD为8个），256 个直接或间接的可设定地址的端口，1 个可屏蔽的、速率为35MIPS 的中断。它的性能超过了传统独立元器件组成的微处理器，而且成本低，使得PicoBlaze 在数据处理和控制算法领域有着广泛的应用前景。由于可编程部分也完成嵌入，PicoBlaze 可与子程序和外围设备结合起来完成特殊的设计。
  PicoBlaze IP Core应用框架
各端口解释见下表：
端口功能I/Oaddress10位地址线outputinstruction18位指令输入inputport_idI/O地址控制outputwrite_strobe写控制outputread_strobe读控制outputinterrupt_ack中断响应outputout_port8位输出接口outputin_port8位输入接口inputinterrupt中断输入inputreset复位inputclk时钟输入inputinstruction18位指令输出output
处理器架构
  PicoBlaze处理器架构PicoBlaze 8 位微处理器内部结构如图所示。PicoBlaze 处理器IP Core 由全局寄存器、计算逻辑单元（ALU）、程序流控制标志和复位逻辑、输入/输出（I/O）、中断控制器等几大部分构成。全局寄存器16 个8 位全局寄存器，s0～sf。寄存器的操作是非常灵活的；没有为特殊任务保留寄存器，任何寄存器的优先权都是一样的。算术逻辑单元（ALU）提供了8 位处理器需要的所有简单操作。执行所有的操作都是用任意一个寄存器提供的操作数完成。若操作需两个操作数，则有另一寄存器指定或在指令中嵌入一8 位常量值。在不增加程序大小的前提下，指不定期任意常量值，增强了简单的指令特性。更明白地说，ADD1 与INCREMENT 指令是等价的。若操作超过8 位，则有一选项（增加或减少）可供选择。二进制操作码（LOAD、AND、OR、XOR）可操作和测试二进制数，还包括SHIFT 和ROTATE 指令集合。程序流控制标志ALU 操作后的结果影响ZERO 和CARRY 两个标记。用有条件的或无条件的程序流控制指令决定程序执行的顺序。JUMP 指令指定在程序空间内的绝对地址。CALL指令将程序定位到用一段代码写的子程序的绝对地址，同时将返回地址压栈。嵌套CALL 指令使用的栈为15 层，对于程序大小足够了。复位逻辑复位信号强迫程序回到初始状态，即程序从地址00 开始执行，中断被屏蔽，状态标记和堆栈也同时复位，但寄存器中内容不受影响。输入/输出（I/O）PicoBlaze 提供256 个输入端口和256 个输出端口。由端口总线提供一个8 位地址值与一个READ 或WRITE 选通脉冲信号，一起指定访问端口。这个端口地址值或为一确定值或由任意一寄存器中内容指定。当访问一由分布式或块状RAM 组成的内存时，最好用直接寻址。当进行输入操作时，输入端口上的值被输出一个READ_STROBE 输出脉冲时，即表示进行了一次输入操作。中断控制器PicoBlaze 提供一中断输入信号。只要用一些简单的组合逻辑，多个信号就可进行组合并被应用于这一中断。程序中可定义此中断是否被屏蔽，默认值是中断被屏蔽。一被激活的中断信号使程序执行“CALL FF”指令（FF 即256，程序存储器的最后一个位置），然后设计者为此定义的放在此处的一段程序被执行。一般在此地址放一JUMP 指令，跳转到中断服务程序。中断进程屏蔽其它中断，RETURNI 指令保证在中断程序结束后，标记和控制指令回到原先的状态。[3]
指令集
下面列举了所有代表十六进制的PicoBlaze 操作码的指令，其中：
①“X”和“Y”代表寄存器，“s”，范围为0～F；
②“kk”代表常量，“aa”代表地址，“pp”代表端口地址，范围均为00～FF。程序控制JUMP aaa
JUMP Z,aaa
JUMP NZ,aaa
JUMP C, aaa
JUMP NC,aaa
CALL
CALL Z,aaa
CALL NZ,aaa
CALL C, aaa
CALL NC,aaa
RETURN
RETURN Z
RETURN NZ
RETURN C
RETURN NC输入输出INPUT sX,pp
INPUT sX,(sY)
OUTPUT sX,pp
OUTPUT sX,(sY)逻辑运算LOAD sXX,kk
AND sXX,kk
OR sXX,kk
XOR sXX,kk
LOAD sXX,sYY
AND sXX,sYY
OR sXX,sYY
XOR sXX,sYY算术运算ADD sXX,kk
ADDCY sXX,kk
SUB sXX,kk
SUBCY sXX,kk
ADD sXX,sYY
ADDCY sXX,sYY
SUB sXX,sYY
SUBCY sXX,sYY移位与反转SR0 sXX
SR1 sXX
SRX sXX
SRA sXX
RR sXX
SL0 sXX
SL1 sXX
SLX sXX
SLA sXX
RL sXX中断指令RETURNI ENABLE
RETURNI DISABLE
ENABLE INTERRUPT
DISABLE INTERRUPT
具体细节请参看PicoBlaze的数据手册。
例化代码
VHDL版address       : out std_logic_vector(9 downto 0);
instruction   : in std_logic_vector(17 downto 0);
port_id       : out std_logic_vector(7 downto 0);
write_strobe  : out std_logic;
out_port      : out std_logic_vector(7 downto 0);
read_strobe   : out std_logic;
in_port       : in std_logic_vector(7 downto 0);
interrupt     : in std_logic;
interrupt_ack : out std_logic;
reset         : in std_logic;
clk           : in std_logicVerilog版output   [9:0]    address;                          
input     [17:0]   instruction;                        
output   [7:0]    port_id;                            
output              write_strobe; 
output              read_strobe;
output              interrupt_ack;
output   [7:0]    out_port;                           
input     [7:0]    in_port;                            
input                 interrupt;    
input                 reset;
input                 clk;                              
output   [17:0]   instruction;