【问题标题】:Conversion from numeric_std unsigned to std_logic_vector in vhdlvhdl 中从 numeric_std unsigned 到 std_logic_vector 的转换
【发布时间】:2013-11-20 14:20:17
【问题描述】:

我有一个关于从 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 降为 0)。谁能告诉我如何将过滤器输出“y”转换为“std_logic_vector”?

非常感谢!

【问题讨论】:

    标签: vhdl fpga xilinx hdl intel-fpga


    【解决方案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;
    

    【讨论】:

    • 我使用了已经为 MAF 制作的代码。由于函数 slv_to_num 的定义,我必须使用 4 个额外的位。
    • 我编辑了答案并为您的功能提出了建议slv_to_num
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2015-09-15
      相关资源
      最近更新 更多