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 から 0) に変換したいと考えています。フィルタ出力 'y' を 'std_logic_vector' に変換する方法を教えてください。

どうもありがとう!

4

2 に答える 2

0

変換では、2 つの問題を解決する必要があります。指摘した型の違いと、2 つの単語のサイズが異なるという事実です。

型の違いは簡単std_logic_vector (y)です。正しい型が得られます。2 つの型は関連する型であるため、これは単なるキャストです。

サイズの違い...あなただけがそれを行う知識を持っています.

adc_dat <= std_logic_vector(y(23 downto 0))YのLSB、つまりY自体の値が得られますが、オーバーフローする可能性があります。または、リックが言うように、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 に答える