2014-10-01 4 views
0

모든 기능이 작동하지만 증분 기능은 작동합니다. 0에서 1, 1에서 2로 증가 할 수 있고, 2에서 "1111111111"로 증가합니다. 나는 혼란 스럽다.프로그램 카운터의 증분이 작동하지 않습니다.

PC_OE의 데이터 :

변수 :

D_IN 높은 활성. PC_TRI 출력을 구동합니다.

PC_LD : Active high는 D_IN을 PC에 동기식으로로드합니다.

PC_INC : 활성 하이는 PC에서 동기로 값을 증가시킵니다.

RST : 액티브 하이 비동기 리셋.

PC_COUNT : PC의 현재 값입니다. 주소.

PC_TRI : 트라이 상태 제어하에있는 PC의 현재 값. PC_OE = '1'일 때, PC_TRI < = PC_COUNT, 그렇지 않으면 하이 임피던스.

library IEEE; 

use IEEE.STD_LOGIC_1164.ALL; 

use IEEE.STD_LOGIC_UNSIGNED.ALL; 

use IEEE.STD_LOGIC_ARITH.ALL; 


entity ProgramCounter is 
    Port (D_IN : in STD_LOGIC_VECTOR (9 downto 0); 

      PC_OE : in STD_LOGIC; 

      PC_LD : in STD_LOGIC; 

      PC_INC : in STD_LOGIC; 

      RST : in STD_LOGIC; 

      CLK : in STD_LOGIC; 

      PC_COUNT : out STD_LOGIC_VECTOR (9 downto 0); 

      PC_TRI : out STD_LOGIC_VECTOR (9 downto 0)); 


end ProgramCounter; 

architecture Behavioral of ProgramCounter is 

signal s_COUNT : STD_LOGIC_VECTOR (9 downto 0); 

begin 

s_COUNT <= "0000000000"; 

proc: process(RST, CLK, PC_LD, D_IN, s_COUNT, PC_INC, PC_OE) 
begin 

    if (RST = '1') then 
     s_COUNT <= "0000000000"; 
    elsif (rising_edge(CLK)) then 

     if (PC_LD = '1') then 
      s_COUNT <= D_IN; 
     elsif (PC_INC = '1') then 
      s_COUNT <= s_COUNT + 1; 
     else 
     end if; 

    else 
    end if; 

if (PC_OE = '1') then 
    PC_TRI <= s_COUNT; 
else 
    PC_TRI <= "ZZZZZZZZZZ"; 
end if; 

PC_COUNT <= s_COUNT; 

end process proc; 

end Behavioral; 
+1

PC_LD가 실수로 설정되지 않았습니까? –

+0

나는 꽤 확신한다. 나는 그것을 테스트하기 위해 시뮬레이터를 사용하고있다. PC_LD가 '0'이라고합니다. 이상한 점은 내가 넣는 데이터가 "1111111111"이 아니라는 것입니다. 나는 그것이 그 가치를 얻고 있는지 전혀 모른다. –

+1

아키텍처 본문에는''0000000000 "'과's_count'의 동시 할당이 있습니다. 'proc' 프로세스에 추가 드라이버가 있습니다. "+"는 s_count's (0), '0'과'1'을 해결 한 후''X ''를 전파합니다. 테스트 케이스가 증상을 재현 할 수 있습니까? – user1155120

답변

0

QuantumRipple의 의견은

begin 
--s_COUNT <= "0000000000"; 
... 

나는 매우 유용합니다 그런 선을 논평하려고 노력했고 그것은 효과가 있었다. 계산을 시작하기 전에 RST를 작성하십시오.

-1

이 방법을 시도하고 알려 주시기 바랍니다, 난 당신의 코드를 수정하지만 난 그것을 시도 할 수 없습니다

library IEEE; 

use IEEE.STD_LOGIC_1164.ALL; 

use IEEE.STD_LOGIC_UNSIGNED.ALL; 

use IEEE.STD_LOGIC_ARITH.ALL; 


entity ProgramCounter is 
    Port (D_IN : in STD_LOGIC_VECTOR (9 downto 0); 

      PC_OE : in STD_LOGIC; 

      PC_LD : in STD_LOGIC; 

      PC_INC : in STD_LOGIC; 

      RST : in STD_LOGIC; 

      CLK : in STD_LOGIC; 

      PC_COUNT : out STD_LOGIC_VECTOR (9 downto 0); 

      PC_TRI : out STD_LOGIC_VECTOR (9 downto 0)); 


end ProgramCounter; 

architecture Behavioral of ProgramCounter is 

signal s_COUNT : STD_LOGIC_VECTOR (9 downto 0); 

begin 

proc: process(RST, CLK) 
begin 

    if (RST = '1') then 
     s_COUNT <= "0000000000"; 
    elsif (rising_edge(CLK)) then 

     if (PC_LD = '1') then 
      s_COUNT <= D_IN; 
     elsif (PC_INC = '1') then 
      s_COUNT <= s_COUNT + 1; 
     else 
     end if; 

    else 
    end if; 
end process; 

PC_TRI <= s_COUNT when (PC_OE = '1') else (others => 'Z'); 
PC_COUNT <= s_COUNT; 



end Behavioral; 
+0

's_count'에 기여한 두 번째 드라이버는 std_logic_1164의 해상도 기능으로 인해 '0000000000'에서' "0000000000X"'로, 첫 번째 증분에서는''XXXXXXXXXX ''로 이어집니다. 이것은 설명 된 증상과 일치하지 않습니다 "... 0에서 1, 1에서 2까지 그리고 2에서"1111111111 "로갑니다." – user1155120

관련 문제