乘法器(一)

乘法运算在数字信号处理中也是比较常用,如常系数FIR中需要输入数据与FIR系数进行乘法运算。在FPGA实现乘法时可选择采用逻辑实现,也可使用硬资源,如Xilinx

FPGA中的DSP48。相比于逻辑实现的乘法器,采用DSP48实现的乘法器速度较块,但是个数有限,如果在DSP48资源比较紧缺时,则只能采用逻辑实现乘法器。

首先介绍一下逻辑实现乘法器的方法,最常用的是移位相加法,基于此方法本文介绍全并行结构和半并行结构的乘法器。

1.全并行结构

如图1所示为两个16位无符号数a、b的全并行乘法器结构。

图1

全并行结构乘法器并行输入数据a、b,直接进行移位并且累加,所有操作都在一个时钟周期完成,输出的数据速率可以与输入数据的相同,并且输入与输出只有一个时钟周期的延时,Verilog

HDL代码如下:

modulemultiply_lut_FP

(

inputclk,

inputrst,

input[15:0]

a,

input[15:0]

b,

output

reg[31:0] p

);

//one path

reg[15:0] a_in,b_in;

always@(posedgeclk)

if(rst)

begin

a_in<=16'd0;

b_in<=16'd0;

end

else

begin

a_in<=a;

b_in<=b;

end

wire[31:0]

p_tmp[0:15];

generate

genvari;

for(i=0;i<16;i=i+1)

begin:bit_mult

assignp_tmp[i]

= (b_in[i]==1'b1) ? ({16'd0,a_in})<

32'd0;

end

endgenerate

always@(posedgeclk)

if(rst)

p<=32'd0;

else

p<= p_tmp[0] + p_tmp[1] + p_tmp[2] + p_tmp[3] +

p_tmp[4] + p_tmp[5] + p_tmp[6] + p_tmp[7] +

p_tmp[8] + p_tmp[9] + p_tmp[10]+ p_tmp[11]+

p_tmp[12]+ p_tmp[13]+ p_tmp[14]+

p_tmp[15];

endmodule

通过XST综合报告如下:

Number of Slice Registers: 64

Number of Slice LUTs: 598

Minimum period: 5.304ns (Maximum Frequency: 188.523MHz)

以上报告中的Fmax的结果不是很理想,在无线通信数字中频中数据速率一般都需要达到200M以上,因此需要对此全并行结构乘法器做结构优化,可采用加入流水线级,分隔其中的组合逻辑,如图2所示,分了两级流水线结构,第一级中判断b中比特位、a移位和1个加法操作,第二级流水线中有4个加法操作,Verilog

HDL代码如下:

modulemultiply_lut_FP

(

inputclk,

inputrst,

input[15:0]

a,

input[15:0]

b,

output

reg[31:0] p

);

//pipeline

reg[15:0] a_in,b_in;

always@(posedgeclk)

if(rst)

begin

a_in<=16'd0;

b_in<=16'd0;

end

else

begin

a_in<=a;

b_in<=b;

end

wire[31:0]

p_tmp[0:15];

reg[31:0]

p_tmp_d[0:7];

generate

genvari;

for(i=0;i<16;i=i+1)

begin:bit_mult

assignp_tmp[i]

= (b_in[i]==1'b1) ? ({16'd0,a_in})<

32'd0;

end

endgenerate

always@(posedgeclk)

if(rst)

begin

p_tmp_d[0]<=32'd0;

p_tmp_d[1]<=32'd0;

p_tmp_d[2]<=32'd0;

p_tmp_d[3]<=32'd0;

p_tmp_d[4]<=32'd0;

p_tmp_d[5]<=32'd0;

p_tmp_d[6]<=32'd0;

p_tmp_d[7]<=32'd0;

end

else

begin

p_tmp_d[0]<=p_tmp[0] + p_tmp[1];

p_tmp_d[1]<=p_tmp[2] + p_tmp[3];

p_tmp_d[2]<=p_tmp[4] + p_tmp[5];

p_tmp_d[3]<=p_tmp[6] + p_tmp[7];

p_tmp_d[4]<=p_tmp[8] + p_tmp[9];

p_tmp_d[5]<=p_tmp[10] + p_tmp[11];

p_tmp_d[6]<=p_tmp[12] + p_tmp[13];

p_tmp_d[7]<=p_tmp[14] + p_tmp[15];

end

always@(posedgeclk)

if(rst)

p<=32'd0;

else

p<= p_tmp_d[0] + p_tmp_d[1] + p_tmp_d[2] + p_tmp_d[3] +

p_tmp_d[4] + p_tmp_d[5] + p_tmp_d[6] +

p_tmp_d[7];

endmodule

图2

得到综合报告:

Number of Slice Registers: 208

Number of Slice LUTs: 452

Minimum period: 3.828ns (Maximum Frequency: 261.219MHz)

与优化前结构比较,register消耗由64增至208,但是Fmax提高到了261.219MHz,相当于以面积换取速度。而数据速率方面,此结构输出数据速率与输入数据速率仍相同,但是输出数据有2个时钟周期的延时。优化前后结构的仿真如图3所示,其中p_one是优化前输出,p_pip是加入流水线级后的输出,结果验证了如上所述功能。

图3

2.半并行结构

半并行结构乘法器结构如图4所示,a为并行输入,b按比特位串行输入,其中有15级寄存器寄存中间累加数据,因此计算一次半并行乘法需要15个时钟周期的延时。

图4

半并行结构乘法器Verilog HDL代码如下:

modulemultiply_lut_HP(

inputclk,

inputrst,

input[15:0]

a,

input[15:0]

b,

output

reg [31:0] p,

inputivalid,

output

reg ovalid

);

reg[15:0] a_in,b_in;

reg[31:0] p_tmp;

integercnt;

reg[2:0] cs;

parameter[2:0] IDLE=3'b001,

ST0 =3'b010,

DONE=3'b100;

always@(posedgeclk)

if(rst)

begin

ovalid<=1'b0;

a_in<=16'd0;

b_in<=16'd0;

p_tmp<=32'd0;

p<=32'd0;

cs<=IDLE;

end

else

begin

ovalid<=1'b0;

p<=32'd0;

case(cs)

IDLE: begin

p_tmp<=32'd0;

cnt<=0;

if(ivalid)

begin

b_in<=b;

a_in<=a;

cs<=ST0;

end

else

begin

b_in<=16'd0;

a_in<=16'd0;

cs<=IDLE;

end

end

ST0:begin

if(b_in[cnt])

p_tmp<=p_tmp + ({16'd0,a_in}<

else

p_tmp<=p_tmp;

if(cnt==15)

begin

cs<=DONE;

cnt<=0;

end

else

begin

cs<=ST0;

cnt<=cnt+1;

end

end

DONE:begin

cs<=IDLE;

ovalid<=1'b1;

p<=p_tmp;

p_tmp<=32'd0;

end

endcase

end

endmodule

综合报告如下:

Number of Slice Registers: 105

Number of Slice LUTs: 117

Minimum period: 2.909ns (Maximum Frequency: 343.716MHz)

分析综合报告,半并行结构乘法器无论资源还是Fmax性能上都优于全并行结构乘法器,但是数据吞吐率不如全并行结构,在此例中出去输入和输出数据的寄存,乘法操作有15个时钟周期的延时,如图5所示为半并行结构乘法器仿真。

图5

fpga中例化乘法器_FPGA:乘法器(一)相关推荐

  1. fpga中例化乘法器_“安富利杯”赛灵思FPGA设计技巧与应用创新博文大赛------Spartan3硬件乘法器使用详解(4)...

    h前面已经介绍了Spartan3系列FPGA中硬件乘法器的用途.调用方法.结构特定等等,还介绍了使用一个专用硬件乘法器同时处理两个乘法的方法.接下来对它的一些具体使用方法做更深入的介绍. 1. 使用X ...

  2. (91)FPGA模块例化(module)

    (91)FPGA模块例化(module) 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)FPGA模块例化(module) 5)结语 1.2 FPGA简介 FPGA(Fi ...

  3. (94)FPGA模块例化传递参数(input)

    (94)FPGA模块例化传递参数(input) 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)FPGA模块例化传递参数(input) 5)结语 1.2 FPGA简介 F ...

  4. (92)FPGA模块例化传递参数(parameter)

    (92)FPGA模块例化传递参数(parameter) 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)FPGA模块例化传递参数(parameter) 5)结语 1.2 ...

  5. (93)FPGA模块例化传递参数(defparam)

    (93)FPGA模块例化传递参数(defparam) 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)FPGA模块例化传递参数(defparam) 5)结语 1.2 FP ...

  6. (64)FPGA模块例化(generate)

    (64)FPGA模块例化(generate) 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)FPGA模块例化(generate) 5)结语 1.2 FPGA简介 FPG ...

  7. (65)FPGA模块例化(parameter)

    (65)FPGA模块例化(parameter) 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)FPGA模块例化(parameter) 5)结语 1.2 FPGA简介 F ...

  8. FPGA学习-Verilog例化说明

    原文作者:FPGA设计论坛 Verilog例化说明 1.什么是模块例化?为什么要例化? 模块例化可以理解成模块调用.对于一个FPGA工程,通常是由一个顶层模块与多个功能子模块组成,为了实现顶层模块与子 ...

  9. FPGA中IBERT 核的应用(二)

    IBERT使用手册 使用环境:ise 14.4 +VirtexFLG 2000T -1925 -2c 1 IBERT简介 IBERT是Xilinx提供用于调试FPGA芯片内高速串行接口比特误码率性能的 ...

最新文章

  1. 基于Linux(LAMP)平台搭建MYsql数据库(二)
  2. Office 2007中的简繁体转换功能
  3. if else流程判断
  4. 利用DAC(Data-tier Application)实现数据库结构迁移
  5. 教小学四年级的计算机,小学四年级微机教学设计
  6. NLP高阶实战必读:一文走遍完整自然语言处理流程
  7. 算法笔记_036:预排序(Java)
  8. mac os 相关命令
  9. Linux最大能创建多少用户,如何在Linux中创建多个用户帐户?
  10. 【刷题记录】GCJ 2.71~2.72
  11. vue3新增Suspense组件
  12. ES6解析彩票项目学习记录(二)
  13. 0501 0503 模块区别_金川区西门子控制器模块CPU313C哪里有
  14. 个人 易混淆 高频 高级单词
  15. Shi-Tomasi特征点(角点)检测及追踪方法
  16. 解决 java 程序中 CPU 占用率过高问题
  17. 禅与摩托车维修艺术中提到的“刀”
  18. 【无标题】如何在C#中使用Dapper ORM学习通http://www.bdgxy.com/
  19. python 中文分词工具
  20. 【PTA】代码部分基础整理

热门文章

  1. AB32开发板测评:GPIO控制RGB彩灯
  2. proxmox 直通显卡(GPU)
  3. 解决CSDN文档打印排版混乱问题
  4. MATLAB 数学应用 线性代数 判断矩阵是否为对称正定矩阵
  5. elasticsearch 内存配置
  6. 为Qt生成的可执行程序设置图标
  7. 以太坊变红,为什么 ETH 必须持有这个关键支持
  8. 皮尔逊相关(Pearson correlation)系数概述及其计算例
  9. pandas读取Excel表格(read_excel)
  10. 基于EKF的四旋翼无人机姿态估计matlab仿真