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

📄 tbxsp010pak.vhd

📁 the vhdl model of usb. it is very helpful.
💻 VHD
📖 第 1 页 / 共 3 页
字号:
--------------------------------------------------------------------------------
-- Copyright (c) 2000 by Trenz Electronic.
-- Duenner Kirchweg 77, 32257 Buende, Germany, www.trenz-electronic.de
--     
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--     
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
--     
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
--------------------------------------------------------------------------------
-- Project:      Full-Speed USB 1.1 Function Controller
-- File:         TBxsp010pak.vhd
-- Description:  Chapter 9 testbench procedures.
-- Version:      FB, 2000jun06: Created.
--               FB, 2000nov15: Fix SETUP-DATA0-ACK (was DATA1 before).
--                              binary to hex
--------------------------------------------------------------------------------

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use work.usbTSTPAK.all;

package TBxsp010pak is
	shared variable comment1: STRING(1 to 25);
	shared variable comment2: STRING(1 to 25);
	constant addr0: STD_LOGIC_VECTOR(6 downto 0):= "0000000";
	constant addr1: STD_LOGIC_VECTOR(6 downto 0):= "1100101";
	constant ep0:   STD_LOGIC_VECTOR(3 downto 0):= "0000";
	
	procedure GetDeviceDescriptor(
	signal tb_clk:  in  STD_LOGIC;
	signal tb_xd:   out STD_LOGIC;
	signal tb_x0:   out STD_LOGIC;
	signal stim:    out STD_LOGIC);
	
	procedure GetConfigDescriptor(
	signal tb_clk:  in  STD_LOGIC;
	signal tb_xd:   out STD_LOGIC;
	signal tb_x0:   out STD_LOGIC;
	signal stim:    out STD_LOGIC);
	
	procedure GetStringDescriptor(
	signal tb_clk:  in  STD_LOGIC;
	signal tb_xd:   out STD_LOGIC;
	signal tb_x0:   out STD_LOGIC;
	signal stim:    out STD_LOGIC);
	
	procedure SetAddress(
	signal tb_clk:  in  STD_LOGIC;
	signal tb_xd:   out STD_LOGIC;
	signal tb_x0:   out STD_LOGIC;
	signal stim:    out STD_LOGIC);
	
	procedure SetConfiguration(
	signal tb_clk:  in  STD_LOGIC;
	signal tb_xd:   out STD_LOGIC;
	signal tb_x0:   out STD_LOGIC;
	signal stim:    out STD_LOGIC);
	
	procedure GetStatus(
	signal tb_clk:  in  STD_LOGIC;
	signal tb_xd:   out STD_LOGIC;
	signal tb_x0:   out STD_LOGIC;
	signal stim:    out STD_LOGIC);
	
	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);
	
	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);
	
	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);
end TBxsp010pak;

--------------------------------------------------------------------------------
package body TBxsp010pak is
	
	----------------------------------------------------------------------------
	procedure GetDeviceDescriptor(
		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 gdd: packetBUF:= (
		x"80",  --  0: bmRequestType      0x80   Device-to-host
		x"06",  --  1: bRequest           0x06   GET_DESCRIPTOR
		x"00",  --  2: wValue             0x0100 DEVICE
		x"01",  --  3:
		x"00",  --  4: wIndex             0x0000
		x"00",  --  5:
		x"40",  --  6: wLength            0x0040
		x"00"); --  7:
		
		constant dd0_7: packetBUF:= (
		x"12",  --  0: bLength            0x12   18bytes
		x"01",  --  1: bDescriptorType    0x01   DEVICE
		x"01",  --  2: bcdUSB             0x0101 Rev 1.1
		x"01",  --  3:
		x"00",  --  4: bDeviceClass       0x00
		x"00",  --  5: bDeviceSubClass    0x00
		x"00",  --  6: bDeviceProtocol    0x00
		x"08"); --  7: bMaxPacketSize0    0x08   8bytes
		
		constant dd8_15: packetBUF:= (
		x"D0",  --  8: idVendor           0x0BD0 (3024)
		x"0B",  --  9: 
		x"00",  -- 10: idProduct          0x0100
		x"01",  -- 11:
		x"00",  -- 12: bcdDevice          0x0100 Rev 1.0
		x"01",  -- 13:
		x"01",  -- 14: iManufacturer      0x01
		x"02"); -- 15: iProduct           0x02
		
		constant dd16_17: packetBUF:= (
		x"00",  -- 16: iSerialNumber      0x00
		x"01"); -- 17: bNumConfigurations 0x01
		
	begin
		comment1:= "GetDeviceDescriptor      ";
		--------------------
		-- send SETUP stage
		comment2:= "GetDescriptor(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, gdd);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 1us;
		
		--------------------
		-- NAKed data stage
		comment2:= "IN, NAK                  ";
		stim<= '1';
		packetIN   (tb_clk, tb_xd, tb_x0, addr0, ep0);
		stim<= '0';
		packetNAK  (tb_clk, tb_xd, tb_x0);
		
		wait for 200us; -- ok
		
		--------------------
		-- 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, dd0_7);
		stim<= '1';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 150us; -- ok
		
		--------------------
		-- data stage, DATA0
		comment2:= "IN, DATA0                ";
		stim<= '1';
		packetIN   (tb_clk, tb_xd, tb_x0, addr0, ep0);
		stim<= '0';
		packetDATA0(tb_clk, tb_xd, tb_x0, dd8_15);
		stim<= '1';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 60us; -- ok
		
		--------------------
		-- 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, dd16_17);
		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 1us;
		
		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 GetConfigDescriptor(
		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 gcd: packetBUF:= (
		x"80",  --  0: bmRequestType      0x80   Device-to-host
		x"06",  --  1: bRequest           0x06   GET_DESCRIPTOR
		x"00",  --  2: wValue             0x0200 CONFIGURATION
		x"02",  --  3:
		x"00",  --  4: wIndex             0x0000
		x"00",  --  5:
		x"00",  --  6: wLength            0x0400
		x"04"); --  7:
		
		constant cd0_7: packetBUF:= (
		x"09",  --  0: bLength            0x09   9bytes
		x"02",  --  1: bDescriptorType    0x02   CONFIGURATION
		x"22",  --  2: wTotalLength       0x0022
		x"00",  --  3:
		x"01",  --  4: bNumInterfaces     0x01
		x"01",  --  5: bConfigurationVal  0x01
		x"03",  --  6: iConfiguration     0x03
		x"80"); --  7: bmAttributes       0x80
		
		-- remainder of cd missing here
		
	begin
		comment1:= "GetConfigDescriptor      ";
		
		--------------------
		-- send SETUP stage
		comment2:= "GetDescriptor(Config)    ";
		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, gcd);
		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, cd0_7);
		stim<= '1';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 5us;
		
		--------------------
		-- early 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 150us; -- ok
		
		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 GetStringDescriptor(
		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 gsd0: packetBUF:= (
		x"80",  --  0: bmRequestType      0x80   Device-to-host
		x"06",  --  1: bRequest           0x06   GET_DESCRIPTOR
		x"00",  --  2: wValue             0x0300 STRING #0
		x"03",  --  3:
		x"00",  --  4: wIndex             0x0000
		x"00",  --  5:
		x"00",  --  6: wLength            0x0100
		x"01"); --  7:
		
		constant sd0_0_3: packetBUF:= (
		x"04",  --  0: bLength            0x04   4bytes
		x"03",  --  1: bDescriptorType    0x03   STRING
		x"09",  --  2: wLANGID[0]         0x09
		x"04"); --  3:                    0x04
		
		constant gsd1: packetBUF:= (
		x"80",  --  0: bmRequestType      0x80   Device-to-host
		x"06",  --  1: bRequest           0x06   GET_DESCRIPTOR
		x"01",  --  2: wValue             0x0301 STRING #1
		x"03",  --  3:
		x"00",  --  4: wIndex             0x0000
		x"00",  --  5:
		x"00",  --  6: wLength            0x0100
		x"01"); --  7:
		
		constant sd1_0_7: packetBUF:= (
		x"2C",  --  0: bLength            0x2c   44bytes
		x"03",  --  1: bDescriptorType    0x03   STRING
		x"55",  --  2:                    0x55   'U'
		x"00",  --  3:                    0x00
		x"53",  --  4:                    0x53   'S'
		x"00",  --  5:                    0x00
		x"42",  --  6:                    0x42   'B'
		x"00"); --  7:                    0x00
		
		constant gsd2: packetBUF:= (
		x"80",  --  0: bmRequestType      0x80   Device-to-host
		x"06",  --  1: bRequest           0x06   GET_DESCRIPTOR
		x"02",  --  2: wValue             0x0302 STRING #2
		x"03",  --  3:
		x"00",  --  4: wIndex             0x0000
		x"00",  --  5:
		x"07",  --  6: wLength            0x0007
		x"00"); --  7:
		
		constant sd2_0_6: packetBUF:= (
		x"22",  --  0: bLength            0x22   34bytes
		x"03",  --  1: bDescriptorType    0x03   STRING
		x"42",  --  2:                    0x42   'B'
		x"00",  --  3:                    0x00
		x"75",  --  4:                    0x75   'u'
		x"00",  --  5:                    0x00
		x"74"); --  6:                    0x74   't'
		
		constant gsd3: packetBUF:= (
		x"80",  --  0: bmRequestType      0x80   Device-to-host
		x"06",  --  1: bRequest           0x06   GET_DESCRIPTOR
		x"03",  --  2: wValue             0x0303 STRING #3
		x"03",  --  3:
		x"00",  --  4: wIndex             0x0000
		x"00",  --  5:
		x"07",  --  6: wLength            0x0007
		x"00"); --  7:
		
		constant sd3_0_6: packetBUF:= (
		x"24",  --  0: bLength            0x24   44bytes
		x"03",  --  1: bDescriptorType    0x03   STRING
		x"53",  --  2:                    0x53   'S'
		x"00",  --  3:                    0x00
		x"69",  --  4:                    0x69   'i'
		x"00",  --  5:                    0x00
		x"6D"); --  6:                    0x6D   'm'
		
		constant gsd4: packetBUF:= (
		x"80",  --  0: bmRequestType      0x80   Device-to-host
		x"06",  --  1: bRequest           0x06   GET_DESCRIPTOR
		x"04",  --  2: wValue             0x0304 STRING #4
		x"03",  --  3:
		x"00",  --  4: wIndex             0x0000
		x"00",  --  5:
		x"07",  --  6: wLength            0x0007
		x"00"); --  7:
		
		constant sd4_0_6: packetBUF:= (
		x"24",  --  0: bLength            0x24   44bytes
		x"03",  --  1: bDescriptorType    0x03   STRING
		x"46",  --  2:                    0x46   'F'
		x"00",  --  3:                    0x00
		x"69",  --  4:                    0x69   'i'
		x"00",  --  5:                    0x00
		x"72"); --  6:                    0x72   'r'
	begin
		
		comment1:= "GetStringDescriptor      ";
		
		----------------------------------------
		-- string #0
		
		--------------------
		-- send SETUP stage
		comment2:= "GetDescriptor(String #0) ";
		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, gsd0);
		stim<= '0';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 160us;
		
		--------------------
		-- 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, sd0_0_3);
		stim<= '1';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 5us;
		
		--------------------
		-- 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 1us;
		
		stim<= '1';
		comment2:= "ACK                      ";
		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);
		
		----------------------------------------
		-- string #1
		--------------------
		-- send SETUP stage
		comment2:= "GetDescriptor(String #1) ";
		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, gsd1);
		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, sd1_0_7);
		stim<= '1';
		packetACK  (tb_clk, tb_xd, tb_x0);
		
		wait for 5us;
		
		--------------------
		-- 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 150us;
		
		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);
		
		----------------------------------------
		-- string #2
		--------------------
		-- send SETUP stage
		comment2:= "GetDescriptor(String #2) ";
		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, gsd2);
		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);

⌨️ 快捷键说明

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