新聞中心

        EEPW首頁 > EDA/PCB > 設計應用 > 在FPGA上對OC8051IP核的修改與測試

        在FPGA上對OC8051IP核的修改與測試

        作者: 時間:2009-12-14 來源:網絡 收藏

        2.1 仿真調試方案
        仿真調試方案如圖2所示。其原理是:在Keil軟件環境中編寫測試程序,編譯生成.hex文件并將其注入ROM的指令寄存器中。testbench負責產生工作時鐘及控制使能等信號,并將執行ROM中指令的結果輸出到文本/波形文件中。開發人員通過對文本/波形文件和Keil調試工具執行測試程序的結果進行比較,從而實現對邏輯錯誤的查找與定位,并對核源文件進行修改。

        本文引用地址:http://www.104case.com/article/191853.htm

        值得注意的是,雖然Modelsim功能強大,可以方便地觀察到任何層次模塊信號的變化,但是OC8051 核的結構和時序比較復雜,仍避免不了仿真時因為中間信號多所帶來的不便。因此,在仿真調試時可尋求一些簡化操作的機制??紤]到借助數據寄存器指針DPTR和累加器A,MOVX指令可以將程序執行過程中任何寄存器的值輸出到外部RAM中,而觀察外部RAM中的值相對容易,因而本文采用了這種機制。
        2.2 具體修改方法
        (1)oc805 1_ext_addr_sel模塊
        讀寫外部RAM地址可以由DPTR指示,也可以由Ri指示,該模塊的主要功能是選擇讀寫外部RAM地址。通過select和write信號完成對buff和state的配置,從而完成對讀寫外部RAM地址addr_out的配置。在Modelsim環境中,執行表1中的代碼1時,發現addz_out的變化總是比DPTR慢一個時鐘周期,因而其執行結果是將5寫入地址為0的外部RAM。造成這種現象的原因是配置buff和state時采用了always進程,本文將該部分代碼修改為:
        assign state=write;
        asstgn buff=select?{8h00,ri}:{dptr_hi,dptr_lo};
        (2)oc8051_psw模塊
        該模塊由一個8位標志寄存器及其控制邏輯組成,用來收集指令執行后的有關狀態。8位寄存器的各位狀態通常是在指令執行過程中自動形成,但也可以由用戶根據需要采用傳送指令加以改變。原設計中負責解釋傳送指令的邏輯采用if語句:
        if(addr[7:3]=='OC8051_SFR_B_ACC)data_out[addr[2:O]]=cy_in;
        'OC8051_SFR_B_ACC被定義為累加器A的高5位地址,用在這里顯然不對。應該將其改為程序狀態字PSW的高5位地址'OC8051_SFR_B_PSW。
        (3)oc8051_alu模塊
        該模塊是一個性能極強的運算器,不但可以進行四則運算和邏輯運算,而且具有數據傳送、移位、程序轉移等功能。其中,程序轉移功能是當遇到短轉移指令SJMlE’或變址轉移指令JZ、CJNE、DJNZ等時,改變程序計數器PC的值,對應原設計為always進程中的'OC8051_ALU_PCS分支。其代碼如下:


        輸入src3為PC[15:8],src2為PC[7;0],src1為目標轉移地址rel。需要注意的是,rel是以立即數形式存在的,且為補碼格式(補碼數的加減法運算統一為加法運算)。若src1[7]=1'b1成立,則rel為一負數,對應轉移指令是往前轉移;否則,往后轉移。當rel為負數時,原設計僅考慮了:PC[7:0]≥| rel |的情況,其對目標地址{des1,des2}的處理不全面;當PC[7:0]|rel|時,des2=src2+src1為負數,借位會對des1產生影響,因而應有des1=src3-8'h1。因此,將該部分代碼修改為:


        其中c是借位標志位,用來標識程序轉移時PC[7:0]對PC[15:8]的影響。



        關鍵詞: FPGA 8051 OC IP

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 阳原县| 泰安市| 章丘市| 阿城市| 个旧市| 泗阳县| 昌吉市| 宁安市| 团风县| 牟定县| 曲水县| 噶尔县| 东光县| 金华市| 长丰县| 左云县| 大连市| 阿尔山市| 东阿县| 临朐县| 瓮安县| 双流县| 保靖县| 东港市| 启东市| 哈尔滨市| 汉沽区| 广汉市| 张家川| 荥经县| 辉南县| 比如县| 辽宁省| 江陵县| 金塔县| 七台河市| 柘荣县| 瑞丽市| 商洛市| 屯门区| 临猗县|