如何计算verilog中位数组中的最大连续1/0

时间:2017-08-02 09:23:49

标签: verilog

对于一个reg数组,我想计算其中最大的连续数。

例如

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

结果应为7。

如果我想在256位甚至更长的reg数组上做同样的事情, 有没有办法在一个或几个周期内实现它? (1GHz,16nm FF +)

编辑1:

真正的问题是我想找到最大的连续可用内存大小。 16位寄存器阵列代表64KByte meomry,每位代表一个4KByte的内存块,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个周期,这是不可接受的。

所以,请告诉我有更好的方法来做到这一点。

1 个答案:

答案 0 :(得分: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