PicoBlaze 学习笔记5: PicoBlaze设计例子(LED 闪烁)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
本文是在Spartan-3E Starter kit Demo板上实现PicoBlaze参考设计,通过PicoBlaze控制板上LED灯的亮灭。
当然Xilinx公司关于Spartan-3E FPGA 入门套件板设计实例上也给出了很多关于PicoBlaze的设计实例,大家也可以参考一下,具体网址:
http://china.xilinx.com/products/boards/s3estarter/reference_designs.htm
(1) 下载适用于Spartan-3E的PicoBlaze模块
Xilinx官网上好像没有应用于Spartan-3E的PicoBlaze核,但如果要在Spartan-3E使用PicoBlaze,可以采用”PicoBlaze for Spartan?-3, Virtex?-4, Virtex-II and Virtex-II Pro FPGAs”,下载地址:
http://china.xilinx.com/products/ipcenter/picoblaze-S3-V2-Pro.htm
(2) 建立一个新的工程并输入文件名称,如图1所示,选择Spartan-3E Starter kit板的FPGA选择器件XC3S500E-4FG<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />320C作为本参考设计的目标器件,如图2所示。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
图1 创建一个新的工程文件
图2 建立一个新的设计工程
(2) 将PicoBlaze处理器的所有设计源文件(包含在任何参考设计中的KCPSM3文件夹中)添加劲没计工程中,这仅仅是一个PioBlaze的内核文件如图3所示.根据设计者的儒耍,叫以分别选择VHDL风格或Verilong源文件。
图3 PicoBlaze处理器的Verilong源文件
(3) 运行Implemcn Deslqn 实现PicoBlaze处理器 如4所示.
图4 实现PicoBlaze处理器
(4) 实现完成后,可以打开设计报告,如图5所示。一个完整的PicoBlaze处理器在XC3S500E中仅需要76个Slice及176个LUTs,资源占用率为1%。
图5 设计报告
(5)编写程序代码,可以利用任何文本编辑工具,并以psm格式保存。
以下是LED.psm部分代码:
CONSTANT delay_1us_constant, 0B
CONSTANT LED_port, 80 ;8 simple LEDs
LED:LOAD s0,01 ;其中1 LED亮
OUTPUT s0,LED_port
CALL wait_1s ;调用延时1s程序
LOAD s0,00 ;亮那 LED 1s后灭
OUTPUT s0,LED_port
CALL wait_1s ;调用延时1s程序
JUMP LED
下面是调用延时1s程序
…….;
完整psm文件 https://static.assets-stash.eet-china.com/album/old-resources/2009/5/11/cfaedf19-a552-4c0b-867b-68161ff8d7e7.rar
(6) 把KCPSM3.EXE、ROM_form.coe、ROM_form.v和ROM_form.vhd(都是下载的PicoBlaze IP核Assembler目录下的文件)连同刚才的汇编文件(LED.psm)放在XP根目录下(C:\ XP默认为C盘)(放在其他盘KCPSM3会显示编译不成功),我放在c:\LED目录里。
开始——运行——“cmd”
在DOS状态下进入KCPSM3所在文件夹(c:\LED)
C:\Documents and Settings\tengjingshu>cd C:\LED
C:\LED>dir
可以看到C:\LED目录下的五个文件
C:\LED>KCPSM3 LED.psm //编译汇编文件
如果成功会出现
PASS 5 - Writing reformatted PSM file
led.fmt
PASS 6 - Writing assembler log file
led.log
PASS 7 - Writing coefficient file
led.coe
PASS 8 - Writing VHDL memory definition file
led.vhd
PASS 9 - Writing Verilog memory definition file
led.v
PASS 10 - Writing System Generator memory definition file
led.m
PASS 11 - Writing memory definition files
led.hex
led.dec
led.mem
KCPSM3 successful.
KCPSM3 complete.
如果成功你会发现c:\LED文件夹里会多了几个文件
本文件夹下载:(包括了LED.psm)https://static.assets-stash.eet-china.com/album/old-resources/2009/5/11/229d2cfa-06f5-4f0d-b93f-1e68b7b66c61.rar
如果编译成功,将输出的<filename>.vhd或<filename>.v添加到FPGA的设计中。该文件实际上是一个1k×18bits的ROM文件,需要占用FPGA一个BRAM。由于本工程采用Verilog编程,所以把生成LED.v 文件放在工程LED_PicoBlaze中。
如果编译不成功,会出现下面提示:(比如把KCPSM3.exe放在其他目录下F:\)
(7)编写Verilog顶层文件LED_PicoBlaze.v,连接kcpsm3.v和LED.v。
下面是LED_PicoBlaze.v代码:
module LED_PicoBlize(led_out,clk);
input clk;
output[7:0] led_out;
reg [7:0] led_out;
wire clk;
wire [9:0] address;
wire [17:0] instruction;
wire [7:0] out_port;
wire [7:0] port_id;
wire [7:0] in_port; //不用的输入接0
wire reset; //不用的输入接0
wire write_strobe;
wire read_strobe;
wire interrupt;
wire interrupt_ack;
// Unused inputs on processor
assign in_port = 8'b 00000000;
assign reset = 1'b 0;
//----------------------------------------------------------------------------------
//
// declaration of KCPSM3
//
//
// declaration of program ROM
//
//----------------------------------------------------------------------------------
//
// Start of test circuit description
//
kcpsm3 processor
(
.address(address), //10位地址线
.instruction(instruction), //18位指令输入
.port_id(port_id), //led输出口地址
.write_strobe(write_strobe),
.out_port(out_port), //led输出
.read_strobe(read_strobe),
.in_port(in_port), //
.interrupt(interrupt),
.interrupt_ack(interrupt_ack),
.reset(reset), //
.clk(clk)); //时钟输入
led program
(
.address(address), //10位地址线
.instruction(instruction), //18位指令输出
.clk(clk)); //时钟输入
//////////////////////////////////////////////////////////////////////
// main programme
//////////////////////////////////////////////////////////////////////
always@(posedge clk)
begin
if(port_id==8'b10000000)
led_out<=out_port;
end
endmodule
要注意的是main programme中port_id为I/O地址控制,
顶层文件主程序
if(port_id==8'b10000000)
对应psm汇编程序中的
CONSTANT LED_port, 80
通过I/O地址控制,控制I/O口的输入输出,最多控制256个地址。
(8) 根据PCB的情况修改FPGA的引脚定义(编辑UOF文件),重新对顶层设计文件进行综合及设计实现。Spartan-3E Starter Kit板上LED分布。
时钟采用Spartan-3E Starter Kit板上的50MHz有源晶振(C9输入)。
LED_PicoBlaze.ucf文件如下:
NET "clk" LOC = "C9" | IOSTANDARD = LVTTL ;
NET "led_out[0]" LOC = "F12" | DRIVE = 4 | IOSTANDARD = LVTTL ;
NET "led_out[1]" LOC = "E12" | DRIVE = 4 | IOSTANDARD = LVTTL ;
NET "led_out[2]" LOC = "E11" | DRIVE = 4 | IOSTANDARD = LVTTL ;
NET "led_out[3]" LOC = "F11" | DRIVE = 4 | IOSTANDARD = LVTTL ;
NET "led_out[4]" LOC = "C11" | DRIVE = 4 | IOSTANDARD = LVTTL ;
NET "led_out[5]" LOC = "D11" | DRIVE = 4 | IOSTANDARD = LVTTL ;
NET "led_out[6]" LOC = "E9" | DRIVE = 4 | IOSTANDARD = LVTTL ;
NET "led_out[7]" LOC = "F9" | DRIVE = 4 | IOSTANDARD = LVTTL ;
(9) 然后就可以按照标准的Synthesis,Implement(Translate, Map, Place & Route),Generate Programming File以及最后的下载到板上的ROM里面的方式进行了。
(10)可以看到Spartan-3E Starter Kit板上的LED0闪烁(隔一段时间亮,隔一段时间灭),时间不是当初汇编设计的1秒,而是好几秒了,说明psm汇编的程序没编写好。
LED_PicoBlaze工程下载:*************https://static.assets-stash.eet-china.com/album/old-resources/2009/5/11/a3522400-10bd-4df8-a862-c0fec464037f.rar**************
大功告成,让我们玩转PicoBlazeJ
参考资料:
1) PicoBlaze处理器设计流流程
http://www.dzsc.com/data/html/2008-9-19/69656.html
2) 关于PicoBlaze编译器KCPSM3的使用 -- 1oh1oh1oh's Blog
http://blog.ednchina.com/1oh1oh1oh/123475/message.aspx
3) Picoblaze 与ISE入门-jame的博客-与非网
http://www.openhard.org/myspace/blog/show_155205.html
用户377235 2015-10-25 22:19
coyoo 2012-12-10 13:31
用户1052686 2012-12-10 13:04
用户553229 2010-3-27 09:59
用户1195540 2009-11-10 17:59