案例陈述中的VHDL IF声明

时间:2016-04-28 09:13:02

标签: vhdl fpga intel-fpga case-statement quartus

正如您可以想象的那样,通过查看我的代码,我是VHDL的初学者,所以我真的很想知道为什么它不起作用,因为它似乎在逻辑上应该起作用。

事实上,那些没有表现出我喜欢的方式的部分根本就没有做任何事情。

为了使这个更容易理解,我将至少解释一下这应该做些什么。首先,IN端口New_Data指示1有新数据可用且应进行评估。输入代码是要评估/解释的值。输出是新的速度值,电流是当前/前一个。方向由输入代码10反转。

没有工作或实际做任何事情的部分:如果代码是+(val 43)你将它增加1,如果代码是 - (val 45)你将它减少1然后结果它发送到速度输出。

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.NUMERIC_STD.ALL;

ENTITY Code_Interpret IS
    PORT (
            New_Data: IN STD_LOGIC;
            Current_Speed: IN UNSIGNED(7 DOWNTO 0);
            Code: IN UNSIGNED(7 DOWNTO 0);
            Speed: OUT UNSIGNED(7 DOWNTO 0);
            Direction: OUT STD_LOGIC
         );
END Code_Interpret;

ARCHITECTURE rtl OF Code_Interpret IS

SIGNAL s_speed: UNSIGNED(7 DOWNTO 0):= "00110000";
SIGNAL s_case: INTEGER RANGE 0 TO 64 := 48;
SIGNAL s_direction: STD_LOGIC := '1';

BEGIN
    PROCESS (New_Data, Code)
    BEGIN
        s_case <= TO_INTEGER(Code);
        IF RISING_EDGE(New_Data) THEN
            CASE s_case IS
                WHEN 48 TO 55 =>
                    --s_speed <= Code;
                    s_speed <= Code;
                WHEN 43 =>
                    IF Current_Speed < 55 THEN
                        s_speed <= Current_Speed + 1;
                    ELSE
                        s_speed <= Current_Speed;
                    END IF;
                WHEN 45 =>
                    IF Current_Speed > 48 THEN
                        s_speed <= Current_Speed - 1;
                    ELSE
                        s_speed <= Current_Speed;
                    END IF;
                WHEN 10 =>
                    s_direction <= NOT s_direction;
                WHEN OTHERS =>
                    NULL;
            END CASE;
        END IF;
        Speed <= s_speed;
        Direction <= s_direction;
    END PROCESS;
END;

没有做我想做的事情:

WHEN 43 =>
    IF Current_Speed < 55 THEN
        s_speed <= Current_Speed + 1;
    ELSE
        s_speed <= Current_Speed;
    END IF;
WHEN 45 =>
    IF Current_Speed > 48 THEN
        s_speed <= Current_Speed - 1;
    ELSE
        s_speed <= Current_Speed;
    END IF;

这是我的模拟效果。时间轴上有6个标记,第一个是+然后 - 然后是一个方向开关,相同的代码以相同的顺序重复。

Quartus Simulation #1

我尝试了很多不同的事情,但我还没有意识到问题是什么,我很想知道为什么这不起作用。

好的,现在我只模拟VHDL代码并直接使用输入和输出而不是使用无用的引脚,并且在我不需要的原理图中。我还阅读了Quartus II仿真手册,以帮助我修复基数。 (就像我说的那样,我对此很新......)

更改代码以尝试使用VAR:

--....
--SIGNAL s_case: INTEGER RANGE 0 TO 64 := 48;
SIGNAL s_direction: STD_LOGIC := '1';

BEGIN
    PROCESS (New_Data, Code)
        VARIABLE s_case: INTEGER RANGE 0 TO 64 := 48;
    BEGIN
        s_case := TO_INTEGER(Code);
        IF RISING_EDGE(New_Data) THEN
            CASE s_case IS
    --....

结果模拟: Quartus Simulation #2

1 个答案:

答案 0 :(得分:0)

请首先重新考虑一下你要做的事情。您的流程实现是顺序和组合逻辑的有趣组合。您遇到的语义陷阱:

  • 信号仅在下一个增量周期中更新,即s_ *信号的变化仅在过程的下一次迭代中生效。
  • 此过程仅由New_data和代码输入的更改触发。

确保您清楚了解应该连续的内容,从而触发时钟并使用“rising_edge(clock)&#39;什么应该是组合的,因此必须触发所有已处理的输入 - 而不检查边缘。