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Я рекомендую использовать его вместо. Кроме того, если это не так, вы должны отправить сообщение об ошибке против него.

Другие вопросы по тегам