首页
学习
活动
专区
圈层
工具
发布
37 篇文章
1
Linux音频驱动-ASOC(ALSA System on Chip)
2
LPDDR5: A New Clocking Scheme 提高性能
3
FPGA 控制 RGMII 接口 PHY芯片基础
4
DDR3篇第三讲、DDR3读写测试项目分析
5
PHY(Physical Layer,PHY)通俗理
6
MIPI联盟已完成车载的Long-Reach SerDes PHY工业标准 A-PHY v1.0
7
【三】Bluetooth 技术||链路层七种状态与空口报文设计(Core_v5.2)
8
【RL-TCPnet网络教程】第5章 PHY芯片和STM32的MAC基础知识
9
FPGA和USB3.0通信-USB3.0 PHY介绍
10
USB技术浅析
11
优秀的 Verilog/FPGA开源项目介绍(二)-RISC-V
12
优秀的 Verilog/FPGA开源项目介绍(十六)- 数字频率合成器DDS
13
想学习高速ADC/DAC/SDR项目这个项目你不得不理解
14
优秀的 Verilog/FPGA开源项目介绍(九)- DP(增改版)
15
优秀的 Verilog/FPGA开源项目介绍(十三)- I2C
16
高速串行通信常用的编码方式-8b/10b编码/解码
17
SoC设计之PPA
18
SoC设计之功耗--开篇
19
开源SOC的设计与实践
20
SoC设计之功耗 – RTL/netlist功耗计算
21
转置型FIR设计
22
SSD目标检测系统系统结构网络训练
23
P2P接口Booth乘法器设计描述原理代码实现
24
流水线式p2p接口的分析与实现
25
流水线乘加树需求设计规划代码实现
26
分时复用的移位相加乘法器
27
Verilog实现全并行比较算法
28
全并行流水线移位相加乘法器
29
ROM乘法器基本算法单个ROM乘法器分时复用ROM乘法器
30
Flash中XIP模式
31
cordic的FPGA实现(五)、除法实现
32
cordic的FPGA实现(三)、乘法器实现
33
cordic的FPGA实现(三)、sin、cos函数运算与源码分析
34
FPGA卡拉ok系统--Biquad filter
35
音频总线I2S协议
36
脉冲压缩处理
37
虚拟地址(VA,virtual address)到物理地址(PA, ,physical address)的转换
清单首页SoC文章详情

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代码:

代码语言:javascript
复制
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;

仿真代码:

代码语言:javascript
复制
`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 

仿真结果:

下一篇
举报
领券