在VHDL中使用非线性查找操作

时间:2014-10-28 12:14:50

标签: vhdl

我想采用4位输入并将其映射为4位输出 由替代函数定义。

输出< =替代(输入)

可以使用利用大内存组件的单个表查找操作来实现替换功能

我们的协处理器的设计要求是提供快速散列函数。基于此 事实上,我们决定实施一种改善修改后性能的机制 漩涡哈希函数。

在散列算法中使用的非线性操作利用并行的4位非线性操作,其中输入半字节(4位)被映射到另一个非线性4位值。所有非线性操作仅使用单字节输入。

包含SBox-1和SBox-2的非线性变换作为4位输入的16个值给出,并且对于每个SBox,存在16个4位输出值。使用16位输入的SBox-2(LSB)和SBox-1(MSB)未经改变地传递到输出。

如何实现case / select语句呢?

1 个答案:

答案 0 :(得分:0)

这是一项家庭作业,但这是一个使用with / select的示例实体。 With语句与case语句类似,但在进程外的并发逻辑中工作。 Case语句和if / elsif树通常用于顺序逻辑,因为它们只允许在进程内部使用。

您还可以创建一个包含16个4位std_logic_vectors的常量数组,并使用您的4位i值对其进行索引,以获取o值。虽然它没有按照您的要求使用任何类型的withcase语句,但这可能更容易阅读和理解。两种句法格式在合成后都会产生相同的结果。

当给定任意输出数据作为要分配的文字时,此with语句将合成为4x 4输入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;