首页 > 代码库 > 采用流水线技术实现8位加法器

采用流水线技术实现8位加法器

 

说明

     本文基于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 begin
16     tempa = ina;
17     tempb = inb;
18     tempc = cin;
19 end
20 
21 always @(posedge enable)
22 begin
23     {cout,sum} = tempa + tempb + tempc;
24 end
25 
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 begin
16     {firstc,firsts} = ina[3:0] + inb[3:0] + cin;
17     tempa = ina[7:4];        //高4位输入寄存,使其与sum低4位在下级流水线同步输入。
tempb = inb[7:4];
//否则sum的高4位,与低四位分两个时钟周期输出 18 end 19 20 always @(posedge enable) 21 begin 22 {cout,sum[7:4]} = tempa + tempb + firstc; 23 sum[3:0] = firsts; //不能合并为{cout, sum} = {tempa + tempb + firstc, firsts}; 位宽不匹配 24 end 25 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 begin
14     {cout,sum} = ina + inb + cin;
15 end
16 
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中,只需要很少或根本不需要额外的成本。这是因为每个逻辑单元都包含两个触发器,大多数情况下这两个触发器或者没有用到,或者用于存储布线资源,那么就可利用其来实现流水线结构。若采用流水线后,加法器速度仍不能满足需要,可采用串并转换来进一步提高计算的并行度。