如何在VHDL中进行字符串/模式检查?

时间:2013-12-03 06:35:55

标签: vhdl

我遇到了一个问题 - 我认为我可以通过常规的“c”类似操作解决问题 但我想知道是否有更好的方法,比如VHDL的'regexp'

问题是我有一个字符串/位集合,“101010101010101”,我想查找模式(没有重叠)“1010”里面

攻击此问题的最佳选择是什么?

编辑:我想提一下输入是parralel,所有的位都是一次而不是串行的 它仍然可以作为FSM实现 - 但它有更有效的方法吗?

3 个答案:

答案 0 :(得分:1)

VHDL没有内置的正则表达式支持,但是您计划解决的是模式匹配问题。基本上你所做的是构建一个状态机(这是在评估正则表达式时会发生的事情)并使用它来匹配输入。最简单的方法是检查前n位是否与您的模式匹配,然后移位并继续。更长或更有趣的模式,例如,结合量词,匹配组等需要更多。

有很多方法可以做到这一点(尝试google vhdl模式匹配,例如,用于网络流量分析),我甚至找到了一个会自动生成vhdl的方法。但是,我猜想,针对您的问题的专用手工制作版本会更有效率。

答案 1 :(得分:1)

对于那种模式,通常没有适用的VHDL解决方案 匹配,但解决方案应该由需求驱动,因为大小和 对于那种设计,速度可能会有很大差异。

因此,如果时间允许有足够的时间进行全并行比较和过滤 重叠模式,有很多硬件来实现, 然后你可以进行并行比较。

对于没有FSM和时钟的全并行实现,那么你可以制作一个 获取模式和集合的函数,并返回匹配指示 每个匹配的开始std_logic_vector '1'

然后可以在并发分配中使用该函数:

match <= pattern_search_collection(pattern, collection);

该功能可以通过以下方式实现:

function pattern_search_collection(pat : std_logic_vector;
                                   col : std_logic_vector) return std_logic_vector is
  ...
begin
  -- Code for matching with overlap using loop over all possible positions
  -- Code for filtering out overlaps using loop over all result bits
  return result;
end function;

答案 2 :(得分:1)

如果您只想在矢量中找到一个模式,那么您可以迭代它。假设“downto”载体:

process (vec, what_to_find)
begin
   found <= 0;
   for start in vec'high downto vec'low+what_to_find'length loop
       if vec(start downto start - what_to_find'length) = what_to_find then
           found <= start;
       end if;
   end for;    
end process;

根据输入和搜索向量的大小与目标设备的比较,这将是一个合理或不合理的逻辑数量!