我是一个新的vhdl用户,我正在尝试解决一个问题,这对我来说现在很难。我有两个std_logic_vectors.First有5位,必须有(11111)。第二个有2040位,这是仲裁,我必须将2040位分成24个输出,这意味着每个输出必须有85位。首先我必须确定通过在std_logic_vector中使用小向量(5位)连续5位(11111)的位置,其具有2040位。在确定2040位向量中是否存在(11111)之后,输出应为“1”,其负责85有位的位(11111)。
总结
例如我有24个输出,每个控制85位的std_logic-vector(2040bits) 如果前85位中有11111,则output1应为'1' 如果在86到170位中有11111,则output2应为'1' 如果在172到255位中有一个11111,那么output3应为'1',所以...
(11111)是最小值。为了使输出逻辑“1”可以更大。有人对它有任何了解吗?...(和(如果2040位是大的那么我可以减少位数) ))
谢谢
答案 0 :(得分:0)
我怀疑你的意思是在第二个中搜索第一个向量,但是如果你知道它们都是'1',那么and_reduce宏可以很好地工作。否则用比较替换它。
一般原则是将其分为两个循环,外部用于每个输出结果,内部用于每个可能的5位组。该过程可以按顺序或并行完成,如下所示。
如果81到86 =“11111”,你描述问题的方式将没有模式匹配。如果它应该返回1,那么数组边界将需要稍微改变。
type slvArray is array (natural range <>) of standard_logic_vector;
subtype outputRange is natural range 0 to 23;
subtype partitionRange is natural range 0 to 84;
proc:process(clock)
variable andResult : slvArray(outputRange)(partitionRange);
begin
if rising_edge(clock) then
for olc in outputRange loop
for ilc in partitonRange'low to partitionRange'high-4 loop
andResult(olc)(ilc) <= and_reduce(slv2(olc*partitionRange'length + ilc to olc*partitionRange'length+ ilc + 4);
end loop;
output(olc) <= or_reduce(andResult);
end loop;
end if;
end process;