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

📄 stdec.vhd

📁 X8086的VHDL源码
💻 VHD
字号:
library ieee; use ieee.STD_LOGIC_1164.all;
use work.UPAC.all;

entity STDEC is
	port( I_MOD			:  in std_logic_vector( 1 downto 0 ); --mod in op code 
		  I_RM	        :  in std_logic_vector( 2 downto 0 ); --rm in op code
		  I_BW			:  in std_logic; --byte or word
		  I_EACUSTATE   :  in std_logic_vector( 2 downto 0 ); --EA state
	      O_EACUSTATE_V : out std_logic_vector( 2 downto 0 ); --for test
		  O_EARQ	    : out std_logic; --mem(EA)value request 
		  O_RDQUE	    : out std_logic; --read que signal
		  O_SE          : out std_logic; --disp sign extension(<='1') 
		  O_TMPRW	    : out std_logic_vector( 1 downto 0 ); --TMPreg read or write(00:read,01:tmp1 write,10:tmp2 write,11:write)
		  O_D16HL	    : out std_logic; --displacement-high or low
		  O_BUSCS	    : out std_logic_vector( 4 downto 0 ); --bus cotrol
		  O_GRSEL	    : out std_logic_vector( 3 downto 0 )   --GR select
		  ); 
end;

architecture rtl of STDEC is

constant INITIAL  : std_logic_vector(2 downto 0 ) := "000";
constant D16      : std_logic_vector(2 downto 0 ) := "001";
constant ALU_OUT  : std_logic_vector(2 downto 0 ) := "010";
constant DATA1    : std_logic_vector(2 downto 0 ) := "011";
constant DATA2    : std_logic_vector(2 downto 0 ) := "100";
constant DATA3    : std_logic_vector(2 downto 0 ) := "101";
constant DATA_OUT : std_logic_vector(2 downto 0 ) := "110";
constant TMP_DATA : std_logic_vector(2 downto 0 ) := "111";

begin
	O_EACUSTATE_V <= I_EACUSTATE ; --for test

	D16HL_OUT :
	process (I_EACUSTATE)
	begin	
		if (I_EACUSTATE = D16) then
			O_D16HL <= '1';
		else
			O_D16HL <= '0';
		end if;
	end process;

	EARQ_OUT : 
	process (I_EACUSTATE)
	begin
		if    (I_EACUSTATE = ALU_OUT) then
			O_EARQ  <= '1'; --mem request
		elsif (I_EACUSTATE = DATA_OUT)then
			O_EARQ  <= '1'; --mem request
		else
			O_EARQ  <= '0';
		end if;
	end process;

	SignExtention_OUT :
	process (I_EACUSTATE,I_MOD)
	begin		
		if (I_EACUSTATE = DATA2) then
			if (I_MOD = "01")then
				O_SE <= '1';
			else
				O_SE <= '0';
			end if;
		else
			O_SE <= '0';
		end if;
	end process;

	BUSCS_OUT : 
	process (I_EACUSTATE,I_MOD,I_RM)
	begin
		case I_EACUSTATE is
		when INITIAL => 
			O_BUSCS <= "00000";
		when DATA1 => --data1
			if (I_MOD = "00") then
				if (I_RM = "110") then
					O_BUSCS <= "00000";
				else
					O_BUSCS <= G2T1; --gr2tmp1
				end if;
			else
				O_BUSCS <= G2T1; --gr2tmp1
			end if;
		when DATA2 => --data2
			if    (I_MOD = "00" )then
				if    (I_RM = "000" or I_RM = "010") then
				    O_BUSCS <= G2T2; --gr2tmp2
				elsif (I_RM = "001" or I_RM = "011") then 
				    O_BUSCS <= G2T2; --gr2tmp2
				elsif (I_RM = "110") then 
				    O_BUSCS <= B2T2; --biu(q)2tmp2
				else 
				    O_BUSCS <= "00000";							
				end if;		
			elsif (I_MOD = "01")then 
				O_BUSCS <= "11101"; --biu(q)2tmp2	
			elsif (I_MOD = "10")then
				O_BUSCS <= "11101";
			else
				O_BUSCS <= "00000";
			end if;
		when D16 => --D16
			O_BUSCS <= B2T2;
		when TMP_DATA => --tmp_data
			O_BUSCS <= A2T2; --alu2tmp2
		when DATA3 => --data3
			O_BUSCS <= G2T1; --gr2tmp1
		when ALU_OUT => --alu_out
			if (I_MOD = "00") then
				if (I_RM = "110") then
	            	O_BUSCS <= T22B; --tmp2 to biu
	            else
					O_BUSCS <= A2B; --alu2biu
	            end if;
			else
	        		O_BUSCS <= A2B; --alu2biu
			end if;
		when DATA_OUT => --data_out(reg)
			O_BUSCS <= G2B;	--gr2biu
		when others => 
			O_BUSCS <= "XXXXX";
		end case;
	end process;

	TMPRW_OUT : 
	process (I_EACUSTATE,I_MOD,I_RM)
	begin		
		case I_EACUSTATE is
		when INITIAL => 
			O_TMPRW <= "00";
		when DATA1 => --data1
			if (I_MOD = "00") then
				if (I_RM = "110") then
					O_TMPRW <= "00";
				else
					O_TMPRW <= "01";
				end if;
			else
				O_TMPRW <= "01";
			end if;
		when DATA2 => --data2
			O_TMPRW <= "10";
		when D16 => --D16
			O_TMPRW <= "10";			
		when TMP_DATA => --tmp_data
			O_TMPRW <= "10";
		when DATA3 => --data3
			O_TMPRW <= "01";
		when ALU_OUT => --alu_out
			O_TMPRW <= "00";
		when DATA_OUT => --data_out(reg)
			O_TMPRW <= "00";
		when others => 
			O_TMPRW <= "XX";
		end case;
	end process;

	RDQUE_OUT : 
	process (I_EACUSTATE,I_MOD,I_RM,I_BW)
	begin
		if    (I_EACUSTATE = DATA1) then
 		    if    (I_MOD = "01" or I_MOD = "10") then
				O_RDQUE <= '1'; --for dislacement(8bit or 16bit(low))
			elsif (I_MOD = "00") then
				if (I_RM = "110") then
					O_RDQUE <= '1';
				else
					O_RDQUE <= '0';
				end if;
			else 
					O_RDQUE <= '0';
			end if;
		elsif (I_EACUSTATE = DATA2)then
			if    (I_MOD = "00") then
 				if (I_RM = "110") then
				    if (I_BW = '1') then
				    	O_RDQUE <= '1';
				    else
				    	O_RDQUE <= '0';
				    end if;
				else
				    O_RDQUE <= '0';
				end if;
			elsif (I_MOD = "10")then 
				O_RDQUE <= '1'; --for 16bit displacement(high)
			else
				O_RDQUE <= '0';
			end if;
		else
			O_RDQUE <= '0';
		end if;
	end process;

	GRSEL_OUT : 
	process (I_EACUSTATE,I_MOD,I_RM)
	begin		
		case I_EACUSTATE is
		when INITIAL => 
			O_GRSEL <= SIX;
		when DATA1 => --data1
			case I_RM is
			when "000" | "001" | "111" => 
				O_GRSEL <= BX;
			when "010" | "011" | "110" => 
				O_GRSEL <= BP;
			when "100" => 
				O_GRSEL <= SIX;
			when "101" => 
				O_GRSEL <= DIX;
			when others => 
				O_GRSEL <= SIX;
			end case;
		when DATA2 => --data2 
			case I_MOD is
			when "00" => 	
				case I_RM is
				when "000" | "010" => 
					O_GRSEL <= SIX;
				when "001" | "011" => 
					O_GRSEL <= DIX;
				when "110" => 
					O_GRSEL <= SIX;	
				when others => 
					O_GRSEL <= SIX;								
				end case;		
			when "01" => 
				O_GRSEL <= SIX;
			when "10" => 
				O_GRSEL <= SIX;
			when others => 
				O_GRSEL <= SIX;
			end case;
		when D16 => --D16
			O_GRSEL <= SIX;			
		when TMP_DATA => --tmp_data
			O_GRSEL <= SIX;
		when DATA3 => --data3
			case I_RM is
			when "000" | "010" => 
				O_GRSEL <= SIX;
			when "001" | "011" => 
				O_GRSEL <= DIX;
			when others => 
				O_GRSEL <= SIX;
			end case;
		when ALU_OUT => --alu_out
			O_GRSEL <= SIX;
		when DATA_OUT => --data_out(reg)
			case I_RM is
			when "100" => 
				O_GRSEL <= SIX;
			when "101" => 
				O_GRSEL <= DIX;
			when "111" => 
				O_GRSEL <= BX;
			when others => 
				O_GRSEL <= SIX;
			end case;
		when others => 
			O_GRSEL <= "XXXX";
		end case;
	end process;

end;

⌨️ 快捷键说明

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