2016-05-27 33 views
0

我正在嘗試使用VHDL中修改的MIPS指令集來生成32位CPU。我目前正試圖讓我的程序計數器爲下一條指令遞增1,除非它是跳轉指令,然後程序計數器將等於跳轉值。VHDL通過1遞增10位程序計數器

entity PC is 
Port (PC_IN  : in STD_LOGIC_VECTOR (9 downto 0); --New PC in value (PC+1 or jump) 
     PC_OUT : out STD_LOGIC_VECTOR (9 downto 0); --PC out to instruction memory 
     Jump_Inst : in STD_LOGIC_VECTOR(9 downto 0); --Jump address 
     Jump  : in STD_LOGIC; --Jump MUX 
     clk  : in STD_LOGIC); 
end PC; 

architecture Behavioral of PC is 
begin 

PC_IN <= (PC_IN + "0000000001") when (Jump = '0') 
else Jump_Inst;  

process(clk) 
begin 
    if rising_edge(clk) then --If it is the next clock cycle (i.e time for the next instruction) 
    PC_OUT <= PC_IN; 

end if; 
end process;  
end Behavioral; 

我在這條線上收到錯誤PC_IN <= (PC_IN + "0000000001") when (Jump = '0')。錯誤由無法更新對象pc_in運營商「+」的0定義匹配,所以它不喜歡我使用+運算符,也許pc_in需要是輸出?

有誰知道如何讓我的程序計數器增加1爲下一個指令?任何幫助,將不勝感激。謝謝。

+0

Signal Jump是在另一個文件中聲明的,其中所有的控制信號都是在其中創建的。然後它鏈接到PC文件使用組件減速和端口映射在一個名爲cpu的開銷文件,它連接我的電腦,指令內存,寄存器,控制等 – oodan123

+0

因此,因爲我不能作出模式的對象的任務,我應該改變它改爲PC_Out? – oodan123

回答

2

PC_IN定義爲std_logic_vector。您不顯示正在使用的庫,但默認情況下+對於std_logic_vectorstd_logic_1164中沒有定義的運算符。請注意您的錯誤信息:

0 definitions of operator "+" match here

這是+未在此背景下定義你的興。爲了使用+運算符,您需要包含一個具有該支持並使用適當類型的庫。

你其他錯誤:

cannot update 'in' object pc_in

告訴你,你不能設置一個in端口。值得注意的是,PC_IN是一個輸入,但您試圖驅動PC_IN。也許你的意思是開車PC_OUT

我不會提到替代方法,但在這種情況下,您應該使用numeric_std。例如:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

... 

PC_OUT <= std_logic_vector(unsigned(PC_IN) + 1) when (Jump = '0') else Jump_Inst; 
+0

謝謝你似乎解決了這個問題。我仍然收到有關更新對象的錯誤,但您已經獲得了增加的值。謝謝你的幫助。 – oodan123

+0

@ oodan123與'對象pc_in'中的'無法更新'有關的錯誤是因爲'PC_IN'是一個輸入,並且正在分配它。你應該分配'PC_OUT'。我已經更新了我的答案以澄清這一點。 – PlayDough

+0

對於非2008年修訂版兼容VHDL工具(沒有其中信號分配在一個過程中發生連續的條件信號分配): '如果跳轉=「0」然後 PC_OUT <= std_logic_vector(無符號(PC_IN)+ 1);其他 PC_OUT <=跳轉_Inst; END IF;'在-2008有還包numeric_std_unsigned該治療std_logic_vector爲無符號並提供一個「+」不帶類型轉換。 – user1155120