2015-02-11 54 views
2

我需要採取結果的絕對值,我只對最重要的位感興趣。這是我做了什麼:簽署到std_logic_vector,切片結果

data_ram_h <= std_logic_vector(abs(signed(resize(r4(calc_cnt - 2), data_ram_h'length) + r4(calc_cnt - 1) + 
        r4(calc_cnt) + r4(calc_cnt + 1) + r4(calc_cnt + 2) - 
        r2(calc_cnt - 2) - r2(calc_cnt - 1) - r2(calc_cnt) - 
        r2(calc_cnt + 1) - r2(calc_cnt + 2))))(11 downto 4); 

我嘗試檢查語法和我得到這個錯誤:

type conversion std_logic_vector is not allowed as a prefix for an slice name. 

data_ram_h是正確尺寸的std_logic_vector,並且ABS功能返回一個簽名,在轉換爲std_logic_vector時不應該有問題。我正在使用的庫是使用ieee.numeric_std.all

我在哪裏錯了?在此先感謝c:

+1

由於錯誤提示:您無法切分函數的結果。您將需要一箇中間信號,或者您可以嘗試將切片操作移動到您的表達式中,這使得它更難讀。 – Paebbels 2015-02-11 08:32:51

+0

@Paebbels謝謝,我無法得到的是,即使std_logic_vector是一個功能!我張貼我的工作解決方案。 – harrym 2015-02-11 09:23:13

+0

如果我是正確的std_logic_vector(..)不是一個真正的函數,但它確實看起來像一個。 – Paebbels 2015-02-11 09:42:32

回答

4

類型轉換是一種基本操作,需要圍繞操作數表達式使用括​​號。有蹭,這是使用不是一個函數調用,所以它不能被用作切片名稱的前綴。

切片名稱的前綴是function_call或名稱。 (IEEE Std 1076-2008,5種類型,5.1概述,顯式類型轉換,8個名稱,8.1總則,8.5片名稱)。

如果是函數調用,則可以對結果進行切片。

在另一方面,你可以切片`「ABS」,所以切片時,然後做類型轉換:

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

entity slice is 
end entity; 

architecture foo of slice is 
    signal h_tmp: signed (11 downto 0); 
    signal h_tmp_vec: std_logic_vector (11 downto 0); 
    signal data_ram_h: std_logic_vector(7 downto 0); 
    signal calc_cnt:  integer := 3; 
    type r_array is array (0 to 15) of unsigned(15 downto 0); 
    signal r2, r4: r_array := (others => (others => '0')); 
begin 


    data_ram_h<= std_logic_vector (
        "abs"(signed(resize(r4(calc_cnt - 2), data_ram_h'length) + r4(calc_cnt - 1) + 
         r4(calc_cnt) + r4(calc_cnt + 1) + r4(calc_cnt + 2) - 
         r2(calc_cnt - 2) - r2(calc_cnt - 1) - r2(calc_cnt) - 
         r2(calc_cnt + 1) - r2(calc_cnt + 2)))(11 downto 4) 
        ); 

end architecture; 

使用abs作爲一個函數調用需要您使用它聲明的名稱是"abs"

我只是猜測這裏的一些聲明,所以我不能保證這在你的代碼中工作。上面的例子確實分析,詳細說明並運行,說明子類型範圍是兼容的。

+0

感謝您解釋一切。爲了更好地理解,我將閱讀你指出的部分參考文獻! – harrym 2015-02-11 11:06:54

0

最後我解決了我的疑問。即使std_logic_vector是一個函數,所以我需要3個變量來切片結果沒有錯誤。在這裏我所做的:

h_tmp <= abs(signed(resize(r4(calc_cnt - 2), data_ram_h'length) + r4(calc_cnt - 1) + 
        r4(calc_cnt) + r4(calc_cnt + 1) + r4(calc_cnt + 2) - 
        r2(calc_cnt - 2) - r2(calc_cnt - 1) - r2(calc_cnt) - 
        r2(calc_cnt + 1) - r2(calc_cnt + 2))); 
    h_tmp_vec <= std_logic_vector(h_tmp); 
    data_ram_h <= h_tmp_vec(11 downto 4); 

以下定義:

signal h_tmp: signed (11 downto 0); 
signal h_tmp_vec: std_logic_vector (11 downto 0); 
signal data_ram_h: std_logic_vector(7 downto 0); 

感謝Paebbels的評論:)

如果有人有更好的辦法來解決這個問題,請發表吧!

+0

你的計算是否正確?在簽名轉換之前,您正在調整大小(無符號擴展名)。 – Paebbels 2015-02-11 09:46:05

+0

@Paebbels它應該是,我跟着另一個答案(http://stackoverflow.com/questions/28382730/how-to-define-sum-results-width/28383429#28383429)。所有的寄存器都是無符號的8位,但是我想要在加和/減法之後得到結果,以便提取絕對值。 – harrym 2015-02-11 09:54:12

+2

並且沒有std_logic_vector不是函數,它是一個基本的操作,這就是爲什麼它不能用在需要數組對象的名稱或返回數組對象的函數調用的片名中。 – user1155120 2015-02-11 10:32:38