我正在为浮点实现标准化单元,并且我想知道如何有效地实现前导零计数器?
我知道我可以写以下内容,但是我想知道如果我针对低面积和高能源效率是否有更好的方法?:
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
,它就会退出循环,使计数器包含前导零的数量。要找出效率是否足够高,您必须尝试综合-让我们知道!