正如您可以想象的那样,通过查看我的代码,我是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个标记,第一个是+然后 - 然后是一个方向开关,相同的代码以相同的顺序重复。
我尝试了很多不同的事情,但我还没有意识到问题是什么,我很想知道为什么这不起作用。
好的,现在我只模拟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
--....
答案 0 :(得分:0)
请首先重新考虑一下你要做的事情。您的流程实现是顺序和组合逻辑的有趣组合。您遇到的语义陷阱:
确保您清楚了解应该连续的内容,从而触发时钟并使用“rising_edge(clock)&#39;什么应该是组合的,因此必须触发所有已处理的输入 - 而不检查边缘。