fpga的流水线设计(Pipeline Design)、并行处理

流水线含义

如1个器件加工需要三个步骤,1个人干,需要时间时间是t1+t2+t3;如果是流水线,将任务变成三个小模块,三个人每人负责一个模块,完成一个器件的时间就等于max(t1,t2,t3),效率就高了。

目的

速度换面积,提高运行速度。

实现方法

1、组合逻辑插入触发器,模块变小

如要完成
out=a0b0+a1b1+a2b2+a3b3;
1)直接写程序:

module head(
input clk,
input rst_n,
input [7:0] a0,a1,a2,a3,
input [7:0] b0,b1,b2,b3,
output reg [15:0] out
);
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		out<=0;
	else
		out<=a0*b0+a1*b1+a2*b2+a3*b3;
end
endmodule

RTL图参看我的文章
fpga速度(流量、时滞、时序)
流量:16/1。一个周期处理16位
时滞:1个周期
时序:一个乘法器加三个加法器的延时
2)并行化
out=(a0b0+a1b1)+(a2b2+a3b3);
在这里插入图片描述

module head(
input clk,
input rst_n,
<
  • 6
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Xilinx官方翻译的《FPGA并行编程》,本书以10个数字信号处理为例,带我们了解HLS如何使C代码并行运行,深入浅出的将HLS实现方法,硬件设计的考虑 以及系统优化都一一介绍。本书可以在小白仓库微信公众号号免费下载,还可以在Xilinx学术合作找到相应的下载链接。 本人还制作了该书的读书笔记,详情请见《FPGA并行编程》读书笔记专栏启动说明:https://blog.csdn.net/qq_35712169/article/details/99738006 。 本书将着重介绍高层次综合(HLS) 算法的使用并以此完成一些比较具体、细分的FPGA应用。我们的 目的是让读者认识到用HLS创造并优化硬件设计的好处。当然,FPGA并行编程肯定是有别于在多核处理 器、GPU上实行的并行编程,但是一些最关键的概念是相似的,例如,设计者必须充分理解内存层级和带 宽、空间局部性与时间局部性、并行结构和计算与存储之间的取舍与平衡。 本书将更多的作为一个实际应用的向导,为那些对于研发FPGA系统有兴趣的读者提供帮助。对于大学教育来说,这本书将更适用于高阶的本科课程或研究生课程,同时也对应用系统设计师和嵌入式程序员有 所帮助。我们不会对C/C++方面的知识做过多的阐述,而会以提供很多的代码的方式作为示范。另外,读者 需要对基本的计算机架构有所熟悉,例如流水线pipeline),加速,阿姆达尔定律(Amdahl's Law)。以寄存器传输级(RTL)为基础FPGA设计知识并不是必需的,但会对理解本书有所帮助。
在 Verilog 中实现流水线并行处理请求可以通过以下步骤实现: 1. 定义输入和输出端口 首先,在 Verilog 中定义模块的输入和输出端口。在这种情况下,输入端口应包括请求信号和数据信号,输出端口应包括处理完成信号和处理结果信号。例如: module pipeline_module( input request, input [7:0] data_in, output ready, output [7:0] data_out ); 2. 定义内部寄存器和状态 流水线并行处理请求需要使用内部寄存器和状态,以便在不同的处理阶段存储和传递数据。在这个例子中,我们需要定义三个状态:请求接收、数据处理和结果输出。我们还需要定义三个内部寄存器:请求寄存器、数据寄存器和结果寄存器。例如: reg request_reg; reg [7:0] data_reg; reg [7:0] result_reg; reg [1:0] state; 3. 实现状态机 流水线并行处理请求需要使用状态机来控制处理流程。在这个例子中,我们需要实现一个简单的三状态状态机:Idle、Receive 和 Process。例如: always @(posedge clk) begin case(state) 2'b00: // Idle if(request) begin request_reg <= request; data_reg <= data_in; state <= 2'b01; // Receive end 2'b01: // Receive if(ready) begin state <= 2'b10; // Process end 2'b10: // Process result_reg <= process(data_reg); state <= 2'b00; // Idle endcase end 4. 实现处理逻辑 最后,我们需要实现处理逻辑。在这个例子中,我们将 process 函数定义为一个简单的将输入数据加 1 的函数。例如: function [7:0] process(input [7:0] data); begin process = data + 8'b00000001; end endfunction 5. 完整的代码示例: module pipeline_module( input request, input [7:0] data_in, output ready, output [7:0] data_out ); reg request_reg; reg [7:0] data_reg; reg [7:0] result_reg; reg [1:0] state; function [7:0] process(input [7:0] data); begin process = data + 8'b00000001; end endfunction always @(posedge clk) begin case(state) 2'b00: // Idle if(request) begin request_reg <= request; data_reg <= data_in; state <= 2'b01; // Receive end 2'b01: // Receive if(ready) begin state <= 2'b10; // Process end 2'b10: // Process result_reg <= process(data_reg); state <= 2'b00; // Idle endcase end assign data_out = result_reg; assign ready = (state == 2'b01); endmodule

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值