名称:除法器设计Verilog代码VIVADO仿真
软件:VIVADO
语言:Verilog
代码功能:
32 位有符号、无符号除法器
了解 32 位有符号、无符号除法器的实现原理,使用 Verilog 实现一个 32 位有符号除法器和一个 32 位无符号除法器。
无符号除法器功能为将两个 32 位无符号数相除,得到一个 32 位商和 32 位余数。
本实验分别实现 32 位有符号和无符号除法器,结果为 32 位商 quotient 和 32 位余数 remainder,分别存放在 CPU 的专用寄存器 LO 和 HI 中。除法器时钟信号下降沿时检查 start 信号,有效时开始执行,执行除法指令时,busy 标志位置 1。在执行除法指令时,任何情况下不产生算数异常,当除数为 0 时,运算结果未知,对除法器除数为 0 和溢出情况的发生通过汇编指令中其他指令进行检查和处理。
带符号除法器功能为:将两个 32 带无符号数相除,得到一个 32 位商和余数,基本和无符号除法器类似,注意余数符号与被除数符号相同。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 设计代码
2. Testbench
3. 仿真图
部分代码展示:
//除法器 module Divider_32bit( input clock,//时钟 input reset,//复位 input start,//开始计算信号,为高电平开始 input [31:0]dividend,//被除数 input [31:0]divisor,//除数 output [31:0]q,//商 output [31:0]r,//余数 output busy//除法器忙标志位 ); parameter N=32;//N定义除法器位数 parameter M=5;//2^M=N reg busy_buf=0; wire [N-1:0] Divisor_unsigned;//无符号被除数 ,dividend/Divisor wire [N-1:0] dividend_unsigned;//无符号除数 wire [N-1:0] shang;//无符号商 wire [N-1:0] yushu;//无符号余数 //将有符号数转为无符号数,正数不变,负数取反加1 assign dividend_unsigned=(dividend[N-1]==0)?dividend:(~dividend+1); assign Divisor_unsigned=(divisor[N-1]==0)?divisor:(~divisor+1); wire [2*N-1:0] Divident_extend;//扩展为2N位 assign Divident_extend=dividend_unsigned; parameter state_idle =3'd0;//空闲状态 parameter state_load = 3'd1;//加载被除数 parameter state_leftshift = 3'd2;//左移 parameter state_judge = 3'd3;//判断高位是否大于除数 parameter state_sub = 3'd4;//减去 parameter state_end = 3'd5;//结束 reg [2:0] state=3'd0; reg [2*N-1:0] data=16'd0; reg [M-1:0] shift_cnt='d0;//移位次数累计 reg [N-1:0] shang_reg=8'd0;//商 reg [N-1:0] yushu_reg=8'd0;//余数 always@(posedge clock or posedge reset) if(reset==1) state<=state_idle; else case(state) state_idle:begin shift_cnt<='d0; if(start==1)//加载被除数 state<=state_load; else state<=state_idle; end state_load:begin data<=Divident_extend;//加载被除数 state<=state_leftshift; shift_cnt<='d0; end state_leftshift:begin shift_cnt<=shift_cnt+'d1;//移位次数累计 data<={data[2*N-2:0],1'b0};//左移 state<=state_judge; end
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1109
1750