#vhdl #fpga #xilinx
#vhdl #плис #xilinx
Вопрос:
В одном из моих проектов мне нужно изменить ровно один сигнал в массиве std_logic_vector.
Я использую generate для создания нескольких n-разрядных сумматоров, выход каждого такого n-разрядного сумматора представляет собой n-разрядную шину std_logic_vector. Все значения суммы хранятся в массиве std_logic_vector. После каждого сложения мне нужно сдвинуть вектор суммы на 1 место вправо и изменить самый старший бит.
MULTIPLIER: for i in 0 to DataWidth-2 generate
shifted_augend(i) <= std_logic_vector(shift_right(unsigned(augend(i)),1));
temp1(i) <= augend(i)(0);
shifted_augend(i)(DataWidth-1) <= carry_out(i);
ADDR: adder generic map(DataWidth => DataWidth)
port map(A => addend(i 1),
B => shifted_augend(i),
Cin => cin ,
Cout => carry_out(i 1),
Sum => augend(i 1));
end generate;
Я попытался сделать это, как показано выше, и хотя Xilinx Vivado позволяет это делать, это определенно вызывает проблему. Всякий раз, когда присваиваемое значение равно «1», оно преобразуется в «X» при моделировании, однако, когда оно равно «0», все в порядке. Значение, которое я пытаюсь изменить, скорее всего, равно «0» по умолчанию (результат сдвига).
Я полагаю, это либо потому, что я не могу этого сделать, либо потому, что я пытаюсь одновременно назначить сигнал существующему, следовательно, это приводит к появлению значения ‘X’?
Комментарии:
1. Хорошо, пока я понял, что проблема вызвана одновременным изменением этого бита и
shift_right
, но теперь я немного зациклен на том, как изменить этот бит, не вызывая проблемы.
Ответ №1:
Проблема заключалась в том, что сдвиг std_logic_vector и присвоение нового значения одному биту выполнялись одновременно, следовательно, это вызвало конфликт.
Что я сделал: я использовал процесс внутри generate для последовательного выполнения этих 2 операций, следовательно:
MULTIPLIER: for i in 0 to DataWidth-2 generate
temp1(i) <= augend(i)(0);
process(augend)
begin
shifted_augend(i) <= std_logic_vector(shift_right(unsigned(augend(i)),1));
shifted_augend(i)(DataWidth-1) <= carry_out(i);
end process;
ADDR: adder generic map(DataWidth => DataWidth)
port map(A => addend(i 1),
B => shifted_augend(i),
Cin => cin ,
Cout => carry_out(i 1),
Sum => augend(i 1));
end generate;