博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转载Verilog乘法器
阅读量:4630 次
发布时间:2019-06-09

本文共 2448 字,大约阅读时间需要 8 分钟。

1. 串行乘法器 

两个N位二进制数x、y的乘积用简单的方法计算就是利用移位操作来实现。

module multi_CX(clk, x, y, result);        input clk;    input [7:0] x, y;    output [15:0] result;    reg [15:0] result;    parameter s0 = 0, s1 = 1, s2 = 2;    reg [2:0] count = 0;    reg [1:0] state = 0;    reg [15:0] P, T;    reg [7:0] y_reg;    always @(posedge clk) begin        case (state)            s0: begin                count <= 0;                P <= 0;                y_reg <= y;                T <= {
{8{1'b0}}, x}; state <= s1; end s1: begin if(count == 3'b111) state <= s2; else begin if(y_reg[0] == 1'b1) P <= P + T; else P <= P; y_reg <= y_reg >> 1; T <= T << 1; count <= count + 1; state <= s1; end end s2: begin result <= P; state <= s0; end default: ; endcase endendmodule

乘法功能是正确的,但计算一次乘法需要8个周期。因此可以看出串行乘法器速度比较慢、时延大,但这种乘法器的优点是所占用的资源是所有类型乘法器中最少的,在低速的信号处理中有着广泛的应用。

2.流水线乘法器 

一般的快速乘法器通常采用逐位并行的迭代阵列结构,将每个操作数的N位都并行地提交给乘法器。但是一般对于FPGA来讲,进位的速度快于加法的速度,这种阵列结构并不是最优的。所以可以采用多级流水线的形式,将相邻的两个部分乘积结果再加到最终的输出乘积上,即排成一个二叉树形式的结构,这样对于N位乘法器需要lb(N)级来实现。

module multi_4bits_pipelining(mul_a, mul_b, clk, rst_n, mul_out);        input [3:0] mul_a, mul_b;    input       clk;    input       rst_n;    output [7:0] mul_out;    reg [7:0] mul_out;    reg [7:0] stored0;    reg [7:0] stored1;    reg [7:0] stored2;    reg [7:0] stored3;    reg [7:0] add01;    reg [7:0] add23;    always @(posedge clk or negedge rst_n) begin        if(!rst_n) begin            mul_out <= 0;            stored0 <= 0;            stored1 <= 0;            stored2 <= 0;            stored3 <= 0;            add01 <= 0;            add23 <= 0;        end        else begin            stored0 <= mul_b[0]? {4'b0, mul_a} : 8'b0;            stored1 <= mul_b[1]? {3'b0, mul_a, 1'b0} : 8'b0;            stored2 <= mul_b[2]? {2'b0, mul_a, 2'b0} : 8'b0;            stored3 <= mul_b[3]? {1'b0, mul_a, 3'b0} : 8'b0;            add01 <= stored1 + stored0;            add23 <= stored3 + stored2;            mul_out <= add01 + add23;        end    endendmodule

从图中可以看出,流水线乘法器比串行乘法器的速度快很多很多,在非高速的信号处理中有广泛的应用。至于高速信号的乘法一般需要利用FPGA芯片中内嵌的硬核DSP单元来实现。

转载于:https://www.cnblogs.com/lianjiehere/p/3906982.html

你可能感兴趣的文章
vs2010统计项目代码总行数
查看>>
delphi 一个时钟引发的事情
查看>>
JPEG和Variant的转换
查看>>
How to read very large text files fast
查看>>
Java读取.properties配置文件
查看>>
java绘制带姓的圆
查看>>
android数据的4种存储方式
查看>>
css缓存问题
查看>>
3dmax_FBX转havok_model
查看>>
Linux常用命令
查看>>
实验三 二叉树
查看>>
几种交叉验证(cross validation)方式的比较
查看>>
第44章:MongoDB-集群--Sharding(分片)--分片的片键选择
查看>>
自定义ISO结构
查看>>
7.11 animals.c 程序
查看>>
java Web三大组件--过滤器
查看>>
使用NUnit为游戏项目编写高质量单元测试的思考
查看>>
Uva 1638 Pole Arrangement
查看>>
Java内存泄漏
查看>>
逻辑函数的代数化简法
查看>>