2013-11-20 4 views
2

numeric_std에서 std_logic_vector 로의 변환과 관련된 질문이 있습니다. 나는 온라인에서 보았던 이동 평균 필터 코드를 사용하고 ADC 값을 필터링하여 값을 안정화했습니다.vhdl에서 numeric_std 서명되지 않은 코드에서 std_logic_vector로 변환

필터 패키지 코드는 다음과 같습니다

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 프로 시저를 호출. I는 MAF_Filter의 출력 (23 downto 0)을 std_logic_vector로 변환 할

adc_dat : out std_logic_vector (23 downto 0); 

:로

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

adc_dat

정의된다. 아무도 어떻게 필터 출력 'y'를 'std_logic_vector'로 변환 할 수 있습니까?

많은 감사!

답변

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; 
+0

MAF 용으로 이미 만들어진 코드를 사용했습니다. 나는 함수 slv_to_num 정의 때문에 여분의 4 비트를 사용해야한다. – user3008991

+0

나는'slv_to_num' 함수에 대한 제안으로 대답을 편집했습니다. – rick

0

전환은 두 가지 문제를 해결해야합니다. 두 유형의 차이점과 두 단어가 다른 크기라는 사실입니다.

유형 차이는 간단합니다. 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을 제공합니다.