[英]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个标记,第一个标记是+,然后是-然后是方向开关,并且相同的代码以相同的顺序重复。
我尝试了很多不同的方法,但是我没有设法理解问题所在,我很想知道为什么这行不通。
好的,现在我只模拟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
--....
请先重新考虑您要做什么。 您的流程实现是顺序逻辑和组合逻辑的有趣组合。 您遇到的语义陷阱:
确保对什么是顺序的,因此在时钟上触发并使用“ rising_edge(clock)”以及什么是组合的,因此必须在所有已处理的输入上触发-没有检查边沿有一个清晰的认识。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.