FPGA 与 Verilog 基础
FPGA(可编程逻辑器件)是构建数字电路的核心组件,Verilog 作为硬件描述语言,用于定义其逻辑结构。本文基于纯 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
// 构建结果
assign result = {a[31], exp_a, sum_mantissa[22:0]};
endmodule
数制转换桥梁
浮点数转整数
模块 e02_float_to_int 将浮点数转换为整数形式,适用于电机转速控制等需要整数输出量的场景。
整数转浮点数
模块 e03_int_to_float 实现整数到浮点数的转换,利用浮点数更宽的表示范围避免高精度运算中的精度损失。
PID 控制算法
PID(比例积分微分)是工业控制中确保系统稳定性和响应速度的关键算法。模块 e04_pid 通过 P、I、D 三个参数的调节,使系统快速稳定达到目标状态。
验证工具与文档
- fpu.pdf:浮点数计算功能应用说明。
- pid_mat.m:MATLAB 脚本,用于计算 PID 公式并与 FPGA 结果对比。
- u_n_result_mat.xlsx:MATLAB 的 PID 计算输出结果记录。
- 浮点数 - 整数转换.exe:辅助调试工具。
所有工程均包含 Testbench 激励,可直接在 FPGA 开发环境中进行 RTL 仿真验证。


