截位操作

 

2)截位操作

  ①在有限字长的情况下,若两个M 位的数相加,其结果就是M +1位;若两个M 位的数相乘,其结果就是2M 位。但在实际的操作过程中,考虑到资源的问题,不能任由相加、相乘操作来增加操作数的位宽,必须进行截断。

  ②例如,两个16 位数相乘后,其结果为32 位,如再和一个16 位数相乘,结果就变为48 位,这样下去,用不了几个乘法操作就会使操作数的位宽剧增,所占用的硬件资源也会很多。因此,需要将乘积结果进行截位,寄存在M 位的寄存器中。

 

3)截位与扩位规范(Verilog中

  ①加法实现规范,扩展符号位后相加。

1   reg[12:0] Adder_Out;
2   reg[11:0] Adder_In1,Adder_In2;
3   Adder_Out <= {Adder_In1[11],Adder_In1} + {Adder_In2[11],Adder_In2};

  ②对于截取乘法的结果,需要加溢出保护的截取规范。例如要截取12 比特输出的第6 位到第2 位,其实现代码为:

1 if((addRakeOut[11:6] == 0) || (addRakeOut[11:6] == 63))
2     tmptraffic <= addRakeOut[6:2];
3 else
4     tmptraffic <= (addRakeOut[11] == 1) ? 16 : 15;

或者:

1 if((addRakeOut[11:6] == 6'b000000) || (addRakeOut[11:6] == 6'b111111))
2     tmptraffic <= addRakeOut[6:2];
3 else
4     tmptraffic <= (addRakeOut[11] == 1) ? 5’b10000 : 5’sb01111;

  ③移位操作规范,移位操作的截位和加法器的截位规则类似,如16 比特数据的左、右1 比特移位示例:

复制代码

1 reg[15:0] Data;
2 if((Data[15:14] == 2'b00) || (Data[15:14] == 2'b11))
3     Data <= {Data[14:0],1'b0};//左移一位
4 else
5     Data <= (Data[15]) ? 16'b1000_0000_0000_0000 : 16'b0111_1111_1111_1111;
6 //右移一位
7 Data <= {Data[15],Data[15:1]};

复制代码

你可能感兴趣的:(FPGA截位)