2016-04-30 199 views
2

我在Quartus的conv_std_logic_vector函數中遇到了一些問題。我正在使用該函數將整數變量轉換爲std_logic_vector。當我編譯下面的代碼中,Quartus顯示以下錯誤消息:VHDL:conv_std_logic_vector參數錯誤

錯誤(10344):VHDL表達錯誤在counter_Wbits.vhd(32):表達式具有3個元素,但必須有4個元件。

我在互聯網上搜索了這個功能,人們總是使用2個參數,發生了什麼?

LIBRARY IEEE; 
USE IEEE.std_logic_1164.ALL; 
USE IEEE.std_logic_unsigned.ALL; 
use IEEE.std_logic_arith.ALL; 

ENTITY counter_Wbits IS 
    GENERIC(W : NATURAL := 4); 
    PORT (portae : IN BIT;-- data input 
     portas : IN BIT;-- data input 
     clk : IN BIT; -- clock 
     clrn: IN BIT; -- clear 
     ena : IN BIT; -- enable 
     q : BUFFER STD_LOGIC_VECTOR(W-1 DOWNTO 0));-- data output 
END counter_Wbits; 

ARCHITECTURE arch_1 OF counter_Wbits IS 
BEGIN 
    PROCESS(clk,clrn) 
    variable cont : integer range 0 to 15; 
    BEGIN 
    IF (clrn='0') THEN 
     q <= (OTHERS => '0'); 
    ELSIF (clk'EVENT AND clk='1') THEN 
     IF (ena='1') THEN 
     IF(portae='1') THEN 
      cont := cont+1; 
     ELSIF (portas='1') THEN 
      cont := cont-1; 
     END IF; 
     END IF; 
    END IF; 
    q <= conv_std_logic_vector(cont, W-1); -- LINE 32 
    END PROCESS; 
END arch_1; 
+0

W = 4所以W-1 = 3。你不能以3位來適應(範圍從0到15),這正是錯誤信息所說的。 (注意,如果你用任何其他的通用值來實例化這個實體,它將會被破壞,修復這個) –

+0

謝謝你,我在想這是一個參數錯誤!它正在工作! –

+1

我對使用'std_logic_arith'的SO例子數量感到驚訝。 「numeric_std庫已經存在了十多年,自2002年以來,我們的內部編碼標準已經要求它。自2002年以來,我所能想到的每個合成器都支持它。誰在教這個東西? – PlayDough

回答

2

功能conv_std_logic_vector的最後一個參數定義了從該函數返回的std_logic_vector的長度。在這裏指定W-1,請求函數返回一個3位向量。但是,目標信號q有4位,編號從W-1 downto 0。這就是錯誤消息的抱怨。

你可以通過傳遞W作爲最後一個參數來解決這個問題。更好的方法是,在指定,而不是使用q'length目標信號的長度:

q <= conv_std_logic_vector(cont, q'length); 

這樣,函數結果將始終具有正確的長度。

因此,如果第一個參數的可能範圍大於第二個參數中給出的位數可以表示的範圍,那麼這是沒有問題的。當然,會發生截斷。


,請不要使用,Synopsys公司的非標std_logic_arithstd_logic_unsigned包了。當您必須在同一個實體中使用帶符號和無符號數字時,會出現問題。使用標準ieee.numeric_std包代替:

LIBRARY IEEE; 
USE IEEE.std_logic_1164.ALL; 
use IEEE.numeric_std.all; -- CHANGED THIS 

ENTITY counter_Wbits IS 
    GENERIC(W : NATURAL := 4); 
    PORT (portae : IN BIT;-- data input 
     portas : IN BIT;-- data input 
     clk : IN BIT; -- clock 
     clrn: IN BIT; -- clear 
     ena : IN BIT; -- enable 
     q : BUFFER STD_LOGIC_VECTOR(W-1 DOWNTO 0));-- data output 
END counter_Wbits; 

ARCHITECTURE arch_1 OF counter_Wbits IS 
BEGIN 
    PROCESS(clk,clrn) 
    variable cont : integer range 0 to 31; 
    BEGIN 
    IF (clrn='0') THEN 
     q <= (OTHERS => '0'); 
    ELSIF (clk'EVENT AND clk='1') THEN 
     IF (ena='1') THEN 
     IF(portae='1') THEN 
      cont := cont+1; 
     ELSIF (portas='1') THEN 
      cont := cont-1; 
     END IF; 
     END IF; 
    END IF; 
    q <= std_logic_vector(to_unsigned(cont, q'length)); -- CHANGED THIS 
    END PROCESS; 
END arch_1; 

integerstd_logic_vector轉換需要2個步驟了。首先,您必須將其轉換爲長度爲q'lengthunsigned,如to_unsigned的第二個參數所指定。unsigned也是std_logic元素的向量,但各個函數將此「位序列」威脅爲無符號數。第二步(外部)是將類型轉換爲std_logic_vector