FPGA 中并发控制器的部分重配置技术解析
1. FPGA 部分重配置的概念
现场可编程门阵列(FPGA)的部分重配置是一个相对较新的概念。目前市面上大多数流行的 FPGA 都支持部分重配置。与传统设计流程不同,原型系统的完整版本通常只实现一次,后续对 FPGA 的更改仅限于设计者预先选择的特定区域。
部分重配置从设计功能角度可分为两种主要类型:
-
静态部分重配置
:在重配置过程中,FPGA 会停止运行。当部分数据被发送到设备时,FPGA 的其余部分处于关闭模式(不活动)。部分配置完成后,设备重新启动。
-
动态部分重配置
:在重配置过程中,FPGA 保持活动状态(不停止)。当设备的一部分正在进行重配置时,FPGA 的其余部分仍在运行。也就是说,动态部分重配置允许在不停止设备的情况下对 FPGA 进行配置。
下面是部分重配置类型的简单表格总结:
| 重配置类型 | FPGA 运行状态 | 特点 |
| ---- | ---- | ---- |
| 静态部分重配置 | 停止 | 重配置时其余部分关闭,完成后重启 |
| 动态部分重配置 | 活动 | 重配置时其余部分仍运行 |
2. 并发系统的部分重配置
对于并发控制系统的部分重配置,假设原型系统至少有两个版本。第一个版本(主版本)仅在 FPGA 中实现一次,其他版本(称为上下文)用于交换设备的部分区域。
这种技术依赖于控制器的分解。上下文实际上是待替换的分解模块的不同版本,我们将这样的模块称为可重配置模块,即原型系统中包含至少两个(或更多)上下文的模块。
例如,一个并发控制系统分解为四个模块,假设模块 C 是可重配置模块且有三个上下文。在 FPGA 初始配置时实现第一个上下文,之后可以使用模块 C 的其他上下文对设备进行部分重配置,并且可以恢复到系统的初始版本。系统中保持不变的部分称为核心,在上述例子中,模块 A、B 和 D 构成核心,因为它们不是可重配置模块。
需要注意的是,可重配置模块在所有上下文中的输入和输出数量应该保持恒定,所有该模块任何版本使用的输入和输出信号都应在所有上下文中指定。
3. 静态部分重配置
静态部分重配置的原型设计流程包括以下步骤:
1.
系统规格定义
:通过解释 Petri 网指定并发控制系统(并发控制器)的第一个版本。
2.
分解与同步
:对并发控制器进行分解和同步。
3.
建模
:对并发控制器的第一个版本进行建模。
4.
验证
:验证并发控制器的第一个版本。
5.
准备额外上下文
:
- 为每个可重配置模块指定新上下文。
- 对新上下文进行建模。
- 验证包含新上下文的并发控制器。
- 验证之前的上下文。
6.
系统实现
:
- 对并发控制器的核心进行逻辑综合。
- 对每个可重配置模块的每个上下文进行逻辑综合。
- 为可重配置模块分配 FPGA 区域。
- 将核心与所有上下文进行逻辑实现。
- 为控制器的每个版本生成位流。
- 使用核心和可重配置模块的第一个上下文(上下文)对 FPGA 进行物理实现。
7.
部分重配置
:使用选定的上下文对 FPGA 进行部分重配置。
下面是静态部分重配置流程的 mermaid 流程图:
graph LR
A[系统规格定义] --> B[分解与同步]
B --> C[建模]
C --> D[验证]
D --> E[准备额外上下文]
E --> F[系统实现]
F --> G[部分重配置]
以铣床为例,初始时第三个组件负责从木板上切割正方形,通过静态部分重配置可以将其更改为切割“U 形”。逻辑综合和实现后会生成四个配置文件:第一个上下文的完整位流、第二个上下文的完整位流、第一个上下文的部分位流和第二个上下文的部分位流。系统最初使用其中一个完整位流在 FPGA 中物理实现,后续可以使用部分位流进行重配置,改变铣床的切割形状。
4. 动态部分重配置
动态部分重配置与静态重配置不同,系统在部分设计交换时仍在运行,因此有额外的条件和限制。
从原型系统的功能角度来看,主要问题是选择可重配置区域。通常不建议对整个模块进行重配置,对于由 Petri 网指定的控制器,分解模块的位置会与所有标记相交,因此在不停止系统的情况下,特定状态机组件(SMC)的位置无法动态重配置。但分解模块的所有位置是顺序相关的,利用这一特性可以将包含可重配置区域的模块分为动态和静态两部分,动态部分包含待交换的位置,静态部分保持不变,由于两部分是顺序的,因此可以安全地进行重配置。
动态部分重配置的原型设计流程如下:
1.
系统规格定义
:通过解释 Petri 网指定并发控制系统(并发控制器)的第一个版本。
2.
分解与同步
:对并发控制器进行分解和同步。
3.
准备可重配置区域
:
- 选择可重配置区域。
- 为系统补充重配置信号:重配置请求(Rec 或 rec)和重配置允许(Ral 或 ral)。
- 根据选择将模块拆分为静态和动态子模块(部分)。
- 配置动态子模块中的复位信号。
4.
建模
:对并发控制器的第一个版本进行建模。
5.
验证
:验证并发控制器的第一个版本。
6.
准备额外上下文
:
- 为动态子模块指定新上下文。
- 对新上下文进行建模。
- 验证包含新上下文的并发控制器。
- 验证之前的上下文。
7.
系统实现
:
- 对并发控制器的核心进行逻辑综合。
- 对每个动态子模块的每个上下文进行逻辑综合。
- 为动态子模块分配 FPGA 区域。
- 将核心与所有上下文进行逻辑实现。
- 为控制器的每个版本生成位流。
- 使用核心和动态子模块的第一个上下文(上下文)对 FPGA 进行物理实现。
8.
部分重配置
:使用选定的上下文对 FPGA 进行部分重配置。
下面是动态部分重配置流程的 mermaid 流程图:
graph LR
A[系统规格定义] --> B[分解与同步]
B --> C[准备可重配置区域]
C --> D[建模]
D --> E[验证]
E --> F[准备额外上下文]
F --> G[系统实现]
G --> H[部分重配置]
以一个由解释 Petri 网 PN8 指定的并发控制系统为例,分解后得到两个 SMC。选择第一个模块的部分区域作为动态部分,补充重配置信号,将模块拆分为静态和动态子模块。对系统进行建模和验证后,为动态子模块准备新上下文,例如将原来的位置 p4 和 p5 替换为 p7、p8 和 p9,并添加新的输出信号。
再以铣床为例,尝试动态重配置负责从木板上切割形状的部分(模块 S3)。在木板准备期间进行动态重配置,补充重配置信号 rec 防止系统出现意外行为。新上下文改变了切割形状,例如切割“U 形”,同时更新之前的上下文。综合和逻辑实现后生成四个位流,在更换木板时动态进行部分重配置。
以下是模块 S1(PN8)的静态和动态子模块的代码描述:
module S1(y1 ,y3 ,y4 ,y5 ,z1 ,z3 ,z4 ,ral ,clk ,reset ,z2 ,z5 ,rec );
output y1 ,y3 ,y4 ,y5 ,z1 ,z3 ,z4 ,ral;
input clk ,reset ,z2 ,z5 ,rec;
S1_static S1_s (y1 ,y3 ,ral ,z1 ,z3 ,clk ,reset ,z2 ,z4 ,z5 ,rec );
S1_dynamic S1_d (y4 ,y5 ,z4 ,clk , reset |( ral&rec),z3 ,z5 ,rec );
endmodule
module S1_static (y1 ,y3 ,ral ,z1 ,z3 ,clk ,reset ,z2 ,z4 ,z5 ,rec );
output y1 ,y3 ,ral ,z1 ,z3;
input clk ,reset ,z2 ,z4 ,z5 ,rec;
reg [1:0] state =0, next =0;
parameter p1 =2’b00 ,
p3 =2’b01 ,
nop_r =2’ b11;
always@ ( posedge clk or posedge reset )
if ( reset )
state <= p1;
else
state <= next ;
always@ ( state or z2 or z4 or z5 or rec)
case ( state )
p1:next <=( z2 )? p3:p1;
p3:next <=(! rec )? nop_r :p3;
nop_r :next <=( z4 && z5 )? p1: nop_r ;
default :next <= p1;
endcase
assign {y1 ,z1 }=( state == p1 )?2 ’ b11 :2’ b00;
assign {y3 ,z3 }=( state == p3 )?2 ’ b11 :2’ b00;
assign ral =( state == p1 || state == p3 )?1 ’ b1 :1’ b0;
endmodule
module S1_dynamic (y4 ,y5 ,z4 ,clk ,reset ,z3 ,z5 ,rec );
output y4 ,y5 ,z4;
input clk ,reset ,z3 ,z5 ,rec;
reg [1:0] state =0, next =0;
parameter nop_s =2’b00 ,
p4 =2’b01 ,
p5 =2’ b11;
always@ ( posedge clk or posedge reset )
if ( reset )
state <= nop_s ;
else
state <= next ;
always@ ( state or z3 or z5 or rec)
case ( state )
nop_s :next <=( z3 && !rec )? p4: nop_s ;
p4:next <= p5;
p5:next <=( z5 )? nop_s :p5;
default :next <= nop_s ;
endcase
assign y4 =( state == p4 )?1 ’ b1 :1’ b0;
assign {y5 ,z4 }=( state == p5 )?2 ’ b11 :2’ b00;
endmodule
通过以上对 FPGA 中并发控制器的静态和动态部分重配置技术的介绍,我们可以看到这些技术为系统的灵活性和可扩展性提供了强大的支持,能够根据不同的需求动态或静态地改变系统的功能。
FPGA 中并发控制器的部分重配置技术解析(续)
5. 动态与静态部分重配置的对比
为了更清晰地理解动态部分重配置和静态部分重配置的区别,我们可以通过以下表格进行对比:
| 对比项 | 静态部分重配置 | 动态部分重配置 |
| ---- | ---- | ---- |
| 系统运行状态 | 重配置时系统停止,完成后重启 | 重配置时系统仍在运行 |
| 可重配置区域选择 | 可针对整个可重配置模块 | 需将模块拆分为动态和静态部分,只对动态部分进行重配置 |
| 重配置信号 | 一般无需额外重配置信号 | 需要重配置请求(Rec 或 rec)和重配置允许(Ral 或 ral)信号 |
| 应用场景 | 适用于对系统停机时间要求不高的场景 | 适用于需要系统持续运行,不能停机的场景 |
从表格中可以看出,两种重配置方式各有优缺点,在实际应用中需要根据具体的系统需求和场景来选择合适的重配置方式。
6. 部分重配置技术的应用优势
FPGA 中并发控制器的部分重配置技术具有多方面的应用优势:
-
提高系统灵活性
:通过部分重配置,可以在不改变整个系统设计的情况下,动态或静态地改变系统的部分功能。例如在铣床的例子中,可以根据不同的加工需求,灵活地改变切割形状,而无需重新设计整个控制系统。
-
降低成本
:由于只需要对部分区域进行重配置,而不是重新实现整个系统,因此可以减少硬件资源的使用和开发成本。同时,也可以提高系统的可维护性,降低维护成本。
-
增强系统适应性
:在一些实时性要求较高的应用场景中,动态部分重配置可以使系统在运行过程中根据实际情况及时调整功能,提高系统的适应性和响应速度。
7. 部分重配置技术的挑战与应对策略
虽然部分重配置技术具有很多优势,但也面临一些挑战:
-
重配置信号管理
:在动态部分重配置中,重配置请求和重配置允许信号的管理至关重要。如果信号管理不当,可能会导致系统出现意外行为。应对策略是在设计过程中,仔细规划重配置信号的逻辑,确保其在重配置过程中能够正确地控制系统的运行。
-
上下文验证与更新
:当为可重配置模块或动态子模块添加新上下文时,需要对之前的上下文进行验证和更新。这是因为新上下文可能会引入新的输入和输出信号,需要确保所有上下文的兼容性。应对策略是建立完善的验证机制,在添加新上下文时,对整个系统进行全面的验证。
-
硬件资源分配
:在为可重配置模块或动态子模块分配 FPGA 区域时,需要合理规划硬件资源,确保重配置过程的顺利进行。如果资源分配不合理,可能会导致重配置失败或系统性能下降。应对策略是在设计过程中,进行充分的资源评估和规划,根据模块的大小和功能需求,合理分配 FPGA 区域。
8. 总结与展望
FPGA 中并发控制器的部分重配置技术为系统设计带来了更高的灵活性和可扩展性。通过静态和动态部分重配置,可以根据不同的应用需求,灵活地改变系统的部分功能,提高系统的适应性和响应速度。同时,部分重配置技术也面临一些挑战,需要在设计过程中加以解决。
未来,随着 FPGA 技术的不断发展,部分重配置技术有望得到进一步的优化和完善。例如,可能会出现更高效的重配置算法和更智能的重配置信号管理机制,进一步提高部分重配置的效率和可靠性。此外,部分重配置技术也有望在更多的领域得到应用,如工业自动化、通信、航空航天等,为这些领域的发展带来新的机遇。
综上所述,掌握 FPGA 中并发控制器的部分重配置技术,对于提高系统设计的质量和效率具有重要意义。无论是在学术研究还是工程实践中,都值得我们深入探索和应用。
超级会员免费看
1万+

被折叠的 条评论
为什么被折叠?



