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

📄 usb_package.vhd

📁 < FPGA数字电子系统设计与开发实例导航> 一书的代码
💻 VHD
字号:
---------------------------------------------------------------------------------------------------
--
-- File        : USB_PACKAGE.vhd
-- Create Time : Fri Apr 16 20:39:30 2004
-- Title       : USB_PACKAGE
-- Design      : USB Interface IP Core
-- Author      : Lou Xinghua (louxinghua99@mails.tsinghua.edu.cn)
-- Company     : Department of Engineering Physics in Tsinghua Unversity, Beijing, China
-- Version	   : 1.0
--
---------------------------------------------------------------------------------------------------
--
-- Description : 
-- USB Package, where device detail information included.
-- Written by Lou Xinghua	
--
---------------------------------------------------------------------------------------------------


library IEEE;
use IEEE.STD_LOGIC_1164.all; 	



package USB_PACKAGE is	   


--------------------------------------------------------------------------------------------------
-- Custom Type
---------------------------------------------------------------------------------------------------
type REG256x8 is array(0 to 255) of std_logic_vector( 7 downto 0 );
type REG8x8 is array(0 to 7) of STD_LOGIC_VECTOR(7 downto 0);
type REG8x1 is array(0 to 7) of STD_LOGIC;
subtype INTEGER8 is INTEGER range 0 to 255; 

---------------------------------------------------------------------------------------------------
-- State Machine
---------------------------------------------------------------------------------------------------
type TRANSEIVER_STATE 
is (TS_DISCONNECTED,
	TS_CONNECTING,
	TS_IDLE,
	TS_END_REQUESTHANDLER,
	TS_READ_IR,
	TS_READ_LTS,
	TS_BUSRESET,
	TS_SUSPENDCHANGE,
	TS_EP0_RECEIVE,
	TS_EP0_TRANSMIT,
	TS_EP2_RECEIVE,
	TS_EP2_TRANSMIT,
	TS_END_RECEIVE,
	TS_END_TRANSMIT,
	TS_SEND_DESCRIPTOR_1ST,
	TS_SEND_DESCRIPTOR,
	TS_SET_ADDRESS,
	TS_SET_CONFIGURATION, 
	TS_GET_CONFIGURATION,
	TS_GET_INTERFACE,
	TS_SEND_STATUS,
	TS_CLEAR_FEATURE,
	TS_SET_FEATURE,	   
	TS_SET_INTERFACE,
	TS_READ_ENDPOINT, 
	TS_WRITE_ENDPOINT, 
	TS_STALL,
	TS_ERROR); 
	
type INT_HANDLE_STATE
is (IH_START,
	IH_READ_LTS,
	IH_ACK_ENDPOINT,
	IH_END_RECEIVE,
	IH_RECEIVE,
	IH_ENABLE_EP,
	IH_DISABLE_EP,
	IH_IDLE);	 
	
type REQUEST_HANDLER_STATE 
is (RH_IDLE,
	RH_ERROR);
-- Request Handler Command
constant RH_SEND_DESCRIPTOR_1ST: STD_LOGIC_VECTOR(7 downto 0) := X"00";	
constant RH_SEND_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"01";
constant RH_SET_ADDRESS: STD_LOGIC_VECTOR(7 downto 0) := X"02";
constant RH_SET_CONFIGURATION: STD_LOGIC_VECTOR(7 downto 0) := X"03";
constant RH_SEND_CONFIGURATION: STD_LOGIC_VECTOR(7 downto 0) := X"04";
constant RH_SEND_INTERFACE: STD_LOGIC_VECTOR(7 downto 0) := X"05"; 	
constant RH_SEND_STATUS: STD_LOGIC_VECTOR(7 downto 0) := X"06";		 	
constant RH_CLEAR_FEATURE: STD_LOGIC_VECTOR(7 downto 0) := X"07";  	 	
constant RH_SET_FEATURE: STD_LOGIC_VECTOR(7 downto 0) := X"08";		  	 	
constant RH_SET_INTERFACE: STD_LOGIC_VECTOR(7 downto 0) := X"09";
constant RH_INVALID_COMMAND: STD_LOGIC_VECTOR(7 downto 0) := X"FF";
	
---------------------------------------------------------------------------------------------------
-- USB Protocol Constant
---------------------------------------------------------------------------------------------------
-- Descriptor Packet Size
constant SIZE_DEVICE_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"12";
constant SIZE_CONFIGURATION_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"09"; 
constant SIZE_INTERFACE_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"09"; 
constant SIZE_ENDPOINT_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"07"; 
constant SIZE_ALL_CONFIGURATION_DESCRIPTOR_HIGH: STD_LOGIC_VECTOR(7 downto 0) := X"2E"; 
constant SIZE_ALL_CONFIGURATION_DESCRIPTOR_LOW: STD_LOGIC_VECTOR(7 downto 0) := X"00"; 

-- Data Length
constant LENGTH_SETUP_PACKET: INTEGER8 := 8; 
constant LENGTH_ENDPOINT0_BUFFER: INTEGER8 := 16;  
constant LENGTH_DEVICE_DESCRIPTOR: INTEGER8 := 18;  
constant LENGTH_CONFIGURATION_DESCRIPTOR: INTEGER8 := 46;

-- EndPoint Packet Size
constant SIZE_ENDPOINT0_PACKET: STD_LOGIC_VECTOR(7 downto 0) := X"10";
constant SIZE_ENDPOINT1_PACKET: STD_LOGIC_VECTOR(7 downto 0) := X"04";	
constant SIZE_ENDPOINT1_PACKET_HIGH: STD_LOGIC_VECTOR(7 downto 0) := X"04";	
constant SIZE_ENDPOINT1_PACKET_LOW: STD_LOGIC_VECTOR(7 downto 0) := X"00";	
constant SIZE_ENDPOINT2_PACKET: STD_LOGIC_VECTOR(7 downto 0) := X"40";	
constant SIZE_ENDPOINT2_PACKET_HIGH: STD_LOGIC_VECTOR(7 downto 0) := X"40";	
constant SIZE_ENDPOINT2_PACKET_LOW: STD_LOGIC_VECTOR(7 downto 0) := X"00";	

-- EndPoint Type
constant ENDPOINT_TYPE_MASK: STD_LOGIC_VECTOR(7 downto 0) := X"03";
constant TYPE_ENDPOINT_CONTROL: STD_LOGIC_VECTOR(7 downto 0) := X"00";
constant TYPE_ENDPOINT_ISOCHRONOUS: STD_LOGIC_VECTOR(7 downto 0) := X"01";
constant TYPE_ENDPOINT_BULK: STD_LOGIC_VECTOR(7 downto 0) := X"02";
constant TYPE_ENDPOINT_INTERRUPT: STD_LOGIC_VECTOR(7 downto 0) := X"03";
constant ENDPOINT_DIRECTION_MASK: STD_LOGIC_VECTOR(7 downto 0) := X"80";  

-- EndPoint Address
constant ADDRESS_ENDPOINT1_TX: STD_LOGIC_VECTOR(7 downto 0) := X"81";
constant ADDRESS_ENDPOINT1_RX: STD_LOGIC_VECTOR(7 downto 0) := X"01";
constant ADDRESS_ENDPOINT2_TX: STD_LOGIC_VECTOR(7 downto 0) := X"82";
constant ADDRESS_ENDPOINT2_RX: STD_LOGIC_VECTOR(7 downto 0) := X"02";

-- Descriptor Type
constant TYPE_DEVICE_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"01";
constant TYPE_CONFIGURATION_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"02";
constant TYPE_STRING_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"03";
constant TYPE_INTERFACE_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"04";
constant TYPE_ENDPOINT_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"05";
constant TYPE_POWER_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"06";

-- Device Code of (ID & Number & Index)
constant CODE_DEVICE_CLASS: STD_LOGIC_VECTOR(7 downto 0) := X"DC";
constant CODE_BCD_USB_HIGH: STD_LOGIC_VECTOR(7 downto 0) := X"00";
constant CODE_BCD_USB_LOW: STD_LOGIC_VECTOR(7 downto 0) := X"01";
constant CODE_ID_VENDOR_HIGH: STD_LOGIC_VECTOR(7 downto 0) := X"71";
constant CODE_ID_VENDOR_LOW: STD_LOGIC_VECTOR(7 downto 0) := X"04";
constant CODE_ID_PRODUCT_HIGH: STD_LOGIC_VECTOR(7 downto 0) := X"66";
constant CODE_ID_PRODUCT_LOW: STD_LOGIC_VECTOR(7 downto 0) := X"06";
constant CODE_BCD_DEVICE_HIGH: STD_LOGIC_VECTOR(7 downto 0) := X"00";
constant CODE_BCD_DEVICE_LOW: STD_LOGIC_VECTOR(7 downto 0) := X"01";
constant CODE_NUMBER_CONFIGURATIONS: STD_LOGIC_VECTOR(7 downto 0) := X"19";
-- Configuration Code of (ID & Number & Index)
constant CODE_BM_ATTRIBUTES: STD_LOGIC_VECTOR(7 downto 0) := X"60";
-- Interface Code of (ID & Number & Index)
constant CODE_NUMBER_ENDPOINTS: STD_LOGIC_VECTOR(7 downto 0) := X"04";
constant CODE_INTERFACE_CLASS: STD_LOGIC_VECTOR(7 downto 0) := X"DC";
constant CODE_INTERFACE_SUB_CLASS: STD_LOGIC_VECTOR(7 downto 0) := X"A0";
constant CODE_INTERFACE_PROTOCOL: STD_LOGIC_VECTOR(7 downto 0) := X"B0";
-- EndPoint Code of (ID & Number & Index)
constant CODE_NUMBER_INTERVAL: STD_LOGIC_VECTOR(7 downto 0) := X"0A";

-- Recipient
constant RECIPIENT_MASK: STD_LOGIC_VECTOR(7 downto 0) := X"1F";
constant RECIPIENT_DEVICE: STD_LOGIC_VECTOR(7 downto 0) := X"00";
constant RECIPIENT_INTERFACE: STD_LOGIC_VECTOR(7 downto 0) := X"01";
constant RECIPIENT_ENDPOINT: STD_LOGIC_VECTOR(7 downto 0) := X"02";

-- Request Type
constant REQUEST_TYPE_MASK: STD_LOGIC_VECTOR(7 downto 0) := X"60";
constant TYPE_STANDARD_REQUEST: STD_LOGIC_VECTOR(7 downto 0) := X"00";
constant TYPE_CLASS_REQUEST: STD_LOGIC_VECTOR(7 downto 0) := X"20";
constant TYPE_VENDOR_REQUEST: STD_LOGIC_VECTOR(7 downto 0) := X"40";

constant REQUEST_GET_STATUS: STD_LOGIC_VECTOR(7 downto 0) := X"00";
constant REQUEST_CLEAR_FEATURE: STD_LOGIC_VECTOR(7 downto 0) := X"01";
constant REQUEST_SET_FEATURE: STD_LOGIC_VECTOR(7 downto 0) := X"03";
constant REQUEST_SET_ADDRESS: STD_LOGIC_VECTOR(7 downto 0) := X"05";
constant REQUEST_GET_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"06";
constant REQUEST_SET_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"07";
constant REQUEST_GET_CONFIGURATION: STD_LOGIC_VECTOR(7 downto 0) := X"08";
constant REQUEST_SET_CONFIGURATION: STD_LOGIC_VECTOR(7 downto 0) := X"09";
constant REQUEST_GET_INTERFACE: STD_LOGIC_VECTOR(7 downto 0) := X"0A";
constant REQUEST_SET_INTERFACE: STD_LOGIC_VECTOR(7 downto 0) := X"0B";
constant REQUEST_SYNC_FRAME: STD_LOGIC_VECTOR(7 downto 0) := X"0C";	 

-- Special Consants

---------------------------------------------------------------------------------------------------
-- Descriptors
---------------------------------------------------------------------------------------------------	

-- Descriptors Set
constant TRANSEIVER_DATA: REG256x8 :=
(										-- Address		Comments
SIZE_DEVICE_DESCRIPTOR,					-- 00000000		Start of device descriptor
TYPE_DEVICE_DESCRIPTOR,
CODE_BCD_USB_HIGH,
CODE_BCD_USB_LOW, 
CODE_DEVICE_CLASS,
X"00",
X"00",		 
SIZE_ENDPOINT0_PACKET,
CODE_ID_VENDOR_HIGH,
CODE_ID_VENDOR_LOW,
CODE_ID_PRODUCT_HIGH,
CODE_ID_PRODUCT_LOW,
CODE_BCD_DEVICE_HIGH,
CODE_BCD_DEVICE_LOW,
X"00",
X"00",
X"00",
CODE_NUMBER_CONFIGURATIONS,				-- 00000011		End of device descriptor 
SIZE_CONFIGURATION_DESCRIPTOR,			-- 00000012		Start of configuration descriptor
TYPE_CONFIGURATION_DESCRIPTOR,
SIZE_ALL_CONFIGURATION_DESCRIPTOR_HIGH,
SIZE_ALL_CONFIGURATION_DESCRIPTOR_LOW,
X"01",
X"01",
X"00",
CODE_BM_ATTRIBUTES,
X"01", 									-- 0000001A		End of configuration descriptor	
SIZE_INTERFACE_DESCRIPTOR,				-- 0000001B		Start of interface descriptor
TYPE_INTERFACE_DESCRIPTOR,
X"00",
X"00",				   
CODE_NUMBER_ENDPOINTS,	
CODE_INTERFACE_CLASS,
CODE_INTERFACE_SUB_CLASS,
CODE_INTERFACE_PROTOCOL,
X"00",									-- 00000023		End of interface descriptor
SIZE_ENDPOINT_DESCRIPTOR,				-- 00000024		Start of endpoint1(tx) descriptor
TYPE_ENDPOINT_DESCRIPTOR,
ADDRESS_ENDPOINT1_TX, 
TYPE_ENDPOINT_INTERRUPT,
SIZE_ENDPOINT1_PACKET_HIGH,
SIZE_ENDPOINT1_PACKET_LOW,	
CODE_NUMBER_INTERVAL,					-- 0000002A		End of endpoint1(tx) descriptor	
SIZE_ENDPOINT_DESCRIPTOR,				-- 0000002B		Start of endpoint1(rx) descriptor
TYPE_ENDPOINT_DESCRIPTOR,
ADDRESS_ENDPOINT1_RX, 
TYPE_ENDPOINT_INTERRUPT,
SIZE_ENDPOINT1_PACKET_HIGH,
SIZE_ENDPOINT1_PACKET_LOW,	
CODE_NUMBER_INTERVAL,					-- 00000031		End of endpoint1(rx) descriptor	
SIZE_ENDPOINT_DESCRIPTOR,				-- 00000032		Start of endpoint2(tx) descriptor
TYPE_ENDPOINT_DESCRIPTOR,
ADDRESS_ENDPOINT2_TX, 
TYPE_ENDPOINT_BULK,
SIZE_ENDPOINT2_PACKET_HIGH,
SIZE_ENDPOINT2_PACKET_LOW,	
CODE_NUMBER_INTERVAL,					-- 00000038		End of endpoint2(tx) descriptor	
SIZE_ENDPOINT_DESCRIPTOR,				-- 00000039		Start of endpoint2(rx) descriptor
TYPE_ENDPOINT_DESCRIPTOR,
ADDRESS_ENDPOINT2_RX, 
TYPE_ENDPOINT_BULK,
SIZE_ENDPOINT2_PACKET_HIGH,
SIZE_ENDPOINT2_PACKET_LOW,	
CODE_NUMBER_INTERVAL,					-- 0000003F		End of endpoint2(rx) descriptor	
others => X"00"	
);				

-- Address
--constant ADDRESS_DEVICE_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"00";
--constant ADDRESS_CONFIGURATION_DESCRIPTOR: STD_LOGIC_VECTOR(7 downto 0) := X"12"; 
--constant ADDRESS_EP0_BUFFER: STD_LOGIC_VECTOR(7 downto 0) := X"40";
--constant ADDRESS_EP1_BUFFER: STD_LOGIC_VECTOR(7 downto 0) := X"50";
--constant ADDRESS_EP2_BUFFER: STD_LOGIC_VECTOR(7 downto 0) := X"60";
constant ADDRESS_DEVICE_DESCRIPTOR: INTEGER8 := 0;
constant ADDRESS_CONFIGURATION_DESCRIPTOR: INTEGER8 := 18;
constant ADDRESS_EP0_BUFFER: INTEGER8 := 64;  
constant ADDRESS_SET_ADDRESS: INTEGER8 := 66;  
constant ADDRESS_SET_CONFIGURATION: INTEGER8 := 66;
constant ADDRESS_DESCRIPTOR_TYPE: INTEGER8 := 67;
constant ADDRESS_REQUEST_VALUE_HIGH: INTEGER8 := 66;
constant ADDRESS_REQUEST_VALUE_LOW: INTEGER8 := 67;
constant ADDRESS_DATA_LENGTH_HIGH: INTEGER8 := 70;
constant ADDRESS_DATA_LENGTH_LOW: INTEGER8 := 71;
constant ADDRESS_EP1_BUFFER: INTEGER8 := 80;
constant ADDRESS_EP2_BUFFER: INTEGER8 := 96;
constant ADDRESS_TEMP_DATA: INTEGER8 := 192; 
constant ADDRESS_DEVICE_REQUEST_TYPE: INTEGER8 := 64;	
constant ADDRESS_DEVICE_REQUEST: INTEGER8 := 65;


end USB_PACKAGE;
--}} End of automatically maintained section

package body USB_PACKAGE is
end USB_PACKAGE;

⌨️ 快捷键说明

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