Предыстория:
У меня есть массив типов из четырех 4-битных std_logic_vector:
type my_arr_type is array (0 to 3) of std_logic_vector (3 downto 0);
и соответствующий сигнал:
signal my_signal : my_arr_type;
У меня также есть 2-битный вектор, который будет использоваться в качестве индекса массива:
signal index : std_logic_vector (1 downto 0) := "00";
Это позволяет мне динамически обращаться к каждому 4-битному вектору следующим образом:
my_signal(to_integer(unsigned(index))) <= "0001";
В этом случае индексированный 4-битный вектор получит значение b"0001".
Проблема:
Я хотел бы увеличить значение текущего индексированного 4-битного вектора на 1, когда какое-то условие истинно, например. переключатель высокий.
Я думал, что могу это сделать с чем-то вроде:
process(clk)
begin
if(rising_edge(clk)) then
if switch = '1' then --switch flicked (increment)
my_signal(to_integer(unsigned(index)))
<= std_logic_vector(unsigned( my_signal(to_integer(unsigned(index))) ) + 1);
else --remain the same
my_signal(to_integer(unsigned(index)))
<= my_signal(to_integer(unsigned(index)));
end if;
end if;
end process;
Однако я должен делать что-то не так, поскольку передача результирующего сигнала на выход дает сообщение об ошибке - в строках:
Signal X is connected to multiple drivers. ERROR:HDLCompiler:1401
Вопрос:
Что я делаю неправильно в приведенной выше попытке? Что будет правильным решением?
Я не могу найти в Интернете никаких примеров, связанных с увеличением ячеек в индексированном массиве.
(Проектирование для синтеза с Digilent Nexys 3 в ISE Proj Nav)
(edit) Более длинный фрагмент кода для большей тщательности:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity ui_top is
Port ( clk : in std_logic;
buttons : in std_logic_vector (4 downto 0); -- centre, left, up, right, down
switches : in std_logic_vector (7 downto 0);
leds : out std_logic_vector (7 downto 0);
digit : out std_logic_vector (3 downto 0) := "1110";
segments : out std_logic_vector (7 downto 0) := (others => '0');
uart_tx : out std_logic);
end ui_top;
architecture Behavioral of ui_top is
type my_arr_type is array (0 to 3) of std_logic_vector(3 downto 0);
signal my_signal : my_arr_type;
signal index : std_logic_vector (1 downto 0) := "00";
begin
-- send indexed signal to leds
leds(3 downto 0) <= my_signal(to_integer(unsigned(index)));
-- set other outputs arbitrarily
leds(7 downto 4) <= (others => '1');
uart_tx <= '1';
digit <= "1110";
segments <= (others => '0');
-- set index
index <= "00";
process(clk)
begin
if (rising_edge(clk)) then
if switches(1) = '1' then -- up
my_signal(to_integer(unsigned(index)))
<= std_logic_vector(unsigned( my_signal(to_integer(unsigned(index))) ) + 1);
end if;
end if; -- rising clock edge
end process;
-- set non indexed values arbitrarily
my_signal(1) <= "0000";
my_signal(2) <= "0000";
my_signal(3) <= "0000";
end Behavioral;
Изменить: Все ответы и комментарии были полезными. Спасибо!
index
является постоянным значением. Таким образом, он вычисляет несколько драйверов для каждого имени сигнала, а не для каждого имени индекса. Пожалуйста, измените свой сигналindex
на константу, и он должен его распознать (это просто для тестирования). - person Paebbels   schedule 28.12.2015index
на постоянное значение делает код пригодным для синтеза. Любые советы о том, как преодолеть эту проблему, когда индекс не является константой? - person Thomas McKay-Smith   schedule 28.12.2015my_signal
в процесс. Назначайте только те индексы, к которым никогда не обращаетсяindex
. - person Paebbels   schedule 28.12.2015numeric_std
, если она представляет число без знака, объявите ееunsigned
. Или, что еще лучше, объявите свой индекс какnatural
. В любом случае вы одним махом устраняете большинство уродливых преобразований типов. - person user_1818839   schedule 28.12.2015index
изменить на константу, синтез, а также размещение и маршрут выполняются успешно без ошибок. - person Martin Zabel   schedule 29.12.2015