2017-08-02 156 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