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!
(公式又来了,还是截图吧)
在迭代的过程中,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
仿真结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人