2

我有一个与从 numeric_std 转换为 std_logic_vector 相关的问题。我正在使用我在网上看到的移动平均滤波器代码并过滤我的 ADC 值以稳定这些值。

过滤器包代码为:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

package filterpack is
  subtype number is unsigned(27 downto 0);
  type numbers is array(natural range <>) of number;
  function slv_to_num(signal slv: in std_logic_vector) return number;
  procedure MAF_filter(
    signal x: in    number;
    signal h: inout numbers;
    signal y: out   number
  );
end filterpack;

package body filterpack is

function slv_to_num(signal slv: in std_logic_vector) return number is
  variable x: number := (others => '0');
begin
  for i in slv'range loop
    if slv(i) = '1' then
      x(i+4) := '1';
    end if;
  end loop;
  return x;
end function slv_to_num;

procedure MAF_filter(
    signal x: in    number;
    signal h: inout numbers;
    signal y: out   number
  ) is
begin
  h(0) <= x + h(1);       -- h[n] = x[n] + h[n-1]
  y <= h(0) - h(h'high);  -- y[n] = h[n] - h[n-M]
end MAF_filter;

end package body filterpack;

在我的顶级文件中,我调用了 MAF_filter 过程。

Asign_x: x <= slv_to_num(adc_dat);
Filter:  MAF_filter(x,h,y);

adc_dat 定义为:

adc_dat : out std_logic_vector (23 downto 0);

我想将 MAF_Filter 的输出转换为 std_logic_vector (23 down to 0)。谁能告诉我如何将过滤器输出“y”转换为“std_logic_vector”?

非常感谢!

4

2 回答 2

1

你想用 4 个额外的位做什么?您的类型number有 28 位,但您的信号adc_dat只有 24 位。

如果可以丢弃它们,您可以使用:

adc_dat <= std_logic_vector(y(adc_dat'range));

另外,是否有理由不编写slv_to_num如下所示的函数?

function slv_to_num(signal slv: in std_logic_vector) return number is
begin
  return number(slv & "0000");
end function slv_to_num;
于 2013-11-20T14:38:27.847 回答
0

转换必须解决 2 个问题:您注意到的类型差异,以及两个单词大小不同的事实。

类型差异很简单:std_logic_vector (y)会给你正确的类型。因为这两种类型是相关类型,所以这只是一个强制转换。

大小差异......只有你有这样做的知识。

adc_dat <= std_logic_vector(y(23 downto 0))将为您提供 Y 的 LSB - 即 Y 本身的值,但可能会溢出。或者正如 Rick 所说,adc_dat <= std_logic_vector(y(adc_dat'range));这通常更好,但我想暴露细节。

adc_dat <= std_logic_vector(y(27 downto 4))不能溢出,但实际上给你 y/16。

于 2013-11-20T14:42:00.457 回答