Изменение одного бита в массиве std_logic_vector

#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;