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

📄 mult8_comb_seq_mux.vhd

📁 这是一些经典的vhdl example
💻 VHD
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.std_logic_arith.all;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY mult8_comb_seq_mux IS
	--GENERIC(datawidth:INTEGER:=4);									   --乘数的数据宽度
    PORT (
    	clk 		: IN STD_LOGIC;									   	   --时钟
        A			: IN STD_LOGIC_VECTOR (7 DOWNTO 0);	                   --第一个乘数
        B			: IN STD_LOGIC_VECTOR (7 DOWNTO 0);                    --第二个乘数
        P			: OUT STD_LOGIC_VECTOR (15 DOWNTO 0);                  --乘法器的结果
        start 		: IN STD_LOGIC;                                        --计算开始信号  
        finished 	: BUFFER STD_LOGIC                                     --计算结束信号
    );
END mult8_comb_seq_mux;
ARCHITECTURE rtl OF mult8_comb_seq_mux IS
	COMPONENT mult4_comb
		GENERIC(datawidth:INTEGER:=4);
		PORT (
	        A			: IN STD_LOGIC_VECTOR (datawidth-1 DOWNTO 0);	   --第一个乘数
	        B			: IN STD_LOGIC_VECTOR (datawidth-1 DOWNTO 0);      --第二个乘数
	        P			: OUT STD_LOGIC_VECTOR (datawidth*2-1 DOWNTO 0)    --乘法器的结果
	         );
	END COMPONENT;

    COMPONENT adder8_arith
		PORT(
		cin		: IN	STD_LOGIC;						--进位输入
        a,b     : IN    UNSIGNED(7 DOWNTO 0);			--加数
		s   	: OUT	STD_LOGIC_VECTOR(7 DOWNTO 0);	--和
        cout    : OUT   STD_LOGIC);						--进位输出
    END COMPONENT;


	SIGNAL count        : INTEGER RANGE 0 to 5;                         --节拍计数器
	SIGNAL A_mult4      : STD_LOGIC_VECTOR (3 DOWNTO 0);				--4位乘法器乘数输入
	SIGNAL B_mult4      : STD_LOGIC_VECTOR (3 DOWNTO 0);                --4位乘法器乘数输入
	SIGNAL P_mult4      : STD_LOGIC_VECTOR (7 DOWNTO 0);                --4位乘法器积输出
	SIGNAL P_sig        : STD_LOGIC_VECTOR (15 DOWNTO 0);               --结果寄存器		
    SIGNAL a_adder8     : UNSIGNED(7 DOWNTO 0);                         --加法器的输入a
    SIGNAL b_adder8     : UNSIGNED(7 DOWNTO 0);                         --加法器的输入b
	SIGNAL s_adder8     : STD_LOGIC_VECTOR(7 DOWNTO 0);                 --加法器的和
    SIGNAL cout_adder8  : STD_LOGIC;                                    --加法器的进位输出
    SIGNAL cin_adder8  : STD_LOGIC;                                     --加法器进位输入

BEGIN
	--实例化4bit乘法器
    mult: mult4_comb 
    	GENERIC MAP (datawidth =>4) 
    	PORT MAP (A => A_mult4, 
    	          B => B_mult4,
                  P => P_mult4);
    --实例化adder8
    add: adder8_arith
	PORT MAP (    cin => cin_adder8,
                  a => a_adder8, 
    	          b => b_adder8,
                  s => s_adder8,
                  cout => cout_adder8);
    cin_adder8<='0';                       --加法器进位,常为'0'
    a_adder8 <= unsigned(p_mult4);         --加法器固定输入:4位乘法器的输出

    --主进程,负责结果寄存器的操作:1、从4位乘法器积取数,做加法运算。2、负责加法进位	
	PROCESS(clk)
	VARIABLE 	sum		: STD_LOGIC_VECTOR (8 DOWNTO 0);
		BEGIN
		IF(clk'event and clk='0') THEN
			IF(count=0) THEN
				P_sig <= B"0000000000000000";
            ELSIF(count=1) THEN
			 	P_sig(7 DOWNTO 0) <= P_mult4;
			ELSIF(count=2) THEN
				P_sig(11 DOWNTO 4) <= s_adder8;
			ELSIF(count=3) THEN
				P_sig(11 DOWNTO 4)<= s_adder8; 
				P_sig(12) <= cout_adder8;
			ELSIF(count=4) THEN
				P_sig(15 DOWNTO 8) <= s_adder8;
			ELSE
				P_sig<=P_sig;
			END IF;
		END IF;
	END PROCESS;

	--产生4位乘法器输入和加法器的输入b(三个多路选通器)
	PROCESS(clk)
	BEGIN
		IF(count=0) THEN
				A_mult4 <= A(3 DOWNTO 0);
    			B_mult4 <= B(3 DOWNTO 0);            
        ELSIF(count=1) THEN
		 		A_mult4 <= A(3 DOWNTO 0);
    			B_mult4 <= B(3 DOWNTO 0); 
		ELSIF(count=2) THEN
		 		A_mult4 <= A(3 DOWNTO 0);
    			B_mult4 <= B(7 DOWNTO 4);
				b_adder8 <=	unsigned(P_sig(11 DOWNTO 4));
		ELSIF(count=3) THEN
		 		A_mult4 <= A(7 DOWNTO 4);
    			B_mult4 <= B(3 DOWNTO 0);
                b_adder8 <=	unsigned(P_sig(11 DOWNTO 4));
		ELSIF(count=4) THEN
		 		A_mult4 <= A(7 DOWNTO 4);
    			B_mult4 <= B(7 DOWNTO 4);
                b_adder8 <=	unsigned(P_sig(15 DOWNTO 8));
		ELSE
				A_mult4<=B"0000";
				B_mult4<=B"0000";
		END IF;
	END PROCESS;

	--进程:节拍计数器
	PROCESS(clk)
	BEGIN
		IF(Start='1') and finished='1' THEN
			--在乘法器空闲并时来了开始信号
			--则节怕计数器复位
			count<=0;
		ELSIF(clk'event and clk='1') THEN
			IF(count=count'high) THEN
			    --计算完成,节拍计数器停止
				count<=count;
				--输出指示乘法器空闲
				finished<='1';
			ELSE	
				count<=count+1;
				finished<='0';
			END IF;
		END IF;
	END PROCESS;
    --输出进程
    PROCESS(finished)
	BEGIN
		IF(finished='1') THEN
			p<=P_sig;
		END IF;
    END PROCESS;
END RTL;

⌨️ 快捷键说明

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