PicoBlaze是8位微處理器,在Xilinx公司的Virtex、Spartan-II系列以上FPGA與CoolRunner-II系列以上的CPLD器件設(shè)計(jì)中以IP核的方式提供,使用是免費(fèi)的?。
常見的版本有KCPSM3和KCPSM6。其中KCPSM支持7系列的Xilinx FPGA。
PicoBlaze非常小,只有一個(gè)VHDL/Verilog文件,KCPSM6在FPGA中只需要26塊邏輯單元Slice,每個(gè)指令都可以再2個(gè)時(shí)鐘周期內(nèi)完成,在Spartan-6中可以達(dá)到105MHz時(shí)鐘頻率(-2速度等級(jí)),在Kintex-7(-3速度等級(jí))中能到達(dá)238MHz。它能提供兩個(gè)寄存器Bank,每個(gè)Bank有16個(gè)寄存器。
?
?
另外
很多時(shí)候我們用FPGA的HDL語言很難實(shí)現(xiàn)某些功能,但是用軟件方式就比較容易,但是我們又不希望花很多硬件資源去搭建一個(gè)嵌入式系統(tǒng),比如基于MicroBlaze的系統(tǒng)。這樣,我們就可以使用輕量級(jí)的PicoBlaze實(shí)現(xiàn)。
通常使用匯編語言寫PicoBlaze程序,以KCPSM6為例,我們基于它的指令集可以很方便實(shí)現(xiàn)一些簡(jiǎn)單的程序,指令集如下:
?
?
Xilinx提供了相應(yīng)的匯編器,可以生成帶指令數(shù)據(jù)的ROM的VHDL/Verilog代碼,也可以生成HEX文件供動(dòng)態(tài)加載到RAM。
下面介紹開發(fā)流程,我們以一個(gè)簡(jiǎn)單的開關(guān)輸入LED輸出為例,之后我們會(huì)介紹簡(jiǎn)單的流水燈以及中斷。
首先,我們?nèi)ilinx官網(wǎng)下載所需的KCPSM6的相關(guān)文件以及輔助程序。
本文基于ZedBoard進(jìn)行試驗(yàn),所以只需要下載PicoBlaze for UltraScale, 7-series, 6-series FPGAs 即可。下載后解壓出來,會(huì)有很多實(shí)例,JTAG_Loader以及kcpsm6.exe匯編器等。
以下是匯編器的功能圖:
?
?
一般情況下,我們的處理器系統(tǒng)如下所示:
?
?
Kcpsm6處理器核與rom相連,rom中裝載我們的編譯后的代碼數(shù)據(jù)。這兩個(gè)模塊都是通過工具生成,不過我們的程序還是需要寫匯編代碼實(shí)現(xiàn)。
Kcpsm6外部信號(hào)很少,常用的就是in_port和out_port,地址線和bram_enable以及instruction信號(hào)與rom相連,在不使用中斷和休眠信號(hào)的情況下將interrupt和sleep拉低即可。Clk連接在FPGA外部輸入的時(shí)鐘引腳上,我們這里是Y9(100MHz)。
本文使用Verilog語言實(shí)現(xiàn)硬件邏輯。
創(chuàng)建一個(gè)基于ZedBoard的xc7z020-2clg484的工程。
建立一個(gè)頂層文件top.v,參照下載的文件夾中的Verilog目錄中的kcpsm6_design_template.v,添加處理器核的例化
?
?
添加內(nèi)部信號(hào)
?
?
另外,由于我們暫時(shí)沒用到中斷和休眠,將kcpsm6_sleep和interrupt拉低
?
?
我們?cè)偌尤隦OM的例化
?
?
將其中的改成后面匯編主程序文件名一樣的名稱。由于我們使用的Zedboard是7系列的FPGA,故將上面的C_FAMILY的V6改成7S。
之后我們定義DIP開關(guān)作為輸入管腳,并將內(nèi)部In_port信號(hào)與其相連,定義輸入管腳為L(zhǎng)ED,并將out_port信號(hào)與其相連。
?
?
?
現(xiàn)在,我們可以編寫匯編程序了。這里先寫一個(gè)最簡(jiǎn)單的程序,只是將輸入端口01與輸出端口01直接相連。
;8個(gè)LED
constant led_port,01
;8個(gè)DIP開關(guān)
constant dip_port,01
start: input s0,dip_port
output s0,led_port
jump start
使用對(duì)其進(jìn)行編譯,輸入文件名回車,我們看到產(chǎn)生了4個(gè)文件
?
?
?
其中生成的.v是我們現(xiàn)在需要的,也就是含指令的ROM的Verilog代碼,.hex文件是后面我們通過JTAG_LOADER動(dòng)態(tài)修改程序時(shí)候需要的。
將產(chǎn)生的.v文件連同kcpsm6.v一起拷貝到ISE項(xiàng)目下,并編寫UCF文件進(jìn)行管腳和電平約束。
?
?
綜合,生成比特流之后,將top.bit用IMPACT下載到FPGA,就可以運(yùn)行了。
下面我們換成流水燈的匯編程序。
;8個(gè)LED
constant led_port,01
load s0,01
output s0,led_port
start: call delay1s
SLA s0
;output s0,led_port
jump start
delay1s:
load s1,FF
call delay1
sub s1,01
output s1,led_port
jump c,delay1s
return
delay1:
load s2,FF
call delay2
sub s2,01
jump c,delay1
return;
delay2:
load s3,FF
call delay3
sub s3,01
jump c,delay2
return;
delay3:
load s4,04
sub s4,01
jump c,delay3
return;
這次我們編譯后,使用JTAG_LOADER下載,不需要改變硬件配置。為了讓JTAG_LOADER正常加載運(yùn)行所需的dll,我們使用ISE Design Suite 64 Bit Command Prompt啟動(dòng)命令行,cd到JTAG_LOADER路徑
?
?
因?yàn)楸疚腜C為win7 x64,故使用JTAG_Loader_Win7_64.exe,過程如下
?
?
對(duì)于中斷的測(cè)試,我們首先需要開啟硬件中的中斷連接,我們添加一個(gè)input輸入,UCF中連接到按鍵上,并將處理器核的interrupt信號(hào)連接到int,interrupt_ack信號(hào)是在進(jìn)入中斷服務(wù)程序前的響應(yīng)信號(hào),這里沒有使用。由于picoblaze只提供一個(gè)中斷輸入,要實(shí)現(xiàn)多級(jí)中斷,需要自己在FPGA中實(shí)現(xiàn)對(duì)應(yīng)邏輯。
?
?
然后我們修改匯編程序,首先開啟中斷ENABLE INTERRUPT,然后在結(jié)尾加上中斷服務(wù)程序,中斷服務(wù)程序會(huì)自動(dòng)關(guān)閉中斷,跳出時(shí)候再恢復(fù)。
?
?
?
?
以下參考
中斷時(shí)序圖
?
?
完整的中斷程序,中斷修改了s7寄存器的值,使得流水燈由兩個(gè)燈變成一個(gè)燈:
;8個(gè)LED
constant led_port,01
ENABLE INTERRUPT
load s7,03
main: load s0,s7
load sA,00
output s0,led_port
start: load s1,0F
call delay1s
SLA s0
compare s0,00
jump z,main
output s0,led_port
jump start
delay1s:
load s2,FF
call delay1
sub s1,01
COMPARE sA,s1
jump c,delay1s
return
delay1:
load s3,FF
call delay2
sub s2,01
COMPARE sA,s2
jump c,delay1
return
delay2:
load s4,04
call delay3
sub s3,01
COMPARE sA,s3
jump c,delay2
return
delay3:
sub s4,01
;COMPARE sA,s4
jump nc,delay3
return
;interrupt service routine
isr: load s7,01
returni ENABLE
address 3FF
JUMP isr
評(píng)論