1. 程式人生 > >jchdl - RTL實例 - MOS6502 ALU (Verilog)

jchdl - RTL實例 - MOS6502 ALU (Verilog)

ilog 格式 操作類 進行 取反 def 包含 text 算術

https://mp.weixin.qq.com/s/jLUz757FQZjMEYzYb2AIww

MOS6502是簡單,但是曾經相當流行的一款CPU。網上有很多模擬程序可供學習使用。這裏使用一個較為精簡的Verilog項目,介紹MOS6502這款CPU的運行機制,然後使用jchdl進行模擬。 參考項目:https://github.com/Arlet/verilog-6502 該項目只包含兩個文件:alu.v, cpu.v。這裏首先介紹alu.v。 1. 註釋部分簡介了ALU的主要功能,根據op的不同,對AI/BI進行運算。 ?技術分享圖片? 2. 輸入輸出接口 ?技術分享圖片? 需要關註的有時鐘(clk), 操作類型(op),運算數和進位輸入(AI, BI, CI),運算結果和進位輸出(OUT, CO),標誌位輸出(V, Z, N, HC)等
3. 內部變量 ?技術分享圖片? 4. 計算邏輯運算的結果 ?技術分享圖片? op是經過精心設計的,如果op[1:0]等於2‘b11,則alu執行AI和BI的加減運算: ?技術分享圖片? 此時temp_logic中保存運算數AI,以期參與後續運算。 相反的,op[1:0]的另外集中組合,則temp_logic中直接存放邏輯運算結果。這幾種情況下,op[3:2]都為2‘b11,不存在其他情況。 5. 計算算術運算結果 ?技術分享圖片? 當op[3:2]為2‘b11時,temp_logic中已經是邏輯運算結果了,所以無需temp_BI參加運算,故而直接置零。 當op[3:2]為其他值時,則temp_BI緩存BI的值。根據op的設計,此種情況下,op[1:0]的值為2‘b11, temp_logic中保存的是AI。
  1. A+B: temp_BI直接緩存BI的值,後續參與運算。
  1. A-B:減法運算需要對BI求2的補碼,即取反加一,這裏先行取反。
  1. A+A:temp_BI緩存temp_logic的值,此時temp_logic中存的是AI的值,所以是A+A。
6. 計算運算結果 ?技術分享圖片? 這裏把temp_logic和temp_BI相加,計算最終結果。 需要指出的是,當運算為A - B時,需要對BI取反加一以求補碼。上面只進行了取反,而沒有加一,所以要加的1只能來自於adder_CI。adder_CI來自於輸入CI: ?技術分享圖片? 也沒有表明當為減法是,adder_CI或CI為1。查詢MOS6502文檔之後得知,MOS6502若要執行減法,需要先執行一條把進位置1的指令。
7. 更新進位 ?技術分享圖片? 8. BCD的運算 MOS6502可以把AI, BI當成BCD格式(每四位表示一位十進制數)進行運算,並輸出BCD格式的數字到OUT中。 BCD運算與二進制運算的區別,主要體現在進位上: ?技術分享圖片? temp_l[3:1]大於等於5,即代表temp_l[3:0]大於等於10,在BCD格式下,需要進位。 其他部分這裏不做解釋。

jchdl - RTL實例 - MOS6502 ALU (Verilog)