blob: 1222d61a2519702d824a3c08092069bdec060c58 [file] [log] [blame]
module LZCnt (
in,
out
);
input wire [31:0] in;
output reg [5:0] out;
integer i;
reg [1:0] s0 [15:0];
reg [2:0] s1 [7:0];
reg [3:0] s2 [3:0];
reg [4:0] s3 [1:0];
always @(*) begin
for (i = 0; i < 16; i = i + 1)
case (in[2 * i+:2])
2'b00: s0[15 - i] = 2'b10;
2'b01: s0[15 - i] = 2'b01;
2'b10: s0[15 - i] = 2'b00;
2'b11: s0[15 - i] = 2'b00;
endcase
for (i = 0; i < 8; i = i + 1)
if (s0[(2 * i) + 0][1] && s0[(2 * i) + 1][1])
s1[i] = 3'b100;
else if (s0[2 * i][1] == 1'b0)
s1[i] = {1'b0, s0[2 * i]};
else
s1[i] = {2'b01, s0[(2 * i) + 1][0]};
for (i = 0; i < 4; i = i + 1)
if (s1[(2 * i) + 0][2] && s1[(2 * i) + 1][2])
s2[i] = 4'b1000;
else if (s1[2 * i][2] == 1'b0)
s2[i] = {1'b0, s1[2 * i]};
else
s2[i] = {2'b01, s1[(2 * i) + 1][1:0]};
for (i = 0; i < 2; i = i + 1)
if (s2[(2 * i) + 0][3] && s2[(2 * i) + 1][3])
s3[i] = 5'b10000;
else if (s2[2 * i][3] == 1'b0)
s3[i] = {1'b0, s2[2 * i]};
else
s3[i] = {2'b01, s2[(2 * i) + 1][2:0]};
if (s3[0][4] && s3[1][4])
out = 6'b100000;
else if (s3[0][4] == 1'b0)
out = {1'b0, s3[0]};
else
out = {2'b01, s3[1][3:0]};
end
endmodule