博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
采用流水线技术实现8位加法器
阅读量:6524 次
发布时间:2019-06-24

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

 

说明

     本文基于FPGA和CPLD器件,采用非流水线和流水线技术实现8位加法器,并对比其Quartus II仿真结果和波形时序。

     器件选择:

     Stratix:EP1S40F1020C5(FPGA)

     MAX7000S:EPM7064SLC44-5(CPLD)

 

实验一  FPGA实现8位加法器

     程序清单:

1 /*******************8位加法器(非流水线)***********************/ 2 module adder_nonpipe(cout, sum, ina, inb, cin, enable); 3  4 output cout; 5 output [7:0] sum; 6 input [7:0] ina, inb; 7 input cin, enable; 8  9 reg cout;10 reg [7:0] sum;11 reg [7:0] tempa, tempb;12 reg tempc;13 14 always @(posedge enable)15 begin16     tempa = ina;17     tempb = inb;18     tempc = cin;19 end20 21 always @(posedge enable)22 begin23     {cout,sum} = tempa + tempb + tempc;24 end25 26 endmodule

     Compilation编译报告如图1所示:

 

图1  8位加法器(非流水线/FPGA)编译结果

     RTL Viewer 提供设计的逻辑门级原理图和层次结构列表,列出整个设计网表的实例、基本单元、引脚和网络。可过滤显示在视图上的信息,浏览设计视图的不同页面来检查设计并确定应当作的更改。实验一的RTL原理图如图2所示:

图2  8位加法器(非流水线/FPGA)RTL Viewer

     Technology Map Viewer 提供设计的底层或基元级特定技术原理表征。它包括一个原理视图,以及一个层次列表,列出整个设计网表的实例、基本单元、引脚和网络。实验一的Techology Map Viewer结果如图3所示:

图3  8位加法器(非流水线/FPGA)Techology Map Viewer

     Simulation仿真波形如图4所示:

图4  8位加法器(非流水线/FPGA)仿真图

 

 

实验二  FPGA实现8位加法器(采用2级流水线)

     程序清单:

1 /*******************8位2级流水加法器*************************/ 2 module adder_pipeline(cout, sum, ina, inb, cin, enable); 3  4 output cout; 5 output [7:0] sum; 6 input [7:0] ina, inb; 7 input cin, enable; 8  9 reg cout;10 reg [7:0] sum;11 12 reg [3:0] tempa, tempb, firsts;13 reg firstc;14 always @(posedge enable)15 begin16     {firstc,firsts} = ina[3:0] + inb[3:0] + cin;17     tempa = ina[7:4];        //高4位输入寄存,使其与sum低4位在下级流水线同步输入。 tempb = inb[7:4];        //否则sum的高4位,与低四位分两个时钟周期输出18 end19 20 always @(posedge enable)21 begin22     {cout,sum[7:4]} = tempa + tempb + firstc;23     sum[3:0] = firsts;       //不能合并为{cout, sum} = {tempa + tempb + firstc, firsts}; 位宽不匹配24 end25 26 endmodule

     另一个可用版本主体代码如下:

1 reg [4:0] tempa,tempb; 2 reg [3:0] firsts; 3 reg firstc; 4  5 always @(posedge enable) begin     //低4 位相加;  6       { firstc, firsts} = {ina[3], ina[3:0]} + {inb[3], inb[3:0]} + cin ;  7       tempa = {ina[7], ina[7:4]};  //似乎应该高位补零即{1’b0, ina[7:4]};才对 8       tempb = {inb[7], inb[7:4]}; 9 end 10 11 always @(posedge enable) begin     //高4 位相加,并连成8位 12       {cout, sum} = {tempa + tempb + firstc, firsts} ;  13 end

     注:设ina为Mbit,inb为Nbit,则{cout, sum}=a+b为M+N+1位,其中cout占1位,sum为M+N位。

     编译后Total Logic Element为24个。

     RTL原理图如图5所示:

图5  8位加法器(2级流水线/FPGA)RTL Viewer

     Techology Map Viewer结果如图6所示:

图6  8位加法器(2级流水线/FPGA)Techology Map Viewer

     Simulation仿真波形如图7所示:

图7  8位加法器(2级流水线/FPGA)仿真图

 

 

实验三  CPLD实现8位加法器

     程序清单(单always):

1 /*******************8位加法器(非流水线)***********************/ 2 module adder_nonpipe(cout, sum, ina, inb, cin, enable); 3  4 output cout; 5 output [7:0] sum; 6 input [7:0] ina, inb; 7 input cin, enable; 8  9 reg cout;10 reg [7:0] sum;11 12 always @(posedge enable)13 begin14     {cout,sum} = ina + inb + cin;15 end16 17 endmodule

     将Device替换为CPLD器件。在Project Navigator->Hierarchy窗口器件处右键->Device,即可打开器件选择框,选择所需的器件确定即可。此处选择"MAX7000S:EPM7064SLC44-5"。

     Compilation编译报告如图8所示:

 

图8  8位加法器(非流水线/CPLD)编译结果

     Simulation仿真波形如图9所示:

图9  8位加法器(非流水线/CPLD)仿真图-1

     接着考虑双always形式的加法器(程序同实验一,仅器件不同):

     Compile编译后,Total Macrocell为42个。

     仍采用周期为10ns的时钟enable,仿真结果如图10所示:

图10  8位加法器(非流水线/CPLD)仿真图-2

     显然sum值不正确。

     展开Compilation Report下面的Timing Analyzer,多了一项Clock Setup ‘enable’。从右侧报告窗口可观察到最长(最差时序)路径需要13.5ns,对应fmax为74.07MHz,也就是最高工作频率。

图11  8位加法器(非流水线/CPLD)时序分析结果

     将时钟周期改为13.5ns,重新运行仿真,结果如图12所示:

图12  8位加法器(非流水线/CPLD)仿真图-3

     注意:

  1. 单always程序中时钟周期10ns,结果也正确。同时Timing Analysis下不存在Clock Setup ‘enable’,Timing Analysis Tool也无法激活。
  2. 单always程序中,{cout,sum} = tempa + tempb + tempc;的阻塞赋值改为非阻塞赋值,结果并无变化。
  3. 若用FPGA器件实现单always程序,则波形完全正确,如图13所示:

图13  8位加法器(非流水线/CPLD)仿真图-4

          这也符合通常习惯,即一个时钟沿周期采样,下一个时钟沿输出。

 

 

实验四  CPLD实现8位加法器(采用2级流水线)

     程序同实验二,器件选择同实验三。

     编译后Total Macrocell为32个。

     在Timing Analyzer详细报告窗口可观察到那些影响周期恶化的最差时序路径,根据这些信息可找出关键路径并进行时序分析。图14显示Clock Period为9.700ns,Frequency为103.09MHz。

图14  8位加法器(非流水线/CPLD)时序分析结果

     观察第一条路径的时序报告,如图15所示:

 

图15  8位加法器(2级流水线/CPLD)时序报告(局部)

     时钟周期为10ns时,仿真波形如图16所示:

图16  8位加法器(2级流水线/CPLD)仿真图

     该波形与实验三单always程序波形最主要的差别在于,sum=01001010之后一个周期的值是否正确。

     当时钟周期取10ns时,仿真波形与实验三双always程序波形相同,但最高工作频率却由74.07 MHz提高到103.09MHz。可见最高工作频率(系统工作速度)不能单纯由仿真波形判断。

 

 

总结

     1. FPGA中1个逻辑单元(Logic Element )相当于CPLD中0.78个宏单元(MacroCell).

     2. Quartus II中FPGA器件编译速度比CPLD慢得多。

     3. Stratix的最高工作频率大于MAX7000S的的最高工作频率。如实验一二中Timing Analysis Tool均显示Frequency为Restricted to 422.12 MHz(这时不易比较采用流水线和非流水线的最高频率)。

     4. 比较实验一(非流水线)和实验二(流水线)的RTL原理图及工艺映射图,可清楚地看到,流水线技术的本质是在组合逻辑之间插入寄存器,暂存前面的运算结果或输入数据,并在下一个时钟到来时将寄存值作为后一级运算的输入。将流水线规则应用于FPGA中,只需要很少或根本不需要额外的成本。这是因为每个逻辑单元都包含两个触发器,大多数情况下这两个触发器或者没有用到,或者用于存储布线资源,那么就可利用其来实现流水线结构。若采用流水线后,加法器速度仍不能满足需要,可采用串并转换来进一步提高计算的并行度。

 

 

转载地址:http://jbjbo.baihongyu.com/

你可能感兴趣的文章
好程序员HTML5大前端分享web前端面试题集锦二
查看>>
UG中卸载被占用的DLL
查看>>
eclipse 设置注释模板详解,与导入模板方法介绍总结
查看>>
Cocos2d-x3.2 文字显示
查看>>
估计下星期就能考科目二了
查看>>
20 Useful Commands for Linux Newbies
查看>>
轻松实现localStorage本地存储和本地数组存储
查看>>
mongodb group
查看>>
python+selenium自动化测试(二)
查看>>
(笔记 - 纯手敲)Spring的IOC和AOP 含GIT地址
查看>>
7-设计模式介绍
查看>>
让运维更高效:关于ECS系统事件
查看>>
J2EE分布式框架--单点登录集成方案
查看>>
跨域传递参数
查看>>
android 4.2的新特性layoutRtl,让布局自动从右往左显示
查看>>
iOS tableView 下拉列表的设计
查看>>
sharepoint 2010 属性编辑工具 SPCamlEditor 1.5.1
查看>>
JAVA学习笔记--4.多线程编程 part3.JAVA多线程的常见概念和基本类库
查看>>
linux下配置网络环境
查看>>
java Windows7 下环境变量设置
查看>>