2013-11-20 61 views
2

我有一個問題涉及到從numeric_std轉換爲std_logic_vector。我正在使用我在線看到的移動平均濾波器代碼,並過濾我的ADC值以穩定值。從numeric_std無符號轉換爲std_logic_vector在vhdl

過濾包代碼是:

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 DOWNTO 0)。任何人都可以告訴我如何將過濾器輸出'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

該轉換必須解決2個問題:您記下的類型差異以及兩個詞語的大小不同。

該類型的差異很容易:std_logic_vector (y)會給你正確的類型。因爲這兩種類型是相關的類型,這只是一個演員。

尺寸差異...只有你有知識才能做到這一點。

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。

相關問題