cordic的FPGA实现(四)、乘法器实现

CORDIC运算在齐次线性坐标系下时,可使用CORDIC实现乘法运算,这只乘法器有一些弊端,就是输入z只能是介于-2~2之间

CORDIC算法实现最简单的功能即为线性函数,实现乘法器。

原CORDIC模块的输入为x、y、z,现在将原模块的输入y屏蔽掉,输出y就会产生乘法效果,然而,这个乘法器的输入z只能介于-2~2之间,这个乘法器为针对小数的乘法器,z只要介于-2~2之间,后面有多少位小数don’t care at all!

(公式又来了,还是截图吧)

cordic的FPGA实现(四)、乘法器实现_第1张图片

在迭代的过程中,x并没有移动方向,只有不断减半而已,对于z,其绝对值要不断的趋向于0,在z>0时矢量就执行相减操作,z<0时就执行相加操作;x为输入乘数,在迭代的过程中不断累加(减),最后的结果就是乘积。

matlab代码:

function a = chengfaqi(x,z)  
y=0;
t=1.0;
for i=0:1:15
    if z>0   %矢量向下移动 以z为参考系
        y=y+x*t;
        z=z-t;
        t=t/2;
    elseif z<=0  %矢量向上移动
        y=y-x*t;
        z=z+t;
        t=t/2;
   end
end 
a=y;

仿真代码:

`timescale 1ns/1ps


module cfq_tb;


reg clk;
reg rst_n;
reg iCall;
reg [31:0]ix;
reg [31:0]iz;
wire oDone;
wire [31:0]oData;
wire [31:0]z,x,y;
chengfaqi u0(
.clk(clk),
.rst_n(rst_n),
.iCall(iCall),
.ix(ix),
.iz(iz),
.oDone(oDone),
.oData(oData),
.z(z),
.x(x),
.y(y)
);


initial begin
rst_n=0; #10; rst_n=1;
 clk=0;
 forever #1 clk=~clk;
end 


reg[7:0]i;
always@(posedge clk or negedge rst_n)
if(~rst_n)
begin
 i<=8'd0;
 iCall<=1'b0;
 {ix,iz}<={32'd0,32'd0};
end 
else begin 
 case(i)
 0:  //x=0.4 z=1.3 
  begin
   if(oDone)
   begin
    i<=i+1'b1;
    iCall<=1'b0;
   end 
  else 
    begin
    iCall<=1'b1;
    ix<=0.4*65536;
    iz<=1.3*65536;
    end   
  end 
 1: //x=1.3 z=1.3
  begin
  if(oDone)
   begin
    i<=i+1'b1;
    iCall<=1'b0;
   end 
  else 
    begin
    iCall<=1'b1;
    ix<=1.3*65536;
    iz<=1.3*65536;
    end    
  end 
 2:
  begin
   if(oDone)
   begin
    i<=i+1'b1;
    iCall<=1'b0;
   end 
  else 
    begin
    iCall<=1'b1;
    ix<=3.8*65536;
    iz<=1.9*65536;
    end   
  end 
 3:
  begin
   if(oDone)
   begin
    i<=i+1'b1;
    iCall<=1'b0;
   end 
  else 
    begin
    iCall<=1'b1;
    ix<=10.125*65536;
    iz<=2*65536;
    end   
  end 
 4:
  begin
   i<=i;
  end 
 default:;
 endcase
end 
endmodule 

仿真结果:

cordic的FPGA实现(四)、乘法器实现_第2张图片

你可能感兴趣的:(cordic的FPGA实现(四)、乘法器实现)