2017-08-02 5 views
1

Pour un tableau reg, je veux compter les maximums continus dans ceux-ci.Comment compter les maximums continus/zéros dans un tableau de bits dans verilog

par exemple

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

le résultat devrait être 7.

Si je veux faire la même chose sur 256 bits ou même plus ensemble reg, est-il possible de mettre en œuvre en un ou plusieurs cycles? (1GHz, 16nm FF +)

Edit 1:

Le vrai problème est que je veux trouver la plus grande taille de la mémoire libre continue. Le tableau de registre de 16 bits représente une méomrie de 64 Ko, chaque bit représente un bloc de mémoire de 4 Ko, 1'b1 signifie déjà attribué, 1'b0 signifie libre. Ainsi, le nombre maximal de continues affiche la plus grande taille de mémoire libre pouvant être allouée une fois.

Mon compte à ce sujet est d'effectuer un premier compte zéro au tableau de registre, comme suit:

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 

Mais le problème est que ça va prendre 16 cycles pour cela, si je veux effectuer ceci sur un tableau de registre de 256 bits, cela coûtera 256 cycles, ce qui n'est pas acceptable.

Alors, s'il vous plaît, dites-moi s'il y a une meilleure façon de le faire.

+0

Quel est le problème exactement? Itérer et compter. –

+0

Montrez quelques tentatives pour résoudre le problème. Sinon, nous supposons que vous voulez que nous vous donnions le code et que vous fassiez vos devoirs pour vous. – Greg

+0

Vous pouvez faire comme vous avez illustré ou «dérouler la boucle» et faire deux tours, compte, et compare par horloge. Ou 4, 8, 16, tout le chemin jusqu'à 256. Dans le cas extrême, vous ferez tout cela dans une horloge, mais en déduire une énorme quantité de logique et presque certainement pas respecter le calendrier, même dans votre processus de fantaisie. C'est à vous de négocier la zone de porte contre la performance/latence. –

Répondre

0

Ci-dessous le code comptera 1 consécutifs au maximum de 1 cycle en combinatoires, vous pouvez potentiellement briser cette boucle pour répondre calendrier:

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