
李振礼 1111082008
1、设计方法
采用移位相减法设计二进制除法器:被除数和除数都是二进制数,采用将除数移位的方法。1)判断除数和被除数是否为零:如果除数为零,返回等待;如果被除数为零,则商和余数都为零。2)被除数和除数都不为零时,判断被除数和除数的大小:如果除数大于被除数,则商为零,余数等于被除数;如果除数小于等于被除数,则对除数进行移位,第一次移位使被除数的最高位和除数的最低位对齐。然后对移位后的除数和被除数进行判断:如果被除数大于等于除数,则用被除数减去除数,并将所得结果做为新的被除数;如果被除数小于除数,则将除数在第一次移位的基础上右移一位,在对被除数和除数进行判断,根据被除数和除数的大小关系进行类似的操作。
2、算法流程图
图中:被除数和除数分别放在A、B中,商和余数分别放在S、和Y中,C作为移位计数器
3、VHDL程序代码:
library ieee;
use ieee.std_logic_11.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all; ---打开可能用到的库
entity dedect1 is
port(A,B:in std_logic_vector(3 downto 0);
S,Y:out std_logic_vector(3 downto 0));
end entity dedect1; ----四位二进制除法器实体定义
architecture behv of dedect1 is
begin
s1:process(A,B) ---进程开始敏感信号A、B
variable tmpa,tmpb:std_logic_vector(7 downto 0);--中间变量定义
variable tmpc:std_logic_vector(3 downto 0);
begin
tmpa:="00000000";
tmpb:="00000000";
tmpc:="0000"; ---中间变量初始化
if(B>"0000")then ---B不为零(除数不为零)
if(A>"0000")then ----A不为零(被除数不为零)
if(A>B)then ----被除数大于除数时
tmpa(3 downto 0):=A; -----以下四条If语句完成求满足以上
tmpb(6 downto 3):=B; ---三个条件时被除数除以除数的商和余数
if(tmpa>=tmpb)then
tmpa:=tmpa-tmpb;
tmpc(3):='1';
else
tmpc(3):='0';
end if;
tmpb(5 downto 2):=B;
tmpb(6):='0';
if(tmpa>=tmpb)then
tmpa:=tmpa-tmpb;
tmpc(2):='1';
else
tmpc(2):='0';
end if;
tmpb(4 downto 1):=B;
tmpb(5):='0';
if(tmpa>=tmpb)then
tmpa:=tmpa-tmpb;
tmpc(1):='1';
else
tmpc(1):='0';
end if;
tmpb(3 downto 0):=B;
tmpb(4):='0';
if(tmpa>=tmpb)then
tmpa:=tmpa-tmpb;
tmpc(0):='1';
else
tmpc(0):='0';
end if;
Y<=tmpa(3 downto 0);
S<=tmpc;
elsif(A=B)then ---------被除数等于除数
S<="0001";
Y<="0000";
else
S<="0000"; ---------被除数小于除数
Y<=A;
end if;
else ----被除数为零时
S<="0000";
Y<="0000";
end if;
else ---------除数为零时
S<="ZZZZ";
Y<="ZZZZ";
end if;
end process; ---进程结束
end architecture behv;
4、仿真结果:
图中:A、B、S、Y分别是被除数、除数、商和余数。
被除数为零时,除数为零和不为零时的商和余数;
被除数不为零时,除数为零和不为零时的商和余数;
被除数等于除数,大于除数及小于除数时的商和余数;
