logo资料库

4位乘法器的设计.doc

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
4​ 位​ 乘​ 法​ 器​ 的​ 设​ 计 设计思想: 确定该乘法器工作的基本原理是首先生成部分积,再将这些部分积相加得到 乘积。设计的基本思想为:从被乘数的最低位开始移位,若移出位为 1,则乘数左移后与上 一次的和相加,若移出位为 0,则乘数左移后以全 0 相加,循环上述操作,直至被乘数的最 高位。主要是进行移位、相加两项操作的重复。 乘法器设计 根据乘法器工作原理可知,确定输入与输出。输入的两个乘数分别为 din[4 .. 0]、din1 [4.. 0],另外 clk、clr 作为控制输入,dout[7..0]作为输出。 由分析可知乘法器原理框图包括右 移寄存器(sregb)、8 位寄存器(regb)、选通与门(andarith)、4 位加法器(adder4)四部 分。其中,sreg4b 对被乘数进行右移移位,andarith 对乘数与被乘数相乘过程中的部分积进 行相与,adder4 对右移寄存器的移位位数进行计数,regb 对乘数和被乘数相乘之后的结果 进行存储。下面分别对各部分元件进行设计,然后再由这些元件构成整个乘法器电路图。 1) 设计一个右移寄存器(sregb) LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY sregb IS PORT ( clk : IN STD_LOGIC; load : IN STD_LOGIC; din : IN STD_LOGIC_VECTOR(3 downto 0); qb : OUT STD_LOGIC ); END sregb; ARCHITECTURE sregb_architecture OF sregb IS SIGNAL regb : STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN PROCESS (clk, load) BEGIN IF ELSIF CLK'EVENT AND CLK = '1' THEN load = '1' THEN regb<= din; regb(2 DOWNTO 0) <= regb(3 DOWNTO 1); qb <= regb(0); END IF; END PROCESS; END sregb_architecture; 2) 设计一个选通与门(andarith) LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY andarith IS PORT
qb: IN STD_LOGIC; din1 : IN STD_LOGIC_VECTOR(3 downto 0); dout1 : OUT STD_LOGIC_VECTOR(3 downto 0) ( ); END andarith; ARCHITECTURE andarith_architecture OF andarith IS BEGIN PROCESS(qb, din1) BEGIN FOR i IN 0 TO 3 LOOP DOUT1(i) <= DIN1(i) AND qb; END LOOP; END PROCESS; END andarith_architecture; 3) 设计一个计数器(adder4) LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; ENTITY adder4 IS PORT ( dout1 : IN STD_LOGIC_VECTOR(3 downto 0); dout : IN STD_LOGIC_VECTOR(7 downto 4); s : OUT STD_LOGIC_VECTOR(4 downto 0) ); END adder4; ARCHITECTURE adder4_architecture OF adder4 IS BEGIN s <= ('0' & dout1) + ('0'& dout) END adder4_architecture; 4) 设计一个 8 位寄存器(rega) LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY rega IS PORT ( clk : IN STD_LOGIC; load : IN STD_LOGIC; s : IN STD_LOGIC_VECTOR(3 downto 0); dout : OUT STD_LOGIC_VECTOR(7 downto 0)
); END rega; ARCHITECTURE rega_architecture OF rega IS SIGNAL R8S : STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN PROCESS(clk, load) BEGIN IF load = '1' THEN R8S <= (OTHERS =>'0') ELSIF rising_edge(clk) THEN --清零部分积 R8S(2 DOWNTO 0) R8S(7 DOWNTO 3) <= s; Load= '0 '; <= R16S(3 DOWNTO 1); -- 右 移 低 3 位 -- 将 加 法 和 输 入 锁 到 高 5 位 END IF; END PROCESS; dout <= R8S; END rega_architecture;
分享到:
收藏