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

📄 c_8255.vhd

📁 vhdl实现8255,可重用
💻 VHD
📖 第 1 页 / 共 2 页
字号:
							end if;
						end if; 
						if (EIB = '1' or EOB = '1')	then					-- PB mode 1
							if D_in(3 downto 1) = "010" then	
								INTEB <= D_in(0);							-- input/output interrupt enable 
							end if;
						end if;
					else													-- write control word
						Aout <= "00000000";
						Bout <= "00000000";
						Cout <= "00000000";
						INTEA1 <= '0';
						INTEA2 <= '0';
						INTEB <= '0';
					end if;
				when others =>
			end case;
		end if;
	end if;
end process;

Data_buf: D_out <= PA_in_int when A = "00" 
				else PB_in_int when A = "01"
				else PC_in_int when A = "10" 
				else "00000000";

Data_en: D_en <= '1' when (nCS = '0' and nRD = '0') else '0';

-- decode inputs
PC_en_in(7) <= '1' when (D_in(6) = '1'										-- PA mode 2
					or D_in(6 downto 4) = "010" 						-- PA mode 1 output
					or (D_in(6 downto 4) = "011" and D_in(3) = '0')	-- PA mode 1 input and PC(7) output
					or (D_in(6 downto 5) = "00" and D_in(3) = '0'))	-- PA mode 0 and PC(7) output 
				else '0';

PC_en_in(6) <= '1' when (D_in(6 downto 3) = "0110" 							-- PA mode 1 input and PC(6) output
						or (D_in(6 downto 5) = "00" and D_in(3) = '0'))   -- PA mode 0 and PC(6) output 
				else '0'; 

PC_en_in(5) <= '1' when (D_in(6) = '1' 										-- PA mode 2
					or D_in(6 downto 4) = "011" 						-- PA mode 1 input
					or (D_in(6 downto 4) = "010" and D_in(3) = '0')	-- PA mode 1 output and PC(5) output
					or (D_in(6 downto 5) = "00" and D_in(3) = '0')) 	-- PA mode 0 and PC(5) output 
				else '0';

PC_en_in(4) <= '1' when (D_in(6 downto 3) = "0100" 							-- PA mode 1 output and PC(4) output
					or (D_in(6 downto 5) = "00" and D_in(3) = '0')) 	-- PA mode 0 and PC(4) output
				else '0';

PC_en_in(3) <= '1' when (D_in(6) = '1' 										-- PA mode 2
					or D_in(6 downto 5) = "01" 						-- PA mode 1
					or (D_in(6 downto 5) = "00" and D_in(0) = '0')) 	-- PA mode 0 and PC(3) output
				else '0';

PC_en_in(2) <= '1' when (D_in(2) = '0' and D_in(0) = '0')					-- PB mode 0 and PC(2) output
				else '0';

PC_en_in(1) <= '1' when (D_in(2) = '1'										-- PB mode 1
					or (D_in(2) = '0' and D_in(0) = '0'))				-- PB mode 0 and PC(1) output
				else '0';
PC_en_in(0) <= '1' when (D_in(2) = '1'										-- PB mode 1
					or (D_in(2) = '0' and D_in(0) = '0'))				-- PB mode 0 and PC(0) output
				else '0';

EA_IN <= '1' when (D_in(6) = '1' or D_in(4) = '0') else '0'; 				-- PA output
EIA_IN <= '1' when (D_in(6) = '1' or D_in(6 downto 4) = "011") else '0';	-- PA mode 1 input or mode 2
EOA_IN <= '1' when (D_in(6) = '1' or D_in(6 downto 4) = "010") else '0';	-- PA mode 1 output or mode 2

EB_IN <= '1' when (D_in(1) = '0') else '0'; 								-- PB output
EIB_IN <= '1' when (D_in(2) = '1' and D_in(1) = '1') else '0';				-- PB mode 1 input
EOB_IN <= '1' when (D_in(2) = '1' and D_in(1) = '0') else '0';				-- PB mode 1 output

-- write control
write_control:process(nWR,RESET)
begin
	if RESET = '1' then
		PC_en <= "00000000";
		EA <= '0';
		EB <= '0';
		EIA <= '0';
		EIB <= '0';
		EOA <= '0';
		EOB <= '0';
	elsif nWR = '1' and nWR'event then
		if nCS = '0' and A = "11" and D_in(7) = '1' then 	-- write control word
			PC_en <= PC_en_in;
			EA <= EA_IN;
			EB <= EB_IN;
			EIA <= EIA_IN;
			EOA <= EOA_IN;
			EIB <= EIB_IN;
			EOB <= EOB_IN;
		end if;
	end if;
end process;

PA_out_int <= Aout;
PB_out_int <= Bout;
PC_out_int <= Cout;

CTRL_A(7) <= EA;
CTRL_A(6) <= EIA;
CTRL_A(5) <= EOA;
CTRL_A(4) <= nCS;
CTRL_A(3) <= nWR;
CTRL_A(2) <= nRD;
CTRL_A(1) <= A(1);
CTRL_A(0) <= A(0);

CTRL_B(7) <= EB;
CTRL_B(6) <= EIB;
CTRL_B(5) <= EOB;
CTRL_B(4) <= nCS;
CTRL_B(3) <= nWR;
CTRL_B(2) <= nRD;
CTRL_B(1) <= A(1);
CTRL_B(0) <= A(0);

end RWCtrl;

---------------------------------------------------------------------------
-- Copyright (c) 2002 by Aldec, Inc. All rights reserved.
--
---------------------------------------------------------------------------
-- DESCRIPTION   :  Component was generated by Aldec IP CORE Generator, version 3.0
--                  Details: 
-- CREATED       :  2004-8-31, 22:55:15
---------------------------------------------------------------------------


library IEEE;
use IEEE.std_logic_1164.all;

entity C_8255_CORE is
	port(
		RESET : in STD_LOGIC;
		nCS : in STD_LOGIC;
		nRD : in STD_LOGIC;
		nWR : in STD_LOGIC;
		A : in STD_LOGIC_VECTOR (1 downto 0);
		D_in : in STD_LOGIC_VECTOR (7 downto 0);
		PA_in : in STD_LOGIC_VECTOR (7 downto 0);
		PB_in : in STD_LOGIC_VECTOR (7 downto 0);
		PC_in : in STD_LOGIC_VECTOR (7 downto 0);
		D_en : out STD_LOGIC;
		PA_en : out STD_LOGIC;
		PB_en : out STD_LOGIC;
		D_out : out STD_LOGIC_VECTOR (7 downto 0);
		PA_out : out STD_LOGIC_VECTOR (7 downto 0);
		PB_out : out STD_LOGIC_VECTOR (7 downto 0);
		PC_en : out STD_LOGIC_VECTOR (7 downto 0);
		PC_out : out STD_LOGIC_VECTOR (7 downto 0)
		);
end C_8255_CORE;

architecture C_8255_CORE_ARCH of C_8255_CORE is

signal CTRL_A : STD_LOGIC_VECTOR (7 downto 0);
signal CTRL_B : STD_LOGIC_VECTOR (7 downto 0);
signal INTEA1 : STD_LOGIC ;
signal INTEA2 : STD_LOGIC ;
signal INTEB : STD_LOGIC ;
signal PA_IN_INT : STD_LOGIC_VECTOR (7 downto 0);
signal PA_OUT_INT : STD_LOGIC_VECTOR (7 downto 0);
signal PB_IN_INT : STD_LOGIC_VECTOR (7 downto 0);
signal PB_OUT_INT : STD_LOGIC_VECTOR (7 downto 0);
signal PC_IN_INT : STD_LOGIC_VECTOR (7 downto 0);
signal PC_OUT_INT : STD_LOGIC_VECTOR (7 downto 0);

---- Component declarations -----

component GROUPA
	port (
		CTRL_A : in STD_LOGIC_VECTOR (7 downto 0);
		INTEA1 : in STD_LOGIC;
		INTEA2 : in STD_LOGIC;
		PA_in : in STD_LOGIC_VECTOR (7 downto 0);
		PA_out_int : in STD_LOGIC_VECTOR (7 downto 0);
		PC_in : in STD_LOGIC_VECTOR (7 downto 3);
		PC_out_int : in STD_LOGIC_VECTOR (7 downto 3);
		PA_en : out STD_LOGIC;
		PA_in_int : out STD_LOGIC_VECTOR (7 downto 0);
		PA_out : out STD_LOGIC_VECTOR (7 downto 0);
		PC_in_int : out STD_LOGIC_VECTOR (7 downto 3);
		PC_out : out STD_LOGIC_VECTOR (7 downto 3)
	);
end component ;

component GROUPB
	port (
		CTRL_B : in STD_LOGIC_VECTOR (7 downto 0);
		INTEB : in STD_LOGIC;
		PB_in : in STD_LOGIC_VECTOR (7 downto 0);
		PB_out_int : in STD_LOGIC_VECTOR (7 downto 0);
		PB_in_int : out STD_LOGIC_VECTOR (7 downto 0);
		PB_out : out STD_LOGIC_VECTOR (7 downto 0);
		PB_en : out STD_LOGIC;
		PC_in : in STD_LOGIC_VECTOR (2 downto 0);
		PC_out_int : in STD_LOGIC_VECTOR (2 downto 0);
		PC_in_int : out STD_LOGIC_VECTOR (2 downto 0);
		PC_out : out STD_LOGIC_VECTOR (2 downto 0)
	);
end component ;

component RWCTRL
	port (
		A : in STD_LOGIC_VECTOR (1 downto 0);
		D_in : in STD_LOGIC_VECTOR (7 downto 0);
		PA_in_int : in STD_LOGIC_VECTOR (7 downto 0);
		PB_in_int : in STD_LOGIC_VECTOR (7 downto 0);
		PC_in_int : in STD_LOGIC_VECTOR (7 downto 0);
		RESET : in STD_LOGIC;
		nCS : in STD_LOGIC;
		nRD : in STD_LOGIC;
		nWR : in STD_LOGIC;
		CTRL_A : out STD_LOGIC_VECTOR (7 downto 0);
		CTRL_B : out STD_LOGIC_VECTOR (7 downto 0);
		D_en : out STD_LOGIC;
		D_out : out STD_LOGIC_VECTOR (7 downto 0);
		INTEA1 : out STD_LOGIC;
		INTEA2 : out STD_LOGIC;
		INTEB : out STD_LOGIC;
		PA_out_int : out STD_LOGIC_VECTOR (7 downto 0);
		PB_out_int : out STD_LOGIC_VECTOR (7 downto 0);
		PC_en : out STD_LOGIC_VECTOR (7 downto 0);
		PC_out_int : out STD_LOGIC_VECTOR (7 downto 0)
	);
end component ;

	signal RESET_conv : STD_LOGIC;
	signal D_in_conv : STD_LOGIC_VECTOR(7 downto 0);
	signal A_conv : STD_LOGIC_VECTOR(1 downto 0);
	signal nCS_conv : STD_LOGIC;
	signal nRD_conv : STD_LOGIC;
	signal nWR_conv : STD_LOGIC;
	signal PA_in_conv : STD_LOGIC_VECTOR(7 downto 0);
	signal PB_in_conv : STD_LOGIC_VECTOR(7 downto 0);
	signal PC_in_conv : STD_LOGIC_VECTOR(7 downto 0);

begin

D_in_conv <= To_X01Z(D_in);
A_conv <= To_X01Z(A);
nRD_conv <= To_X01Z(nRD);
nWR_conv <= To_X01Z(nWR);
nCS_conv <= To_X01Z(nCS);
RESET_conv <= To_X01Z(RESET);
PA_in_conv <= To_X01Z(PA_in);
PB_in_conv <= To_X01Z(PB_in);
PC_in_conv <= To_X01Z(PC_in);

----  Component instantiations  ----

U0 : RWCTRL
	port map(
		A => A_conv,
		CTRL_A => CTRL_A,
		CTRL_B => CTRL_B,
		D_en => D_en,
		D_in => D_in_conv,
		D_out => D_out,
		INTEA1 => INTEA1,
		INTEA2 => INTEA2,
		INTEB => INTEB,
		PA_in_int => PA_in_int,
		PA_out_int => PA_out_int,
		PB_in_int => PB_in_int,
		PB_out_int => PB_out_int,
		PC_en => PC_en,
		PC_in_int => PC_in_int,
		PC_out_int => PC_out_int,
		RESET => RESET_conv,
		nCS => nCS_conv,
		nRD => nRD_conv,
		nWR => nWR_conv
	);

U1 : GROUPA
	port map(
		CTRL_A => CTRL_A,
		INTEA1 => INTEA1,
		INTEA2 => INTEA2,
		PA_en => PA_en,
		PA_in => PA_in_conv,
		PA_in_int => PA_in_int,
		PA_out => PA_out,
		PA_out_int => PA_out_int,
		PC_in(3) => PC_in_conv(3),
		PC_in(4) => PC_in_conv(4),
		PC_in(5) => PC_in_conv(5),
		PC_in(6) => PC_in_conv(6),
		PC_in(7) => PC_in_conv(7),
		PC_in_int(3) => PC_in_int(3),
		PC_in_int(4) => PC_in_int(4),
		PC_in_int(5) => PC_in_int(5),
		PC_in_int(6) => PC_in_int(6),
		PC_in_int(7) => PC_in_int(7),
		PC_out(3) => PC_out(3),
		PC_out(4) => PC_out(4),
		PC_out(5) => PC_out(5),
		PC_out(6) => PC_out(6),
		PC_out(7) => PC_out(7),
		PC_out_int(3) => PC_out_int(3),
		PC_out_int(4) => PC_out_int(4),
		PC_out_int(5) => PC_out_int(5),
		PC_out_int(6) => PC_out_int(6),
		PC_out_int(7) => PC_out_int(7)
	);

U2 : GROUPB
	port map(
		CTRL_B => CTRL_B,
		INTEB => INTEB,
		PB_en => PB_en,
		PB_in => PB_in_conv,
		PB_in_int => PB_in_int,
		PB_out => PB_out,
		PB_out_int => PB_out_int,
		PC_in(0) => PC_in_conv(0),
		PC_in(1) => PC_in_conv(1),
		PC_in(2) => PC_in_conv(2),
		PC_in_int(0) => PC_in_int(0),
		PC_in_int(1) => PC_in_int(1),
		PC_in_int(2) => PC_in_int(2),
		PC_out(0) => PC_out(0),
		PC_out(1) => PC_out(1),
		PC_out(2) => PC_out(2),
		PC_out_int(0) => PC_out_int(0),
		PC_out_int(1) => PC_out_int(1),
		PC_out_int(2) => PC_out_int(2)
	);

end C_8255_CORE_ARCH;

---------------------------------------------------------------------------
-- Copyright (c) 2002 by Aldec, Inc. All rights reserved.
--
---------------------------------------------------------------------------
-- DESCRIPTION   :  Component was generated by Aldec IP CORE Generator, version 3.0
--                  Details: 
--                  Reset (RESET) active : high
--                  Chip select (nCS) active : low
--                  Write (nWR) active : low
--                  Read (nRD) active : low
-- CREATED       :  2004-8-31, 22:55:15
---------------------------------------------------------------------------

--{{ Section below this comment is automatically maintained
--   and may be overwritten
--{entity {C_8255} architecture {C_8255_arch}}

library IEEE;
use IEEE.std_logic_1164.all;

entity C_8255 is
	port(
		RESET : in STD_LOGIC;
		nCS : in STD_LOGIC;
		nRD : in STD_LOGIC;
		nWR : in STD_LOGIC;
		A : in STD_LOGIC_VECTOR (1 downto 0);
		D : inout STD_LOGIC_VECTOR (7 downto 0);
		PA : inout STD_LOGIC_VECTOR (7 downto 0);
		PB : inout STD_LOGIC_VECTOR (7 downto 0);
		PC : inout STD_LOGIC_VECTOR (7 downto 0)
	);
end C_8255;

--}} End of automatically maintained section

architecture C_8255_arch of C_8255 is

signal D_out : STD_LOGIC_VECTOR (7 downto 0);
signal D_en : STD_LOGIC;
signal PA_out : STD_LOGIC_VECTOR (7 downto 0);
signal PA_en : STD_LOGIC;
signal PB_out : STD_LOGIC_VECTOR (7 downto 0);
signal PB_en : STD_LOGIC;
signal PC_out : STD_LOGIC_VECTOR (7 downto 0);
signal PC_en : STD_LOGIC_VECTOR (7 downto 0);


---- Component declarations -----
	component PULLUP
		port (O: out std_logic);
	end component;

	component C_8255_CORE
		port (
		RESET 	: in STD_LOGIC;
		nCS 	: in STD_LOGIC;
		nRD 	: in STD_LOGIC;
		nWR 	: in STD_LOGIC;
		A 		: in STD_LOGIC_VECTOR (1 downto 0);
		D_in 	: in STD_LOGIC_VECTOR (7 downto 0);
		D_out 	: out STD_LOGIC_VECTOR (7 downto 0);
		D_en 	: out STD_LOGIC;
		PA_in 	: in STD_LOGIC_VECTOR (7 downto 0);
		PA_out 	: out STD_LOGIC_VECTOR (7 downto 0);
		PA_en 	: out STD_LOGIC;
		PB_in 	: in STD_LOGIC_VECTOR (7 downto 0);
		PB_out 	: out STD_LOGIC_VECTOR (7 downto 0);
		PB_en 	: out STD_LOGIC;
		PC_in 	: in STD_LOGIC_VECTOR (7 downto 0);
		PC_out 	: out STD_LOGIC_VECTOR (7 downto 0);
		PC_en 	: out STD_LOGIC_VECTOR (7 downto 0)
		);
	end component ;

begin

----  Component instantiations  ----

CORE : C_8255_CORE
	port map(
		RESET 	=> RESET,
		nCS 	=> nCS,
		nRD 	=> nRD,
		nWR 	=> nWR,
		A 		=> A,
		D_in 	=> D,
		D_out 	=> D_out,
		D_en 	=> D_en,
		PA_in 	=> PA,
		PA_out 	=> PA_out,
		PA_en 	=> PA_en,
		PB_in 	=> PB,
		PB_out 	=> PB_out,
		PB_en 	=> PB_en,
		PC_in 	=> PC,
		PC_out 	=> PC_out,
		PC_en 	=> PC_en
	);

PU_PC6 : PULLUP 
	port map (O => PC(6));
PU_PC4 : PULLUP 
	port map (O => PC(4));
PU_PC2 : PULLUP 
	port map (O => PC(2));


D  <= D_out  when D_en = '1' 	 else "ZZZZZZZZ";
PA <= PA_out when PA_en = '1' 	 else "ZZZZZZZZ";
PB <= PB_out when PB_en = '1' 	 else "ZZZZZZZZ";

PC(0) 	<= PC_out(0) when PC_en(0) = '1' else 'Z';
PC(1) 	<= PC_out(1) when PC_en(1) = '1' else 'Z';
PC(2) 	<= PC_out(2) when PC_en(2) = '1' else 'Z';
PC(3) 	<= PC_out(3) when PC_en(3) = '1' else 'Z';
PC(4) 	<= PC_out(4) when PC_en(4) = '1' else 'Z';
PC(5) 	<= PC_out(5) when PC_en(5) = '1' else 'Z';
PC(6) 	<= PC_out(6) when PC_en(6) = '1' else 'Z';
PC(7) 	<= PC_out(7) when PC_en(7) = '1' else 'Z';

end C_8255_arch;

⌨️ 快捷键说明

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