FPGA 数字运算与控制:浮点数及 PID 实现
FPGA(现场可编程门阵列)是一种可编程逻辑器件,可用于实现各种数字电路。Verilog 作为硬件描述语言,用于描述数字电路的结构和行为,是编写 FPGA 逻辑设计代码的主要工具。
项目资源清单
本资料包包含以下核心工程与辅助文件:
- e01_fpu_single_precision_float:单精度浮点数计算单元(加减乘除开方),Altera 工程代码。
- e02_float_to_int:浮点数转整数,Altera 工程代码。
- e03_int_to_float:整数转浮点数,Altera 工程代码。
- e04_pid:PID 计算,Altera 工程代码。
- fpu.pdf:功能应用说明文件。
- pid_mat.m:MATLAB 文件,用于计算 PID 公式并与 FPGA 结果对比。
- u_n_result_mat.xlsx:MATLAB 的 PID 计算输出结果。
- 浮点数 - 整数转换.exe:浮点数和整数转换的小工具。
注:所有工程均带有激励 Testbench,支持 RTL Simulation 仿真验证。所有代码均为纯 Verilog,未使用 IP 核。
单精度浮点数运算
单精度浮点数使用 32 位二进制表示,广泛应用于数字信号处理等领域。e01_fpu_single_precision_float 工程实现了加减乘除和开方运算。
加法示例
以下为简化后的浮点加法 Verilog 代码示意:
module float_addition (
input wire [31:0] a,
input wire [31:0] b,
output reg [31:0] result
);
// 提取符号位、指数位和尾数位
wire [30:23] exp_a = a[30:23];
wire [22:0] mantissa_a = a[22:0];
wire [30:23] exp_b = b[30:23];
wire [22:0] mantissa_b = b[22:0];
// 比较指数大小,对尾数进行对齐
reg [22:0] aligned_mantissa_a;
reg [22:0] aligned_mantissa_b;
if (exp_a > exp_b) begin
aligned_mantissa_a = mantissa_a;
aligned_mantissa_b = mantissa_b >> (exp_a - exp_b);
end else begin
aligned_mantissa_a = mantissa_a >> (exp_b - exp_a);
aligned_mantissa_b = mantissa_b;
end
// 尾数相加
reg [23:0] sum_mantissa = {1'b1, aligned_mantissa_a} + {1'b1, aligned_mantissa_b};
// 处理溢出和规格化
if (sum_mantissa[23]) begin
sum_mantissa = sum_mantissa >> 1;
exp_a = exp_a + 1;
end
// 构建结果
result = {a[31], exp_a, sum_mantissa[22:0]};
endmodule
该过程先提取符号位、指数位和尾数位,通过比较指数来对齐尾数,然后相加,最后处理溢出并规格化得到结果。
数制转换
- 浮点数转整数 (
e02_float_to_int):将浮点数转化为整数的表示形式,适用于电机转速控制等需要整数输出量的场景。 - 整数转浮点数 (
e03_int_to_float):将整数转化为浮点数,利用浮点数更宽的表示范围避免高精度运算中的精度损失。
PID 控制算法
PID(比例积分微分)是工业控制中常用的控制算法。e04_pid 工程实现了 PID 计算功能,通过 P、I、D 三个参数的调节,使系统能够快速稳定地达到目标状态。


