2013-12-18 43 views
1

我有这个PC模块,很简单(代码结尾)。我首先生成一些输入信号port_int,并在过程结束时说pc_out <= port_int。我的目标是根据输入信号增加或增加或减少PC。VHDL内部信号改变输出 - 不工作?

在仿真中,内部port_int信号工作正常,但pc_out没有。这是为什么发生?看看模拟: sim

看看port_int如何改变,因为它应该,而pc_out是迟到。后来在模拟中,pc_out变得更糟,变化不规则,甚至不迟到。

我在做什么错?有没有另一种方法来改变pc_out? Bcoz你不能改变out信号,我已经告诉inout是非常不好的做法..

下面的代码:

entity PC is 
    Port (clk : in STD_LOGIC; 
     enable : in STD_LOGIC; 
     reset : in STD_LOGIC; 
     pc_out : out STD_LOGIC_VECTOR (3 downto 0); 
     data : in STD_LOGIC_VECTOR (3 downto 0); -- jump value 
     zero : in STD_LOGIC; -- jump condition 
     jmp_en : in STD_LOGIC;  -- jump enable 
     jmp_dir : in STD_LOGIC; -- jump direction 
     ctrl_en : out STD_LOGIC); -- output signal 
end PC; 

architecture Behavioral of PC is 

type state_type is (s0, s1, s2, s3); 
signal reg_state, next_state : state_type; 

signal port_int : std_logic_vector(3 downto 0); 

begin 

state_transition: process(clk, reset) 
begin 
    if (reset = '1') then 
     reg_state <= s0; 
    elsif(rising_edge(clk)) then 
     reg_state <= next_state; 
    end if; 
end process; 

next_state_logic: process(reg_state, enable) 
begin 
    case reg_state is 
     when s0 => 
      if(enable = '1') then 
       next_state <= s2; 
      else 
       next_state <= s1; 
      end if; 

     when s1 => 
      if(enable = '1') then 
       next_state <= s2; 
      else 
       next_state <= s1; 
      end if; 

     when s2 => 
      next_state <= s3; 

     when s3 => 
      if(enable = '1') then 
       next_state <= s2; 
      else 
       next_state <= s1; 
      end if; 
    end case; 
end process; 

output_logic: process(reg_state, zero, jmp_en, jmp_dir, data) 
begin 
    case reg_state is 
     when s0 => 
      pc_out <= "0000"; 
      port_int <= "0000"; 
      ctrl_en <= '0'; 

     when s1 => 
      ctrl_en <= '0'; 

     when s2 => 
      if(zero = '1' and jmp_en = '1' and jmp_dir = '1')then 
       port_int <= port_int + data; -- jump forward 
      elsif(zero = '1' and jmp_en = '1' and jmp_dir = '0')then 
       port_int <= port_int - data; -- jump backward 
      else -- nije ispunjen uslov skoka 
       port_int <= port_int + '1'; -- increment PC 
      end if; 
      pc_out <= port_int; 

     when s3 => 
      ctrl_en <= '1'; 
    end case; 
end process; 

end Behavioral; 

编辑:

当我导入模块在整个处理器中,发生这种情况: sim3 相同pc_out信号奇怪行为,并且所有输入都是相同的。我只在一个地方使用pc_out信号来选择存储器。 为什么它不正常?这可能导致什么?

回答

1

计算输出值的第二个过程(output_logic:过程)有一些问题。

首先,回顾,它实现一个组合电路(因此,无记忆),所以像port_int方程< = port_int +数据只能如果port_int的值被存储在某处计算。顺便说一句,固定代码后,您可以直接删除内部信号port_int并使用pc_out

其次,作为该过程的一个组合电路,必须指定其全部真值表;否则,将推断锁存器。请注意,例如,只有ctrl_en的值在状态s1中指定。您必须在所有状态中指定所有输出值(相同列表),或者等价地,您可以在个案个案之前创建一个输出值列表,以便编译器在未明确声明值时将它们用作默认值。

2

如果我明白你正确地做什么,你只需要process块外面一条语句:

pc_out <= port_int; 

采取一切其他语句分配的东西pc_out你的设计中。我想你会被<=运营商绊倒,该运营商会等到下一次模拟增量时才真正更新信号驱动器。

+0

是的,这解决了我的问题!谢谢! – Vidak

+0

还有一件事,当我将这个模块连接到一个更高的模块时,pc_out不会像它应该那样改变。所有输入信号保持不变,然而'pc_out'从'0000'变为'0100'而不是'0001'。我在另一个模块中使用'pc_out'作为输入,会影响它吗?我没有做任何事情,只是简单的阅读。 – Vidak

+0

@Vidak很难说......你是在混合“TO”还是“DOWNTO”?这可能导致位翻转。 – godel9