Как вы можете себе представить, увидев мой код прямо здесь, я новичок в 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
--....
s_case
переменную (она бесполезна вне процесса, и ограничение области действия является хорошей практикой), этого можно было бы избежать. - person user_1818839   schedule 28.04.2016