vhdl中寄存器的算术平均值

时间:2017-05-17 08:47:30

标签: vhdl fpga xilinx xilinx-ise digital-logic

对于我目前正在进行的项目,我正在尝试获取一些输入,将它们存储在寄存器中,然后找到寄存器的算术平均值。我的所有输入都是24位长。我的寄存器是4输入长,因此我只是删除最低有效位的最后3位,同时将它们除以4以计算算术平均值,然后简单地添加它们。

表示我的register(95 downto 0)(4 x 24 = 96),mean_medium表示unsigned

当我编码以下行

signal mean_medium : unsigned (23 downto 0) := (others => '0');
mean_medium <= unsigned(medium (95 downto 75)) +
               unsigned(medium (71 downto 51)) +
               unsigned(medium (47 downto 27)) +
               unsigned(medium (23 downto 3)) ;

我发出了以下警告:

  

宽度不匹配。 mean_medium的宽度为24位,但赋值的表达式为21位宽。

你有什么建议可以解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

我假设您使用的是numeric_std包。

numeric_std包中,+运算符要求总和的宽度与最宽的操作数的宽度相同。操作数是21位宽,总和是24位宽。因此,您还需要将操作数设置为24位宽。您可以使用resize中的numeric_std功能执行此操作。事实上,这应该足够了:

mean_medium <= resize(unsigned(medium (95 downto 75)),24) +
               unsigned(medium (71 downto 51)) +
               unsigned(medium (47 downto 27)) +
               unsigned(medium (23 downto 3)) ;

但如果你觉得它更整洁,你也可以这样做:

mean_medium <= resize(unsigned(medium (95 downto 75)),24) +
               resize(unsigned(medium (71 downto 51)),24) +
               resize(unsigned(medium (47 downto 27)),24) +
               resize(unsigned(medium (23 downto 3)) ,24) ;

或者这方面的一些变化甚至更好:

mean_medium <= resize(unsigned(medium (95 downto 75)),mean_medium'length) +
               unsigned(medium (71 downto 51)) +
               unsigned(medium (47 downto 27)) +
               unsigned(medium (23 downto 3)) ;

答案 1 :(得分:0)

等式的两边应该具有相同的大小,你可以使用调整大小功能,或者你可以使用一个24位的临时信号,并且这样做:

signal temp : std_logic_vector(23 downto 0); temp(23 downto 21) <= "000"; temp(20 downto 0) <= medium (95 downto 75); mean_medium <= temp + ....

答案 2 :(得分:0)

错误已经是你通过移位3位除以4。你只需要移位2位。

但是对于正确/精确的算术,你应该预先移动该表达式的操作符,因为你会因为trunctation而失去精确度。首先将所有4个完整的24位值添加到一个26位输出。然后轮换输出。实施例

signal mean_medium : unsigned (23 downto 0); -- redundant := (others => '0');
signal mean_temp : unsigned(25 downto 0);

mean_temp <=
    resize(unsigned(medium (95 downto 72)), mean_Temp'length) +
    resize(unsigned(medium (71 downto 48)), mean_Temp'length) +
    resize(unsigned(medium (47 downto 24)), mean_Temp'length) +
    resize(unsigned(medium (23 downto 0)), mean_Temp'length) +
    2; -- round factor

mean_medium <= shift_right(mean_temp, 2); --divide by 4

P.S。您也可以将其合并为一行,从而消除了mean_temp的必要性。