想用移位法做FPGA的除法器,语言是Verilog HDL,不知道怎么做,请求指点,给出思路也行,能给出代码更好。谢谢了。
假如你有个数 std_logic_vector shu(19 downto 0)那么
0&shu(19 downto 1) 就是除以2的值, shu(0) 就是余数
我写了个移位除法的程序,但是仿真不出,请高手指点
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
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |