理解picoblaze-ug129观后感
四、Scratchpad RAM
PicoBlaze提供64个字节的RAM使我们可以方便的保存一些运行需要的数据。我们可以用STORE和FETCH2条指令方便的
对RAM进行操作:
scratchpad_transfers:
STORE sX, 04 ; Write register sX to RAM location 04
FETCH sX, 04 ; Read RAM location 04 into register sX
上面两条指令是分别对RAM里的地址04进行存取操作。
另外我们可以用间接地址访问模式对RAM进行操作。如下是整个64个字节的RAM空间初始化为0:
NAMEREG s0, ram_data
NAMEREG s1, ram_address
CONSTANT ram_locations, 40 ; there are 64 locations
CONSTANT initial_value, 00 ; initialize to zero
LOAD ram_data, initial_value ; load initial value
LOAD ram_address, ram_locations ; fill from top to bottom
ram_fill: SUB ram_address, 01 ; decrement address
STORE ram_data, (ram_address) ; initialize location
JUMP NZ, ram_fill ; if not address 0, goto ram_fill
这里将寄存器s0做为要存入RAM里值的寄存器,寄存器S1做为地址指针来扫描整个RAM空间。
通常SRAM有三个典型的应用,我们一一介绍:
1.1首先做为查找表的例子,这时我们可以将整个要查找的数据做为一张
表放入SRAM,然后在指令空间将查找的索引间接传入,下面的代码是七段LED的显示代码,它先将LED-0到LED-F的
数值存入SRAM地址0到F。然后读取开关量,再取出相应值进行显示。
CONSTANT switches, 00 ; read switch values at port 0
CONSTANT LEDs, 01 ; write 7-seg LED at port 1
; Define 7-segment LED pattern {dp,g,f,e,d,c,b,a}
CONSTANT LED_0, C0 ; display '0' on 7-segment display
CONSTANT LED_1, F9 ; display '1' on 7-segment display
;
CONSTANT LED_F, 8E ; display 'F' on 7-segment display
NAMEREG s0, switch_value ; read switches into register s0
NAMEREG s1, LED_output ; load LED output data in register s1
; Load 7-segment LED patterns into scratchpad RAM
LOAD LED_output, LED_0 ; grab LED pattern for switches = 0000
STORE LED_output, 00 ; store in RAM[0]
LOAD LED_output, LED_1 ; grab LED pattern for switches = 0001
STORE LED_output, 01 ; store in RAM[1]
;
LOAD LED_output, LED_F ; grab LED pattern for switches = 1111
STORE LED_output, 0F ; store in RAM[F]
; Read switch values and display value on 7-segment LED
loop: INPUT switch_value, switches ; read value on switches
AND switch_value, F0 ; mask upper bits to guarantee < 15
FETCH LED_output, (switch_value) ; look up LED pattern in RAM
1.2堆栈应用
由于PicoBlaze没有提供类似POP和PUSH的指令,我们可以用SRAM来实现这种操作,大概的方法就是PUSH时,把值先
存到SRAM里的某一个地址,后面POP时再从这个地址取出先前的值。代码如下:
NAMEREG sF, stack_ptr ; reserve register sF for the stack pointer
; Initialize stack pointer to location 32 in the scratchpad RAM
LOAD sF, 20
my_subroutine:
; preserve register s0
CALL push_s0
; *** remainder of subroutine algorithm ***
; restore register s0
CALL pop_s0
RETURN
push_s0:
STORE s0, stack_ptr ; preserve register s0 onto “stack”
ADD stack_ptr, 01 ; increment stack pointer
RETURN
pop_s0:
SUB stack_ptr, 01 ; decrement stack pointer
FETCH s0, stack_ptr ; restore register s0 from “stack”
RETURN
这里是用SRAM里的地址20H做为存储地址。
1.3 FIFO操作:和上面的原理相同,FIFO操作也可以用SRAM实现,只是存取的顺序要先进先出。
五、指令空间配置
5.1标准配置-一个1KX18块RAM
这种方法是用一个KCPSM3专门占用一个1Kx18的RAM块。如下图所示:

5.2带有UART或JTAG的编程接口配置
这种方式RAM提供两个外部读写口,另外一个连到UART或JTAG的编程器,使得不用重新更改整个FPGA设计,就可以
升级PICOBLAZE。

5.3两个KCPSM3共用一块1kx18的代码映像,这时它们所执行的指令是一样的,不同的只是它们自己的时钟,输入输出
和中断。

5.4两个KCPSM3分别占用512x18的代码空间。这样两个KCPSM3就可以运行不同的代码指令,只是它们的总的空间少了
一半。
,通常有三种开发工具可以对PICOBLAZE进行开发。其中PBLAZIDE是WINDOWS下的图形界面
开发的,比较方便。不过它的指令格式还是和KCPSM3有些区别,看上去更象8051的语法,具体区别如下 :
剧终:
写到这里,关于fpga的文章就告一段落了,希望以后有机会可以实际操作一下。谢谢收看。