2014-09-10 86 views
0
library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
--use IEEE.STD_LOGIC_ARITH.ALL; 
--use IEEE.STD_LOGIC_UNSIGNED.ALL; 
use IEEE.NUMERIC_STD.ALL; 

entity two_number_split is 
    Port (number : in integer range 0 to 99; 
      position0 : out STD_LOGIC_VECTOR (3 downto 0); 
      position1 : out STD_LOGIC_VECTOR (3 downto 0)); 
end two_number_split; 

architecture Behavioral of two_number_split is 
    signal pos0, pos1 : STD_LOGIC_VECTOR(3 downto 0); 
begin 
    convert: process(number, pos0, pos1) 
    begin 
      pos1 <= number/10; 
      pos0 <= number mod 10; 
      position0 <= std_logic_vector(pos0); 
      position1 <= std_logic_vector(pos1); 
    end process convert; 

end Behavioral; 

錯誤:什麼VHDL庫使用十進制模

ERROR:HDLCompiler:1638 - "C:\Users\XXX\Documents\SS\ISE_Ex\seven_segment\two_numbers.vhd" Line 19: found '0' definitions of operator "/", cannot determine exact overloaded matching definition for "/" 
ERROR:HDLCompiler:1638 - "C:\Users\XXX\Documents\SS\ISE_Ex\seven_segment\two_numbers.vhd" Line 20: found '0' definitions of operator "mod", cannot determine exact overloaded matching definition for "mod" 

我想我只是使用了錯誤的庫。任何建議嗎?我已經嘗試了上面列出的庫的所有組合,不知道發生了什麼。

回答

1

std_logic_vector傳統上不是數字類型。它是一些位數的集合,故意忽略數字運算符來強化這種解釋。您應該使用numeric_std中的unsignedsigned類型來獲取具有一組算術運算符的數組。

(可選)如果您的工具支持VHDL-2008,則可以使用ieee.numeric_std_unsigned將算術語義添加到std_logic_vector。它與std_logic_unsigned類似,儘管它的名稱和庫映射不是標準庫。

+0

我知道一個邏輯向量是一個位數組。但我正在取一個十進制數並將其分成兩個代表每個數字的位數組。 IE瀏覽器。 99的輸入將使得pos0 1001和pos1 1001. – marshmallow 2014-09-10 22:56:01

+0

如果你使用定義了除法和mod運算符的類型,就會發生這種情況。您有兩種選擇可以用我的答案中描述的標準庫來完成這一任務。看起來您可能試圖將其輸出到七段顯示器,在這種情況下,您可能希望使用不需要任何除法的雙重算法轉換爲BCD。 – 2014-09-10 23:28:34

2

您可以修改pos0pos1的聲明爲整數類型,計算並將它們轉換爲BCD表示形式。

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

entity two_number_split is 
    port ( 
     number:  in integer range 0 to 99; 
     position0: out std_logic_vector (3 downto 0); 
     position1: out std_logic_vector (3 downto 0) 
    ); 
end two_number_split; 

architecture Behavioral of two_number_split is 
    signal pos0, pos1 : natural range 0 to 9; -- std_logic_vector(3 downto 0); 
begin 
    convert: process(number, pos0, pos1) 
    begin 
      pos1 <= number/10; 
      pos0 <= number mod 10; 
      position0 <= std_logic_vector(to_unsigned(pos0,position0'LENGTH)); 
      -- was <= std_logic_vector(pos0); 
      position1 <= std_logic_vector(to_unsigned(pos1,position1'LENGTH)); 
      -- was <= std_logic_vector(pos1); 
    end process convert; 

end Behavioral; 

它使用to_unsigned於十進制數位值POS1和POS0轉換爲unsigned數組類型。返回的unsigned數組長度由第二個參數指定,該參數可能只是一個文字。

您可以使用unsigned作爲position0position1的類型,併爲每個作業保存類型轉換。

這裏的想法有三個方面:可讀性,使用兼容左右參數的操作符函數以及返回值,以及使用integer乘法運算符的速度快於unsigned運算符。無符號運算暗含在number的自然範圍內。

而這個例子的工作原理:

tb_numb_split.png

但並不特別合成資格 - 有兩個相乘的運營商。如果您需要綜合某些內容,請參閱Convert 8bit binary number to BCD in VHDL以獲取有關如何避免七位乘法運算符的啓示。

+0

只需注意。雖然在一般情況下該部門對合成有問題,但XST確實支持6系列和7系列系列的非冪次冪常量推導的divmod的合成。我很好奇它是如何執行的,並且結果適合7位輸入的7個LUT,這與手動實現的兩位BCD轉換相同。其他供應商可能會對不斷的分裂提供類似支持 – 2014-09-11 13:07:37

+0

@KevinThibedeau - [UG687](http://www.xilinx.com/support/documentation/sw_manuals/xilinx14_1/xst_v6s6.pdf)P.77,在2的恆定功率下支持'mod','/'「如果右操作數是2的常數冪,或者如果兩個操作數是恆定的,則支持。 '數字'不是一個常數,這兩種情況都不是真的,我很驚喜 - 但它適合放在一張桌子上,即足夠小到濃縮咖啡。對於add3,可以採用6個LUT,BIN(7)爲常數'0'(7位輸入),並且是移位和條件添加(除法步驟)。在程序框圖中add3 U0不需要,輸入不能大於4. – user1155120 2014-09-11 14:29:48

+0

我很驚訝地發現它的工作原理,因爲那是我對文檔的回憶。它看起來好像是在RTL視圖中合成完整的分割或模數操作,然後合併共享路徑並優化大部分路徑,因爲在這種情況下只保留較低的四位。 – 2014-09-11 16:45:56

相關問題