-1

这是完整的代码

library ieee;
use ieee.std_logic_1164.all;

entity move_key_detector is
    PORT(
        clk : IN STD_LOGIC;
        done : IN STD_LOGIC;
        hex : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
        up, down : out std_logic
    );
END move_key_detector;

architecture arch of move_key_detector is

    type statetype is (IDLE, RECEIVED_BREAK);
    signal next_state, current_state : statetype :=IDLE;

begin

process (Clk) begin
    if(rising_edge(Clk)) then
        current_state <= next_state;
    end if;
end process;


process(done) begin
next_state <= current_state;
    case current_state is
        when IDLE=>
            if(done = '1') then
                if (hex = "00011101") then up <= '1';
                elsif(hex = "00011011") then down <= '1';
                --check to see if a break code is sent
                elsif (hex = "11110000") then next_state <= RECEIVED_BREAK; 
                end if;
            end if;
        when RECEIVED_BREAK=>
            if(done ='1') then
                if (hex = "00011101") then up <= '0';
                elsif(hex="00011011") then down <= '0';
                end if;
                next_state <= IDLE;
            end if;
        end case;
end process;

错误是:

错误 (10821):move_key_detector.vhd(31) 处的 HDL 错误:无法推断“down”的寄存器,因为它的行为与任何支持的寄存器模型都不匹配

信息 (10041):在 move_key_detector.vhd(29) 中推断“向下”的锁存器

错误 (10821):move_key_detector.vhd(31) 处的 HDL 错误:无法推断“向上”的寄存器,因为它的行为与任何支持的寄存器模型都不匹配

信息 (10041):在 move_key_detector.vhd(29) 处推断“向上”的锁存器

错误 (10818):无法推断 move_key_detector.vhd(41) 处的“next_state”寄存器,因为它在时钟边沿之外不保持其值

错误 (10818): 无法推断 move_key_detector.vhd(33) 处的“next_state”寄存器,因为它没有在时钟沿之外保持其值

我一直收到这种错误。我遵循了这个建议,阅读了 HDL 手册,但我仍然不知道如何解决这个问题。

谁能帮我?非常感谢你!

4

1 回答 1

2

为什么你有第二个过程?看起来它包含旨在成为异步代码的内容。

如果您需要该过程以便可以使用 if 和 case 构造,则需要将任何可能影响所需输出的内容放入过程敏感度列表(即:done AND current_state & hex)。

您还可能为 next_state 分配两个不同的值,这在针对 FPGA 时通常是一件坏事。我建议在 case 语句中移动“next_state <= current_state”,并在你的 case/if 语句的所有分支中明确分配所有术语(我猜测你对行为的期望,但你应该得到一般主意):

case current_state is
    when IDLE=>
        if(done = '1') then
            if (hex = "00011101") then 
                up <= '1';
                down <= '0';
                next_state <= current_state;
            elsif(hex = "00011011") then 
                up <= '0';
                down <= '1';
                next_state <= current_state;
            --check to see if a break code is sent
            elsif (hex = "11110000") then 
                up <= '0';
                down <= '0';
                next_state <= RECEIVED_BREAK; 
            ...

如果您打算生成异步逻辑,您还可以在进程之外使用选定的信号分配。

如果您真的试图推断 up/down/next_state 信号的锁存器,您需要更明确地说明您想要发生的事情,无论是直接在您的代码中还是在您向我们提出的问题中,以便我们为您提供帮助。

于 2011-11-18T23:22:22.540 回答