花生漫画

数据操作的溢出保护及意义

0
阅读(2440)

        在数字信号处理过程中,不论是用何种逻辑器件,在对数据进行操作时都会面临溢出操作的问题,为了保证数据运算在一定意义上的正确性,须对数据进行溢出保护。下面以一具体的例子进行说明。

        假设有20个16位数进行操作,则结果最大有可能是一21位的。所以在对这20个数操作的时候需要先对数据进行扩位,关于扩位的方法,在前面已经介绍过了,先是将数据统一扩到21位,但绝非在最高位前面添加5个0,因为在数据操作时,原始数据大都是以补码的形式存储的,所以负数的扩位跟正数的扩位并不一样。对数据扩完位以后便可对数据进行操作,但是考虑到20个16位数加操作完后都必须用21位来表示,有的可能不需要这么多的位来存储。假设在后续处理中,需要判断该运算结果与一理论值的大小,而这一处理过程的处理时钟速率要求比较高,如果在FPGA中实现时,会用下列语句来实现:

if ( data_out > thsh)
	begin
		flag <= 1’b1;
	end
else
	begin
		flag <= 1’b0;
	end

        其中data_out表示20个16位数加减操作以后的结果,flag表示data_out与理论值---thsh的大小。

        由于硬件描述语言跟高级语言(如C语言)不一样,高级语言在执行的过程中没有时序特性的要求,而硬件描述语言必须要考虑到时序特性,由于在高速信号处理的过程中,如果不满足时序特性的要求,则会出现意想不到的“逻辑错误”,这也就是为什么我们在用软件进行仿真的时候结果跟预想的一样,而在真正的板级测试的时候会不满足要求,或者是时序约束条件不满足。上述的简单语句就会面临这样的问题,其实语句:if ( data_out > thsh )在逻辑网表映射的时候就是一个数据比较器,而数据在比较大小的时候通常是按照从高位到低位的顺序开始的。由于在FPAG内部一般都建议采用时序逻辑电路来实现,这样能保证运算的可控性与正确性。试想一下,当一个时钟的上升沿到来时,比较的过程最多可能会经历21次,而时钟上升沿的持续时间是非常短暂的,所以在高速电路当中,这会给FPGA造成很大的压力,为了避免这种情况,就需要对数据进行做溢出保护。其基本思想是:先预测一下数据运算的范围,当数据在这一范围内时,则对数据进行正确表示,但是对其表示位缩短,当数据不在这一范围内时,则将数据缩位,但是同时对数据进行截断处理,比如,预测到20个16位数在操作完以后的结果范围是在17位之内,这时可以用下列语句实现上述的功能,即最多取数据的第17位,同时省略数据的低5位,即只取数据的第6至第17位,这时数据仅仅剩下12位,对比较大小造成较小的压力,满足更好的时序特性。

If ( data_out[20:16] == 3’b111 || data_out[20:16] == 3’b00)
	begin
		data_out_short <= data_out[16:5];
	end
else if ( data_out[20] )
	begin
		data_out_short <= 12’b1000_0000_0000;
	end
else
	begin
		data_out_short <= 12’b0111_1111_1111;
	end

        上述的代码基本思想是:如果第20位到第16位全部为1或全部为0,这时就取数据的第16到第5位,如果不是就判断原始数据的最高位,如果原始数据的最高位为0,则说明原始数据为正数,这时将截断后的数据表示成12位数所能表达的最大数,如果为1,则说明数据为负数,便将数据表示成12位数所能表达的最小的负数,以便尽最大可能的保证数据运算的正确性。

        对数据进行溢出保护具有重要的意义,尤其是在高速信号处理时,为了保证时序要求,对运算数据提出了要求,当数据位越少时,就越容易满足良好的时序特性,以上是个人在实际工程项目中的一点心得,拿来与大家分享,仅供参考!