news 2026/5/8 20:24:30

从零到一:用Verilog在FPGA上实现MIPS处理器的乘除法单元(含完整测试激励)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零到一:用Verilog在FPGA上实现MIPS处理器的乘除法单元(含完整测试激励)

从零到一:用Verilog在FPGA上实现MIPS处理器的乘除法单元(含完整测试激励)

当你在单周期MIPS模型机上成功运行了基本的算术逻辑指令后,下一步自然要挑战更复杂的乘除法运算。这不仅是CPU设计的核心功能,更是理解计算机体系结构的关键一步。本文将带你从理论到实践,完整实现一个可验证的乘除法单元。

1. MIPS乘除法指令的精髓

MIPS架构中,乘除法指令采用特殊的Hi/Lo寄存器设计。与常规算术指令不同,乘法运算会产生64位结果(存储在Hi和Lo两个32位寄存器中),而除法运算则同时产生商和余数。这种设计在硬件实现上既高效又优雅。

典型的MIPS乘除法指令包括:

  • mult rs, rt:带符号乘法
  • multu rs, rt:无符号乘法
  • div rs, rt:带符号除法
  • divu rs, rt:无符号除法

关键细节:乘法的64位结果中,Hi存高32位,Lo存低32位;除法的结果中,Lo存商,Hi存余数。

2. 硬件架构改造方案

要在现有单周期MIPS数据通路上添加乘除法功能,需要三个关键改造:

2.1 Hi/Lo寄存器模块

`include "define.v" module HiLo ( input wire rst, input wire clk, input wire [31:0] wHiData, input wire [31:0] wLoData, input wire whi, // Hi写使能 input wire wlo, // Lo写使能 output reg [31:0] rHiData, output reg [31:0] rLoData ); reg [31:0] hi, lo; // 内部存储 always@(*) begin if(rst) begin rHiData <= 0; rLoData <= 0; end else begin rHiData <= hi; rLoData <= lo; end end always@(posedge clk) begin if(!rst && whi) hi <= wHiData; if(!rst && wlo) lo <= wLoData; end endmodule

2.2 执行单元(EX)扩展

EX模块需要新增乘除法运算逻辑:

always@(*) begin // 默认值 whi = 0; wlo = 0; wHiData = 0; wLoData = 0; case(op_i) `Mult: begin // 带符号乘法 whi = 1; wlo = 1; {wHiData, wLoData} = $signed(regaData) * $signed(regbData); end `Multu: begin // 无符号乘法 whi = 1; wlo = 1; {wHiData, wLoData} = regaData * regbData; end `Div: begin // 带符号除法 whi = 1; wlo = 1; wHiData = $signed(regaData) % $signed(regbData); wLoData = $signed(regaData) / $signed(regbData); end `Divu: begin // 无符号除法 whi = 1; wlo = 1; wHiData = regaData % regbData; wLoData = regaData / regbData; end endcase end

2.3 指令译码(ID)适配

ID模块需要识别新增的乘除法指令:

`Inst_mult: begin op = `Mult; regaRead = 1; // 读取rs regbRead = 1; // 读取rt regcWrite = 0; // 结果不写回通用寄存器 end `Inst_divu: begin op = `Divu; regaRead = 1; regbRead = 1; regcWrite = 0; end // 其他乘除法指令类似...

3. 关键实现技巧与陷阱规避

3.1 符号处理的玄机

  • 带符号运算必须使用$signed()转换
  • 特别注意负数除法的舍入方向
  • 乘法结果扩展时要注意符号位

3.2 常见实现陷阱

  1. 复位信号处理:必须正确初始化所有中间寄存器
  2. 使能信号控制:乘除法指令执行期间要确保Hi/Lo写使能准确
  3. 数据通路冲突:当连续执行乘除法指令时,要处理好数据依赖

经验之谈:在EX模块中,所有控制信号都应该有明确的默认值,避免生成锁存器。

3.3 性能优化思路

虽然本文实现的是单周期设计,但实际项目中可以考虑:

  • 多周期乘除法器(节省面积)
  • Booth算法优化(提高速度)
  • 流水线化设计(提高吞吐量)

4. 完整测试方案设计

一套好的测试激励应该覆盖以下场景:

测试类型操作数A操作数B预期结果
无符号乘法0x000011000x00000020Hi:0x00000000 Lo:0x00022000
带符号乘法0xFFFF00000x00000020Hi:0xFFFFFFFF Lo:0xFFE00000
无符号除法0x000011000x00000020Hi:0x00000000 Lo:0x00000088
带符号除法0xFFFF00000x00000020Hi:0x00000000 Lo:0xFFFFF800

测试指令序列示例:

initial begin // 初始化操作数 instmem[0] = 32'h34011100; // ori $1, $0, 0x1100 instmem[1] = 32'h34020020; // ori $2, $0, 0x0020 // 无符号乘法测试 instmem[2] = 32'b000000_00001_00010_00000_00000_011001; // multu $1, $2 // 带符号乘法测试 instmem[3] = 32'h3407FFFF; // ori $7, $0, 0xFFFF instmem[4] = 32'b000000_00000_00111_00111_10000_000000; // sll $7, $7, 16 instmem[5] = 32'b000000_00111_00010_00000_00000_011000; // mult $7, $2 // 除法测试... end

仿真波形检查要点:

  1. 确认Hi/Lo寄存器的写入时机
  2. 验证运算结果的正确性
  3. 检查控制信号的同步性

5. 进阶扩展方向

完成基础实现后,可以考虑以下增强功能:

  1. 移动指令支持

    • mfhi rd:将Hi寄存器值移动到通用寄存器
    • mflo rd:将Lo寄存器值移动到通用寄存器
  2. 异常检测

    • 除零异常处理
    • 溢出检测
  3. 性能计数器

    • 统计乘除法指令执行周期数
    • 资源占用监控
// mfhi指令实现示例 `Inst_mfhi: begin op = `Mfhi; regcData = rHiData; // 从Hi寄存器读取 regcWrite = 1; end

实现一个完整的乘除法单元不仅是FPGA设计的绝佳练习,更是理解CPU内部工作机制的窗口。当你在仿真中看到第一个正确的乘法结果波形时,那种成就感绝对值得这番努力。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 20:13:09

AI智能体如何通过MCP协议实现外部工具动态集成与调用

1. 项目概述&#xff1a;当AI智能体遇上MCP协议最近在AI智能体开发圈子里&#xff0c;一个名为“The-Agents-MCP”的项目开始引起不少人的注意。这个由IronLain88开源的仓库&#xff0c;名字听起来就很有意思——“智能体”与“MCP”的结合。如果你正在探索如何让AI智能体更高效…

作者头像 李华
网站建设 2026/5/8 20:11:51

利用Twitter API与ioBroker实现智能家居社交媒体自动化

1. 项目概述&#xff1a;一个让智能音箱“读懂”推特的技能 最近在折腾智能家居和自动化流程&#xff0c;发现一个挺有意思的需求&#xff1a;能不能让家里的智能音箱&#xff0c;比如亚马逊的Alexa或者Google Home&#xff0c;直接给我读最新的推特&#xff0c;或者根据我的指…

作者头像 李华
网站建设 2026/5/8 20:06:39

ARM电源管理套件(PMK)核心技术解析与实践

1. ARM标准单元库电源管理套件深度解析在低功耗芯片设计领域&#xff0c;电源管理技术已经从"可有可无"变成了"不可或缺"的核心要素。作为从业15年的芯片设计工程师&#xff0c;我见证了这个领域的多次技术迭代&#xff0c;而ARM的电源管理套件(PMK)无疑是…

作者头像 李华
网站建设 2026/5/8 20:05:15

Cursor AI编辑器液态玻璃主题:设计解析、安装与深度定制指南

1. 项目概述&#xff1a;当AI代码编辑器遇上液态玻璃美学如果你和我一样&#xff0c;每天有超过8小时的时间都泡在代码编辑器里&#xff0c;那么编辑器的主题就不仅仅是一个“皮肤”&#xff0c;它直接关系到你的视觉舒适度、代码阅读效率和长期工作的心情。最近&#xff0c;我…

作者头像 李华