繁体   English   中英

案例陈述中的VHDL IF陈述

[英]VHDL IF Statement in Case Statement

您可以通过在那里看到我的代码来想象,我是VHDL的初学者,所以我真的很想知道为什么这不起作用,因为逻辑上应该起作用。

实际上,不符合我希望的方式的部分根本没有做任何事情。

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

无效或实际上没有执行任何操作的部分:如果代码为+(值43),则将其加1;如果代码为-(值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

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

  • 信号仅在下一个增量周期内更新,即s_ *信号的更改仅在该过程的下一次迭代中有效。
  • 该过程仅由New_data和Code输入上的更改触发。

确保对什么是顺序的,因此在时钟上触发并使用“ rising_edge(clock)”以及什么是组合的,因此必须在所有已处理的输入上触发-没有检查边沿有一个清晰的认识。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM