FPGA之流水线思想

                                                      FPGA之流水线思想(含代码)

本文主要涉及以下几个问题:

1:什么是流水线

2:流水线使用场景

3:一个例子来说明流水线

 

1:CASE1: 例如工厂要对一个产品进行组装,分为A,B,C三步,以往是一个人负责这三步。这三步分别用时T1,T2,T3。且一个人完成所有步骤后才能发出通知:我完成这个产品了,其他部门只有接收到这个通知后才能继续生产零部件供应下一次的生成。有一天领导觉得这样似乎效率低了,于是想出一个办法:每个人只负责这三个步骤中的一个,且以每步最长完成时间为通知标志,以往发出完成标志的时间是T1+T2+T3,假如T2的时间最长。那么改进后的时间就为T2了。生成效率大大提高。

CASE2:术业有专攻,这个工厂的工人不是对产品组装的每一步都熟练掌握,他只会其中的一步,这样会A的到A部门,会B的到B部门,会C的到C部门。这样就解决了这个问题。

2:回到FPGA中,有时候组合逻辑过长势必会造成很大的延时,而系统的时钟频率的限制往往由这些关键路径延时来决定的,如果时钟频率过快,那一个clock的边沿到来时,组合逻辑的信号还没有传到端口或者传到后建立时间没有满足会产生亚稳态。这时把一个组合逻辑拆成几块,每一块插入一个寄存器用来暂时存储当前数据。这样可以提升工作频率。还有就是数据位宽和需要的计算位宽不一致的问题,如存储器位宽只有8位,我们想要进行16位的运算这时候可以借助流水线的思想去做。流水线用一个此词来概括就是“拆分”

3:以8位加法为例,对比一下不用流水线和用流水线的区别。

RTL设计

module	add8_2(
	input	wire		sclk,
	input	wire		rst_n,
  	input	wire		cin,
	input	wire	[7:0]   cina,
  	input	wire	[7:0]   cinb,  
  	output	wire	[7:0]  	sum,
  	output  wire	        cout,
  	output	wire	[7:0]  	sum_normal	 
);
	reg            cout_reg;
	reg   [7:0]    sum_reg;
  	reg            cout1; //插入的寄存器 
 	reg   [3:0]    sum1 ; //插入的寄存器
  	reg   [3:0]    cina_reg;
  	reg   [3:0]    cinb_reg;//插入的寄存器

  //流水线
  always @(posedge sclk or negedge rst_n) //第一级流水
  	if(rst_n == 1'b0)begin
  		cout1 <= 1'b0;
  		sum1 <= 4'd0;
  	end
  	else	begin
    	{cout1 , sum1} <= cina[3:0] + cinb [3:0] + cin ;
 	 	end
  
  always @(posedge sclk or negedge rst_n)
  		if(rst_n == 1'b0)begin
  			cina_reg <= 4'd0;
  			cinb_reg <= 4'd0;
  		end
		else begin
    		cina_reg <= cina[7:4];
  		 	cinb_reg <= cinb[7:4];
  		end
  
  always @(posedge sclk or rst_n ) //第二级流水
  		if(rst_n == 1'b0)begin
  			cout_reg <=1'b0;
  			sum_reg <=8'd0;
  		end
		else 
  			{cout_reg,sum_reg[7:0]}	<= {{1'b0,cina_reg[3:0]}+{1'b0,cinb_reg[3:0]+cout1,sum1[3:0]}};
    		
  		
assign	cout = cout_reg;
assign 	sum = sum_reg;
assign 	sum_normal = cina+cinb+cin;//无流水线,纯组合逻辑

endmodule	
		

仿真测试代码:

`timescale	1ns/1ns
module tb_add8_2;
reg					sclk;
reg					rst_n;
reg					cin;
reg			[7:0]		cin_a;
reg			[7:0]		cin_b;

initial	begin
			sclk=0;
			rst_n=0;
			cin=1;
			cin_a=2;
			cin_b=3;
			#20
			rst_n=1;						
end

initial begin
	#30
	data_ina();	
end
initial	begin
	#30;
	data_inb();		
	end
	
always #10 sclk	= ~sclk;

task	data_ina();
		integer i;
		begin
			for(i=0;i<256;i=i+1)
				begin
					@(posedge sclk)
					cin_a<=i;					
				end	
		end	
endtask

task data_inb();
		integer j;
		begin
		for(j=1;j<254;j=j+1)
			begin
				@(posedge sclk)				
				cin_b<=j;
				cin<=cin_b[0];				
			end	
		end	
endtask
add8_2  add8_2_inst(
	.sclk			(sclk),
	.rst_n			(rst_n),
	.cin			(cin),
	.cina			(cin_a),
	.cinb			(cin_b),
	.sum			(),
	.sum_normal		(),
	.cout			()
);

endmodule

先在quartus下看看RTL级的结构,这里没有加流水线的的未考虑计算溢出,但不影响分析。可以看到把最下面没有加流水线的分成两步。

如下红色部分是流水线部分

      如下红色部分是未加入流水线部分

如下图是逻辑仿真图,可以看到加入一级流水线第一个数据的输出要比未加入流水线的要延迟两个时钟周期,但是之后就没有再增加延迟了,单看计算使用流水线不但没有减少计算时间反而增加了。但是提高了整个系统的频率,其他行为可以提升操作速度,不用再等速度慢的操作。加入流水线后消耗了寄存器资源,拿面积换取速度。

 

  • 12
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: FPGA(现场可编程门阵列)是一种可重构的半导体器件,可以根据需要进行现场编程和重新配置的芯片。它具有灵活性高、性能强和功耗低的特点,广泛应用于数字电路设计和嵌入式系统等领域。 乘法是在数字电路设计中常见的运算操作,而在FPGA中实现乘法运算可以利用流水线技术来提高计算速度和系统性能。 流水线是一种将复杂操作分解为多个子操作,并将这些子操作按顺序依次处理的技术。在乘法运算中,可以将乘法操作分解为多个阶段,每个阶段只处理乘法的一部分。这样,整个乘法操作可以同时进行不同阶段的处理,从而提高计算效率。 以一个简单的4位乘法为例,可以将乘法操作分解为四个阶段:部分乘法、部分积累加、全加运算和结果输出。 在部分乘法阶段,将被乘数和乘数按位相乘,得到局部部分积。在部分积累加阶段,将不同位的部分乘积累加起来。在全加运算阶段,将累加的部分积进行全加运算,得到最终乘积的各位。在结果输出阶段,将最终乘积输出。 通过流水线技术,每个阶段可以并行进行,不同阶段的操作可以同时执行。这样,即使整个乘法操作需要多个周期才能完成,但每个周期可以处理不同的部分,大大提高了计算速度和系统性能。 总而言之,FPGA乘法流水线利用了流水线技术来将复杂的乘法操作分解为多个阶段并同时进行,以提高计算速度和系统性能。它是在FPGA中实现乘法的一种有效方法。 ### 回答2: FPGA是一种可编程逻辑器件,可以通过编程来实现特定的功能。在FPGA中进行乘法运算时,可以采用流水线的方式来提高运算速度和效率。 流水线是一种将复杂运算任务分解为多个简单子任务并按顺序执行的方法。在FPGA乘法运算中,可以将乘法操作分解为若干个阶段,并将每个阶段的计算结果依次传递给下一个阶段,从而实现乘法运算的流水线。 乘法运算的流水线通常包括以下几个阶段:输入寄存器、乘法器、累加器和输出寄存器。在输入寄存器阶段,将待乘的数值存储在寄存器中。然后,在乘法器阶段,对输入的数值进行乘法运算,得到乘积的部分结果。接下来,在累加器阶段,将乘积的部分结果进行累加,得到最终的乘积结果。最后,在输出寄存器阶段,将乘积结果存储在寄存器中,以供后续的操作使用。 通过流水线的方式进行乘法运算,可以将一个乘法操作分解为多个较为简单的任务,每个任务只需完成一部分计算,从而大大提高了乘法运算的速度和效率。在FPGA中,由于可以对硬件进行自定义编程,可以根据具体需求来设计和优化乘法运算的流水线,以获得更好的性能和功耗。 总结来说,FPGA乘法运算可以通过流水线的方式来实现,将乘法操作分解为多个阶段,并依次执行,从而提高了运算速度和效率。通过优化流水线的设计,可以进一步提升性能和功耗。 ### 回答3: FPGA代表现场可编程门阵列(Field-Programmable Gate Array),乘法是其在数字电路设计中的一种基本运算。而流水线则是一种常用的技术,在各种计算系统中可以提高计算效率。 FPGA中的乘法运算是基于所谓的乘法器单元实现的。乘法器单元是FPGA芯片中的一部分硬件,用于执行乘法操作。使用FPGA进行乘法运算相比于使用通用处理器的软件实现,可以提供更高的性能和更低的功耗。此外,FPGA芯片中可以包含多个乘法器单元,从而可以并行执行多个乘法操作,进一步提高计算速度。 为了进一步提高计算效率,可以使用流水线技术。流水线是一种将计算任务分为多个阶段的方法,每个阶段依次执行任务的一部分。在乘法运算中,可以将乘法操作划分为多个阶段,例如乘法器准备、乘法器执行和结果输出的阶段。每个阶段可以并行执行,并在下一个阶段开始之前完成其任务。通过使用流水线,可以使乘法操作的整体延迟减少,并提高整体性能。 总的来说,FPGA乘法运算可以通过乘法器单元硬件实现,并通过使用流水线技术进一步优化。这种方法可以提供高性能和低功耗的乘法运算,适用于在许多数字电路设计中需要进行大量乘法运算的应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值