乘法器的Verilog HDL实现
原文链接:http://www.cnblogs.com/shengansong/archive/2011/05/23/2054401.html
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
end endmodule

乘法功能是正确的,但计算一次乘法须要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
end endmodule

从图中能够看出,流水线乘法器比串行乘法器的速度快非常多非常多,在非快速的信号处理中有广泛的应用。至于快速信号的乘法一般须要利用FPGA芯片中内嵌的硬核DSP单元来实现。
乘法器的Verilog HDL实现的更多相关文章
- [转载]【转】乘法器的Verilog HDL实现
乘法器如果直接用*来实现的话,会消耗很多的资源.所以有了串行和并行两种实现思路.用串行的话,8位一般会有8位以上的延迟,但是消耗的资源是最少的.低速数据处理比较适合.并行也就是流水线方法,以时间换 ...
- 乘法器的Verilog HDL实现(转载)
原文地址:http://www.cnblogs.com/shengansong/archive/2011/05/23/2054401.html 1. 串行乘法器 两个N位二进制数x.y的乘积用简单的方 ...
- 基于Verilog HDL整数乘法器设计与仿真验证
基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为 ...
- 基于Verilog HDL 各种实验
菜鸟做的的小实验链接汇总: 1.基于Verilog HDL 的数字时钟设计 2.乘法器 3.触发器(基本的SR触发器.同步触发器.D触发器) 4.基于Verilog HDL的ADC ...
- 关于Verilog HDL的一些技巧、易错、易忘点(不定期更新)
本文记录一些关于Verilog HDL的一些技巧.易错.易忘点等(主要是语法上),一方面是方便自己忘记语法时进行查阅翻看,另一方面是分享给大家,如果有错的话,希望大家能够评论指出. 关键词: ·技巧篇 ...
- 关于初次使用Verilog HDL语言需要懂的基本语法
关于初次使用Verilog HDL语言需要懂的基本语法 1.常量 数字表达式全面的描述方式为:<位宽><进制><数字> 8’b10101100,表示位宽为8的二进制 ...
- FPGA Verilog HDL 系列实例--------步进电机驱动控制
[连载] FPGA Verilog HDL 系列实例 Verilog HDL 之 步进电机驱动控制 步进电机的用途还是非常广泛的,目前打印机,绘图仪,机器人等等设备都以步进电机为动力核心.那么,下面我 ...
- Verilog HDL基础语法讲解之模块代码基本结构
Verilog HDL基础语法讲解之模块代码基本结构 本章主要讲解Verilog基础语法的内容,文章以一个最简单的例子"二选一多路器"来引入一个最简单的Verilog设计文件的 ...
- Verilog HDL模块的结构
一个设计是由一个个模块(module)构成的.一个模块的设计如下: 1.模块内容是嵌在module 和endmodule两个语句之间.每个模块实现特定的功能,模块可进行层次的嵌套,因此可以将大型的数字 ...
随机推荐
- TypeScript学习笔记(一) - 环境搭建
本篇将简单介绍一下TypeScript,并记录开发环境的搭建.使用Visual Studio Code进行一个简单的Demo开发过程. 第一部分.简介 TypeScript是一种由微软开发的自由和开源 ...
- 【LOJ】#2587. 「APIO2018」铁人两项
题解 学习了圆方树!(其实是复习了Tarjan求点双) 我又双叒叕忘记了tarjan点双一个最重要,最重要的事情! 就是--假如low[v] >= dfn[u],我们就找到了一个点双,开始建立方 ...
- lr11录制时报“Request Connection: Remote Server @ 0.0.0.0:1080 (Service=?) NOT PROXIED! )”解决方法
在录制脚本的时候出现如下现象: 解决方法: LoadRunner录制脚本时出现:Unable to connect to remote server),有事件没有脚本的问题 1.首先要查看IE浏览 ...
- Django实战(18):提交订单
前面的内容已经基本上涵盖了Django开发的主要方面,我们从需求和界面设计出发,创建模型和修改模型,并通过scaffold作为开发的起点:在scaffold的基础上重新定制模板,并且通过Model类和 ...
- redis配置新端口
为redis分配一个8888端口,操作步骤如下:1.$REDIS_HOME/redis.conf重新复制一份,重命名为redis8888.conf.2.打开redis8888.conf配置文件,找到p ...
- TP5:使用了INPUT函数来接收参数了,还需再过滤SQL注入吗
TP5:使用了INPUT函数来接收参数了,还需再过滤SQL注入吗,默认的INPUT函数都做了哪些动作啊 有了PDO参数绑定 基本上不需要考虑sql注入的问题(除非自己拼接SQL),需要考虑的是XSS方 ...
- MyISAM InnoDB 区别(转载)
MyISAM 和 InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处 ...
- ref:下一个项目为什么要用 SLF4J
ref:http://blog.mayongfa.cn/267.html 阿里巴巴 Java 开发手册 前几天阿里巴巴在云栖社区首次公开阿里官方Java代码规范标准,就是一个PDF手册,有命名规范,让 ...
- C++雾中风景7:闭包
本来说好要聊一聊命名空间的,因为最近在看C++lambda表达式的内容,所以借这个机会我们来好好聊一聊C++的闭包. 1.什么是闭包? 闭包(closure)是函数式编程的重要的语法结构. 闭包的概念 ...
- eclipse 设置文本模板中 insert variable... 函数 详解
设置文本模板简要图: 设置文本模板详细过程:http://www.cnblogs.com/lsy131479/p/8478711.html 此处引出设置文本模板中 insert variable... ...