流水线加法器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
module add_line (a,b,clk,out);
parameter width=16,
width1=8, //lsb
width2=8; //msb
// r3 r1 input [width-1:0] a; //a<=00010111_00000001
input [width-1:0] b; //b<=11111111_00000000
output [width:0] out; // r4 r2
input clk;
reg [width1-1:0] r1,r2,r5;
reg [width2-1:0] r3,r4,r6;
reg c1,c2;
reg [width:0] sum;
always @(posedge clk) //---first
begin
r1[width1-1:0]=a[width1-1:0]; //
r2[width1-1:0]=b[width1-1:0]; //
r3[width2-1:0]=a[width-1:width1];
r4[width2-1:0]=b[width-1:width1];
end
always @(posedge clk) //---- second
begin
{c1,r5}=r1+r2;
{c2,r6}=r3+r4+c1;
sum={c2,r5,r6};
end
assign out=sum;
endmodule
图Ⅰ
图Ⅱ
上图Ⅱ是没有assign out=sum;时的rtl级仿真结果;
错误1:Warning (10034): Output port "out[1]" at add_line.v(9) has no driver
原因:out没有驱动,out根本就没有用;
错误2:
永远有多远(1057978105) 10:43:30
这样不好有时序又有组合
永远有多远(1057978105) 10:46:04
最好把它都放在时序里面width改成width0
★(1003704680) 10:47:54
那个地方是时序,哪个地方是组合
永远有多远(1057978105) 10:48:17
always 时序assign组合
module add_line (a,b,clk,out);
parameter width=16,
width1=8, //lsb
width2=8; //msb
// r3 r1
input [width-1:0] a; //a<=00010111_00000001
input [width-1:0] b; //b<=11111111_00000000
output [width:0] out; // r4 r2
input clk;
reg [width1-1:0] r1,r2,r5;
reg [width2-1:0] r3,r4,r6;
reg c1,c2;
reg [width:0] out;
always @(posedge clk) //---first
begin
r1[width1-1:0]<=a[width1-1:0]; //
r2[width1-1:0]<=b[width1-1:0]; //
r3[width2-1:0]<=a[width-1:width1];
r4[width2-1:0]<=b[width-1:width1];
end
always @(posedge clk) //---- second
begin
{c1,r5}<=r1+r2;
{c2,r6}<=r3+r4+c1;
out<={c2,r5,r6};
end
endmodule
图Ⅲ
上图用阻塞赋值的rtl;
图Ⅳ
上图是用非阻塞赋值的rtl;
下图是用非阻塞赋值运算结果:有两个地方进位错误!第一个进位推迟一个时钟;
图Ⅴ
下图是用阻塞赋值结果:
图Ⅵ
错误原因:非阻塞赋值语句中,数值的转移须等到下一个时钟周期;
与组合逻辑的比较:
module add(a,b,sum);
input [15:0] a,b;
output [16:0] sum;
assign sum=a+b;
Endmodule
图Ⅶ
所谓流水线设计实际上就是把规模较大、层次较多的组合逻辑电路分为几个级,在每
一级插入寄存器组暂存中间数据。
K 级的流水线就是从组合逻辑的输入到输出恰好有K 个寄存器组(分为K 级,每一级都有一个寄存器组)上一级的输出是下一级的输入而又无反馈的电路。
图5.6 表示了如何将把组合逻辑设计转换为相同组合逻辑功能的流水线设计。
这个组合逻辑包括两级。
第一级的延迟是T1 和T3 两个延迟中的最大值;第二级的延迟等于T2 的延迟。
为了通过这个组合逻辑得到稳定的计算结果输出,需要等待的传播延迟为
[max(T1,T3)+T2]个时间单位。
在从输入到输出的每一级插入寄存器后,流水线设计的第一级寄存器所具有的总的延迟为T1 与T3 时延中的最大值加上寄存器的Tco(触发时间)。
同样,第二级寄存器延迟为T2 的时延加上Tco。
采用流水线设计为取得稳定的输出总体计
算周期为:
max(max(T1,T3)+Tco,(T2+Tco))
流水线设计需要两个时钟周期来获取第一个计算结果,而只需要一个时钟周期来获取随后的计算结果。
开始时用来获取第一个计算结果的两个时钟周期被称为采用流水线设计的首次延迟(latency)。
对于CPLD 来说,器件的延迟如T1、T2 和T3 相对于触发器的Tco 要长得多,并且寄存器的建立时间Tsu 也要比器件的延迟快得多。
只有在上述关于硬件时延的假设为真的情况下,流水线设计才能获得比同功能的组合逻辑设计更高的性能。
采用流水线设计的优势在于它能提高吞吐量(throughput)。
假设T1、T2 和T3 具有同样的传递延迟Tpd。
对于组合逻辑设计而言,总的延迟为2*Tpd。
对于流水线设计来说,计算周期为(Tpd+Tco)。
前面提及的首次延迟(latency)的概念实际上就是将(从输入到输出)最长的路径进行初始化所需要的时间总量;吞吐延迟则是执行一次重复性操作所需要的时间总量。
在组合逻辑设计中,首次延迟和吞吐延迟同为2*Tpd。
与之相比,在流水线设计中,首次延迟是2*(Tpd+Tco),而吞吐延迟是Tpd+Tco。
如果CPLD 硬件能提供快速的
Tco,则流水线设计相对于同样功能的组合逻辑设计能提供更大的吞吐量。
典型的富含寄存器资源的CPLD 器件(如Lattice 的ispLSI 8840)的Tpd 为8.5ns,Tco 为6ns。
流水线设计在性能上的提高是以消耗较多的寄存器资源为代价的。
对于非常简单的用于数据传输的组合逻辑设计,例如上述例子,将它们转换成流水线设计可能只需增加很少的寄存器单元。
随着组合逻辑变得复杂,为了保证中间的计算结果都在同一时钟周期内得到,必须在各级之间加入更多的寄存器。
如果需要在CPLD 中实现复杂的流水线设计,以获取更优良的性能,具有丰富寄存器资源的CPLD 结构并且具有可预测的延迟这两大特点的FPGA 是一个很有吸引力的选择。