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

📄 tbxsp010pak.vhd

📁 the vhdl model of usb. it is very helpful.
💻 VHD
📖 第 1 页 / 共 3 页
字号:
		stim<= '0';
		packetNAK  (tb_clk, tb_xd, tb_x0);
		
		wait for 5us;
		
		comment2:= "ACK                      ";
		stim<= '1';
		packetOUT  (tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA1(tb_clk, tb_xd, tb_x0);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
		----------------------------------------
		-- ClearFeature (ENDPOINT_HALT)
		--------------------
		-- send SETUP stage
		comment2:= "ClearFeature(EP_HALT)    ";
		stim<= '1';
		packetIDLE (tb_clk, tb_xd, tb_x0, 5);
		packetSETUP(tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA0(tb_clk, tb_xd, tb_x0, ecf);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 50us;
		
		--------------------
		-- status stage
		comment2:= "NAK                      ";
		stim<= '1';
		packetIN   (tb_clk, tb_xd, tb_x0, addr0, ep0);
		stim<= '0';
		packetNAK  (tb_clk, tb_xd, tb_x0);
		
		wait for 10us;
		
		comment2:= "ACK                      ";
		stim<= '1';
		packetIN   (tb_clk, tb_xd, tb_x0, addr0, ep0);
		stim<= '0';
		packetDATA1(tb_clk, tb_xd, tb_x0);
		stim<= '1';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		----------------------------------------
		-- GetStatus(EP)
		--------------------
		-- send SETUP stage
		comment2:= "GetStatus(EP)            ";
		stim<= '1';
		packetIDLE (tb_clk, tb_xd, tb_x0, 5);
		packetSETUP(tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA0(tb_clk, tb_xd, tb_x0, egs);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 50us;
		
		--------------------
		-- data stage, DATA1
		comment2:= "IN, DATA1                ";
		stim<= '1';
		packetIN   (tb_clk, tb_xd, tb_x0, addr0, ep0);
		stim<= '0';
		packetDATA1(tb_clk, tb_xd, tb_x0, es0);
		stim<= '1';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 10us;
		
		--------------------
		-- status stage
		comment2:= "NAK                      ";
		stim<= '1';
		packetOUT  (tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA1(tb_clk, tb_xd, tb_x0);
		stim<= '0';
		packetNAK  (tb_clk, tb_xd, tb_x0);
		
		wait for 10us;
		
		comment2:= "ACK                      ";
		stim<= '1';
		packetOUT  (tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA1(tb_clk, tb_xd, tb_x0);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		----------------------------------------
		-- GetStatus(Device)
		--------------------
		-- send SETUP stage
		comment2:= "GetStatus(Device)        ";
		stim<= '1';
		packetIDLE (tb_clk, tb_xd, tb_x0, 5);
		packetSETUP(tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA0(tb_clk, tb_xd, tb_x0, dgs);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 50us;
		
		--------------------
		-- data stage, DATA1
		comment2:= "IN, DATA1                ";
		stim<= '1';
		packetIN   (tb_clk, tb_xd, tb_x0, addr0, ep0);
		stim<= '0';
		packetDATA1(tb_clk, tb_xd, tb_x0, ds);
		stim<= '1';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 10us;
		
		--------------------
		-- status stage
		comment2:= "NAK                      ";
		stim<= '1';
		packetOUT  (tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA1(tb_clk, tb_xd, tb_x0);
		stim<= '0';
		packetNAK  (tb_clk, tb_xd, tb_x0);
		
		wait for 10us;
		
		comment2:= "ACK                      ";
		stim<= '1';
		packetOUT  (tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA1(tb_clk, tb_xd, tb_x0);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
	end procedure;
	
	----------------------------------------------------------------------------
	procedure GetReport(
		signal tb_clk:  in  STD_LOGIC;
		signal tb_xd:   out STD_LOGIC;
		signal tb_x0:   out STD_LOGIC;
		signal stim:    out STD_LOGIC) is
		
		constant gr: packetBUF:= (
		x"A1",  --  0: bmRequestType      0xA1   Device-to-host
		x"01",  --  1: bRequest           0x01   GET_REPORT
		x"00",  --  2: wValue             0x0100 Input
		x"01",  --  3:
		x"01",  --  4: wIndex             0x0001 Interface
		x"00",  --  5:
		x"01",  --  6: wLength            0x0001 Report Length
		x"00"); --  7:
		
		constant grd: packetCHR:=
		x"AA";  --  0:                    0xAA   Report Data
		
		constant sr: packetBUF:= (
		x"21",  --  0: bmRequestType      0x21   Device-to-host
		x"09",  --  1: bRequest           0x09   SET_REPORT
		x"00",  --  2: wValue             0x0100 Input
		x"01",  --  3:
		x"01",  --  4: wIndex             0x0001 Interface
		x"00",  --  5:
		x"01",  --  6: wLength            0x0001 Report Length
		x"00"); --  7:
		
		constant srd: packetBUF:= (
		x"AA",  --  0:                    0xAA   Report Data
		x"55"); --  1:                    0x55
		
	begin
		comment1:= "GetReport                ";
		----------------------------------------
		-- SetReport
		--------------------
		-- send SETUP stage
		comment2:= "SetReport                ";
		stim<= '1';
		packetIDLE (tb_clk, tb_xd, tb_x0, 5);
		packetSETUP(tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA0(tb_clk, tb_xd, tb_x0, sr);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 50us;
		
		--------------------
		-- DATA stage
		comment2:= "OUT, DATA1               ";
		stim<= '1';
		packetOUT  (tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA1(tb_clk, tb_xd, tb_x0, srd);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 10us;
		
		comment2:= "OUT, DATA0               ";
		stim<= '1';
		packetOUT  (tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA0(tb_clk, tb_xd, tb_x0, srd);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		--------------------
		-- status stage
		comment2:= "NAK                      ";
		stim<= '1';
		packetIN   (tb_clk, tb_xd, tb_x0, addr0, ep0);
		stim<= '0';
		packetNAK  (tb_clk, tb_xd, tb_x0);
		
		wait for 10us;
		
		comment2:= "ACK                      ";
		stim<= '1';
		packetIN   (tb_clk, tb_xd, tb_x0, addr0, ep0);
		stim<= '0';
		packetDATA1(tb_clk, tb_xd, tb_x0);
		stim<= '1';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		----------------------------------------
		-- GetReport
		--------------------
		-- send SETUP stage
		comment2:= "GetReport                ";
		stim<= '1';
		packetIDLE (tb_clk, tb_xd, tb_x0, 5);
		packetSETUP(tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA0(tb_clk, tb_xd, tb_x0, gr);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 50us;
		
		--------------------
		-- data stage, DATA1
		comment2:= "IN, DATA1                ";
		stim<= '1';
		packetIN   (tb_clk, tb_xd, tb_x0, addr0, ep0);
		stim<= '0';
		packetDATA1(tb_clk, tb_xd, tb_x0, grd);
		stim<= '1';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 10us;
		
		--------------------
		-- status stage
		comment2:= "NAK                      ";
		stim<= '1';
		packetOUT  (tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA1(tb_clk, tb_xd, tb_x0);
		stim<= '0';
		packetNAK  (tb_clk, tb_xd, tb_x0);
		
		wait for 10us;
		
		comment2:= "ACK                      ";
		stim<= '1';
		packetOUT  (tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA1(tb_clk, tb_xd, tb_x0);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
	end procedure;
	
	----------------------------------------------------------------------------
	procedure GetClassDescriptor(
		signal tb_clk:  in  STD_LOGIC;
		signal tb_xd:   out STD_LOGIC;
		signal tb_x0:   out STD_LOGIC;
		signal stim:    out STD_LOGIC) is
		
		constant ghd: packetBUF:= (
		x"81",  --  0: bmRequestType      0x81   Device-to-host
		x"06",  --  1: bRequest           0x06   GET_DESCRIPTOR
		x"00",  --  2: wValue             0x2100 HID
		x"21",  --  3:
		x"00",  --  4: wIndex             0x0000
		x"00",  --  5:
		x"08",  --  6: wLength            0x0008
		x"00"); --  7:
		
		constant hd0_7: packetBUF:= (
		x"09",  --  0: bLength            0x09   9bytes
		x"21",  --  1: bDescriptorType    0x21   HID
		x"00",  --  2: bcdHID             0x0100 Rev 1.0
		x"01",  --  3:
		x"00",  --  4: bCountryCode       0x00
		x"01",  --  5: bNumDescriptors    0x01
		x"22",  --  6: bDescriptorType    0x22
		x"1C"); --  7: wDescriptorLength  0x1C
		
		constant grd: packetBUF:= (
		x"81",  --  0: bmRequestType      0x81   Device-to-host
		x"06",  --  1: bRequest           0x06   GET_DESCRIPTOR
		x"00",  --  2: wValue             0x2200 Report
		x"22",  --  3:
		x"00",  --  4: wIndex             0x0000
		x"00",  --  5:
		x"07",  --  6: wLength            0x0007
		x"00"); --  7:
		
		constant rd0_6: packetBUF:= (
		x"06",  --  0:                    0x06
		x"00",  --  1:                    0x00
		x"FF",  --  2:                    0xFF
		x"09",  --  3:                    0x09
		x"01",  --  4:                    0x01
		x"A1",  --  5:                    0xA1
		x"01"); --  6:                    0x01
		
		
	begin
		comment1:= "GetClassDescriptor       ";
		----------------------------------------
		-- HID
		
		--------------------
		-- send SETUP stage
		comment2:= "GetDescriptor(HID)       ";
		stim<= '1';
		packetIDLE (tb_clk, tb_xd, tb_x0, 5);
		packetSETUP(tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA0(tb_clk, tb_xd, tb_x0, ghd);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 200us;
		
		--------------------
		-- data stage, DATA1
		comment2:= "IN, DATA1                ";
		stim<= '1';
		packetIN   (tb_clk, tb_xd, tb_x0, addr0, ep0);
		stim<= '0';
		packetDATA1(tb_clk, tb_xd, tb_x0, hd0_7);
		stim<= '1';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 10us;
		
		--------------------
		-- status stage
		comment2:= "NAK                      ";
		stim<= '1';
		packetOUT  (tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA1(tb_clk, tb_xd, tb_x0);
		stim<= '0';
		packetNAK  (tb_clk, tb_xd, tb_x0);
		
		wait for 10us;
		
		comment2:= "ACK                      ";
		stim<= '1';
		packetOUT  (tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA1(tb_clk, tb_xd, tb_x0);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
		----------------------------------------
		-- Report
		
		--------------------
		-- send SETUP stage
		comment2:= "GetDescriptor(Report)    ";
		stim<= '1';
		packetIDLE (tb_clk, tb_xd, tb_x0, 5);
		packetSETUP(tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA0(tb_clk, tb_xd, tb_x0, grd);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 200us;
		
		--------------------
		-- data stage, DATA1
		comment2:= "IN, DATA1                ";
		stim<= '1';
		packetIN   (tb_clk, tb_xd, tb_x0, addr0, ep0);
		stim<= '0';
		packetDATA1(tb_clk, tb_xd, tb_x0, rd0_6);
		stim<= '1';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 10us;
		
		--------------------
		-- status stage
		comment2:= "NAK                      ";
		stim<= '1';
		packetOUT  (tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA1(tb_clk, tb_xd, tb_x0);
		stim<= '0';
		packetNAK  (tb_clk, tb_xd, tb_x0);
		
		wait for 10us;
		
		comment2:= "ACK                      ";
		stim<= '1';
		packetOUT  (tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA1(tb_clk, tb_xd, tb_x0);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
	end procedure;
	
	----------------------------------------------------------------------------
	procedure InvalidRequest(
		signal tb_clk:  in  STD_LOGIC;
		signal tb_xd:   out STD_LOGIC;
		signal tb_x0:   out STD_LOGIC;
		signal stim:    out STD_LOGIC) is
		
		constant inv: packetBUF:= (
		x"FF",  --  0: bmRequestType      0xA1   Device-to-host
		x"FF",  --  1: bRequest           0x01   GET_REPORT
		x"FF",  --  2: wValue             0x0100 Input
		x"FF",  --  3:
		x"FF",  --  4: wIndex             0x0001 Interface
		x"FF",  --  5:
		x"FF",  --  6: wLength            0x0001 Report Length
		x"FF"); --  7:
		
		constant ecf: packetBUF:= (
		x"02",  --  0: bmRequestType      0x00   Host-to-device
		x"01",  --  1: bRequest           0x01   CLEAR_FEATURE
		x"00",  --  2: wValue             0x0000 Feature Selector
		x"00",  --  3:
		x"01",  --  4: wIndex             0x0001 Endpoint
		x"00",  --  5:
		x"00",  --  6: wLength            0x0000
		x"00"); --  7:
		
	begin
		
		comment1:= "InvalidRequest           ";
		----------------------------------------
		-- invalid request
		--------------------
		-- send SETUP stage
		comment2:= "invalid SETUP            ";
		stim<= '1';
		packetSETUP(tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA0(tb_clk, tb_xd, tb_x0, inv);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 50us;
		
		--------------------
		-- try IN
		comment2:= "IN, STALL                ";
		stim<= '1';
		packetIN   (tb_clk, tb_xd, tb_x0, addr0, ep0);
		stim<= '0';
		packetSTALL(tb_clk, tb_xd, tb_x0);
		
		
		--------------------
		-- try OUT
		comment2:= "OUT, STALL               ";
		stim<= '1';
		packetOUT  (tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA1(tb_clk, tb_xd, tb_x0, inv);
		stim<= '0';
		packetSTALL(tb_clk, tb_xd, tb_x0);
		
		----------------------------------------
		-- ClearFeature (any SETUP will disable endpoint STALL)
		--------------------
		-- send SETUP stage
		comment2:= "ClearFeature(EP_HALT)    ";
		stim<= '1';
		packetIDLE (tb_clk, tb_xd, tb_x0, 5);
		packetSETUP(tb_clk, tb_xd, tb_x0, addr0, ep0);
		packetDATA0(tb_clk, tb_xd, tb_x0, ecf);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 50us;
		
		--------------------
		-- status stage
		comment2:= "NAK                      ";
		stim<= '1';
		packetIN   (tb_clk, tb_xd, tb_x0, addr0, ep0);
		stim<= '0';
		packetNAK  (tb_clk, tb_xd, tb_x0);
		
		wait for 10us;
		
		comment2:= "ACK                      ";
		stim<= '1';
		packetIN   (tb_clk, tb_xd, tb_x0, addr0, ep0);
		stim<= '0';
		packetDATA1(tb_clk, tb_xd, tb_x0);
		stim<= '1';
		packetACK  (tb_clk, tb_xd, tb_x0);
	end procedure;
	
end TBxsp010pak;
--------------------------------------------------------------------------------
-- end of file

⌨️ 快捷键说明

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