2016-04-03 40 views
0

我需要創建一個接收時鐘,復位,來自指令字(最低有效字節)的立即數和來自ALU的零輸出作爲輸入的Verilog模塊,並生成一個8-用於輸出的程序計數器(PC)。這個任務說明,在這個架構中,當我們有一個分支時,下一個PC值應該是當前PC值加上從分支指令中提取的偏移量。偏移量以二進制補碼錶示,因此分支目標的範圍是從PC-128到PC + 127.請注意,PC的值不應超過0xFF,因爲我們有256深度的指令內存。您不需要在硬件中檢查這種情況。帶分支的Verilog程序計數器

這是我到目前爲止,但我知道這是不完整的,我不知道如何處理直接或如果我需要添加的分支指令的東西。任何幫助/建議?

module pc(input clk, 
    input rst, 
    input [7:0] immediate, 
    input alu_output, 
    output [7:0] pc) 

reg [7:0] pc; 

[email protected](posedge clk) 
    begin 
     if(rst) 
      begin 
       pc <= 0; 
      end 
     else 
      begin 
       pc <= pc + 1; 
      end    
    end 
endmodule 

回答

0

我一般不會做其他人的功課,所以我會盡力幫助你。 (就像那個惱人的老師永遠不會直接回答你的問題)

雖然你的文本沒有指定,我還假設你應該能夠執行絕對分支(也稱爲跳轉)。

對於分支,您需要使用加法器。你已經有了一個加法器用於你的操作,重新使用這個加法器進行分支真的很不錯。這個加法器必須放在PC寄存器的前面。添加的內容必須由您的電路決定。

你的程序計數器必須能夠:負荷指令字立即增加分支值加1。給定條件下將執行這三種操作之一。在數字電路中,多路複用器是根據條件做出決定的好方法。 我建議你弄清楚你的情況是什麼,並且讓自己瞭解這需要如何工作。然後你嘗試編程它之後。

+0

只是爲了正確,他想要的是相對跳躍,而不是絕對跳躍,因爲他的直接值被添加到當前PC跳躍,而不是加載到PC。 – Unn

+0

我是不是寫了兩個呢?我只是繼續前進,並認爲他的任務需要兩個,儘管他沒有指定它。 – Hida

0

你自己完成了大部分工作。爲什麼不添加一個控制輸入,稱之爲branch。當branch爲0時,您已按照您的要求編寫pc <= pc +1。當branch是1,則寫:

begin 
    next_pc = pc +{ {{24{immediate[8] }}, immediate[8:0] }; 
    if (next_pc > 255) 
     next_pc = 255; 

    pc <= next_pc; 
end 

其中{{24{immediate[8] }}符號延伸的立即,即符號位重複立即[8],24次。

0

必須有一個輸入與指示相關,無論它是否是分支指令。

通常,從處理器的角度來看,指令的一個子集用於指示PC是否應該正常遞增或是否存在分支/跳轉指令。

在你的情況,我們可以採取額外的輸入來指示分支指令。

always @ (posedge clk) 
begin 
    if (rst) 
    pc <= 'h0; 
    else if (branch_inst) // Extra input port "branch_inst" 
    pc <= pc + immediate; // immediate in 2's complement, signed form 
    else 
    pc <= pc + 1'b1; 
end