我写了个移位除法的程序,但是仿真不出,请高手指点 module mdivider(reset,ratio,remainder,error,divisor,dividend); input reset; input[15:0] divisor; //输入16位除数 input[15:0] dividend; //输入16位被除数 output[15:0] ratio; //输出16位比率 output[15:0] remainder; //输出16位余数 output error; //错误信号 reg[31:0] shift_dividend; //用来移位的32位被除数寄存器 reg[15:0] divisor_a; //存放除数的寄存器 reg[15:0] ratio; //比率寄存器 reg[15:0] remainder; //余数寄存器 wire error=(divisor==16'b0); //当除数为0时错误信号为真 always @(divisor or dividend) begin if(reset||error) //当reset或error为真时,所有寄存器置0 begin ratio=16'b0; remainder=16'b0; divisor_a=16'b0; shift_dividend=16'b0; end else if(divisor>dividend) //当被除数小于除数时,直接判定比率为0,余数即除数 begin ratio=16'b0; remainder=dividend; end else if(divisor==16'b1) //当除数为1时,比率即被除数,余数为0 begin ratio=dividend; remainder=16'b0; end else begin ratio=16'b0; divisor_a=divisor; shift_dividend=dividend; //将16位被除数读入32位的移位寄存器的低16位 shift_dividend=shift_dividend<<1; repeat(15) //再将32位移位寄存器的的数进行15次左移计算 begin ratio=ratio<<1; //将已得出的比率左移并根据下一位除数与被除数的比较得出比率最低位的值 shift_dividend=shift_dividend<<1; //将32位移位寄存器的低16位的最高为移入高16位 if(divisor_a<shift_dividend[31:16]) //比较32位移位寄存器的高16位与除数 begin shift_dividend[31:16]=shift_dividend[31:16]-divisor_a; ratio=ratio+1; end //如果移位寄存器的高16位大于除数,则移位寄存器高16位的值为它们的差,并将比率寄存器的最低位+1 end remainder=shift_dividend[31:16];//经过15次移位计算,32移位寄存器高16位的值即位余数 end end endmodule |