⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adder10.vhd

📁 采用加法树流水线乘法构造八位乘法器
💻 VHD
字号:
Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

entity adder10 is 
	port(
		clk,rst:	in std_logic;
		a,b:		in std_logic_vector(8 downto 0);
		sum:		out std_logic_vector(9 downto 0));--带有最高位为进位
end entity adder10;

architecture depict of adder10 is
	signal reg1:	std_logic_vector(17 downto 0);
	signal reg2:	std_logic_vector(16 downto 0);
	signal reg3:	std_logic_vector(15 downto 0);
	signal reg4:	std_logic_vector(14 downto 0);
	signal reg5:	std_logic_vector(13 downto 0);
	signal reg6:	std_logic_vector(12 downto 0);
	signal reg7:	std_logic_vector(11 downto 0);
	signal reg8:	std_logic_vector(10 downto 0);

begin
	bit0:process(clk,rst)
		begin
			if(rst = '1')then
				reg1 <= "000000000000000000";
			elsif(rising_edge(clk))then		
				reg1(0) <= a(0) xor b(0);
				reg1(1) <= a(0) and b(0);
				reg1(2) <= a(1);
				reg1(3) <= b(1);
				reg1(4) <= a(2);
				reg1(5) <= b(2);
				reg1(6) <= a(3);
				reg1(7) <= b(3);
				reg1(8) <= a(4);
				reg1(9) <= b(4);
				reg1(10) <= a(5);
				reg1(11) <= b(5);
				reg1(12) <= a(6);
				reg1(13) <= b(6);
				reg1(14) <= a(7);
				reg1(15) <= b(7);
				reg1(16) <= a(8);
				reg1(17) <= b(8);
			end if;
	end process bit0;

	bit1:process(clk,rst)
		begin
			if(rst = '1') then
				reg2 <= "00000000000000000";
			elsif(rising_edge(clk)) then
				reg2(0) <= reg1(0);--第一次的结果
				reg2(1) <= reg1(1) xor reg1(2) xor reg1(3);--加法结果
				reg2(2) <= (reg1(1) and reg1(2)) or (reg1(1) and reg1(3)) or (reg1(2) and reg1(3));--进位结果
				reg2(16 downto 3) <= reg1(17 downto 4);
			end if;
	end process bit1;
	
	bit2:process(clk,rst)
		begin
			if(rst = '1') then
				reg3 <= "0000000000000000";
			elsif(rising_edge(clk)) then
				reg3(1 downto 0) <= reg2(1 downto 0);--结果
				reg3(2) <= reg2(2) xor reg2(3) xor reg2(4);--加法结果
				reg3(3) <= (reg2(2) and reg2(3)) or (reg2(2) and reg2(4)) or (reg2(3) and reg2(4));--进位结果
				reg3(15 downto 4) <= reg2(16 downto 5);
			end if;
	end process bit2;
	
	bit3:process(clk,rst)
		begin
			if(rst = '1') then
				reg4 <= "000000000000000";
			elsif(rising_edge(clk)) then
				reg4(2 downto 0) <= reg3(2 downto 0);
				reg4(3) <= reg3(3) xor reg3(4) xor reg3(5);
				reg4(5) <= (reg3(3) and reg3(4)) or (reg3(4) and reg3(5)) or (reg3(3) and reg3(5));
				reg4(14 downto 5) <= reg3(15 downto 6);
			end if;
	end process bit3;
	
	bit4:process(clk,rst)
		begin
			if(rst = '1') then
				reg5 <= "00000000000000";
			elsif(rising_edge(clk)) then
				reg5(3 downto 0) <= reg4(3 downto 0);
				reg5(4) <= reg4(4) xor reg4(5) xor reg4(6);
				reg5(5) <= (reg4(4) and reg4(5)) or (reg4(4) and reg4(6)) or (reg4(6) and reg4(5));
				reg5(13 downto 6) <= reg4(14 downto 7);
			end if;
	end process bit4;
	
	

		bit5:process(clk,rst)
		begin
			if(rst = '1') then
				reg6 <= "0000000000000";
			elsif(rising_edge(clk)) then
				reg6(4 downto 0) <= reg5(4 downto 0);
				reg6(5) <= reg5(5) xor reg5(6) xor reg5(7);
				reg6(6) <= (reg5(5) and reg5(6)) or (reg5(5) and reg5(7)) or (reg5(6) and reg5(7));
				reg6(12 downto 7) <= reg4(13 downto 8);
			end if;
	end process bit5;
	
		
		bit6:process(clk,rst)
		begin
			if(rst = '1') then
				reg7 <= "000000000000";
			elsif(rising_edge(clk)) then
				reg7(5 downto 0) <= reg6(5 downto 0);
				reg7(6) <= reg6(6) xor reg6(7) xor reg6(8);
				reg7(7) <= (reg6(6) and reg6(7)) or (reg6(8) and reg6(7)) or (reg6(6) and reg6(8));
				reg7(11 downto 8) <= reg6(12 downto 9);
			end if;
	end process bit6;
	
	bit7:process(clk,rst)
		begin
			if(rst = '1') then
				reg8 <= "00000000000";
			elsif(rising_edge(clk)) then
				reg8(6 downto 0) <= reg7(6 downto 0);
				reg8(7) <= reg7(7) xor reg7(9) xor reg7(8);
				reg8(8) <= (reg7(7) and reg7(8)) or (reg7(8) and reg7(9)) or (reg7(7) and reg7(9));
				reg8(10 downto 9) <= reg7(11 downto 10);
			end if;
	end process bit7;
	
-------------------------------------------------	
	sum_final:process(clk,rst)
		begin
			if(rst = '1') then
				sum <= "0000000000";
			elsif(rising_edge(clk)) then
				sum(7 downto 0) <= reg8(7 downto 0);
				sum(8) <= reg8(10) xor reg8(9) xor reg8(8);
				sum(9) <= (reg8(8) and reg8(9)) or (reg8(10) and reg8(9)) or (reg8(8) and reg8(10));
			end if;
	end process sum_final;

end depict;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -