【问题标题】:Changing a single bit in array of std_logic_vector更改 std_logic_vector 数组中的单个位
【发布时间】:2020-12-14 18:35:08
【问题描述】:

在我的一个设计中,我需要修改 std_logic_vector 数组中的一个信号。

我使用 generate 创建了几个 n 位加法器,每个这样的 n 位加法器的输出都是 std_logic_vector 的 n 位总线。所有总和值都存储在 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”值?

【问题讨论】:

  • 好的,到目前为止,我明白问题是由同时更改此位和shift_right 引起的,但现在我有点卡在如何更改此位而不会导致问题。

标签: vhdl fpga xilinx


【解决方案1】:

问题在于,移动 std_logic_vector 和为单个位分配新值是同时进行的,因此会导致冲突。

我所做的是:我在 generate 中使用了一个进程来顺序执行这两个操作,因此:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    相关资源
    最近更新 更多