我遇到了一个问题 - 我认为我可以通过常规的“c”类似操作解决问题 但我想知道是否有更好的方法,比如VHDL的'regexp'
问题是我有一个字符串/位集合,“101010101010101”,我想查找模式(没有重叠)“1010”里面
攻击此问题的最佳选择是什么?
编辑:我想提一下输入是parralel,所有的位都是一次而不是串行的 它仍然可以作为FSM实现 - 但它有更有效的方法吗?
答案 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;
根据输入和搜索向量的大小与目标设备的比较,这将是一个合理或不合理的逻辑数量!