📄 tbxsp010pak.vhd
字号:
--------------------------------------------------------------------------------
-- 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 + -