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