我正在为浮点实现标准化单元,并且我想知道如何有效地实现前导零计数器?

我知道我可以写以下内容,但是我想知道如果我针对低面积和高能源效率是否有更好的方法?:

always @(mantissa) begin
  case(mantissa)
    25'b1????????????????????????: newmant = mantissa[24:1];
    25'b01???????????????????????: newmant = mantissa[23:0];
    25'b001??????????????????????: newmant = {mantissa[22:0],1'b0};
    25'b0001?????????????????????: newmant = {mantissa[21:0],2'b0};
    // ... (details ommited for brevity)
  endcase
end

最佳答案

在VHDL中(应易于移植到Verilog中):

process
   variable leading_zeros : natural;
begin
   leading_zeros := 0;
   for i in input_vector'range loop
      if input_vector(i) = '1' then
         break;
      end if;
      leading_zeros := leading_zeros + 1;
   end for;
end process;


对于非VHDL扬声器,所有这些操作是从左到右循环遍历input_vector中的所有位,每次看到0都会增加一个计数器。一旦找到第一个1,它就会退出循环,使计数器包含前导零的数量。

要找出效率是否足够高,您必须尝试综合-让我们知道!

10-08 17:44