名称:32位无符号除法器的设计Verilog代码ISE仿真
软件:Xilinx ISE
语言:Verilog
代码功能:实现32位无符号整数除法运算,支持被除数和除数均为32位无符号数,输出32位商和32位余数。该除法器采用状态机控制,通过左移和减法操作实现除法运算,并包含忙信号指示当前运算状态。
代码实现思路:
该32位除法器采用经典的移位减法算法实现。主要设计思路如下:
1. 状态机设计:使用6个状态控制除法流程
- 空闲状态(state_idle):等待开始信号
- 加载状态(state_load):加载被除数到寄存器
- 左移状态(state_leftshift):将被除数左移一位
- 判断状态(state_judge):判断高位是否大于等于除数
- 减法状态(state_sub):执行减法操作并设置商位
- 结束状态(state_end):输出最终结果
2. 算法原理:
- 将被除数扩展为64位(2*N位)
- 通过32次循环(N=32)完成除法运算
- 每次循环:左移被除数,判断高位是否大于等于除数
- 如果大于等于:执行减法,商位设为1
- 如果小于:商位设为0,继续下一轮循环
3. 关键参数:
- N=32:数据位宽
- M=5:2^M=N,用于控制循环次数
代码结构:
该除法器采用模块化设计,主要包含以下部分:
1. 输入输出接口:
- 开始信号(start)控制运算启动
- 32位被除数(dividend)和除数(divisor)输入
- 32位商(q)和余数(r)输出
- 忙信号(busy)指示运算状态
2. 内部寄存器:
- state:3位状态寄存器,控制运算流程
- data:64位数据寄存器,存储中间结果
- shift_cnt:5位移位计数器,记录循环次数
- shang_reg和yushu_reg:分别存储商和余数
3. 状态机逻辑:
- 复位时进入空闲状态
- 收到开始信号后进入加载状态
- 通过左移、判断、减法状态循环32次
- 运算完成后进入结束状态输出结果
4. 忙信号生成:
- 在空闲和结束状态时busy为0
- 在其他运算状态时busy为1
1、工程文件
2、程序文件
3、仿真图
部分代码展示:
`timescale 1ns / 1ps module test; // Inputs reg clock; reg reset; reg start; reg [31:0] dividend; reg [31:0] divisor; // Outputs wire [31:0] q; wire [31:0] r; wire busy; // Instantiate the Unit Under Test (UUT) Divider_32bit uut ( .clock(clock), .reset(reset), .start(start), .dividend(dividend), .divisor(divisor), .q(q), .r(r), .busy(busy) ); initial begin reset=1; start=0; dividend=0;//被除数 ,dividend/divisor divisor=0;//除数 #100; reset=0; dividend=32'h00000000;//被除数 ,dividend/divisor divisor=32'hffffffff;//除数 start=1; #50; start=0; #4000; dividend=32'hffffffff;//被除数 ,dividend/divisor divisor=32'haaaaaaaa;//除数 start=1; #50; start=0; #4000; dividend=32'd256;//被除数 ,dividend/divisor divisor=32'h5;//除数 start=1; #50; start=0; #4000;
150