Q:
杜老师您好,关于数字滤波器的MATLAB与FPGA实现(Altera版)书中有些问题请教:
在7.4.3节自适应均衡器的verilog实现中,有一段程序学生实在理解不了,就是在求取滤波器输出信号及误差信号时:
begin
Y1_out <={{3{Y_Reg[0][31]}},Y_Reg[0]}+{{3{Y_Reg[1][31]}},Y_Reg[1]}+{{3{Y_Reg[2][31]}},Y_Reg[2]};
Y2_out <={{3{Y_Reg[3][31]}},Y_Reg[3]}+{{3{Y_Reg[4][31]}},Y_Reg[4]}+{{3{Y_Reg[5][31]}},Y_Reg[5]}+{{3{Y_Reg[6][31]}},Y_Reg[6]};
Y_out <= Y1_out + Y2_out;
if (count==3)
E_out <={{5{Rin_Reg[3][15]}},Rin_Reg[3]}-Y1_out[34:14]-Y2_out[34:14];
end
其中例如{{3{Y_Reg[0][31]}},Y_Reg[0]}意思是把第0路的结果Y_Reg的符号位复制3次放在高位然后和自己拼接对吧?现在学生不理解为何是复制3次放高位这样的操作?
还有计算DW_Reg[n]时 DW_Reg[n] <= -{{7{Xin_Reg[n][15]}},Xin_Reg[n][15:7]};中,也是复制最高位7次放在高位。
还请老师能百忙中指点迷津,学生感激不尽!
A:
这只是一个符号扩展的VERILOG操作。由于操作数是有符号数据,因此扩展符号位不会改变数值的大小的正负,同时扩展到所需要的位宽。
祝愉快!
杜勇