2016-05-27 8 views
0

Ich versuche, eine 32-Bit-CPU mit einem modifizierten MIPS-Befehl in VHDL festgelegt. Ich versuche gerade, meinen Programmzähler für den nächsten Befehl um 1 zu erhöhen, es sei denn, es handelt sich um einen Sprungbefehl, der dann dem Programmzähler den Sprungwert gleich macht.VHDL Inkrement 10-Bit-Programmzähler von 1

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; 

Ich bekomme Fehler bei dieser Linie PC_IN <= (PC_IN + "0000000001") when (Jump = '0'). Die Fehler bestehen aus kann nicht 'in' Objekt pc_in und 0 Definitionen von Operator "+" passen hier, so dass es nicht mag mich mit dem Operator + und vielleicht pc_in muss eine Ausgabe sein?

Kann jemand meinen Programmzähler um 1 für die nächste Anweisung erhöhen? Jede Hilfe wäre willkommen. Vielen Dank.

+0

Signal Jump wird in einer anderen Datei deklariert, in der alle Steuersignale eingegeben werden. Es verbindet sich dann mit der PC-Datei mit Komponente Verzögerung und Port-Maps in einer Overhead-Datei namens CPU, die meinen PC, Befehlsspeicher, Register, Steuerung usw. – oodan123

+0

Also, weil ich eine Zuordnung zu einem Objekt des Modus in, sollte ich ändern es stattdessen zu PC_Out? – oodan123

Antwort

2

PC_IN ist definiert als std_logic_vector. Sie zeigen die verwendeten Bibliotheken nicht an, aber standardmäßig gibt es keine definierten Operatoren für + für std_logic_vector in std_logic_1164. Beachten Sie Ihre Fehlermeldung:

0 definitions of operator "+" match here

Dies ist Ihr Hing, die + in diesem Zusammenhang nicht definiert ist. Um den Operator + zu verwenden, müssen Sie eine Bibliothek einschließen, die diese Unterstützung bietet und den entsprechenden Typ verwendet.

Weitere Fehler:

cannot update 'in' object pc_in

sagt Ihnen, dass Sie keine in Port einstellen. Bemerkenswert ist, PC_IN ist ein Eingang, aber Sie versuchen, PC_IN zu fahren. Vielleicht wollen Sie PC_OUT fahren?

Ich werde die alternative Methode nicht erwähnen, aber Sie sollten wahrscheinlich numeric_std in diesem Fall verwenden. Zum Beispiel:

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

Danke das schien das Problem zu lösen. Ich bekomme immer noch den Fehler, ein in-Objekt zu aktualisieren, aber Sie haben den Wert zu inkrementieren. Danke für Ihre Hilfe. – oodan123

+0

@ oodan123 Ihr Fehler im Zusammenhang mit 'kann nicht aktualisieren 'in' Objekt pc_in' ist, weil' PC_IN' eine Eingabe ist, und Sie es zuweisen. Sie sollten wahrscheinlich 'PC_OUT' zuweisen. Ich habe meine Antwort aktualisiert, um das zu verdeutlichen. – PlayDough

+0

Für nicht-2008 revisionssichere VHDL-Tools (ohne sequentielle bedingte Signalzuordnung, bei der die Signalzuordnung in einem Prozess auftritt): 'if Jump = '0' dann PC_OUT <= std_logic_vector (unsigned (PC_IN) + 1); sonst PC_OUT <= Jump_Inst; Ende if; 'In -2008 gibt es auch Paket numeric_std_unsigned, das std_logic_vector als unsigned behandelt und ein" + "ohne die Typkonvertierungen liefert. – user1155120