About Black Matrix FPGA+USB Starter Kit~~~

关于PicoBlaze

上一篇 / 下一篇  2008-06-10 23:17:05 / 个人分类:参考设计

查看( 208 ) / 评论( 0 )
EDA中国门户网站5{%UN9}^6F

(如果你需要FPGA+USB的解决方案,请关注:http://www.edacn.net/?uid/184205

L1vS;m:Y0

1XzV Mq&y,o0PicoBlaze资源的下载网址:http://grace.evergreen.edu/dtoi/arch06w/asm/EDA中国门户网站 b|"p K4BS

k-a7E.[1QA0

#f:~"qA^9uJI"i K0以下转帖自:http://www.eefocus.com/myspace/blog/index_7717.htmlEDA中国门户网站P7M,{@ ?\*A G w;A

k,I}0T/b(h9A0 

$l*e_-w3D0 EDA中国门户网站n0X_Unk

PicoBalze 介绍(一)EDA中国门户网站o\-]#[)?OY$r2g

 

{Ek*OD P;Q0

PicoBlaze是由Xilinx公司的Ken Chapman设计并维护的一款8bit的微控制器软核,可以嵌入到Cool Runner II,Virtex-E,Virtex-II(Pro) 和 Spartan3(E)的CPLD以及FPGA中。EDA中国门户网站 |5mfC5dyB3Qw

Nsu/r_2i0 EDA中国门户网站l6e,jun7q

EDA中国门户网站 Y7]hL"A(IBJ9l W6J

首先说一下PicoBlaze这个名字。我们知道:Xilinx主推的32-bit RISC嵌入式软核叫MicroBlaze,非官方有时也可写成uBlaze,用来表示该软核非常之小。Xilinx推出比它更小的软核就是PicoBlaze了。学过电路的人都知道,电容单位里有个量级叫皮法,也就是pF。这里的p就是Pico-的意思,它表示10的负12次方这样一个数量级。而PicoBlaze这个软核呢,也的确是名符其实。将它实现在XC3S500E的FPGA中,只用到了96个SLICE,也就是只占用到了5%的逻辑资源的样子。EDA中国门户网站p V meMFq@[

Gb%R cc0D0 EDA中国门户网站NiT5F^&m

/ZKEaI2O`0不过麻雀虽小,性能却挺强大的。对于整个指令集,PicoBlaze执行一条指令需要2个时钟周期。即使这样,在Spartan3E Starter Kit板上以50MHz的时钟为例,PicoBlaze也能达到25MIPS的性能,对于要求不是太高的应用场合,PicoBlaze是一个不错的选择。而且在某些特殊的应用场合下,还可以实现例化多个PicoBlaze软核来达到设计目的。EDA中国门户网站J |vbeWwyF

@]R4Thw:f1Tc0 

)z3M|*C]2Jq0 EDA中国门户网站2RnT/p7O vx7t{w

尽管PicoBlaze的定义是Microcontroller(ug129就是这样写的),但是根据Ken Chapman在PicoBlaze的参考设计里提到的,PicoBlaze实际上是常数码可编程的状态机(KCPSM, short for Konstant Code Programmable State Machine)。巧合的是,我们也可将其称之为Ken Chapman's Programmable State Machine, 以示纪念,呵呵!从它参考设计中附带的PSM代码中可以看到,针对PicoBlaze编写的代码大部分都是由Constant,各个函数段间的跳转以及中断服务例程(ISR, Interrupt Service Routine)构成的。这些代码的执行都是顺序的,尽管这似乎与FPGA能有效执行操作的特点不同,但是在某些场合,用PicoBlaze却能够简化设计,而又不失性能。

o{f8u]9Pk0 EDA中国门户网站/YZT7Z6W:v X~

 EDA中国门户网站RH5[ s bv^

EDA中国门户网站 d-B8z:`7et;l0Q

在Xilinx的官方论坛上,Ken Chapman列具了如下可以采用PicoBlaze的应用场景:EDA中国门户网站.v4hF?h,O8^ w3C

  • LED flasher (已有参考设计)
  • PWM control and even generation (KHz PRF for motors and brightness control) (已有参考设计)
  • Switch monitor.
  • UART interface and simple command/status terminal (已有参考设计)
  • LCD character module display interface and control (已有参考设计)
  • SPI master (i.e. FLASH controller for Spartan-3AN).
  • I2C master.
  • Calculator (XUP-San Jose State University)
  • Audio DSP processor (typically up to 48KHz sample rate and may utilise a hardware multiplier as a peripheral)
  • DTMF tone telephone dialer including sine wave generation (8KHz sample rate)
  • System monitoring (e.g.  temperature monitor and fan control).
  • Motor control
  • Rotary encoder interface (Spartan3E Build-in Demo)
  • Calculator for frequency synthesizer.
  • Calculator for filter coefficient generation.
  • Emulation of a different micro controller (可用来模拟8051,By Roman-Jones,Inc)
  • PID control.
  • Mouse/Keyboard interface.
  • Keypad scanner
  • Power supply monitoring and control.
  • Servo control.
  • Built-in test equipment (on-chip monitor).
  • Configuration management (ICAP port)
  • Design Authentication Processor (已有参考设计)
  • Implementing peripherals for MicroBlaze or PPC.
  • Interrupt controller for MicroBlaze or PPC.

k'pz j+t(xK2K4PQ0
2q]yY)Hz'HpS0来看看PicoBlaze做到了什么吧:EDA中国门户网站O.fV0wt0l\U

l9Wc%xrg OtD;da4I0EDA中国门户网站t;Rj5o}
在美国纽约的时代广场的JP Morgan Chase大楼,有一块硕大的LED广告屏。这块广告屏在当时(2004年)是世界上最大的高亮解析度的LED显示屏,而驱动这块显示屏的,正是PicoBlaze,整个设计中用到了10块XC2V1000 Virtex-II, 323块XC3S200 Spartan-3, 以及333块XCF00 Platform. Flash PROM和3800块XC9572XL72 PLD宏单元。使用到的PicoBlaze的数量更是超过了1000个。EDA中国门户网站)Jam6m {#u"q

PicoBlaze

q;i+@D4x-OA0 EDA中国门户网站7O]+pT-\ ^*q

.prfQ [(w0引用设计主管的话:EDA中国门户网站m@`0s4H:U7z.?
"The favorite toy in our Xilinx bag-of-tricks is the PicoBlaze™ processor. We could not have completed the project in the time allowed without extensive use of the PicoBlaze processor. The sign contains an impressive count of more than 1,000 of these embedded processors, with nine different designs.PicoBlaze processors provide efficient logic resource utilization by time-multiplexing logic circuits. The PicoBlaze processor also provides a quick and easy way to develop control functions. The alternative would be to build a custom state machine for each function. The PicoBlaze processor is a programmable state machine, meaning that the state machine is already built; one just has to program it." EDA中国门户网站(SZY0jl1J%L3n
Jason Daughenbaugh, Sr Design Engineer, Advanced Electronic Designs (AED) EDA中国门户网站 P4Ev8]9YQ$k/z
Application: Large LED display for JP Morgan in Times Square, NYEDA中国门户网站1Z\'Y6W.O9B!K

EDA中国门户网站C3yP:N|X2rd


d2^ us"_k0因此,千万不要因为当今流行32bit的嵌入式CPU而忽视了PicoBlaze这位小兄弟。

X@ I*C%UO0

+J8Qc0HP0Ol0 

-v\/W FVH0 EDA中国门户网站`+`3L#_H

Joseph

{ G.b+f+R`$t"]/q0 EDA中国门户网站D_9N Xhq_k

 EDA中国门户网站4d*df\~eD4u

@3{M K$r-mCB v0 EDA中国门户网站8n!dWZ HJ

EDA中国门户网站0Y0rY6uI:^

PicoBlaze 介绍(二)
 
EDA中国门户网站[u t.tyR

y2hN1[-Rj.fY0前面已经简要的介绍了一下PicoBlaze。而这一次,我将介绍一下PicoBlaze的结构。以便让大家知道初步了解PicoBlaze的相关HDL文件和工具,为将来进行自己的PicoBlaze设计打下基础。

!voh'vJ j0

KI0hP3g*[ W0
F+h z2~!f4c0Xilinx对于PicoBlaze的IP核是免费提供的,你可以从如下网址进行下载:EDA中国门户网站zc,D4G~e&WX
http://www.xilinx.com/products/ipcenter/picoblaze-S3-V2-Pro.htmEDA中国门户网站4C#oT h'KO

6S0H'r-n!`]&?lm0 

#x"w,Q'@7~/A0 EDA中国门户网站%LYzeV l[ @GUa

需要注意的是,PicoBlaze对应Xilinx不同系列的CPLD和FPGA有不同的版本,因此在下载前你需要确认一下你所使用的硬件平台。这里我所使用的是Spartan3系列和Virtex-II Pro平台对应的PicoBlaze IP核。 

2@9Ng!Fp0u l,|0 EDA中国门户网站vy i"`YyZ QVv

 EDA中国门户网站@p\Jl g@

同时,下载该IP核的充分条件为:
[)g0@cp2OE01) 必须拥有一个Xilinx网站的Account,也就是你在Xilinx的站点下载各种文档资料、参考设计压缩包以及IP ******的通行证;EDA中国门户网站M zE&Ah+E
2) 填写一份调查表,包括你从事行业的领域,职位,使用PicoBlaze的目标领域等问题。EDA中国门户网站}5y{2[XD.Y
完成以上步骤之后,就能够顺利地从Xilinx的网站上下载到PicoBlaze核了。下载到的IP核是一个名为KCPSM3的zip压缩包,将它解压缩到你想要放置它的位置(注意!!:路径中不能有空格以及中文—这是使用Xilinx工具必须特别注意的地方)。EDA中国门户网站!~8awi8g)_n t

F/Z4S!B.OA3~0下面就让我对KCPSM3.zip中所包含的各个文件以及PicoBlaze的结构作一个简要说明。EDA中国门户网站-W!k5~T+vG Q
图 1为解压后的KCPSM3的目录结构:

图 1 KCPSM3文件目录结构图 EDA中国门户网站 NDGW id

 EDA中国门户网站.Fc_VDq

  • VHDL目录——该目录中包含了KCPSM3 的VHDL文件,如果工程师使用的开发语言是VHDL,则可直接调用该目录下的vhd文件:
 kcpsm3.vhd

&`U h?i0KCPSM3的核心VHDL描述 

p7Q$QB9O"Kg0
 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单独使用EDA中国门户网站e wC)ur-CIU
如图 2所示,该图清楚地表明了PicoBlaze设计的HDL文件层次结构(对于用Verilog描述的设计也是这种结构,在此仅以VHDL为例);
   
图 2 PicoBlaze HDL层次结构图 
  • Verilog目录——该目录中包含了KCPSM3 的Verilog HDL文件,如果工程师使用的开发语言是Verilog,则可直接调用该目录下的v文件(包含的文件作用与同名的vhd文件相同,在此不再说明);
  • kcpsm3.ngc——该文件为经过封装了的kcpsm3的网表文件,在非HDL的设计流程中可以作为Black Box使用;
  • Assembler——该目录下包含了将psm文件转换成ROM文件所需的各种工具:
 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汇编文件

G3L%r!F&XW.I0
  • DATA2MEM_assistance——该目录包含了能直接修改bitstream文件中的Block Memory所在的数据段的工具:
 PB_BMM.EXE 能够定位FPGA配置文件中的Block Memory所在的数据段 (注1)
 change_pb_bits.bat 批处理文件,能够自动进行Block Memory中的数据修改
注1:该工具对于基于PicoBlaze设计的配置文件bitstream是可行的(这应该是因为基于PicoBlaze的设计结构简单),对于其他设计生成的bitstream文件不一定可行。EDA中国门户网站f?|(V ^
  • JTAG_loader——该目录下包含了适用于PicoBlaze的JTAG工具:
 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

0T OWsA R0 EDA中国门户网站\1y8^;{#TBO[z

\|U?[9q&v0如果各位有使用过8051或者其他的8/16位的单片机的话就应该知道,主要的开发方式就是对其进行编程并将程序烧写进Flash中。基于PicoBlaze的开发方式也是也大致如此,稍有差别的就是需要将PicoBlaze认识并执行的程序经过Assembler转换成相应的HDL文件以存放在FPGA内部的Block Memory中(也正因为如此,PicoBlaze执行一条指令所需的时钟周期也是固定的)。下图是PicoBlaze核的一个结构框架图:EDA中国门户网站6T5`%|#G9Z!M6W

  

 EDA中国门户网站%sm#e'},_#z

图 3 PicoBlaze结构框架图EDA中国门户网站9o2d9?c#V/wJ

 

*L1A7p!b0S[1Hf#x0 EDA中国门户网站G x*|H yK3]/{

 EDA中国门户网站^q9? F}.n:zdr

EDA中国门户网站5rhR1m3U2X-M9~

图 3中,微控制器核心KCPSM3从Block Memory里面读取程序并按顺序执行。在这里我们可以看到PicoBlaze的存储空间为1024x18bit,也就是能够存放1024条位长为18的指令。而PicoBlaze支持的指令集也很精简,只有57条,包含了程序控制类(跳转,调用,返回),算数类(加,减,比较),逻辑类(与,或,异或),中断类(中断开启/关闭),移位/旋转类(左移/右移,左旋/右旋),输入/输出类(输入,输出)。

S6Pt"? Y7E?2jA0

:I5GF"R P1\l0 

_ R ]t U/R f0
图4 KCPSM3 核心结构图 
关于通用寄存器
2Yd$EhY6g0
K\!}*?'D0KCPSM3******有16个长度为8位的通用寄存器,每个寄存器都可以在汇编代码中分别命名。EDA中国门户网站^4^#F ^V$pJKPL

tGdXy/h nB!L0关于中断
'GC~8GL*Y7PwH0H0
7M,|;J]5u2u}v0KCPSM3只支持1个中断信号,但实际上可以将多个中断信号用逻辑组合的方式变成一个来用(当然这样的话会降低单中断通道的性能)。
Q.jBLE0
.nD'noB0关于Scratch Pad Memory
+]9b!m F,F"R D6e,[,j0
M4`C#BG kz0我不知道Scratch Pad Memory该如何翻译。它的大小为64 Bytes,作用相当于一块临时存储区,比如在中断例程ISR中可以将其作为临时变量适用。
/y7MY.v e7C9` {+G0
K[ \ X } wr%I0
进行PicoBlaze设计的方法如下(也可以使用前面所说的DATA2MEM或者JTAG_loader工具来开发):
EDA中国门户网站&bJ+In]k:A@G!Ss
1. 首先在文本编辑器中用上述的这些指令实现特定的状态机,并以psm格式保存;EDA中国门户网站7X3D!KT1D S'vgg}`
2. 然后按照图 4的流程生成符合能够存放在Block Memories中的ROM格式的vhd文件或者v文件,将vhd文件(或者v文件)作为PicoBlaze的Program在稍后的设计中以供调用;EDA中国门户网站AQ p k6@+H_/IN[.H
3. 在ISE中建立一个工程,写一个顶层文件,将kcpsm3,program,transmitter和receiver等各模块包括进来,在这里使用UART的目的是将其作为PicoBlaze的控制台,分别用transmitter和receiver作PicoBlaze的输入控制和输出显示通道。
Ljhc?Q`n04. 编辑UCF文件,指定FPGA的输入输出管脚。
+r)T7~H A+rxW05. 然后就可以按照标准的Synthesis,Implement(Translate, Map, Place & Route),Generate Programming File以及最后的Download Bitstream的方式进行了。
Y+u0U/K6N {1s A y0
B(\UU4R uF x0 EDA中国门户网站,T5l9aJB NW

图 5 由psm文件转换成ROM格式的vhd文件或v文件 EDA中国门户网站O#pg(V)Dr

EDA中国门户网站,G6C w2w#j/A-@F

 EDA中国门户网站,OH~&y"AN^G ^5C+T

EDA中国门户网站V:C4P }H:pp7V(P

以上是我自己对KCPSM中各个模块以及文档说明的理解,如有疏漏或错误之处,欢迎大家在此提出!让我们共同进步!EDA中国门户网站M;\z,|t(~8q

*gc&{6@*x5T j0参考文献:EDA中国门户网站3Sa\#A6y
[1] PicoBlaze 8-bit Embedded Microcontroller User Guide, ug129, Xilinx. IncEDA中国门户网站3LU iv-yst
[2] KCPSM3_Manual.pdf,EDA中国门户网站M%i&}8aTr
     Available at http://www.xilinx.com/products/ipcenter/picoblaze-S3-V2-Pro.htmEDA中国门户网站 {4nU{}*s)l
[3] JTAG_Loader_quick_guide.pdf, EDA中国门户网站7R Ubjn3b8~
     Available at http://www.xilinx.com/products/ipcenter/picoblaze-S3-V2-Pro.htm
&i d.j,@~ Tt V0EDA中国门户网站7ka/C,|D)~-~

\VK:UE8v2f4p0

G\0Ab-H0

R+V*r*vg_ l} ]4tv R0 EDA中国门户网站$p'?]7y%}0K

EDA中国门户网站(X2v#uZ-IEBc?#s

 EDA中国门户网站*kP z#_/G1K9w jxi

/T6m#v1V4e]ys0 EDA中国门户网站 P gSkQ2j-Be

{j:i&IK r0 

"Et:YLEgC0

X*]D#i4z:o F0 EDA中国门户网站|CR:Z|{'K

|A MUm o ]gH l$t0

PicoBalze 介绍(三)
 

'll'~t-hR\0 EDA中国门户网站n qq)U0D{^[

这一次,我将选择一个PicoBlaze的参考设计来详细讲解一下,并会在其上稍作修改,以实现我所想要的效果。
+T8o j I^zb+o[ ]_0
&WJ eUpC b;S0从如下地址下载PicoBlaze的Reference Design:
9n4pSKS F0http://www.xilinx.com/products/boards/s3estarter/files/s3esk_picoblaze_pwm_control.zipEDA中国门户网站{'y{Sj V%V#cyuJ,e
EDA中国门户网站6fB PQ)v
将此文件夹解包,得到如下图所示文件:

W0Hn7` F0
图 1 PicoBlaze PWM参考设计文件
 
首先阅读一下PicoBlaze_PWM_control_rev1.pdf这份文档,这份文档里已经将该PWM的参考设计讲解的很详细了,稍后将对它作一番讲解。为了建立对该参考设计的感性认识,就先按照文档里的步骤,重现一下该设计:
  • 给Spartan3E Starter Kit开发板接通电源,连接USB Cable到Host PC上; 
    a2a&T](Bp y"U0
  • 建立一个波特率为9600,数据位为8bit,无奇偶校验,无控制流的超级终端连接;
  • 双击install_picoblaze_pwm_control.bat这个批处理文件,它将自动执行:初始化Scan-chain,下载bitstream文件等操作。
当弹出的DOS对话框一闪而过后,表示该批处理操作已经完成并自动退出了。同时在超级终端的界面上应该可以看到如下图所示的提示符号:
  
这时就可以看到位于FPGA开发板上右边的8个绿色LED灯以从左到右的顺序亮度依次变暗。这说明每个给LED供电的电压等级依次“变弱”。这种不同程度的亮度便是由PicoBlaze输出的PWM信号来实现的。
EDA中国门户网站Sh;aJ.g-{.fv9Nw|4?

 

'Dn?7Iz*?'eIg9Dv0
我们知道,从XC3S500E输出的是数字信号,只有0或者1两种状态;而这种代表不同亮度的“模拟信号”是从何而来的呢?采用PWM(Pulse Width Modulation,脉冲宽度调制)的机制就能够实现。PWM的原理简单说来就是将具有一定频率的数字信号按照固定的脉冲宽度分成若干份,那么通过输出不同占空比(也就是一个周期T内该信号为有效1的时间占整个周期的比值)的数字信号来表示不同的“模拟信号”。比如一个频率为1KHz(即1ms为一个周期)的脉冲,电压等级为3.3V。若该信号的周期分成32个脉冲的宽度(一个脉冲的宽度就是15.625us),那么占空比为46.875%(即15/32)的该信号代表的电压水平就是46.875%×3.3V ≈ 1.55V。EDA中国门户网站^y;no\

8CSZ}&nn wS0说到这里,大家应该明白了该参考设计中产生这些不同亮度的信号的原理了。下面就让我对这个例子讲解一下(其实Ken Chapman在参考设计中给出的文档以及在psm文件中添加的注释已经十分详细了——这就是Xilinx的Coding Style,在这里我仅对关键的几个地方作一下解释):EDA中国门户网站3{'l'_ceu
EDA中国门户网站!rm$o [!i(MR
这个Reference Design实现了对12个通道的PWM信号的控制,其中每个通道的信号频率为1KHz,精度为256阶(即输出的占空比以1/256为步进单位)。
sge G8UV5J(W0EDA中国门户网站9MH&E.|q0c
在程序的开头,定义了8个LED端口以及4个扩展输出口,同时还有一些描述UART中收发器状态的寄存器。
EDA中国门户网站9x-h5@[B)?q}.HRjM
接着,该程序便定义了一大堆关于通过UART终端显示命令以及提示符的状态函数,包括输出字符串“PicoBlaze PWM Control”,“KCPSM3>”,“Error”,响应“LD”和“IO”命令的状态函数。
2E$p.md:g)xU0
e*v'SO M[%xp0下图便是与pwm_ctrl.psm相等效的状态转换图(为简化略去终端串口收发字符的状态转换细节):
状态转换图
 
ISR中的内部计数器值会在每次中断例程中自动加1,并且是从0~255循环计数;
3mN&uo3w+i:B0当前中断中内部的计数器的值会与每个通道的PWM的值进行比较,若前者小于后者,则该通道的输出值为1;反之则为0(这里是通过比较结果产生的Carry位是否被置1来实现的)。并且,4个扩展口的电平高低将先并行输出,然后8个LED端口的电平高低再在当前ISR结束前并行输出(每次比较都会有一个Carry位被串行左移进入寄存器s2)。
EDA中国门户网站-Q JY2P:~d-u
关于“3.92us”
5u3|+Y2}O$`0由于产生的信号频率为1KHz,PWM精度为8bit——1/256,鉴于前述PWM信号的产生机理——即在1ms的时间里要进行256次比较输出,因此所需的终端信号的产生频率就为1ms/256 = 3.90625ms ≈ 3.91us 。与3.92us仍相差0.01us,对不对?这里,每3.92us产生一个中断信号是因为:这样更方便计算指令数。对于PicoBlaze的指令集,指令的执行时间是固定的:两个时钟周期(原因在《PicoBlaze介绍(二)已经提到过)。而参考设计所使用的Spartan3E Starter Kits开发板上的时钟源是50MHz的,因此每条指令的执行时间就是40ns。3.91us/40ns = 97.75,如果是3.92us/40ns = 98。基于这个原因,相信大家就不会对PicoBlaze_PWM_control_rev1.pdf中3.92us的来由产生疑惑了。事实上,也正因为如此,在示波器上看到的PWM信号也并不严格为1KHz,而是约为997Hz。EDA中国门户网站-Jh'Boqo? a2b#txfl
EDA中国门户网站3b!`"o$l'l(NtL
关于“196”EDA中国门户网站\Oq!|0R}N8mb v
由于每3.92us就会产生一个中断信号,而开发板上的时钟源为50MHz,因此需要设计一个状态数为3.92us/20ns = 196的计数器,当它从0开始计数,每当计数到195时便产生一个中断信号,来激活PicoBlaze的ISR。
-O6gva9wVZ8r0
]Xk$W g8t0关于“326”EDA中国门户网站,e-\j xr4p.q-`
在PicoBlaze_PWM_control_rev1.pdf文档中第11页还有一个状态数为326的计数器,这个326是如何得到的呢?注意到这个计数器是和UART模块连接起来的,UART的设置为波特率为9600,8位数据位,1位停止位,无奇偶校验和硬件控制流。而在该PicoBlaze的UART模块对clock的要求是时钟必须为波特率的16倍(我猜测是由于UART模块中用到的16Byte的FIFO使然)。这样一来UART模块的时钟频率就为9600×16 = 153600Hz。如何得到呢?采用状态数为326的计数器,每计数到325时便产生一个高电平信号,这样就能够得到50MHz/326 ≈ 153374近似于153600频率的时钟信号了。EDA中国门户网站d1qZ[m;z wn(e&O
EDA中国门户网站n!OC MO7eV
关于“the Limits”EDA中国门户网站8f)VF3Q)OX,W7E
在PicoBlaze_PWM_control_rev1.pdf文档的第12页提到了该参考设计的局限性“the Limits of Software”。当时我对其中关于该设计中的PicoBlaze还剩余约50%的计算能力来处理其他上层任务这一点不理解。(原文是这样的:However, 97 instructions are adequate to drive the PWM signals for all 12 channels and still have ~50% of the processor bandwidth available for the higher level control tasks)经过我在Xilinx的PicoBlaze官方论坛提问求助以及Ken Chapman的亲自回答的情况下,我终于明白了这样写的原因:在该PWM Reference Design中是每3.92us产生一个中断,在此期间,PicoBlaze能够执行的指令数为98条(3.92us/40ns = 98)。中断例程ISR代码段的指令数为48条。这样一来,还剩下大约一半的指令空间。而这些指令空间即是被用来执行输出命令行“KCPSM3>”,“PicoBlaze PWM Control”,UART输入以及ASCII码到Hex码转换等任务(并且执行一次执行单个这样的任务,50条指令绰绰有余!)
%j|&E&_s#bfOm9p\0另外,该设计中能够实现12个通道的PWM控制信号输出,性能是相当不错。但要注意的是这是一种折中,因为每个信号的频率不是很高,只有1KHz。如果提高PWM信号的频率,可控的通道数和PicoBlaze处理能力的带宽将大大降低,原因请参考上面解释的几条。好在一个不够就多用几个,众人拾柴火焰高!(前面不是提到了一个用到1000多个PicoBlaze的案例了吗?)

H7d ~&y6{!@0PWM的参考设计介绍完了。现在我将在此设计的基础上进行一下简单的修改来实现一个输出8KHz,精度为64阶的PWM信号。以备后用
按照前面介绍的计算方法,在该PWM参考设计的基础上,要产生8KHz,64阶精度的PWM信号,每个中断的产生时间为1/(8K×64)≈ 1.96us 。这样的话中断计数器的状态数就为1.96us/20ns = 98 。而由于UART的波特率不变,因此另外一个产生UART时钟的计数器的状态数也不变。
 
上图就是read_duty_value函数段的其中一部分。在接收占空比的第一个字符时,对其判断是否大于或者等于4就会跳转到Error状态。
bT%RU*~t3l0而在ISR段中,也需要进行修改,因为原来的ISR中的PWM_duty_counter是从0~255(即00~FF)来循环增一计数的,刚好是8位的长度。而现在只需要计数到63(3F)然后就回复到0状态重新计数,怎么实现?用一个值为3F(0011 1111)的Mask来与当前计数的PWM_duty_counter相与来实现从0~63的循环计数,这样PWM_duty_counter依然是从0~255来循环增一计数,但却将它分为了4个0~63的循环计数,修改的程度最小,又实现了各通道的PWM_channel与duty_counter值比较输出高低电平来构成PWM信号的目的。
EDA中国门户网站S!GMzz6`b0E

至此,PicoBlaz介绍的系列告一段落,在这里非常感谢Ken Chapman在Xilinx的PicoBlaze论坛的详细解答。各位有什么问题也非常欢迎在这里提出!

%l/mFBl6L0
稍后将放上全部修改后的PWM控制的psm文件。
8F8|pog#U?,O0

9CIN^[J0
EDA中国门户网站e/h2|B:[3S


TAG:

我来说两句

(可选)

日历

« 2008-12-28  
 123456
78910111213
14151617181920
21222324252627
28293031   

数据统计

  • 访问量: 4065
  • 日志数: 18
  • 建立时间: 2008-05-22
  • 更新时间: 2008-06-13

RSS订阅

Open Toolbar