基于FPGA的任意四位除法器设计与实现

一、系统概述

四位除法器是数字系统中实现两个4位二进制数相除的电路,输出商(4位) 和余数(4位),支持无符号整数除法(范围:被除数015,除数115,商0~15,余数<除数)。本设计基于FPGA(Altera Cyclone IV) 实现组合逻辑除法器,采用移位相减算法,通过Verilog HDL描述,可直接综合为硬件电路,适用于嵌入式计算、数字信号处理等场景。

二、设计原理

2.1 二进制除法算法

基于"移位-比较-相减" 迭代原理,步骤如下:

  1. 初始化:余数寄存器R=0,商寄存器Q=0;

  2. 逐位处理:从被除数最高位(MSB)到最低位(LSB),循环4次:

    • 将R左移1位,空出最低位;

    • 将被除数当前位(从高位到低位)填入R的最低位;

    • 若R ≥ 除数B,则R = R - B,Q对应位=1;否则Q对应位=0;

  3. 结果输出:4次迭代后,Q为商,R为余数。

示例:8(1000)÷ 2(0010)

  • 初始R=0,Q=0;

  • 第1位(1):R=0<<1+1=1 < 2 → Q=0000,R=1;

  • 第2位(0):R=1<<1+0=2 ≥ 2 → R=0,Q=0100;

  • 第3位(0):R=0<<1+0=0 < 2 → Q=0100,R=0;

  • 第4位(0):R=0<<1+0=0 < 2 → Q=0100,R=0;

  • 结果:商=4(0100),余数=0。

三、硬件设计(FPGA实现)

3.1 核心组件

模块 功能说明
FPGA Altera Cyclone IV EP4CE6F17C8(逻辑单元6272)
输入 4位拨码开关(A3A0:被除数,B3B0:除数)
输出 4位LED(Q3Q0:商,R3R0:余数)
错误指示 1位LED(ERROR:除数为0时点亮)

3.2 硬件连接

信号 FPGA引脚(EP4CE6F17C8) 外设 说明
被除数A3:0 PIN_30~PIN_27 拨码开关SW3~SW0 输入4位被除数(0~15)
除数B3:0 PIN_26~PIN_23 拨码开关SW7~SW4 输入4位除数(0~15)
商Q3:0 PIN_22~PIN_19 LED D3~D0 输出4位商
余数R3:0 PIN_18~PIN_15 LED D7~D4 输出4位余数
错误ERROR PIN_14 LED D8 除数=0时点亮

四、软件设计(Verilog HDL)

4.1 模块定义

c 复制代码
module divider_4bit (
    input [3:0] A,          // 被除数(4位无符号)
    input [3:0] B,          // 除数(4位无符号)
    output reg [3:0] Q,      // 商(4位)
    output reg [3:0] R,      // 余数(4位)
    output reg error        // 错误标志(除数为0时置1)
);

// 组合逻辑实现除法算法
always @(*) begin
    if (B == 4'd0) begin  // 除数为0,报错
        Q = 4'd0;
        R = 4'd0;
        error = 1'b1;
    end else begin
        error = 1'b0;
        R = 4'd0;  // 初始化余数为0
        Q = 4'd0;  // 初始化商为0
        
        // 逐位处理被除数(从高位到低位,共4位)
        for (int i = 3; i >= 0; i = i - 1) begin
            // 1. 余数左移1位,空出最低位
            R = R << 1;
            // 2. 填入被除数当前位(A的第i位)
            R[0] = A[i];
            // 3. 比较余数与除数,够减则减并记录商1
            if (R >= B) begin
                R = R - B;
                Q[i] = 1'b1;  // 商的第i位(对应被除数第i位)置1
            end else begin
                Q[i] = 1'b0;  // 商的第i位置0
            end
        end
    end
end

endmodule

4.2 顶层模块(含引脚约束)

c 复制代码
module top_divider (
    input [3:0] SW,         // 拨码开关(低4位A,高4位B)
    output [7:0] LED,        // LED(低4位Q,高4位R)
    output ERROR_LED         // 错误指示灯
);

// 信号拆分
wire [3:0] A = SW[3:0];    // 被除数(拨码开关SW3~SW0)
wire [3:0] B = SW[7:4];    // 除数(拨码开关SW7~SW4)
wire [3:0] Q, R;
wire error;

// 实例化除法器
divider_4bit u_divider (
    .A(A),
    .B(B),
    .Q(Q),
    .R(R),
    .error(error)
);

// 输出分配
assign LED[3:0] = Q;        // 商→LED D3~D0
assign LED[7:4] = R;        // 余数→LED D7~D4
assign ERROR_LED = error;   // 错误标志→LED D8

endmodule

参考代码 基于FPGA的任意四位除法器 www.youwenfan.com/contentcss/161306.html

五、关键问题与解决方案

5.1 除数为0的处理

  • 问题:除数为0时除法无意义,需避免硬件错误。

  • 解决 :在always块中优先判断B == 0,置error=1,商和余数输出0。

5.2 组合逻辑延迟

  • 问题:4位组合逻辑虽简单,但FPGA布线延迟可能导致毛刺。

  • 解决 :在输出端添加寄存器打拍(时序逻辑),或约束综合工具优化关键路径。

5.3 无符号数范围

  • 问题:4位无符号数范围为0~15,商和余数需限制在有效范围。

  • 解决 :通过算法保证余数R < B,商Q = (A - R)/B,自然满足范围。

六、测试与验证

6.1 测试用例

被除数A(二进制) 除数B(二进制) 商Q(预期) 余数R(预期) 错误标志
1000(8) 0010(2) 0100(4) 0000(0) 0
1001(9) 0010(2) 0100(4) 0001(1) 0
1111(15) 0011(3) 0101(5) 0000(0) 0
0010(2) 0000(0) 0000(0) 0000(0) 1

6.2 测试步骤

  1. 硬件连接:按3.2节连接拨码开关、LED与FPGA;

  2. 输入设置 :拨动SW3SW0设置被除数A,SW7SW4设置除数B;

  3. 结果观察

    • LED D3D0显示商Q,D7D4显示余数R;

    • 若B=0,LED D8(ERROR_LED)点亮。

七、优化与扩展

7.1 时序逻辑实现(低资源版)

若需节省FPGA资源,可改用时序逻辑迭代除法(4个时钟周期完成计算),核心代码:

c 复制代码
// 时序逻辑除法器(4周期)
reg [3:0] A_reg, B_reg;
reg [1:0] state;  // 状态机:0-初始化,1-迭代,2-完成
always @(posedge clk) begin
    case (state)
        0: begin  // 初始化
            A_reg <= A; B_reg <= B; R <= 0; Q <= 0; state <= 1;
        end
        1: begin  // 迭代4次(略,同组合逻辑但分周期执行)
        end
        2: state <= 2;  // 保持结果
    endcase
end

7.2 有符号数扩展

通过增加符号位(1位)和取绝对值逻辑,可扩展为4位有符号除法器,需处理负数商/余数规则(如向零取整)。

八、总结

本设计基于FPGA实现了4位无符号除法器,采用组合逻辑移位相减算法,通过Verilog HDL完成硬件描述,具有结构简单、延迟低、易扩展的特点。系统可正确计算0~15范围内两数相除的商和余数,并支持除数为0的错误检测,适用于嵌入式计算、教学实验等场景。

相关推荐
仲南音2 天前
Xilinx FPGA——时钟IP核MMCM、PLL
fpga开发
I'm a winner2 天前
基于Xilinx FPGA的LVDS高速串行通信系统(三)--数据训练及握手机制【文末源码】
fpga开发
upper20203 天前
coremark移植坑之-nostartfiles -nostdlib参数
学习·fpga开发·coremark移植·riscv设计
Eloudy3 天前
Vivado 纯命令行构建 FPGA 项目教程
fpga开发
Rambo.xia3 天前
AXI跨时钟域与数据一致性——CDC FIFO深度不够、写后读冒险、多Master仲裁、乱序返回,出了Bug根本查不出来
fpga开发·bug
upper20203 天前
FPGA部署卷积神经网络识别MINST图片
fpga开发·卷积神经网络·minst·minst识别·部署神经网络·神经网络识别图片
你是我的解忧王子3 天前
嵌入式 ADC采样 原始数据分析上层(平均值 波动率 正态分布 线性补偿 系统误差)
fpga开发·数据挖掘·数据分析
9527华安4 天前
FPGA纯verilog代码ISP图像处理培训教程,基于IMX214,提供工程源码+视频教程+FPGA开发板
图像处理·fpga开发·isp·imx214·mipi
千寻xun4 天前
二、实战篇-NVME SSD控制之ZYNQ实现(六)-读写NVME SSD硬盘数据
fpga开发·nvme·nvme ssd
千寻xun5 天前
二、实战篇-NVME SSD控制之ZYNQ实现(三)
fpga开发·nvme ssd·nvme协议