名称:除法器设计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