【问题标题】:VHDL output declarations with State machine带有状态机的 VHDL 输出声明
【发布时间】:2012-05-16 05:27:15
【问题描述】:

我正在尝试用 VHDL 编写一个状态机,它将扫描一个 4x4 键盘。我希望 keyP 在开始时和重置后设置为 0。我还希望在开始时和重置后将 Col 设置为“1111”。

由于我不完全精通 VHDL 编程,我确信这只是一个愚蠢的语法错误。
我得到的错误是:

错误 (10818):无法推断 Lab_7_Keypad.vhd(39) 中“Col[0]”的寄存器,因为它在时钟沿之外没有保持其值

Col[1]Col[2]Col[3]keyP 也是如此。

这是我开始这一切的代码。谁能告诉我我哪里出错了?

谢谢

ENTITY Lab_7_Keypad IS
PORT(
    nReset          :   IN  STD_LOGIC;
    clk             :   IN  STD_LOGIC;
    row             :   IN  STD_LOGIC_VECTOR (3 downto 0);
    Col             :   OUT STD_LOGIC_VECTOR (3 downto 0);
    data            :   OUT STD_LOGIC_VECTOR (3 downto 0);
    keyP            :   OUT STD_LOGIC);

    END Lab_7_Keypad;

ARCHITECTURE a OF Lab_7_Keypad IS   
TYPE STATE_TYPE IS ( Col1Set, Col2Set, Col3Set, Col4Set );
SIGNAL  coltest :   STATE_TYPE;

BEGIN
PROCESS (clk, nReset )
BEGIN
    keyP <= '0';
    Col <= "1111";
    IF nReset = '0' THEN                        --  asynch Reset to zero
        coltest <=  Col1Set;
        Col <="1111";
        keyP <= '0';
    ELSIF clk'EVENT AND clk = '1' THEN          --  triggers on PGT

        CASE coltest IS
            WHEN Col1Set => 
            Col <="1110";
                CASE row IS
                    WHEN    "1110"=>--row 1
                    data <= "0001";
                    keyP <= '1';
                    WHEN    "1101"=>--row 2
                    data <= "0100";
                    keyP <= '1';
                    WHEN    "1011"=>--row 3
                    data <= "0111";
                    keyP <= '1';
                    WHEN    "0111"=>--row 4
                    data <= "1110";
                    keyP <= '1';
                    WHEN OTHERS => coltest <= Col2Set;
                END CASE;
  --And continues with same Case statements three more times.

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    您的综合错误是由于您在进程的异步重置或时钟边缘之外同时分配了 colkeyP,这不正确描述一个寄存器。删除这些分配,错误就会消失。

    PROCESS (clk, nReset )
    BEGIN
        --keyP <= '0';  <------- BAD!
        --Col <= "1111"; <------- BAD!
        IF nReset = '0' THEN                        --  asynch Reset to zero
            coltest <=  Col1Set;
            Col <="1111";
            keyP <= '0';
        ELSIF clk'EVENT AND clk = '1' THEN          --  triggers on PGT
    
            CASE coltest IS
                WHEN Col1Set => 
                Col <="1110";
                    CASE row IS
                        WHEN    "1110"=>--row 1
                        data <= "0001";
                        keyP <= '1';
                        WHEN    "1101"=>--row 2
                        data <= "0100";
                        keyP <= '1';
                        WHEN    "1011"=>--row 3
                        data <= "0111";
                        keyP <= '1';
                        WHEN    "0111"=>--row 4
                        data <= "1110";
                        keyP <= '1';
                        WHEN OTHERS => coltest <= Col2Set;
                    END CASE;
      --And continues with same Case statements three more times.
    

    【讨论】:

      猜你喜欢
      • 2013-07-22
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      相关资源
      最近更新 更多