• 四位加法器
  • 两级加法实现

verilog code

module  pipeliningadder(
output reg [3:0] s,
output reg co,
input [3:0] a,
input [3:0] b,
input ci, input clk,
input rstn
); reg [3:0] a_tmp;
reg [3:0] b_tmp;
reg [1:0] a_tmp2;
reg [1:0] b_tmp2;
reg ci_tmp;
reg [1:0] s_tmp3; reg co_low;
reg [1:0] s_low;
reg co_hign;
reg [1:0] s_hign; always@(posedge clk,negedge rstn)
begin
if(!rstn)
begin
a_tmp <= 4'b0;
b_tmp <= 4'b0;
ci_tmp <= 1'b0;
end
else
begin //将输入的数据缓存起来
a_tmp <= a;
b_tmp <= b;
ci_tmp <= ci;
end
end always@(posedge clk,negedge rstn)
begin
if(!rstn)
begin
co_low <= 1'b0;
s_low <= 2'b0;
a_tmp2 <= 2'b0;
b_tmp2 <= 2'b0;
end
else
begin //低两位相加,缓存高两位
{co_low,s_low} <= a_tmp[1:0] + b_tmp[1:0] + ci_tmp;
a_tmp2 <= a_tmp[3:2];
b_tmp2 <= b_tmp[3:2];
end
end always@(posedge clk,negedge rstn)
begin
if(!rstn)
begin
co_hign <= 2'b0;
s_hign <= 2'b0;
end
else
begin //高两位相加及与之间的低两位一并输出
{co_hign,s_hign} <= a_tmp2 + b_tmp2 + co_low;
s_tmp3 <= s_low; //寄存上一级的结果
end
end always@(posedge clk,negedge rstn)
begin
if(!rstn)
begin
co <= 1'b0;
s <= 4'b0;
end
else
begin
{co,s} = {co_hign,s_hign,s_tmp3}; //合并上两级计算结果,输出结果
end
end endmodule

testbench

module  pipeliningadder_tb;
wire [3:0] s;
wire co;
reg [3:0] a;
reg [3:0] b;
reg ci; reg clk;
reg rstn; initial
begin
clk = 0;
rstn = 0;
@(posedge clk) rstn = 1; a = 4'b0000; b = 4'b0000; ci = 0;
@(posedge clk) a = 4'b1111; b = 4'b1111; ci = 0;
@(posedge clk) a = 4'b1100; b = 4'b1001; ci = 0;
@(posedge clk) a = 4'b0111; b = 4'b0110; ci = 0;
@(posedge clk) a = 4'b0101; b = 4'b0101; ci = 1;
@(posedge clk) a = 4'b1110; b = 4'b1001; ci = 1;
@(posedge clk) a = 4'b0010; b = 4'b0110; ci = 1;
@(posedge clk) a = 4'b0110; b = 4'b1101; ci = 1;
@(posedge clk) a = 4'b1110; b = 4'b1110; ci = 1;
@(posedge clk) a = 4'b1100; b = 4'b0110; ci = 1;
@(posedge clk) a = 4'b1100; b = 4'b0101; ci = 1;
@(posedge clk) a = 4'b0011; b = 4'b1010; ci = 1;
@(posedge clk) $finish;
end always #5 clk = ~clk; initial begin
$fsdbDumpfile("test.fsdb");
$fsdbDumpvars();
end pipeliningadder u_pipeliningadder(
.s(s),
.co(co),
.a(a),
.b(b),
.ci(ci),
.clk(clk),
.rstn(rstn)
); endmodule

verdi波形查看


总结

使用流水线实现可以缩短关键路径,以提高运算频率,加快运算。

其他相关加法器实现方法:verilog 实现加法器

参考资料

[1]. 加法器的verilog实现

verilog流水线加法器的更多相关文章

  1. verilog 实现加法器

    半加器 如果不考虑来自低位的进位将两个1二进制数相加,称为半加. 实现半加运算的逻辑电路称为半加器. 真值表 逻辑表达式和 \begin{align}\notag s = a{b}' + {a}'b ...

  2. 【FPGA学习】Verilog之加法器

    在fpga工程应用设计中,随处可见加法器,乘法器等等.现在将一些常用模块和心得体会先记录下来,以便日后使用. 一位半加器: module halfadder(cout,sum,a,b); output ...

  3. verilog设计加法器

    概述 本文利用了硬件行为描述.数据流描述.结构描述三种方法分别写了几个加法器 一位半加法器 即两个一位的二进制数相加,得到其正常相加的结果的最后一位. 仿真波形图 硬件行为描述 设计文件 123456 ...

  4. 流水线(pipe-line)简介

    1.什么是流水线设计技术? 答:所谓流水线设计实际上是把规模较大.层次较多的组合逻辑电路分为几个级,在每一级插入寄存器组并暂存数据. K级就是有K个寄存器组,从上到下没有反馈电路. 2.流水线设计的深 ...

  5. 剑指Offer - 九度1507 - 不用加减乘除做加法

    剑指Offer - 九度1507 - 不用加减乘除做加法2013-11-29 20:00 题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包 ...

  6. 流水线cpu —Verilog HDL

    一.准备工作 先看看书(<计算机原理与设计 Verilog HDL版>),搞懂一点原理.然后照着书上的代码写一写(用8.4的就可以了,不用8.6的). 注意mux2x32,mux4,cla ...

  7. verilog实现16位五级流水线的CPU带Hazard冲突处理

    verilog实现16位五级流水线的CPU带Hazard冲突处理 该文是基于博主之前一篇博客http://www.cnblogs.com/wsine/p/4292869.html所增加的Hazard处 ...

  8. sobel流水线操作Verilog程序

    sobel算子的verilog实现,采用了流水线操作 module sobel_computer ( clock , reset, OrigDataEn, //SobelAluEn, OrigData ...

  9. 四级流水线的8bit加法器

    以流水线实现8bit 加法器. //date : 2013/8/23 //designer :pengxiaoen //function : module pipeline ( clock ,rese ...

随机推荐

  1. Winamp传统外观皮肤MusicRio发放

    这款皮肤是我在2002年自己弄的,如果能给还在使用Winamp的朋友使用那就最好了. 下载地址:http://files.cnblogs.com/lzhdim/MusicRio.rar

  2. java事件处理2

    Document事件 这个事件有点特别,需要用getDocument()返回到自己所维护的文档,然后就可以添加监视器 (textArea1.getDocument).addDocumentListen ...

  3. mysql-1862、1820、java.sql.SQLException: Your password has expired. To log in you must change it using a client that supports expired passwords.

    之前一直运行的好好的,突然mysql就无法工作了.请求命令后报错误:ERROR 1820 (HY000): You must SET PASSWORD before executing this st ...

  4. 自己动手开发编译器(五)miniSharp语言的词法分析器

    稍微说明一点,整型常量和上面的标识符的词法,在调用lex.DefineToken时都多传了一个参数.这个参数是可选的描述信息,如果不传会直接使用正则表达式的字符串形式.而标识符的正则表达式有4万多个字 ...

  5. pin导致路由器死掉的解决方法

    首先检测网卡: ifconfig -a 然后模拟端口: airmon-ng start wlan0 接下来用: airodump-ng mon0 扫描ap找到你pin死的路由器mac 用mdk3 做身 ...

  6. New ipad安装Perl支持安装nikto

    Title:New ipad安装Perl支持安装nikto --2012-11-15 09:47 New Ipad 越了后. ssh new ipad 进入目录 cd /tmp 下载Key文件 wge ...

  7. 如何判断一个C++对象是否在堆上(通过GetProcessHeaps取得所有堆,然后与对象地址比较即可),附许多精彩评论

    在帖子如何判断一个C++对象是否在堆栈上 中, 又有人提出如何判断一个C++对象是否在堆上. 其实我们可以参照那个帖子的方法类似实现,我们知道堆就是Heap,在windows上我们可以通过GetPro ...

  8. 神舟飞船上的计算机使用什么操作系统,为什么是自研发不是 Linux?

    中国航天用的SpaceOS主要内容是仿造美国风河系统公司的VxWorks653(653是产品名,并非版本号). 先解释为什么用这个系统不用Linux: 航天器的内存和CPU都非常弱,弱到什么程度呢:天 ...

  9. linux awk浅析(转)

    Awk 是一种非常好的语言,同时有一个非常奇怪的名称.在本系列(共三篇文章)的第一篇文章中,Daniel Robbins 将使您迅速掌握 awk 编程技巧.随着本系列的进展,将讨论更高级的主题,最后将 ...

  10. ArcGIS加载高德、OSM和谷歌等地图

    1. 引言 网络地图对于我们来说已经不是什么新鲜事了,上面有各大互联网公司收集的海量的地理空间数据.一般网络地图的地图是以切片形式存在的,因此,本文重点讲述如何将这些网络切片地图加载并显示再ArcGI ...