2014-10-28 74 views
0

我想獲取一個4位輸入並將其映射到一個4位輸出,如替換函數所定義的 。在VHDL中使用非線性查找操作

輸出< =替換(輸入)

取代功能可使用單個表查找操作利用大存儲器組件

我們的協處理器的設計要求是提供快速散列函數來實現。基於這個 的事實,我們決定實現一種改進漩渦散列函數的修改 的性能的機制。

散列算法中使用的非線性運算使用並行4位非線性運算,其中輸入半字節(4位)映射到另一個非線性4位值。所有的非線性操作只使用一個字節的輸入。

包含SBox-1和SBox-2的非線性變換是作爲16位4位輸入值和16位4位輸出值給出的。使用16位輸入的SBox-2(LSB)和SBox-1(MSB)不變地通過輸出。

如何執行case/select語句來執行該操作?

回答

0

這是一個家庭作業的作品,但這裏是一個使用with/select的示例實體。 With語句的操作類似於case語句,但在併發邏輯中工作在進程之外。 Case陳述和if/elsif樹通常用於時序邏輯,因爲它們只允許在一個過程中使用。

您也可以創建一個16位4位std_logic_vectors的常量數組,並使用您的4位i值將其索引,以獲得o值。這可能更容易閱讀和理解,儘管它沒有按照您的要求使用任何類型的withcase陳述。合成後,這兩種語法格式都會導致相同的結果。

這個with語句將在給定任意輸出數據作爲要分配的文字時合成爲4x4輸入LUT。請注意,輸出數據(文字的左側列)將需要更改以符合您所需的「非線性映射」。

library ieee; 
    use ieee.std_logic_1164.all; 

    entity example is 
    port(i : in std_logic_vector(3 downto 0); 
     o : out std_logic_vector(3 downto 0) 
     ); 
    end example; 

    architecture behav of example is 
    begin 

    with i select 
     o <= "1111" when "0000", 
      "1110" when "0001", 
      "1101" when "0010", 
      "1100" when "0011", 
      "1011" when "0100", 
      "1010" when "0101", 
      "1001" when "0110", 
      "1000" when "0111", 
      "0111" when "1000", 
      "0110" when "1001", 
      "0101" when "1010", 
      "0100" when "1011", 
      "0011" when "1100", 
      "0010" when "1101", 
      "0001" when "1110", 
      "0000" when "1111", 
      "XXXX" when others; 
    end behav;