фона:Как увеличить std_logic_vector в массиве с использованием индекса? VHDL
У меня есть тип массив из четырех 4-битный STD_LOGIC_VECTOR'S:
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-битный вектор получит значение б «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 Рго Nav)
(редактировать) Longer фрагмент кода для большей scrunity:
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' на константу, и он должен ее распознать (это просто для тестирования). – Paebbels
@Paebbels Хорошо. В этом есть смысл. И вы правы - изменение «индекса» до постоянного значения делает синтез кода возможным. Любые советы о том, как преодолеть эту проблему, когда индекс не является константой? –
Даже с постоянным индексом мой инструмент останавливается во время «Место и маршрут». –