2017-08-02 160 views
1

对于一个reg阵列,我希望计算他们最大连续的。如何计算中位数组最大连续1/0-用Verilog

例如

reg [15:0] bit_array; 
bit_array = 16'b1001_1111_1100_0100; 

结果应该是7

如果我想要做一个256位,甚至更长REG阵列同样的事情, 有没有什么办法来实现它在一个或几个周期? (1GHz的16nm厚FF +)

编辑1:

真正的问题是,我想找到的最大的连续可用内存大小。 16位寄存器阵列代表一个64K字节meomry,每个位代表一个4K字节的存储器块,1'b1的装置已经被分配,1'b0装置自由。 因此,连续的人的最大计数显示了可一次分配的内存的最大尺寸。

我对这个考虑是执行前导零计数寄存器阵列,像以下:

assign count = lzc(bit_array); // lzc is a function to count leading zeros 
always @(posedge clk) begin 
    if(count >max_count) 
     max_count <= count; 
    bit_array <= {bit_array[0],bit_array[15:1]}; 
end 

但问题是,它会采取16个周期这一点,如果我想在执行此一个256位的寄存器阵列,它将花费256个周期,这是不可接受的。

那么,请告诉我有一个更好的方式来做到这一点。

+0

什么问题是什么呢?迭代和计数。 –

+0

显示一些解决问题的尝试。否则,我们假设您希望我们为您提供代码并为您做好功课。 – Greg

+0

你可以就像你说明或做“展开循环”,并做了两旋转,计数和每时钟进行比较。或者4,8,16,一直到256.在极端情况下,你可以在一个时钟内完成所有工作,但是会推断出大量的逻辑,并且几乎肯定不会满足时序要求,即使在你喜欢的过程中也是如此。这取决于门区与性能/延迟之间的关系。 –

回答

0

下面的代码将在1个周期组合方法计算的最大连续的1,你有可能打破这种循环,以满足时序:

for(i=1;i<16;i=i+1) begin 
    if(bit_array[i] == 1 && bit_array[i-1] == 1) begin 
     count = count+1; 
    else begin 
     count = 0; 
    end 
end