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.
Quel est le problème exactement? Itérer et compter. –
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
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. –