在FPGA上對OC8051IP核的修改與測試
2.1 仿真調(diào)試方案
OC8051仿真調(diào)試方案如圖2所示。其原理是:在Keil軟件環(huán)境中編寫測試程序,編譯生成.hex文件并將其注入ROM的指令寄存器中。testbench負責產(chǎn)生OC8051工作時鐘及控制使能等信號,并將OC8051執(zhí)行ROM中指令的結(jié)果輸出到文本/波形文件中。開發(fā)人員通過對文本/波形文件和Keil調(diào)試工具執(zhí)行測試程序的結(jié)果進行比較,從而實現(xiàn)對邏輯錯誤的查找與定位,并對IP核源文件進行修改。本文引用地址:http://m.butianyuan.cn/article/191853.htm
值得注意的是,雖然Modelsim功能強大,可以方便地觀察到任何層次模塊信號的變化,但是OC8051 IP核的結(jié)構(gòu)和時序比較復(fù)雜,仍避免不了仿真時因為中間信號多所帶來的不便。因此,在仿真調(diào)試時可尋求一些簡化操作的機制??紤]到借助數(shù)據(jù)寄存器指針DPTR和累加器A,MOVX指令可以將程序執(zhí)行過程中任何寄存器的值輸出到外部RAM中,而觀察外部RAM中的值相對容易,因而本文采用了這種機制。
2.2 具體修改方法
(1)oc805 1_ext_addr_sel模塊
讀寫外部RAM地址可以由DPTR指示,也可以由Ri指示,該模塊的主要功能是選擇讀寫外部RAM地址。通過select和write信號完成對buff和state的配置,從而完成對讀寫外部RAM地址addr_out的配置。在Modelsim環(huán)境中,執(zhí)行表1中的代碼1時,發(fā)現(xiàn)addz_out的變化總是比DPTR慢一個時鐘周期,因而其執(zhí)行結(jié)果是將5寫入地址為0的外部RAM。造成這種現(xiàn)象的原因是配置buff和state時采用了always進程,本文將該部分代碼修改為:
assign state=write;
asstgn buff=select?{8h00,ri}:{dptr_hi,dptr_lo};
(2)oc8051_psw模塊
該模塊由一個8位標志寄存器及其控制邏輯組成,用來收集指令執(zhí)行后的有關(guān)狀態(tài)。8位寄存器的各位狀態(tài)通常是在指令執(zhí)行過程中自動形成,但也可以由用戶根據(jù)需要采用傳送指令加以改變。原設(shè)計中負責解釋傳送指令的邏輯采用if語句:
if(addr[7:3]=='OC8051_SFR_B_ACC)data_out[addr[2:O]]=cy_in;
'OC8051_SFR_B_ACC被定義為累加器A的高5位地址,用在這里顯然不對。應(yīng)該將其改為程序狀態(tài)字PSW的高5位地址'OC8051_SFR_B_PSW。
(3)oc8051_alu模塊
該模塊是一個性能極強的運算器,不但可以進行四則運算和邏輯運算,而且具有數(shù)據(jù)傳送、移位、程序轉(zhuǎn)移等功能。其中,程序轉(zhuǎn)移功能是當遇到短轉(zhuǎn)移指令SJMlE’或變址轉(zhuǎn)移指令JZ、CJNE、DJNZ等時,改變程序計數(shù)器PC的值,對應(yīng)原設(shè)計為always進程中的'OC8051_ALU_PCS分支。其代碼如下:
輸入src3為PC[15:8],src2為PC[7;0],src1為目標轉(zhuǎn)移地址rel。需要注意的是,rel是以立即數(shù)形式存在的,且為補碼格式(補碼數(shù)的加減法運算統(tǒng)一為加法運算)。若src1[7]=1'b1成立,則rel為一負數(shù),對應(yīng)轉(zhuǎn)移指令是往前轉(zhuǎn)移;否則,往后轉(zhuǎn)移。當rel為負數(shù)時,原設(shè)計僅考慮了:PC[7:0]≥| rel |的情況,其對目標地址{des1,des2}的處理不全面;當PC[7:0]|rel|時,des2=src2+src1為負數(shù),借位會對des1產(chǎn)生影響,因而應(yīng)有des1=src3-8'h1。因此,將該部分代碼修改為:
其中c是借位標志位,用來標識程序轉(zhuǎn)移時PC[7:0]對PC[15:8]的影響。
評論