VHDL: std_logic_vector Оператор левого и правого сдвига?
Как можно было бы изменить сдвиг прав или сдвиг влево в VHDL на STD_LOGIC_VECTor...
Не получится, почему??
AN <= "0001";
CounterProcess: process(CLK,Switch)
begin
if rising_edge(CLK) then
if prescaler < limit then
prescaler <= prescaler + 1;
else
prescaler <= (others => '0');
counter <= counter + 1;
AN sll 1;
end if;
end if;
end process;
An <= anode;
Segment <= counter;
end Behavioral;
Я получаю сообщение об ошибке: sll не может иметь такие операнды в этом контексте. Но в каком контексте он может быть использован и как выполнить мой левый сдвиг?
это мои включает в себя:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
разве не нужно включать мои операции левого смещения??
Полный код
entity Main is
PORT(
CLK: in std_logic;
LED: out std_logic_vector (7 downto 0);
Switch: in std_logic_vector(7 downto 0);
Segment: out std_logic_vector (7 downto 0);
AN: out std_logic_vector (3 downto 0)
);
end Main;
architecture Behavioral of Main is
signal counter: std_logic_vector (7 downto 0);
signal prescaler: std_logic_vector(25 downto 0);
signal limit: std_logic_vector (25 downto 0);
signal anode: std_logic_vector (3 downto 0);
begin
AN <= "0001";
ScalerChoice: Process(switch)
begin
CASE Switch IS
when "00000001" => limit <= "10111110101111000010000000"; -- 1 Hz;
when "00000010" => limit <= "00111111100101000000101011"; -- 3 HZ
When "00000100" => limit <= "00010011000100101101000000"; -- 10 Hz
when "00001000" => limit <= "00000111101000010010000000"; -- 25 Hz
When "00010000" => limit <= "00000011110100001001000000"; -- 50 Hz;
when "00100000" => limit <= "00000001111010000100100000"; -- 100 hz
when others => limit <= "00000000000000000000000001"; -- 50 MHz
end case;
end process;
CounterProcess: process(CLK,Switch)
begin
if rising_edge(CLK) then
if prescaler < limit then
prescaler <= prescaler + 1;
else
prescaler <= (others => '0');
counter <= counter + 1;
AN sll AN 1;
end if;
end if;
end process;
Segment <= counter;
end Behavioral;
2 ответа
РЕДАКТИРОВАТЬ 1:
Ваш код отредактирован с помощью логики сброса, обратите внимание на добавление RESET
сигнал в список портов, удаление асинхронной линии, установка этого значения, добавление RESET
к списку чувствительности вашего CounterProcess
процесс, добавление if(RESET = '1')
линия, и изменение вашего if
для elsif
, а также изменение вашей сдвигающейся строки:
Я на самом деле не знаю, что ты An <= Anode
линия делает, и считаю, что это также ошибка.
entity Main is PORT(
RESET: in std_logic;
CLK: in std_logic;
LED: out std_logic_vector(7 downto 0);
Switch: in std_logic_vector(7 downto 0);
Segment: out std_logic_vector(7 downto 0);
AN: out std_logic_vector(3 downto 0)
);
end Main;
architecture Behavioral of Main is
signal counter: std_logic_vector(7 downto 0);
signal prescaler: std_logic_vector(25 downto 0);
signal limit: std_logic_vector(25 downto 0);
signal anode: std_logic_vector(3 downto 0);
begin
ScalerChoice: Process(switch)
begin
CASE Switch IS
when "00000001" => limit <= "10111110101111000010000000"; -- 1 Hz;
when "00000010" => limit <= "00111111100101000000101011"; -- 3 HZ
When "00000100" => limit <= "00010011000100101101000000"; -- 10 Hz
when "00001000" => limit <= "00000111101000010010000000"; -- 25 Hz
When "00010000" => limit <= "00000011110100001001000000"; -- 50 Hz;
when "00100000" => limit <= "00000001111010000100100000"; -- 100 hz
when others => limit <= "00000000000000000000000001"; -- 50 MHz
end case;
end process;
CounterProcess: process(RESET, CLK, Switch)
begin
if(RESET = '1') then
AN <= "0001";
elsif rising_edge(CLK) then
if prescaler < limit then
prescaler <= prescaler + 1;
else
prescaler <= (others => '0');
counter <= counter + 1;
AN <= std_logic_vector(unsigned(AN) sll 1);
end if;
end if;
end process;
An <= anode;
Segment <= counter;
end Behavioral;
вам нужно написать строку, которая у вас есть:
AN sll 1;
как
AN <= AN sll 1;
Помни что AN
по сути, как переменная, которая должна быть "установлена". Как ваша линия выше
counter <= counter + 1;
В дополнение к тому, что сказал трубач, используйте эти пакеты вместо. Обязательно включите коммутатор VHDL-2008. Также попробуйте сначала обратиться к поставщику FPGA, поскольку для этого требуются обновления VHDL-2008:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;
use ieee.numeric_std_unsigned.all;
Вышеуказанные пакеты являются стандартами IEEE. Пакеты STD_LOGIC_ARITH
а также std_logic_unsigned
не являются стандартами IEEE. Обратите внимание, что numeric_std
а также STD_LOGIC_ARITH
конфликтуют друг с другом и затрудняют (выход за рамки базового использования) использование типов signed
а также unsigned
, Обратите внимание, что std_logic_unsigned
конфликтует с numeric_std_unsigned
, Так что, если ваш инструмент синтеза поддерживает numeric_std_unsigned
Я рекомендую использовать его вместо. Кроме того, если это не так, вы должны отправить сообщение об ошибке против него.