到現(xiàn)在為止,我們知道如何在基于Zynq SoC的系統(tǒng)中例化PicoBlaze 軟核處理器。在這篇博客,我們將繼續(xù)探索更多關(guān)于如何生成PicoBlaze 程序以及如何使用JTAG接口更新程序而不是重新編譯整個設(shè)計(jì)。
顯然,第一步我們要做的就是編寫匯編程序?qū)崿F(xiàn)我們要求的功能,我們可以使用PicoBlaze 或者更高級的IDE如fidex( )來編寫程序。
這個匯編文件的后綴是.psm,PicoBlaze 處理器使用PicoBlaze 匯編器進(jìn)行編譯,關(guān)于PicoBlaze 匯編語法詳細(xì)請看下載包內(nèi)的UG129和All_kcpsm6_syntax.psm文件。這個語法非常簡單易懂。
我們上周做的LED閃爍的例子使用的是下面的代碼,該例子中PicoBlaze 處理器主頻是40MHz,IO負(fù)載板的4個閃爍的LED閃爍頻率是2HZ。我們通過一個向下計(jì)數(shù)的計(jì)數(shù)器來完成閃爍速率,先設(shè)一個預(yù)置的計(jì)數(shù)值,當(dāng)遞減到0時(shí)使LED狀態(tài)翻轉(zhuǎn)。
由于PicoBlaze 指令執(zhí)行需要兩個周期,所以我們先計(jì)算好預(yù)設(shè)值:
1. 5s / 50ns = 10,000,000 cycles
然而,看看下面的代碼在循環(huán)延遲這里有五個指令需要執(zhí)行,因此我們將上面計(jì)算的值除以5,于是得到一個常量等于2,000,000(十六進(jìn)制為1E8480 )。
這就是最終在PicoBlaze 上跑的LED閃爍程序代碼
NAMEREG s0,led ;rename S0 register to led
;As 8 bit processor we need four delay loops 256 * 256 * 256 * 256 = 4294967296
CONSTANT max1, 80 ;set delay
CONSTANT max2, 84 ;set delay
CONSTANT max3, 1e ;set delay
CONSTANT max4, 00 ;set delay
main: LOAD led, 00; load the led output register with 00
flash: XOR led, FF; xor the value in led register with FF i.e. toggle
OUTPUT led,01; output led register with port ID of 1
CALL delay_init; start delay
JUMP flash; loop back to beginning
delay_init: LOAD s4, max4;
LOAD s3, max3;
LOAD s2, max2;
LOAD s1, max1;
delay_loop: SUB s1, 1'd; subtract 1 decimal from s1
SUBCY s2, 0'd; carry subtraction
SUBCY s3, 0'd; carry subtraction
SUBCY s4, 0'd; carry subtraction
JUMP NZ, delay_loop;
RETURN
下一步就是使用下載包中的匯編器對源代碼進(jìn)行編譯來生成一個存儲文件(上周我們使用的FPGA用的是VHDL語言),一個日志文件,一個十六進(jìn)制文件(.hex)。
寫完這程序,我們打開上周的設(shè)計(jì),并將其例化。盡管在聯(lián)合測試時(shí),如果我們需要改變程序的內(nèi)容,其中一種方法就是使用JTAG下載器來燒錄。JTAG下載器可以通過JTAG接口讓我們修改PicoBlaze 處理器的RAM內(nèi)容。然后我們可以測試這個更新的程序在我們重新編譯FPGA配置之前,使用這個更新的程序,以至它可以再RAM中自動的運(yùn)行。
我們使用這個JTAG下載器只能對應(yīng)一個PicoBlaze,如果一個設(shè)計(jì)有幾個PicoBlaze (理論上是可行的),我們需要確保只有一個處理器使用JTAG下載器。我們通過在例化PicoBlze時(shí)將Generic 進(jìn)行如下設(shè)置來實(shí)現(xiàn):
設(shè)置完JTAG下載器后,僅對應(yīng)我們PicoBlaze 中的一個,我們?nèi)缓笫褂肑TAG下載器來燒錄我們編譯好的hex文件。
過程非常簡單。首先根據(jù)你使用的操作系統(tǒng)從你下載的JTAG_loader文件夾選擇正確的版本并拷貝到你的工作文件夾(你的hex所在的地方)。完成這步之后,你可以打開一個命令窗口然后定位到你的工作目錄,并且使用下面的命令:
jtagloader –l .hex
注意,我已經(jīng)為我操作系統(tǒng)對應(yīng)的 jtagloader.exe的版本進(jìn)行了重命名。
隨著下載,你將看到JTAG下載器暫停了這個處理器的工作,并且在使處理器復(fù)位之前下載新的程序到內(nèi)存,隨后,你的新程序重新開始運(yùn)行。
盡管這是一個非常強(qiáng)大的工具,它允許您下載并驗(yàn)證程序的修改,但不幸的是。它確實(shí)有幾個缺陷。比如,
下一次你將這個板子上電的時(shí)候,還是執(zhí)行原來的程序,而不是更新的那個,同時(shí),在沒有生成新的FPGA配置位流之前,你只能更新一個例化的PicoBlaze。
非常感謝這個Zynq架構(gòu)使我們克服這些局限并且在接下來幾篇博客我們將看到如何完成這些,這將非常令人興奮!
?
評論
查看更多