--控制器协议层<br>
--file :usbf_pd.vhd<br>
<br>
library ieee;<br>
use ieee.std_logic_1164.all;<br>
use ieee.std_logic_arith.all;<br>
use ieee.std_logic_unsigned.all;<br>
<br>
entity usb_pd is --实体声明<br>
generic(<br>
USBF_T_PID_OUT:std_logic_vector(3 downto 0):="0001";<br>
USBF_T_PID_IN:std_logic_vector(3 downto 0):="1001";<br>
USBF_T_PID_SOF:std_logic_vector(3 downto 0):="0101";<br>
USBF_T_PID_SETUP:std_logic_vector(3 downto 0):="1101";<br>
USBF_T_PID_DATA0:std_logic_vector(3 downto 0):="0011";<br>
USBF_T_PID_DATA1:std_logic_vector(3 downto 0):="1011";<br>
USBF_T_PID_DATA2:std_logic_vector(3 downto 0):="0111";<br>
USBF_T_PID_MDATA:std_logic_vector(3 downto 0):="1111";<br>
USBF_T_PID_ACK :std_logic_vector(3 downto 0):="0010";<br>
USBF_T_PID_NACK :std_logic_vector(3 downto 0):="1010";<br>
USBF_T_PID_STALL:std_logic_vector(3 downto 0):="1110";<br>
USBF_T_PID_NYET :std_logic_vector(3 downto 0):="0110"; <br>
USBF_T_PID_PRE :std_logic_vector(3 downto 0):="1100";<br>
USBF_T_PID_ERR :std_logic_vector(3 downto 0):="1100"; <br>
USBF_T_PID_SPLIT:std_logic_vector(3 downto 0):="1000"; <br>
USBF_T_PID_PING :std_logic_vector(3 downto 0):="0100"; <br>
USBF_T_PID_RES :std_logic_vector(3 downto 0):="0000";<br>
);<br>
<br>
port(clk,rst:in std_logic;<br>
rx_data:in std_logic_vector(7 downto 0);<br>
rx_valid,rx_active,rx_err:in std_logic;<br>
--PID数据包标试符信息输出<br>
<br>
pid_OUT,pid_IN,pid_SOF,pid_SETUP:buffer std_logic;<br>
pid_DATA0,pid_DATA1,pid_DATA2,pid_MDATA:buffer std_logic;<br>
pid_ACK,pid_NACK,pid_STALL,pid_NYET:buffer std_logic;<br>
pid_PRE,pid_ERR,pid_SPLIT,pid_PING:buffer std_logic;<br>
pid_cks_err:buffer std_logic; --pid出错标识<br>
<br>
--令牌包信息输出接口<br>
token_fadr:buffer std_logic_vector(6 downto 0); --地址信息<br>
token_endp:buffer std_logic_vector(3 downto 0); --端点信息<br>
token_valid:buffer std_logic; --令牌包有效信息<br>
crc5_err

ut std_logic; --令牌包的CRC5错误检查<br>
frame_no

ut std_logic_vector(10 downto 0); --SOF信息包输出信息<br>
<br>
--数据包信息输出接口<br>
rx_data_st

ut std_logic_vector(7 downto 0); --数据输出<br>
rx_data_valid ut std_logic; --数据有效<br>
rx_data_done ut std_logic --数据传输结束<br>
crc16_err ut std_logic; --数据包CRC6出错检测<br>
seq_err:buffer std_logic; --状态机出错信息<br>
);<br>
end entity;<br>
<br>
architecture arch_usbf_pd of usbf_pd is<br>
<br>
<br>
compand usbf_crc5 port(<br>
crc_in:in std_logic_vector(15 downto 0);<br>
din:in std_logic_vector(7 downto 0);<br>
crc_out ut std_logic_vector(15 downto 0);<br>
);<br>
end compand;<br>
<br>
--状态机状态定义<br>
constant IDLE:std_logic_vector(3 downto 0):="0001";<br>
constant ACTIVE:std_logic_vector(3 downto 0):="0010";<br>
constant TOKEN:std_logic_vector(3 downto 0):="0100";<br>
constant DATA:std_logic_vector(3 downto 0):="1000";<br>
signal state,next_state:std_logic_vector(3 downto 0);<br>
<br>
signal pid:std_logic_vector(7 downto 0); --PDI<br>
signal pid_le_sm:std_logic; --状态机pid有效<br>
signal pid_ld_en:std_logic; --pid有效使能<br>
<br>
signal pid_RES:std_logic;<br>
signal pid_TOKEN:std_logic; --所有的令牌包统一的信号<br>
signal pid_DATA:std_logic; --所有的数据包统一信号<br>
<br>
signal token0,token1:std_logic_vector(7 downto 0); --令牌包缓存<br>
signal token_le_1,token_le_2:std_logic; --令牌包缓存有效使能<br>
signal token_crc5:std_logic_vector(4 downto 0);<br>
<br>
signal d0,d1,d2:std_logic_vector(7 downto 0); --数据通道延迟线(计算CRC5)<br>
signal data_valid_d:std_logic; --状态机输出数据有效信号<br>
signal data_done:std_logic; --数据有效信号延迟<br>
signal rxv1:std_logic; <br>
signal rxv2:std_logic;<br>
<br>
signal got_pid_ack:std_logic;<br>
signal token_valid_r1:std_logic;<br>
signal token_valid_str1:std_logic;<br>
<br>
signal rx_active_r:std_logic; --输出有效<br>
<br>
signal crc5_out:std_logic_vector(4 doento 0);<br>
signal crc5_out2:std_logic_vector(4 doento 0);<br>
signal crc16_clr:std_logic;<br>
signal crc16_sum:std_logic_vector(15 down 0);<br>
signal crc16_out:std_logic_vector(15 down 0); --crc5 crc16校验<br>
<br>
signal rx_data_temp:std_logic_vector(7 downto 0);<br>
signal token_temp:std_logic_vector(10 downto 0);<br>
<br>
begin<br>
<br>
--PID逻辑分析<br>
pid_ld_en<=pid_le_sm and rx_active and rx_valid;<br>
--PID输入寄存<br>
process(clk,rst)begin<br>
if(rst='0')then<br>
pid<="11110000";<br>
elsif clk'event and clk='1'then<br>
if(pid_ld_en='1')then<br>
pdi<=rx_data;<br>
end if;<br>
<br>
end if;<br>
end process;<br>
<br>
--PID校验,识别<br>
process(pid)begin<br>
if pid(3 downto 0)/=not(pid(7 downto 4))then pid_cks_err<='1';<br>
else pid_cks_err<='0';<br>
end if; --PID校验<br>
<br>
if pid(3 downto 0)=USBF_T_PID_OUT then pid_out<="1';<br>
else pid_OUT<='0';<br>
end if;<br>
<br>
if pid(3 downto 0)=USBF_T_PID_IN then pid_IN<='1';<br>
else PID_SETUP<='0';<br>
end if;<br>
<br>
if pid(3 downto 0)=USBF_T_PID_SOF then pid_SOF<='1';<br>
else PID_SOF<='0';<br>
end if;<br>
<br>
if pid(3 downto 0)=USBF_T_PID_SETUP then pid_setup<='1';<br>
else PID_SETUP<='0';<br>
end if;<br>
<br>
if pid(3 downto 0)=USBF_T_PID_DATA0 then pid_DATA0<='1';<br>
else PID_DATA0<='0';<br>
end if;<br>
<br>
if pid(3 downto 0)=USBF_T_PID_DATA1 then pid_DATA<='1';<br>
else PID_DATA1<='0';<br>
end if;<br>
<br>
if pid(3 downto 0)=USBF_T_PID_DATA2 then pid_DATA2<='1';<br>
else PID_DATA2<='0';<br>
end if;<br>
<br>
if pid(3 downto 0)=USBF_T_PID_MDATA then pid_MDATA<='1';<br>
else PID_MDATA<='0';<br>
end if;<br>
<br>
if pid(3 downto 0)=USBF_T_PID_ACK then pid_ACK<='1';<br>
else PID_ACK<='0';<br>
end if; <br>
<br>
if pid(3 downto 0)=USBF_T_PID_NACK then pid_NACK<='1';<br>
else PID_NACK<='0';<br>
end if; <br>
<br>
if pid(3 downto 0)=USBF_T_PID_STALL then pid_STALL<='1';<br>
else PID_STALL<='0';<br>
end if; <br>
<br>
if pid(3 downto 0)=USBF_T_PID_NYET then pid_NYET<='1';<br>
else PID_NYET<='0';<br>
end if; <br>
<br>
if pid(3 downto 0)=USBF_T_PID_PRE then pid_PRE<='1';<br>
else PID_PRE<='0';<br>
end if; <br>
<br>
if pid(3 downto 0)=USBF_T_PID_ERR then pid_ERR<='1';<br>
else PID_ERR<='0';<br>
end if; <br>
<br>
if pid(3 downto 0)=USBF_T_PID_SPLIT then pid_SPLIT<='1';<br>
else PID_SPLIT<='0';<br>
end if; <br>
<br>
if pid(3 downto 0)=USBF_T_PID_PING then pid_PING<='1';<br>
else PID_PING<='0';<br>
end if; <br>
<br>
if pid(3 downto 0)=USBF_T_PID_RES then pid_RES<='1';<br>
else PID_ACK<='0';<br>
end if; <br>
<br>
end process<br>
<br>
--令牌包数据包的统一识别<br>
pid_TOKEN<=pid_OUT or pid_SOF or pid_SRTUP or pid_PING;<br>
pid_DATA<=pid_DATA0 or pid_DATA1 or pid_DATA2 or pid_MDATA;<br>
<br>
--令牌包分析模块<br>
process(clk)begin<br>
if clk'event and clk='1'then<br>
if(token_le_1='1')then<br>
token0<=rx_data;<br>
end if;<br>
end if<br>
end process;<br>
<br>
process(clk)begin<br>
if clk'event and clk='1'then<br>
if(token_le_2='1')then<br>
token1<=rx_data;<br>
end if;<br>
end if<br>
end process;<br>
<br>
process(clk)begin<br>
if clk'event and clk='1'then<br>
token_valid_r1<=token_le_2;<br>
end if<br>
end process;<br>
<br>
;<br>
<br>
[ 本帖最后由 DARkKNIGHT 于 2006-5-25 02:54 编辑 ] |