VHDL实现USB2.0控制器设计
--控制器SSRAMlibrary ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity usbf_mem_arb is --实体声明
generic(SSRAM_HADR:integer:=14);
port(phy_clk,wclk,rst:in std_logic;
sram_adr:buffer std_logic_vector(SSRAM_HADR downto 0);
sram_din:in std_logic_vector(31 downto 0);
sram_dout:buffer std_logic_vector(31 downto 0);
sram_re,sram_we
ut std_logic;
--SSRAM接口
madr:in std_logic_vector(SSRAM_HADR downto 0);
mdout
ut std_logic_vector(31 downto 0);
mdin:in std_logic_vector(31 downto 0);
mwe:in std_logic;
mreq:in std_logic;
mack:buffer stdlogic;
--内部DMA操作接口
wadr:in std_logic_vector(SSRAM_HADR downto 0);
wdout
ut std_logic_vector(31 downto 0);
wdin:in std_logic_vector(31 downto 0);
wwe:in std_logic;
wreq:in std_logic;
wack:buffer std_logic--应用模块的wishbone接口
);
end entity
architecture arch_of_mem_arb of usbf_mem_arb is
signal wsel:std_logic;
signal mcy:stdlogic;
signal wack_r:std_logic;
begin
wsel<=(wreq or wack)and not(mreq);
--对SRAM数据输出
process(wsel,wdin,mdin)
begin
if(wsel='1')then
sram_dout<=wdin;
else sram_dout<=mdin;
end if;
end process;
--sram地址线输出
process(wsel,wadr,madr)
begin
if(wsel='1')then
sram_adr<=wadr;
else sram_adr<=madr;
end if;
end process;
--sram写操作使能控制
process(wsel,wwe,wreq,mwe,mcyc)begin
if(wsel='1')then
sram_we<=wreq and wwe;
else sram_we<=mwe and mcc;
end if;
end process;
sram_re<='1';
mdout<=sram_din;
mack<=mreq;
mcyc<=mack;
--应用模块之间的wishbone接口
wdout<=sram_din;
wack<=wack_r and not(mreq);
process(rst,phy_clk)begin
if(rst='0')then
wack_r<='0';
else if(ph_clk' event and phy_clk='1')then
wack_r<=wreq and not(mreq)and not(wack);
end if;
end process;
end architecture; --控制器WISHBONE<br>
--file:usb_wishbone.vhd<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 usbf_wb is<br>
generic(USBF_UFC_HADR:integer:=17);<br>
port(wb_clk,phy_clk:in std_logic;<br>
rst:in std_logic;<br>
wb_addr_i:in std_logic_vector(USBF_UFC_HDR downto 0);<br>
wb_data_i:in std_logic_vector(31 downto 0);<br>
wb_data_o:buffer std_logic_vector(31 downto 0);<br>
wb_ack_o:buffer std_logic;<br>
wb_we_i:in std_logic;<br>
wb_stb_i:in std_logic;<br>
wb_cyc_i:in std_logic:<br>
--应用程序的WISHBONE接口<br>
<br>
ma_adr
http://bbs.vibesic.com/images/smilies/default/shocked.gif
ut std_logic_vector(USBF_UFC_HADR downto 0);<br>
ma_dout
http://bbs.vibesic.com/images/smilies/default/shocked.gif
ut std_logic_vector(31 downto 0); <br>
ma_din
http://bbs.vibesic.com/images/smilies/default/shocked.gif
ut std_logic_vector(31 downto 0); <br>
ma_we:buffer std_logic_vector(31 wownto 0);<br>
ma_req:buffer std_logic;<br>
ma_ack:in std_logic;<br>
--存储器仲裁器接口<br>
<br>
rf_re:buffer std_logic;<br>
rf_we:out std_logic;<br>
rf_din:in std_logic_vector(31 downto 0);<br>
rf_dout:out std_logic_vector(31 downto 0);<br>
);<br>
end entity;<br>
<br>
architecture arch_usbf_wb of usbf_wb is<br>
constant IDLE:std_logic_vector(5 downto 0):="000001";<br>
constant MA_WR:std_logic_vector(5 downto 0):="000010";<br>
constant MA_RD:Std_logic_vector(5 downto 0):="000100";<br>
constant WO:Std_logic_vector(5 downto 0):="001000";<br>
constant W1:Std_logic_vector(5 downto 0):="010000";<br>
constant W2:Std_logic_vector(5 downto 0):="100000";<br>
<br>
signal state,next_state:std_logic_vector(5 downto 0);<br>
<br>
signal wb_req_sl:std_logic;<br>
signal wb_ack_d,wb_ack_sl,wb_ack_sla,wb_ack_s2:std_logic;<br>
signal rf_we_d:std_logic;<br>
--状态机状态<br>
begin<br>
ma_adr<=wb_addr_i;<br>
ma_dout<=wb_data_i;<br>
rf_dout<=wb_data_i;<br>
--数据,地址由应用模块驱动,输出至存储器或内部存储器<br>
process(wb_clk)begin<br>
if(wb_clk'evevt and wb_clk='1')then<br>
if(not(wb_addr_i(17)0='1')then<br>
wb_data_o<=rf_din;<br>
else wb_data_o<=ma_din;<br>
end if;<br>
end if;<br>
end process;<br>
--数据通道,仲裁数据输入来源是寄存器或储存器<br>
process(phy_clk)begin<br>
if phy_clk'event and phy_clk='1'then<br>
wb_req_s1<=(wb_std_i nd wb_cyc_i);<br>
end if;<br>
end process;<br>
--wishbone 请求<br>
process(wb_clk)begin<br>
if wb_clk'event and wb_clk='1' then<br>
wb_ack_sl<=wb_ack_d;<br>
end if;<br>
end process;<br>
<br>
process(wb_clk)begin<br>
if wb_clk'event and wb_clk='1' then <br>
wb_ack_o<=(wb_ack_s1 and not(wb_ack_s2)and not(wb_ack_0));<br>
end if;<br>
end process;<br>
<br>
process(wb_clk)begin<br>
if wb_clk'event and wb_clk='1' then <br>
wb_ack_s2<=wb_ack_s1a;<br>
end if;<br>
end process;<br>
<br>
process(wb_clk)begin<br>
if wb_clk'event and wb_clk='1' then <br>
wb_ck_s2<=wb_ack_s1a;<br>
end if;<br>
end process;<br>
--内部寄存器写使能驱动<br>
<br>
rf_we<=rf_we_d;<br>
<br>
process(phy_clk,rst)begin<br>
if(rst='0')then<br>
state<=IDLE;<br>
elsif wb_clk'event and wb_clk='1' then <br>
state<=next_state;<br>
end if;<br>
end process;<br>
<br>
process(state,wb_req_s1,wb_addr_i,ma_ack,wb_we_i)<br>
begin<br>
next_state<=state;<br>
ma_req<='0';<br>
ma_we<='0';<br>
wb_ack_d<='0';<br>
rf_re<='0';<br>
rf_we_d<='0';<br>
<br>
case state is --状态机状态转移<br>
when IDLE=><br>
if(wb_req_s1='1' and wb_addr_i(17)='0'and wb_we_i='1')then<br>
ma_req<='1';<br>
ma_we<='1';<br>
next_state<=M_WR; --存储器写状态<br>
end if;<br>
if(wb_req_s1='1' and wb_addr_i(17)='0'and wb_we_i='0')then<br>
ma_req<='1';<br>
next_state<=MA_WR; --存储器读状态<br>
end if;<br>
if(wb_req_s1='1' and wb_addr_i(12)='0'and wb_we_i='1')then<br>
rf_we_d<='1';<br>
next_state<=W0; --寄存器写状态<br>
end if;<br>
if(wb_req_s1='1' and wb_addr_i(12)='0'and wb_we_i='0')then<br>
rf_re<='1';<br>
next_state<=W0; --寄存器读状态<br>
end if;<br>
<br>
when MA_WR=><br>
if(ma_ack='0')then<br>
ma_req<='1';<br>
ma_we<='1';<br>
else<br>
wb_ack_d<='1';<br>
next_state<=W1;<br>
end if;<br>
<br>
when MA_RD=><br>
if(ma_ack='0') then<br>
ma_req<='1';<br>
else<br>
wb_ack_d<='1';<br>
next_state<=W1;<br>
end if;<br>
<br>
when W0=><br>
wb_ack_d<='1';<br>
next_state<=W1; --W1<br>
<br>
when W1=><br>
next_state<=W2; --W2<br>
<br>
when W2=><br>
next_state<=IDLE; --IDLE<br>
<br>
when others=><br>
null;<br>
end case;<br>
end process;<br>
end architecture;<br>
<br>
[ 本帖最后由 DARkKNIGHT 于 2006-5-25 02:53 编辑 ] --控制器协议层<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
http://bbs.vibesic.com/images/smilies/default/shocked.gif
ut std_logic; --令牌包的CRC5错误检查<br>
frame_no
http://bbs.vibesic.com/images/smilies/default/shocked.gif
ut std_logic_vector(10 downto 0); --SOF信息包输出信息<br>
<br>
--数据包信息输出接口<br>
rx_data_st
http://bbs.vibesic.com/images/smilies/default/shocked.gif
ut std_logic_vector(7 downto 0); --数据输出<br>
rx_data_valid:out std_logic; --数据有效<br>
rx_data_done:out std_logic --数据传输结束<br>
crc16_err:out 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:out 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 编辑 ] process(clk)begin<br>
if clk'event and clk='1'then<br>
token_valid_str1<=token_valid_r1 or got_pid_ack; <br>
end if<br>
end process;<br>
<br>
token_valid<=token_valid_str1;<br>
<br>
--CRC5数据校验模块,时序需要一个时钟周期<br>
<br>
process(token_valid,crc5_out2,token_crc5)begin<br>
if(crc5_out2/=token_crc5)then<br>
crc5_err<=token_valid;<br>
else crc5_err<='0';<br>
end if;<br>
end process<br>
<br>
token_temp<=token_fadr(0)&token_fadr(1)&token_fadr(2)&token_fadr(3)&token_fadr(4) &token_fadr(5)&token_fadr(6)&token_endp(0)&token_endp(1)&token_endp(2)<br>
&token_endp(03);<br>
usbf_crc5_u0:usbf_crc5 port map(<br>
"11111",<br>
token_temp,<br>
crc5_out<br>
);<br>
<br>
--CRC5校验输出<br>
crc5_out2<=not(crc5_out(0)&crc5_out(1)&crc5_out(2)&crc5_out(3)&crc5_out(4);<br>
<br>
frame_no<=token1(2 downto 0)&token0;<br>
token_fadr<=token0(6 downto 0);<br>
token_endp<=token1(2 downto 0)&token0(7);<br>
token_crc5<=token1(7 downto 3);<br>
<br>
--数据接收逻辑<br>
--rxv1 rxv2的作用是对数据有效信号做2个时钟的延迟<br>
process(clk,rst)begin<br>
if(rst='0') then<br>
rxv1<='0';<br>
elsif clk'event and clk='1'then<br>
if(data_valid_d='1')then<br>
rxv1<='1';<br>
elsif(data_done='1')then<br>
rxv1<='0';<br>
end if;<br>
end if;<br>
end process;<br>
<br>
process(clk,rst)begin<br>
if(rst='0') then<br>
rxv2<='0';<br>
elsif clk'event and clk='1'then<br>
if(rxv1='1' and data_valid_d='1')then<br>
rxv2<='1';<br>
elsif(data_done='1')then<br>
rxv2<='0';<br>
end if;<br>
end if;<br>
end process;<br>
<br>
process(clk)begin<br>
if clk'event and clk='1'then<br>
data_valid0<=rxv2 and data_valid_d;<br>
end if;<br>
end process;<br>
<br>
process(clk)begin<br>
if clk'event and clk='1'then<br>
if(data_valid_d='1')then d0<=rx_data;end if;<br>
if(data_valid_d='1')then d1<=d0;end if;<br>
if(data_valid_d='1')then d2<=d1;end if; --数据2个时钟延迟<br>
end if;<br>
end process;<br>
<br>
rx_data_st<=d2;<br>
rx_data_valid<=data_vlid0;<br>
rx_data_done<=data_done;<br>
<br>
--crc16数据校验<br>
process(clk)begin<br>
if clk'event and clk='1'then<br>
rx_active_r<=rx_active;<br>
end if;<br>
end process;<br>
<br>
crc16_clr<=rx_active and not(rx_active_r);<br>
<br>
process(clk)begin<br>
if clk'event and clk='1'then<br>
if(crc16_clr='1')then<br>
crc16_sum<='1111111111111111";<br>
else<br>
if(data_valid_d='1')then crc16_sum<=crc16_out;<br>
end if;<br>
end if;<br>
end if;<br>
end process;<br>
<br>
rx_data_temp<=rx_data(0)&rx_data(1)&rx_data(2)&rx_data(3)<br>
&rx_data(4)&rx_data(5)&rx_data(6)&rx_data(7);<br>
usbf_crc16_u1:usb_crc16 port map(<br>
crc16_sum,<br>
rx_data_temp,<br>
crc16_out<br>
);<br>
<br>
process(data_done,crc16_sum)begin<br>
if crc16_sum/="1000000000001101"then<br>
crc16_err<=data_done;<br>
else crc16_err<='0';<br>
end if;<br>
end process;<br>
<br>
--状态机设计<br>
process(clk,rst)begin<br>
if(rst='0') then<br>
state<=IDLE;<br>
elseif clk'event and clk='1'then<br>
state<=next_state;<br>
end if;<br>
end process;<br>
<br>
process(state,rx_valid,rx_active,rx_err,pid_ACK,pid_TOKEN,pid_DATA)<br>
begin<br>
next_state<=state; --默认状态不改变状态机状态<br>
pid_le_sm<='0';<br>
token_le_1<='0';<br>
token_le_2<='0';<br>
data_valid_d<='0';<br>
data_done<='0';<br>
seq_err<='0';<br>
got_pid_ack<='0';<br>
case state is ---状态机<br>
when IDLE=><br>
pid_le_sm<='1';<br>
if(rx_valid='1' and rx_active='1')then<br>
next_state<=ACTIVE;<br>
end if;<br>
when ACTIVE=><br>
--收到数据包标识符号<br>
if(pid_ACK='1' and rx_err='0')then<br>
got_pid_ack<='1';<br>
if(rx_active='0')then<br>
next_atate<=IDLE;<br>
end if;<br>
--收到令牌token数据包标识符<br>
elsif(pid_TOKEN='1' and rx_valid='1' and rx_ctive='1' and rx_err='0')then <br>
token_le_1<='1';<br>
next_state<=TOKEN;<br>
--收到data数据包标识符<br>
elsif(pid_TOKEN='1' and rx_valid='1' and rx_ctive='1' and rx_err='0')then <br>
data_valid_d<='1';<br>
next_state<=DATA;<br>
elsif(rx_active='0' or rx_err='1'or<br>
(rx_valid='1' and not(pid_TOKEN='1' or pid_DATA='1')))then<br>
seq_err<==not(rx_err);<br>
if(rx_active='0')then next_state<=IDLE;<br>
end if;<br>
end if;<br>
--令牌token数据包处理<br>
when TOKEN=><br>
if(rx_valid='1' and rx_active='1' and rx_err='0')then<br>
token_le_2<='1';<br>
next_state<=IDLE;<br>
elsif(rx_active='0' or rx_err='1')then<br>
seq_err<=not(rx_err);<br>
if(rx_active='0')then<br>
next_state<=IDLE;<br>
end if;<br>
end if;<br>
--DATA数据包处理<br>
when DATA=><br>
if(rx_valid='1' and rx_active='1' and rx_err='0') then<br>
data_vlid_d<='1';<br>
end if;<br>
<br>
if(rx_active='0' or rx_err='1')then<br>
data_done<='1';<br>
if(rx_active='0')then<br>
next_state<=IDLE;<br>
end if;<br>
end if;<br>
when other=><br>
null;<br>
end case;<br>
end process;<br>
end architecture;<br>
<br>
[ 本帖最后由 DARkKNIGHT 于 2006-5-25 02:52 编辑 ] 还有剩下的CRC15,CRC16没写出……熬不住了……睡觉先…… tai niu le 支持,没有细看代码<br>
但是很整齐<br>
我想内容也一定很精彩 内容的确很精彩……不过遗憾的是就不是我自己写出来的,我也是参照了有关书籍……实在写不出啊,这是高手的作品。 很不错,顶 ding yige xian