2014-10-01 5 views
0

Все работает, кроме функции приращения. Он может увеличиваться от 0 до 1, от 1 до 2, а затем от 2 до 1111111111. Я в тупике.Приращение счетчика программы не работает

Переменные:

D_IN: Данные в

PC_OE: Активный высокий. Привод вывода PC_TRI.

PC_LD: Активный высокий синхронно загружает D_IN в ПК.

PC_INC: Активно высокий синхронно увеличивает значение на ПК.

RST: активный высокий асинхронный сброс.

PC_COUNT: Текущее значение на ПК. Адрес.

PC_TRI: Текущее значение на ПК под управлением трех состояний. Когда 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». Я понятия не имею, где он получает эту ценность. – 2014-10-01 07:18:16

+1

В теле архитектуры есть параллельное назначение '' 0000000000 '' '' s_count'. В процессе «proc» есть дополнительный драйвер. «+» Будет распространять «X» после разрешения 's_count' (0), '0' и' 1'. Является ли ваш тестовый пример способным воспроизводить ваши симптомы? – user1155120

ответ

0

Комментарий QuantumRipple очень полезно

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

I попытался прокомментировать такую ​​линию, и она сработала. Попробуйте сделать это, и сделайте 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', заставит его перейти от '" 0000000000 "' к '" 0000000000X "' в первом приращении и '' XXXXXXXXXX в следующем из-за функции разрешения std_logic_1164. Это не соответствует описанным симптомам «... от 0 до 1, от 1 до 2, а затем от 2 до 1111111111». – user1155120

Смежные вопросы