Xilinx社区
首页 > 设计经验 > 蜻蜓点水之Picroblaze
设计经验
蜻蜓点水之Picroblaze
来源:  时间:2015-03-20  浏览量:1476

Picroblaze 介绍:

PicoBlaze微控制器是赛灵思推出的一个高性能低成本的8位处理器软核,它由Veriolog或VHDL语言实现,可以在FPGA/CPLD上实现,具有设计灵活方便,运行速度快,占用资源少的特点。虽然现在32位处理器大为盛行,但在一些低速的复杂控制方面使用PicoBlaze微控制器具有较大的成本优势,在这些应用中使用PicoBlaze微控制器将是一个比较好的方案。PicoBlaze微控制器的实现代码对用户是公开的,可使用户完全掌握设计中的所有细节,方便调试与使用,设计者甚至可以修改代码、增加和减少功能块来定制自己专用的处理器,体现了极大地灵活性,在低成本的场合使用还是相当不错的。

PicoBlaze结构概述

PicoBlaze微控制器由16 字节的通用寄存器、1K×18 BIT ROM、1个字节宽度ALU、64 字节的内部RAM和程序计数器等组成,具体框图如下图一所示(摘自赛灵思文档ug129.pdf):    01.jpgPicoBlaze微控制器提供57条不同的指令,256个直接或间接的可设定地址的端口,1个可屏蔽的中断,依赖于具体实现的FPGA型号,可获得44~100 MIPS的性能。更详细的描述请参考附件中UG129和KCPSM3_Manual,附件KCPSM3中也包含Pircoblaze3的代码及编译器,这些内容在XILINX的官网可以下载到。网上还可以找到基于Pircoblaze的IDE仿真环境,下载地址:http://www.mediatronix.com/pBlazeIDE.htm,这个软件也会包含在附件pBlaze_ide中。

关于PicoBlaze的详细使用会在后续的帖子中给出相关例程。

由于源码采用的基于LUT的描述方式,所以在阅读和理解上比较麻烦,为了更好的理解Picroblaze这个简单CPU,花了一天的时间使用Verilog的行为级描述重写了一个非常简单的PPicroblaze,开始支持的指令只有四条,寄存器只写了S1,指令空间为1K,后面有时间的话,希望能够完成整个Picroblaze。重写的目的仅仅是想深入的了解的架构。CPU结构图如下:  

02.jpg

Ppicroblaze代码如下:

  1. module ppblaze(clk,rst,port_id,out_port);

  2. /***** *****/

  3. input clk,rst;

  4. output[7:0] port_id;

  5. output[7:0] out_port;

  6. //--- ---

  7. wire [9:0] address;

  8. wire [17:0] instruction;

  9. wire [5:0] cmd;//just for simulate




  10. assign cmd = instruction[17:12];

  11. /*** ***/

  12. reg clk_div2;




  13. always @(posedge clk or posedge rst) begin

  14. if(rst) clk_div2 <= 1'd0;

  15. else clk_div2 <= ~clk_div2;

  16. end

  17. /*** ****/

  18. reg pc_sel,rs1_sel,rs1_load,id_load,out_load;




  19. always @(rst or instruction) begin

  20. if(rst) {pc_sel,rs1_sel,rs1_load,id_load,out_load} <= 5'b00000;

  21. else

  22. case (instruction[17:12])

  23. 6'b000000:{pc_sel,rs1_sel,rs1_load,id_load,out_load} <= 5'b00100;//load

  24. 6'b011000:{pc_sel,rs1_sel,rs1_load,id_load,out_load} <= 5'b01100;//add

  25. 6'b101100:{pc_sel,rs1_sel,rs1_load,id_load,out_load} <= 5'b00011;//out

  26. 6'b110100:{pc_sel,rs1_sel,rs1_load,id_load,out_load} <= 5'b10000;//jump

  27. default:{pc_sel,rs1_sel,rs1_load,id_load,out_load} <= 5'b00000;

  28. endcase

  29. end




  30. /*** pc control ***/

  31. reg [9:0] pc_r;




  32. always @(posedge clk_div2 or posedge rst) begin

  33. if(rst) pc_r <= 10'd0;

  34. else if(pc_sel) pc_r <= instruction[9:0];

  35. else pc_r <= pc_r + 1'd1;

  36. end




  37. assign address = pc_r;

  38. /*** rs1 regitor ***/

  39. reg[7:0] rs1;

  40. wire[7:0] rs1_data;

  41. wire[7:0] add_reault;




  42. assign rs1_data = rs1_sel ? add_reault:instruction[7:0];




  43. always @(posedge clk_div2 or posedge rst) begin

  44. if(rst) rs1 <= 8'd0;

  45. else if(rs1_load) rs1 <= rs1_data;

  46. end

  47. /*** add ***/

  48. assign add_reault = instruction[7:0] + rs1;

  49. /*** out instrution ***/

  50. reg[7:0] port_id;

  51. reg[7:0] out_port;




  52. always @(posedge clk_div2 or posedge rst) begin

  53. if(rst) {port_id,out_port} <= {8'd0,8'd0};

  54. else begin

  55. if(id_load) port_id <= instruction[7:0];

  56. if(out_load) out_port <= rs1;

  57. end

  58. end

  59. /*** ***/

  60. led program

  61. (

  62. .address(address),

  63. .instruction(instruction),

  64. .clk(clk));




  65. endmodule

Led program是使用汇编程序生成的RAM代码,verilog或VHDL格式都有,可以使用附件的KCPSM3汇编器生成,在DOS窗口下输入汇编器的当前路径,调用改汇编器即可。

Led program源代码很简单,仅包含四条语句,完成一个简单的流水灯程序(没有延时,实际用估计一闪而过了)。

  1.  CONSTANT led, 01

  2.  LOAD s1,01

  3. start:

  4.  ADD  s1,01

  5.  OUTPUT  s1,led

  6.  JUMP start

我们先使用pBlazIDE编辑、仿真环境来仿真一下。pBlazIDE界面如下,还是比较美观的。pBlazIDE仿真的程序和编译的程序格式不大一样,这点需要注意,需要仿真程序是,从file菜单下选着导入即可。可以看到随着程序的运行,右边的led在逐渐变化。

03.jpg

04.jpg

接着我们做硬件仿真,在附件中提供了完整的仿真代码,包括测试激励和BlackRam库文件,打开modelsim,选着当前的路径后,在Transcipt中输入do run.do 即可看到仿真波形

05.jpg

热点文章
精选视频
推荐资源

中国授权培训机构

北京 电话:(010)82757632
      (010) 62192881
深圳 电话:(0755)86186715
武汉 电话:(027)61389792
成都 电话:(028)80821007
南京 电话:(025)66022032
西安 电话:(029)82230498
邮箱:sales@e-elements.com

中国授权经销商

香港 电话:(852)22127848
北京 电话:(010)84148118
成都 电话:(028)86528262
上海 电话:(021)33678387
深圳 电话:(0755)26584925
武汉 电话:(027)87322806
邮箱:china@avent.com
深圳 电话:(0755)26743210
上海 电话:(021)51696680
北京 电话:(010)51726678
成都 电话:(028)85139576
武汉 电话:(027)87690155
邮箱:
xilinx_enquiry@comtech.com.cn

社区主办


《电子产品世界》杂志社

内容提供


    赛灵思公司

Copyright ©2000-2015 ELECTRONIC ENGINEERING & PRODUCT WORLD. All rights reserved.
京ICP备12027778号-2 北京市公安局备案:1101082052