☞☞☞原文链接,点击打开
AD模块没有配置成补码输出,而是将输入的有正有负的模拟信号加上偏置变成全正信号,使12位AD输出为无符号12位整数(范围[0,4095]),而AD后面接的数字下变频芯片GC2012B则要求12位补码(two's complement,范围[-2048,2047])输入!
系统中几乎所有的重要组件都与FPGA相连,所有重要数据连线都通过FPGA,只要在FPGA里动点手脚就行。
既然输入系统的有正有负的模拟信号加上了偏置变成全正信号才输入AD的,那就把AD的输出减去一个正数,并以补码形式传给GC2012B不就行了吗?我想,就减去2048吧,这样就把AD输出的范围从[0,4095]转换到了[-2048,2047],只要在FPGA里做一个以补码形式输出的减法器就可以了。但是想了想,发现根本不需要什么减法器,用一个极其简单的电路即可完成这项功能,电路的代码如下:
module
uint2sint(
input
[width-1:0]
ui,
output
[width-1:0]
si
);
parameter
width=12;
assign
si[width-1]=~ui[width-1];
assign
si[width-2:0]=ui[width-2:0];
endmodule
其实就是将最高位取反,其余不变。为什么这样就能实现减2048的效果呢?假设把输入信号左边添个0变成13位数值,而-2048的十三位补码为1 1000 0000 0000,将这个数与输入数值相加,自然就等效于ui[11]取反了。
有符号数转变为无符号数的方法:
8BIT: 有符号 -128~~~128
+128
无符号 0~~~~256