G
Guest
Guest
誰か助けてpls .. iはVerilogので802.3zギガビットイーサネットMAC層のためのコードを書いています...私のコードを私が完成したが
、 必要なテストの場合は
、 テストベンチのために役立つタスクusung wriring 。
plsの構¥文Ñを書くことが私に
、 どのように役立ちます。
私はシミュレーションはModelSimを使用しています...
私havのコードを
、 nはコードのテストケースを添付を必要と書か
モジュールrx_mac (
rx_clk 、
reset_n 、
rx_dv 、
rx_error 、
rx_data 、
データ、
rx_status_valid_n 、
rx_status 、
、 data_valid
last_data 、
eth_address
) ;
入力rx_clk 、
reset_n 、
rx_dv 、
rx_error ;
入力[ 3:0 ] rx_data ;
入力[ 47:0 ] eth_address ;
出力rx_status_valid_n 、
、 data_valid
last_data ;
出力[ 3:0 ]のデータ;
出力[
午後3時00 ] rx_status ;
ワイヤSFD_start_detect 、
SFD_detected 、
FCS_start_check 、
data_en 、
address_match 、
マルチキャスト、
放送、
crc_ok ;
ワイヤー[ 3:0 ] data_tap 、データ;
rx_sm rx_sm (
。クロック( rx_clk ) 、
。 reset_n ( reset_n ) 、
。 rx_dv ( rx_dv ) 、
。 rx_error ( rx_error ) 、
。 SFD_detected ( SFD_detected ) 、
。 address_match ( address_match ) 、
。マルチキャスト(
マルチキャスト ) 、
。ブロードキャスト(放送) 、
。 crc_ok ( crc_ok ) 、
。 SFD_start_detect ( SFD_start_detect ) 、
。 FCS_start_check ( FCS_start_check ) 、
。 data_en ( data_en ) 、
。 data_valid ( data_valid ) 、
。 last_data ( last_data ) 、
。 rx_status_valid_n ( rx_status_valid_n ) 、
。 rx_status ( rx_status )
) ;
rx_buffer rx_buffer (
。クロック( rx_clk ) 、
。 reset_n ( reset_n ) 、
。 rx_data ( rx_data ) 、
、 ( data_tap
) data_tap 。
データ(データ) 、
。 data_en ( data_en )
) ;
SFD_detector rx_sfd (
。クロック( rx_clk ) 、
。 reset_n ( reset_n ) 、
、 ( data_tap
) data_tap 。
。 SFD_start_detect ( SFD_start_detect ) 、
。 SFD_detected ( SFD_detected )
) ;
急性骨髄性白血病rx_aml (
。クロック( rx_clk ) 、
。 reset_n ( reset_n ) 、
、 ( data_tap
) data_tap 。
。 eth_address ( eth_address ) 、
。 SFD_detected ( SFD_detected ) 、
。 address_match ( address_match ) 、
。マルチキャスト(
マルチキャスト ) 、
。ブロードキャスト(放送)
) ;
fcs_check rx_fcs (
。クロック( rx_clk ) 、
。 reset_n ( reset_n ) 、
。 FCS_start_check ( FCS_start_check ) 、
データ(データ) 、
。 crc_ok ( crc_ok )
) ;
endmodule` INIT_COUNT ( 4'b0000 )
を定義` END_COUNT ( 4'b1100 )
を定義` )放送( 48'hFFFFFFFFFFFF定義
` ZERO_DA ( 48'h000000000000 )
を定義`定義MULTICAST_SIGN ( 48'h010000000000 )
モジュールの急性骨髄性白血病(
クロック、
reset_n 、
data_tap 、
、 eth_address
SFD_detected 、
address_match 、
放送、
マルチキャスト
) ;
入力クロック
は 、
SFD_detected 、
reset_n ;
入力[ 7:0 ] data_tap ;
入力[ 47:0 ] eth_address ;
出力address_match 、
マルチキャスト、
放送;
、 address_match登録
マルチキャスト、
放送、
start_count ;
[ 1:0 ] state_AML
登録 ;
] AML_count [ 3:0登録;
] data_tap_temp [ 7:0登録;
] ダ[ 47:0登録;
パラメータAML_IDLE = 2'b00 、
AML_RUN = 2'b01 、
AML_STOP = 2'b10 ;
( posedgeクロックまたはnegedge reset_n )
は常に@( ! reset_n )
< = AML_IDLE state_AML ;
その他の
ケース(
) state_AML
AML_IDLE :
(
) SFD_detected
開始する
start_count < = 1'b1 ;
state_AML < = AML_RUN ;
終わり
その他の
開始する
start_count < = 1'b0 ;
DAをZERO_DA = ` ;
< = AML_IDLE state_AML ;
終わり
AML_RUN :
( AML_count == ` END_COUNT )
state_AML < = AML_STOP ;
その他の
開始する
state_AML < = AML_RUN ;
ケース( AML_count )
4'b0000 : DAを[ 7:0 ] = data_tap_temp [ 7:0 ] ;
4'b0001 : DAを[
15時08分 ] = data_tap_temp [ 7:0 ] ;
4'b0010 : DAを[ 23:16 ] = data_tap_temp [ 7:0 ] ;
4'b0011 : DAを[ 31:24 ] = data_tap_temp [ 7:0 ] ;
4'b0100 : DAを[ 39:32 ] = data_tap_temp [ 7:0 ] ;
4'b0101 : DAを[ 47:40 ] = data_tap_temp [ 7:0 ] ;
デフォルト:
DAをZERO_DA = ` ;
endcase
終わり
AML_STOP :
開始する
start_count < = 1'b0 ;
< = AML_IDLE state_AML ;
終わり
endcase
( posedgeクロックまたはnegedge reset_n )
は常に@開始する
( ! reset_n )
開始する
address_match = 1'b0 ;
放送= 1'b0 ;
マルチキャスト= 1'b0 ;
終わり
その他の
( state_AML == AML_IDLE )
開始する
address_match = 1'b0 ;
放送= 1'b0 ;
マルチキャスト= 1'b0 ;
終わり
その他の
ケース(ダ)
`放送:
開始する
放送= 1'b1 ;
address_match = 1'b1 ;
終わり
eth_address :
address_match = 1'b1 ;
( eth_address | ` MULTICAST_SIGN ) :
開始する
マルチキャスト= 1'b1 ;
address_match = 1'b1 ;
終わり
デフォルト:
address_match = 1'b0 ;
endcase
終わり
( posedgeクロックまたはnegedge reset_n )
は常に@開始する
( ! reset_n )
data_tap_temp < = 8'b00000000 ;
その他の
data_tap_temp < = data_tap ;
終わり
( posedgeクロックまたはnegedge reset_n )
は常に@( ! reset_n )
AML_count < = ` INIT_COUNT ;
その他の
場合( !
) start_count
AML_count < = ` INIT_COUNT ;
その他の
AML_count < = ( AML_count 1'b1 ) ;
endmodule
` BUFFER_INIT_VALUE 32'hFFFFFFFF定義
` CRCO_RESET 9'b000000000定義
` CRC_NOT 9'b111111111定義
モジュールfcs_check (
クロック、
reset_n 、
FCS_start_check 、
データ、
crc_ok
) ;
入力FCS_start_check ;
入力[ 7:0 ]のデータ;
入力クロック;
入力reset_n ;
出力crc_ok ;
登録crc_ok ;
] crc_buffer [ 31:0登録;
機能¥[ 31:0 ] count_crc ;
入力[ 3:0 ]エ;
入力[ 31:0 ] ç ;
[ 3:0登録]エ;
[ 31:0
登録 ] ç ;
] new_crc [ 31:0登録;
開始する
new_crc [ 0 ] =エ[ 3 ] ^ ç [ 28 ] ;
new_crc [ 1 ] =エ[ 2 ] ^エ[ 3 ] ^ ç [ 28 ] ^ ç [ 29 ] ;
new_crc [ 2 ] =エ[ 1 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 3 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 2 ] ^ ç [ 29 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 4 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 3 ] ^ ç [ 0 ] ^ ç [ 28 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 5 ] =エ[ 0 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 1 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 31 ] ;
new_crc [ 6 ] =エ[ 1 ] ^エ[ 2 ] ^ ç [ 2 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 7 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 3 ] ^ ç [ 3 ] ^ ç [ 28 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 8 ] =エ[ 0 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 4 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 31 ] ;
new_crc [ 9 ] =エ[ 1 ] ^エ[ 2 ] ^ ç [ 5 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 10 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 3 ] ^ ç [ 6 ] ^ ç [ 28 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 11 ] =エ[ 0 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 7 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 31 ] ;
new_crc [ 12 ] =エ[ 1 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 8 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 13 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 2 ] ^ ç [ 9 ] ^ ç [ 29 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 14 ] =エ[ 0 ] ^エ[ 1 ] ^ ç [ 10 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 15 ] =エ[ 0 ] ^ ç [ 11 ] ^ ç [ 31 ] ;
new_crc [ 16 ] =エ[ 3 ] ^ ç [ 12 ] ^ ç [ 28 ] ;
new_crc [ 17 ] =エ[ 2 ] ^ ç [ 13 ] ^ ç [ 29 ] ;
new_crc [ 18 ] =エ[ 1 ] ^ ç [ 14 ] ^ ç [ 30 ] ;
new_crc [ 19 ] =エ[ 0 ] ^ ç [ 15 ] ^ ç [ 31 ] ;
new_crc [ 20 ] = ç [ 16 ] ;
new_crc [ 21 ] = ç [ 17 ] ;
new_crc [ 22 ] =エ[ 3 ] ^ ç [ 18 ] ^ ç [ 28 ] ;
new_crc [ 23 ] =エ[ 2 ] ^エ[ 3 ] ^ ç [ 19 ] ^ ç [ 28 ] ^ ç [ 29 ] ;
new_crc [ 24 ] =エ[ 1 ] ^エ[ 2 ] ^ ç [ 20 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 25 ] =エ[ 0 ] ^エ[ 1 ] ^ ç [ 21 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 26 ] =エ[ 0 ] ^エ[ 3 ] ^ ç [ 22 ] ^ ç [ 28 ] ^ ç [ 31 ] ;
new_crc [ 27 ] =エ[ 2 ] ^ ç [ 23 ] ^ ç [ 29 ] ;
new_crc [ 28 ] =エ[ 1 ] ^ ç [ 24 ] ^ ç [ 30 ] ;
new_crc [ 29 ] =エ[ 0 ] ^ ç [ 25 ] ^ ç [ 31 ] ;
new_crc [ 30 ] = ç [ 26 ] ;
new_crc [ 31 ] = ç [ 27 ] ;
count_crc = new_crc ;
終わり
endfunction
常に( posedgeクロック)
@開始する
もし( crc_buffer == 32'hc704dd7b ) / / :マジックナンバー
crc_ok < = 1'b1 ;
その他の
crc_ok < = 1'b0 ;
終わり
常に( posedgeクロック)
@開始する
( ! reset_n )
crc_buffer < = ` BUFFER_INIT_VALUE ;
その他の
( FCS_start_check )
crc_buffer < = count_crc (データ、 crc_buffer ) ;
その他の
crc_buffer < = ` BUFFER_INIT_VALUE ;
終わり
endmodule
モジュールrx_buffer (
クロック、
reset_n 、
rx_data 、
data_tap 、
データ、
data_en
) ;
入力クロック、 data_en 、 reset_n ;
入力[ 7:0 ] rx_data ;
出力[ 7:0 ] data_tap 、データ;
] data_tap [ 7:0登録;
] data_temp [ 7:0登録;
( posedgeクロックまたはnegedge reset_n )
は常に@開始する
( ! reset_n )
data_tap < = 8'b00000000 ;
その他の
data_tap < = rx_data ;
終わり
( posedgeクロックまたはnegedge reset_n )
は常に@開始する
( ! reset_n )
data_temp < = 8'b00000000 ;
その他の
data_temp < = data_tap ;
終わり
= data_enデータを割り当てる
か ?data_temp : 8'bzzzzzzzz ;
endmodule` INITIAL_COUNT 12'b000000000000定義
` MAX_COUNT 12'b101111011100定義
` STATUS_RESET 16'b0000000000000000定義
` 15'b000000000000000 STATUS_ERROR定義
` 12'b000000001011 eo_DA定義
` 12'b000000001101 GET_CRC_OUT定義
` CRCO_ZERO 9'b000000000定義
` Rx_IDLE 4'b000定義
` SFD_detect 4'b001定義
` Rx_RUN 4'b010定義
` 4'b011 Rx_HOLD定義
` Rx_STOP 4'b100定義
` WRITE_STATUS 4'b101定義
` HOLD1_STATUS 4'b110定義
` HOLD2_STATUS 4'b111定義
モジュールrx_sm (
クロック、
reset_n 、
rx_dv 、
rx_error 、
SFD_detected 、
address_match 、
マルチキャスト、
放送、
crc_ok 、
SFD_start_detect 、
data_en 、
FCS_start_check 、
last_data 、
、 data_valid
rx_status_valid_n 、
rx_status
) ;
入力クロック
は 、
reset_n 、
rx_dv 、
rx_error 、
SFD_detected 、
address_match 、
マルチキャスト、
放送、
crc_ok ;
出力SFD_start_detect 、
data_en 、
FCS_start_check 、
last_data 、
、 data_valid
rx_status_valid_n ;
出力[
午後3時00 ] rx_status ;
、 SFD_start_detect登録
FCS_start_check 、
data_en 、
last_data 、
broadcast_temp 、
multicast_temp 、
address_match_temp 、
、 data_valid
rx_error_temp 、
sending_data_n_status 、
rx_status_valid_n ;
] rx_sm_state [ 3:0登録;
、 [
12時 ] nibble_count登録
nibble_count_temp ;
] rx_status [
15時00分 登録;
( posedgeクロックまたはnegedge reset_n )
は常に@開始する
( ! reset_n )
rx_sm_state < = ` Rx_IDLE ;
その他の
( rx_error )
開始する
rx_error_temp < = 1'b1 ;
rx_sm_state < = ` Rx_HOLD ;
終わり
その他の
場合( ( nibble_count_temp 2'b10 ) == ` MAX_COUNT )
開始する
rx_error_temp < = 1'b1 ;
rx_sm_state < = ` Rx_HOLD ;
終わり
その他の
ケース(
) rx_sm_state
` Rx_IDLE :
開始する
( rx_dv )
開始する
rx_sm_state < = ` SFD_detect ;
SFD_start_detect < = 1'b1 ;
終わり
その他の
開始する
SFD_start_detect < = 1'b0 ;
data_en < = 1'b0 ;
FCS_start_check < = 1'b0 ;
rx_status_valid_n < = 1'b1 ;
rx_status < = ` STATUS_RESET ;
last_data < = 1'b0 ;
< = 1'b0 data_valid ;
sending_data_n_status < = 1'b0 ;
rx_sm_state < = ` Rx_IDLE ;
rx_error_temp < = 1'b0 ;
終わり
終わり
` SFD_detect :
開始する
( ! rx_dv )
rx_sm_state < = ` Rx_HOLD ;
その他の
(
) SFD_detected
開始する
SFD_start_detect < = 1'b0 ;
FCS_start_check < = 1'b1 ;
< = 1'b1 data_valid ;
sending_data_n_status < = 1'b1 ;
data_en < = 1'b1 ;
rx_sm_state < = ` Rx_RUN ;
終わり
その他の
rx_sm_state < = ` SFD_detect ;
終わり
` Rx_RUN :
開始する
( ! rx_dv )
開始する
last_data < = 1'b1 ;
rx_sm_state < = ` Rx_HOLD ;
終わり
その他の
rx_sm_state < = ` Rx_RUN ;
終わり
` Rx_HOLD :
開始する
last_data < = 1'b0 ;
< = 1'b0 data_valid ;
data_en < = 1'b0 ;
rx_sm_state < = ` Rx_STOP ;
終わり
` Rx_STOP :
開始する
FCS_start_check < = 1'b0 ;
rx_sm_state < = ` WRITE_STATUS ;
終わり
` WRITE_STATUS :
開始する
rx_status_valid_n < = 1'b0 ;
rx_status [ 0 ] < = rx_error_temp ;
rx_status [ 1 ] < = address_match_temp ;
rx_status [ 2 ] < = ( broadcast_temp | multicast_temp ) ;
rx_status [ 3 ] < = crc_ok ;
rx_status [
15時04分 ] < = nibble_count 1'b1 ;
rx_sm_state < = ` HOLD1_STATUS ;
終わり
` HOLD1_STATUS :
開始する
rx_sm_state < = ` HOLD2_STATUS ;
終わり
` HOLD2_STATUS :
rx_sm_state < = ` Rx_IDLE ;
デフォルト:
rx_sm_state < = ` Rx_IDLE ;
endcase
終わり
( posedgeクロックまたはnegedge reset_n )
は常に@開始する
( ! reset_n )
nibble_count_temp < = ` INITIAL_COUNT ;
その他の
( ! data_en )
nibble_count_temp < = ` INITIAL_COUNT ;
その他の
nibble_count_temp < = ( nibble_count_temp 1'b1 ) ;
終わり
( posedgeクロックまたはnegedge reset_n )
は常に@開始する
( ! reset_n )
nibble_count < = ` INITIAL_COUNT ;
その他の
( data_en )
nibble_count < = nibble_count_temp ;
その他の
nibble_count < = nibble_count ;
終わり
常に( posedgeクロック)
@開始する
( ! reset_n )
開始する
broadcast_temp < = 1'b0 ;
multicast_temp < = 1'b0 ;
address_match_temp < = 1'b0 ;
終わり
その他の
( ! sending_data_n_status )
開始する
broadcast_temp < = 1'b0 ;
multicast_temp < = 1'b0 ;
address_match_temp < = 1'b0 ;
終わり
その他の
( address_match )
開始する
broadcast_temp < =放送;
multicast_temp < =マルチキャスト;
address_match_temp < = address_match ;
終わり
その他の
開始する
broadcast_temp < = broadcast_temp ;
multicast_temp < = multicast_temp ;
address_match_temp < = address_match_temp ;
終わり
終わり
endmodule
モジュールSFD_detector (
クロック、
reset_n 、
data_tap 、
SFD_start_detect 、
SFD_detected
) ;
入力クロック、 SFD_start_detect 、 reset_n ;
入力[ 3:0 ] data_tap ;
出力SFD_detected ;
SFD_detected登録;
( posedgeクロックまたはnegedge reset_n )
は常に@開始する
( ! reset_n )
< = 1'b0 SFD_detected ;
その他の
( ! SFD_start_detect )
< = 1'b0 SFD_detected ;
その他の
開始する
もし( data_tap == 4'b1101 )
< = 1'b1 SFD_detected ;
その他の
< = 1'b0 SFD_detected ;
終わり
終わり
endmoduleモジュールtxethmac (
tx_data 、
tx_sof 、
tx_eof 、
tx_underrun 、
full_duplex 、
reset_n 、
CRSを、
コル、
tx_clk 、
、 tx_data_used
tx_done 、
tx_abort 、
、 tx_retransmit
tx_status 、
tx_status_valid_n 、
、 txd
tx_en 、
tx_er
) ;
/ / DMAのから
入力[ 7:0 ] tx_data ;
入力tx_sof ;
入力tx_eof ;
入力tx_underrun ;
入力full_duplex ;
入力reset_n ;
/ / MIIから
CRSを入力;
入力コル;
入力tx_clk ;
/ / MIIに
出力[ 7:0 ] txd ;
出力tx_en ;
出力tx_er ;
/ / DMAをする
出力tx_data_used ;
出力tx_done ;
出力tx_abort ;
出力tx_retransmit ;
出力[
6時00分 ] tx_status ;
出力tx_status_valid_n ;
ワイヤー[ 7:0 ]のデータ;
ワイヤtransmit_error ;
ワイヤtransmit_enable ;
ワイヤcompute_crc ;
ワイヤー[ 7:0 ]のCRC ;
ワイヤー[ 2:0 ] data_select ;
ワイヤtransmit_available_p ;
ワイヤtransmit_new_p ;
ワイヤexcess_deferral ;
ワイヤtransmit_preamble ;
ワイヤtransmit_sfd ;
ワイヤー[ 3:0 ] coll_attempt ;
ワイヤlate_coll ;
ワイヤexcessive_coll ;
ワイヤcoll_event_p ;
ワイヤtransmit_64byte ;
ワイヤtransmit_fcs ;
ワイヤ[
11時00 ] count_length ;
ワイヤー[ 3:0 ] count_fcs ;
ワイヤexcessive_length ;
ワイヤー[ 3:0 ] count_jam ;
ワイヤ[
九時 ]ランダム;
ワイヤbackoff_p ;
ワイヤstart_backoff ;
/ /モジュールのインスタンス
tx_1 fifo_synch (
データ(データ) 、
。 transmit_enable ( transmit_enable ) 、
。 transmit_error ( transmit_error ) 、
。クロック( tx_clk ) 、
。 txd ( txd ) 、
。 tx_en ( tx_en ) 、
。 tx_er ( tx_er )
) ;
ifg_timer tx_2 (
。 CRSを( CRSを) 、
。 full_duplex ( full_duplex ) 、
。 transmit_enable ( transmit_enable ) 、
。クロック( tx_clk ) 、
。 reset_n ( reset_n ) 、
。 transmit_available_p ( transmit_available_p )
) ;
defer_counter tx_3 (
。 transmit_available_p ( transmit_available_p ) 、
。 transmit_new_p ( transmit_new_p ) 、
。クロック( tx_clk ) 、
。 reset_n ( reset_n ) 、
。 excess_deferral ( excess_deferral )
) ;
frame_length_counter tx_4 (
。 transmit_enable ( transmit_enable ) 、
。 transmit_fcs ( transmit_fcs ) 、
。クロック( tx_clk ) 、
。 reset_n ( reset_n ) 、
。 count_length ( count_length ) 、
。 count_fcs ( count_fcs ) 、
。 excessive_length ( excessive_length ) 、
。 transmit_64byte (
) transmit_64byte
) ;
/ / coll_counter tx_5 (
/ / 。 transmit_new_p ( transmit_new_p ) 、
/ / 。 transmit_enable (
) transmit_enable 、
/ / 。 transmit_preamble ( transmit_preamble ) 、
/ / 。 transmit_sfd (
) transmit_sfd 、
/ / 。 transmit_64byte (
) transmit_64byte 、
/ / 。クロック( tx_clk ) 、
/ / 。 reset_n ( reset_n ) 、
/ / 。コル(コル) 、
/ / 。 full_duplex ( full_duplex ) 、
/ / 。 coll_event_p ( coll_event_p ) 、
/ / 。 late_coll ( late_coll ) 、
/ / 。 excessive_coll ( excessive_coll ) 、
/ / 。 coll_attempt ( coll_attempt )
/ / ) ;
/ / random_number_gen tx_6 (
/ / 。 coll_attempt ( coll_attempt ) 、
/ / 。クロック( tx_clk ) 、
/ / 。 reset_n ( reset_n ) 、
/ / 。ランダム(
) のランダムな
/ / ) ;
/ / backoff_timer tx_7 (
/ / 。 start_backoff ( start_backoff ) 、
/ / 。ランダム(
) のランダムな、
/ / 。クロック( tx_clk ) 、
/ / 。 reset_n ( reset_n ) 、
/ / 。 backoff_p ( backoff_p )
/ / ) ;
/ / jam_timer tx_8 (
/ / 。 coll_event_p ( coll_event_p ) 、
/ / 。クロック( tx_clk ) 、
/ / 。 reset_n ( reset_n ) 、
/ / 。 count_jam ( count_jam )
/ / ) ;
crc_gen tx_9 (
。 compute_crc ( compute_crc ) 、
データ(データ) 、
。クロック( tx_clk ) 、
。 reset_n ( reset_n ) 、
。のCRC (
) のCRC
) ;
data_mux tx_10 (
、 ( data_select
) data_select 。
。 data_in ( tx_data ) 、
。のCRC (
CRC )
を 、
。 data_out (データ)
) ;
tx_state_machine tx_11 (
。 tx_sof ( tx_sof ) 、
。 tx_eof ( tx_eof ) 、
。 tx_underrun ( tx_underrun ) 、
。クロック( tx_clk ) 、
。 reset_n ( reset_n ) 、
。 transmit_available_p ( transmit_available_p ) 、
。 excess_deferral ( excess_deferral ) 、
。 coll_event_p ( coll_event_p ) 、
。 late_coll ( late_coll ) 、
。 excessive_coll ( excessive_coll ) 、
。 backoff_p ( backoff_p ) 、
。 count_length ( count_length ) 、
。 count_fcs ( count_fcs ) 、
。 excessive_length ( excessive_length ) 、
。 count_jam ( count_jam ) 、
。 tx_data_used ( tx_data_used ) 、
。 tx_done ( tx_done ) 、
。 tx_abort ( tx_abort ) 、
( ) tx_retransmit
、 tx_retransmit 。
。 tx_status ( tx_status ) 、
。 tx_status_valid_n ( tx_status_valid_n ) 、
。 transmit_new_p ( transmit_new_p ) 、
。 transmit_enable ( transmit_enable ) 、
。 transmit_preamble ( transmit_preamble ) 、
。 transmit_sfd ( transmit_sfd ) 、
。 transmit_fcs ( transmit_fcs ) 、
。 transmit_error ( transmit_error ) 、
。 start_backoff ( start_backoff ) 、
。 compute_crc ( compute_crc ) 、
( data_select
) data_select 。
) ;` ) CRC_INIT_VALUE ( 32'hFFFF_FFFF定義
` CRC_IDLE ( 2'b00 )
を定義` CRC_RUN ( 2'b01 )
を定義` CRC_STOP ( 2'b11 )
を定義
モジュールcrc_gen (
、 compute_crc
データ、
クロック、
reset_n 、
のCRC
) ;
入力compute_crc ;
入力[ 7:0 ]のデータ;
入力クロック;
入力reset_n ;
出力[ 7:0 ]のCRC ;
] state_crc [ 1:0登録;
] crc_buffer [ 31:0登録;
] crc_end [ 2:0登録;
機能¥[ 31:0 ] count_crc ; / /最初のシリアルデータのビットがD [ 0 ]
入力[ 3:0 ]エ;
入力[ 31:0 ] ç ;
] new_crc [ 31:0登録;
開始する
new_crc [ 0 ] =エ[ 3 ] ^ ç [ 28 ] ;
new_crc [ 1 ] =エ[ 2 ] ^エ[ 3 ] ^ ç [ 28 ] ^ ç [ 29 ] ;
new_crc [ 2 ] =エ[ 1 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 3 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 2 ] ^ ç [ 29 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 4 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 3 ] ^ ç [ 0 ] ^ ç [ 28 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 5 ] =エ[ 0 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 1 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 31 ] ;
new_crc [ 6 ] =エ[ 1 ] ^エ[ 2 ] ^ ç [ 2 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 7 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 3 ] ^ ç [ 3 ] ^ ç [ 28 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 8 ] =エ[ 0 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 4 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 31 ] ;
new_crc [ 9 ] =エ[ 1 ] ^エ[ 2 ] ^ ç [ 5 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 10 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 3 ] ^ ç [ 6 ] ^ ç [ 28 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 11 ] =エ[ 0 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 7 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 31 ] ;
new_crc [ 12 ] =エ[ 1 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 8 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 13 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 2 ] ^ ç [ 9 ] ^ ç [ 29 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 14 ] =エ[ 0 ] ^エ[ 1 ] ^ ç [ 10 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 15 ] =エ[ 0 ] ^ ç [ 11 ] ^ ç [ 31 ] ;
new_crc [ 16 ] =エ[ 3 ] ^ ç [ 12 ] ^ ç [ 28 ] ;
new_crc [ 17 ] =エ[ 2 ] ^ ç [ 13 ] ^ ç [ 29 ] ;
new_crc [ 18 ] =エ[ 1 ] ^ ç [ 14 ] ^ ç [ 30 ] ;
new_crc [ 19 ] =エ[ 0 ] ^ ç [ 15 ] ^ ç [ 31 ] ;
new_crc [ 20 ] = ç [ 16 ] ;
new_crc [ 21 ] = ç [ 17 ] ;
new_crc [ 22 ] =エ[ 3 ] ^ ç [ 18 ] ^ ç [ 28 ] ;
new_crc [ 23 ] =エ[ 2 ] ^エ[ 3 ] ^ ç [ 19 ] ^ ç [ 28 ] ^ ç [ 29 ] ;
new_crc [ 24 ] =エ[ 1 ] ^エ[ 2 ] ^ ç [ 20 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 25 ] =エ[ 0 ] ^エ[ 1 ] ^ ç [ 21 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 26 ] =エ[ 0 ] ^エ[ 3 ] ^ ç [ 22 ] ^ ç [ 28 ] ^ ç [ 31 ] ;
new_crc [ 27 ] =エ[ 2 ] ^ ç [ 23 ] ^ ç [ 29 ] ;
new_crc [ 28 ] =エ[ 1 ] ^ ç [ 24 ] ^ ç [ 30 ] ;
new_crc [ 29 ] =エ[ 0 ] ^ ç [ 25 ] ^ ç [ 31 ] ;
new_crc [ 30 ] = ç [ 26 ] ;
new_crc [ 31 ] = ç [ 27 ] ;
count_crc = new_crc ;
終わり
endfunction
CRCを 割り当てる[ 7 ] = 〜 crc_buffer [ 24 ] ;
CRCを 割り当てる[ 6 ] = 〜 crc_buffer [ 25 ] ;
CRCを 割り当てる[ 5 ] = 〜 crc_buffer [ 26 ] ;
CRCを 割り当てる[ 4 ] = 〜 crc_buffer [ 27 ] ;
CRCを 割り当てる[ 3 ] = 〜 crc_buffer [ 28 ] ;
CRCを 割り当てる[ 2 ] = 〜 crc_buffer [ 29 ] ;
CRCを 割り当てる[ 1 ] = 〜 crc_buffer [ 30 ] ;
CRCを 割り当てる[ 0 ] = 〜 crc_buffer [ 31 ] ;
( posedgeクロックまたはnegedge reset_n )
は常に@( ! reset_n )
state_crc < = ` CRC_IDLE ;
その他の
ケース(
) state_crc
` CRC_IDLE :もし( compute_crc )
開始する
state_crc < = ` CRC_RUN ;
crc_buffer < = count_crc (データ
は 、 ` CRC_INIT_VALUE ) ;
終わり
その他の
開始する
state_crc < = ` CRC_IDLE ;
crc_buffer < = 32'h0000_0000 ;
crc_end < = 3'd0 ;
終わり
` CRC_RUN :もし( ! compute_crc )
開始する
state_crc < = ` CRC_STOP ;
crc_buffer < = crc_buffer < < 8 ;
終わり
その他の
開始する
state_crc < = ` CRC_RUN ;
crc_buffer < = count_crc (データ、 crc_buffer ) ;
終わり
` CRC_STOP :もし( crc_end == 3'110 )
開始する
state_crc < = ` CRC_IDLE ;
crc_buffer < = 32'h0000_0000 ;
終わり
その他の
開始する
state_crc < = ` CRC_STOP ;
crc_buffer < = crc_buffer < < 4 ;
crc_end < = crc_end 1'b1 ;
終わり
endcase
endmodule
` PATTERN_PREAMBLE ( 8'b01010101 )
を定義` PATTERN_SFD ( 8'b11010101 )
を定義
モジュールdata_mux (
data_select 、
data_in 、
、 CRCが
data_out 、
count_length
) ;
入力[ 2:0 ] data_select ;
入力[ 7:0 ] data_in ;
入力[ 7:0 ]のCRC ;
入力[ 7:0 ] count_length ;
出力[ 7:0 ] data_out ;
] data_out [ 7:0登録;
いつも@ ( data_selectまたはdata_inまたはCRC )
ケース( data_select )
3'b000 : data_out = data_in ;
3'b001 : data_out = ` PATTERN_PREAMBLE ;
3'b010 : data_out = ` PATTERN_SFD ;
3'b011 : data_out =のCRC ;
3'b100 : data_out = src_add ;
3'b101 : data_out = dst_add ;
3'b110 : data_out = count_length ;
デフォルト: data_out = 8'h00 ;
endcase
endmodule
モジュールfifo_synch (
データ、
、 transmit_enable
transmit_error 、
クロック、
、 txd
tx_en 、
tx_er
) ;
入力[ 7:0 ]のデータ;
入力transmit_enable ;
入力transmit_error ;
入力クロック;
出力[ 7:0 ] txd ;
出力tx_en ;
出力tx_er ;
] txd [ 7:0登録;
登録tx_en ;
登録tx_er ;
常に( posedgeクロック)
@(
) transmit_enable
開始する
txd < =データ;
tx_en < = 1'b1 ;
tx_er < = transmit_error ;
終わり
その他の
開始する
txd < = 8'h00 ;
tx_en < = 1'b0 ;
tx_er < = 1'b0 ;
終わり
endmodule` COUNT_LENGTH_IDLE ( 2'b00 )
を定義` COUNT_LENGTH_RUN ( 2'b01 )
を定義`定義COUNT_LENGTH_FCS ( 2'b11 )
` MIN_LENGTH ( 12'd144 )
を定義` MAX_LENGTH ( 12'd3052 )
を定義
モジュールframe_length_counter (
、 transmit_enable
transmit_fcs 、
クロック、
reset_n 、
、 count_length
count_fcs 、
、 excessive_length
transmit_64byte
) ;
入力transmit_enable ;
入力transmit_fcs ;
入力クロック;
入力reset_n ;
出力[
午前11時00分 ] count_length ;
出力[ 3:0 ] count_fcs ;
出力excessive_length ;
出力transmit_64byte ;
[
11 :
00 ] count_length
登録 ;
登録[ 3:0 ] count_fcs ;
excessive_length登録;
登録transmit_64byte ;
[ 1:0 ] state_length
登録 ;
機能¥[
11時00分 ] inc_length ;
入力[
11時00 ] count_length ;
開始する
= count_length 1'b1 inc_length ;
終わり
endfunction
( posedgeクロックまたはnegedge reset_n )
は常に@( ! reset_n )
開始する
state_length < = ` COUNT_LENGTH_IDLE ;
< = 12'd0 count_length ;
count_fcs < = 4'd0 ;
終わり
その他の
ケース(
) state_length
` COUNT_LENGTH_IDLE :もし( transmit_enable )
開始する
state_length < = ` COUNT_LENGTH_RUN ;
< = 12'd1 count_length ;
終わり
その他の
state_length < = ` COUNT_LENGTH_IDLE ;
` COUNT_LENGTH_RUN :もし( ! transmit_enable )
state_length < = ` COUNT_LENGTH_IDLE ;
その他の
( transmit_fcs )
開始する
state_length < = ` COUNT_LENGTH_FCS ;
count_length < = inc_length (
) count_length ;
count_fcs < = 4'd1 ;
終わり
その他の
開始する
state_length < = ` COUNT_LENGTH_RUN ;
count_length < = inc_length (
) count_length ;
終わり
` COUNT_LENGTH_FCS :もし( ! transmit_enable )
state_length < = ` COUNT_LENGTH_IDLE ;
その他の
開始する
state_length < = ` COUNT_LENGTH_FCS ;
count_length < = inc_length (
) count_length ;
count_fcs < = ( count_fcs 1'b1 ) ;
終わり
endcase
いつも@ (
) count_length
開始する
transmit_64byte = ( count_length > ` MIN_LENGTH - 1 ) ?1'b1 : 1'b0 ;
= ( count_length
> `
MAX_LENGTH - 1 ) excessive_length ?1'b1 : 1'b0 ;
終わり
endmodule`定義IFG_LENGTH_1 ( 5'd15 )
`定義IFG_LENGTH_2 ( 5'd22 )
` IFG_IDLE ( 1'b0 )
を定義` IFG_RUN ( 1'b1 )
を定義
モジュールifg_timer (
CRSを、
full_duplex 、
、 transmit_enable
クロック、
reset_n 、
transmit_available_p
) ;
CRSを入力;
入力full_duplex ;
入力transmit_enable ;
入力クロック;
入力reset_n ;
出力transmit_available_p ;
登録transmit_available_p ;
] count_ifg [ 4:0登録;
登録state_ifg ;
機能¥[ 4:0 ] inc_ifg ;
入力[ 4:0 ] count_ifg ;
開始する
inc_ifg = count_ifg 1'b1 ;
終わり
endfunction
( posedgeクロックまたはnegedge reset_n )
は常に@( ! reset_n )
state_ifg < = ` IFG_IDLE ;
その他の
( full_duplex )
ケース(
) state_ifg
` IFG_IDLE :もし( ! transmit_enable )
開始する
state_ifg < = ` IFG_RUN ;
count_ifg < = 5'd1 ;
transmit_available_p < = 1'b0 ;
終わり
その他の
開始する
state_ifg < = ` IFG_IDLE ;
count_ifg < = 5'd0 ;
transmit_available_p < = 1'b0 ;
終わり
` IFG_RUN :もし( transmit_enable )
state_ifg < = ` IFG_IDLE ;
その他の
場合( == ` ) IFG_LENGTH_2 - 1 count_ifg
開始する
state_ifg < = ` IFG_IDLE ;
transmit_available_p < = 1'b1 ;
終わり
その他の
開始する
state_ifg < = ` IFG_RUN ;
count_ifg < =
( count_ifg ) inc_ifg ;
終わり
endcase
その他の
ケース(
) state_ifg
` IFG_IDLE :もし( ! CRSを)
開始する
state_ifg < = ` IFG_RUN ;
count_ifg < = 5'd1 ;
transmit_available_p < = 1'b0 ;
終わり
その他の
開始する
state_ifg < = ` IFG_IDLE ;
count_ifg < = 5'd0 ;
transmit_available_p < = 1'b0 ;
終わり
` IFG_RUN :もし( CRSを& & ( count_ifg < = ` IFG_LENGTH_1 - 1 ) )
state_ifg < = ` IFG_IDLE ;
その他の
場合( == ` ) IFG_LENGTH_2 - 1 count_ifg
開始する
state_ifg < = ` IFG_IDLE ;
transmit_available_p < = 1'b1 ;
終わり
その他の
開始する
state_ifg < = ` IFG_RUN ;
count_ifg < =
( count_ifg ) inc_ifg ;
終わり
endcase
endmodule
` TRANSMIT_IDLE ( 4'b0000 )
を定義`定義NEW_TRANSMIT ( 4'b0001 )
`定義WAIT_TRANSMIT ( 4'b0011 )
` TRANSMIT_PREAMBLE ( 4'b0010 )
を定義` TRANSMIT_SFD ( 4'b0110 )
を定義` TRANSMIT_DATA ( 4'b0111 )
を定義` TRANSMIT_PAD ( 4'b0101 )
を定義`定義TRANSMIT_FCS ( 4'b0100 )
` WAIT_DONE ( 4'b1100 )
を定義` TRANSMIT_DONE ( 4'b1101 )
を定義` TRANSMIT_JAM ( 4'b1111 )
を定義` WAIT_BACKOFF ( 4'b1110 )
を定義`定義WAIT_ABORT ( 4'b1010 )
`定義TRANSMIT_ABORT ( 4'b1011 )
`定義WRITE_STATUS ( 4'b1001 )
/ / ` ( 4'b1000 )
を定義
` PREAMBLE_LENGTH ( 12'd15 )
を定義` SFD_LENGTH ( 12'd1 )
を定義` DATA_LENGTH ( 12'd120 )
を定義`定義FCS_LENGTH ( 4'd
<img src=¥"http://www.edaboard.com/images/smiles/icon_cool.gif¥" alt=¥"涼しい¥" border=¥"0¥" />`定義JAM_LENGTH ( 4'd
<img src=¥"http://www.edaboard.com/images/smiles/icon_cool.gif¥" alt=¥"涼しい¥" border=¥"0¥" />` WIDTH_STATUS 7定義
モジュールtx_state_machine (
tx_sof 、
tx_eof 、
tx_underrun 、
クロック、
reset_n 、
transmit_available_p 、
excess_deferral 、
coll_event_p 、
late_coll 、
excessive_coll 、
backoff_p 、
、 count_length
count_fcs 、
、 excessive_length
count_jam 、
、 tx_data_used
tx_done 、
tx_abort 、
、 tx_retransmit
tx_status 、
tx_status_valid_n 、
transmit_new_p 、
、 transmit_enable
transmit_preamble 、
、 transmit_sfd
transmit_fcs 、
transmit_error 、
start_backoff 、
、 compute_crc
data_select
) ;
入力tx_sof ;
入力tx_eof ;
入力tx_underrun ;
入力クロック;
入力reset_n ;
入力transmit_available_p ;
入力excess_deferral ;
入力excessive_length ;
入力excessive_coll ;
入力late_coll ;
入力coll_event_p ;
入力backoff_p ;
入力[
11時00 ] count_length ;
入力[ 3:0 ] count_fcs ;
入力[ 3:0 ] count_jam ;
出力tx_data_used ;
出力tx_done ;
出力tx_abort ;
出力tx_retransmit ;
出力[ ` WIDTH_STATUS - 1 : 0 ] tx_status ;
出力tx_status_valid_n ;
出力transmit_new_p ;
出力transmit_enable ;
出力transmit_preamble ;
出力transmit_sfd ;
出力transmit_fcs ;
出力transmit_error ;
出力start_backoff ;
出力compute_crc ;
出力[ 2:0 ] data_select ;
tx_data_used登録;
登録tx_done ;
登録tx_abort ;
登録tx_retransmit ;
/ /登録[ ` WIDTH_STATUS - 1 : 0 ] tx_status ;
登録tx_status_valid_n ;
登録transmit_new_p ;
transmit_enable登録;
登録transmit_preamble ;
transmit_sfd登録;
登録transmit_fcs ;
登録transmit_error ;
登録start_backoff ;
登録compute_crc ;
] data_select [ 2:0登録;
] current_tx_state
[ 3:0 登録;
] next_tx_state [ 3:0登録;
( posedgeクロックまたはnegedge reset_n )
は常に@( ! reset_n )
current_tx_state < = ` TRANSMIT_IDLE ;
その他の
current_tx_state < = next_tx_state ;
いつも@ ( current_tx_stateまたはtx_sofまたはtx_eofまたはtx_underrunまたは
transmit_available_pまたはexcess_deferralまたはexcessive_lengthまたは
excessive_collまたはlate_collまたはcoll_event_pまたはbackoff_pまたは
count_lengthまたはcount_fcsまたはcount_jam )
ケース(
) current_tx_state
` TRANSMIT_IDLE :もし( tx_sof )
next_tx_state = ` NEW_TRANSMIT ;
その他の
next_tx_state = ` TRANSMIT_IDLE ;
` NEW_TRANSMIT :もし( ! tx_sof )
next_tx_state = ` TRANSMIT_IDLE ;
その他の
next_tx_state = ` WAIT_TRANSMIT ;
` WAIT_TRANSMIT :もし( ! tx_sof )
next_tx_state = ` TRANSMIT_IDLE ;
その他の
( excess_deferral )
next_tx_state = ` WAIT_ABORT ;
その他の
( transmit_available_p )
next_tx_state = ` TRANSMIT_PREAMBLE ;
その他の
next_tx_state = ` WAIT_TRANSMIT ;
` TRANSMIT_PREAMBLE :もし( ! tx_sof )
next_tx_state = ` TRANSMIT_IDLE ;
その他の
もし( count_length == ` PREAMBLE_LENGTH - 1 )
next_tx_state = ` TRANSMIT_SFD ;
その他の
next_tx_state = ` TRANSMIT_PREAMBLE ;
` TRANSMIT_SFD :もし( ! tx_sof )
next_tx_state = ` TRANSMIT_IDLE ;
その他の
next_tx_state = ` TRANSMIT_DATA ;
` TRANSMIT_DATA :もし( coll_event_p )
next_tx_state = ` TRANSMIT_JAM ;
その他の
もし( tx_underrun | |
) excessive_length
next_tx_state = ` WAIT_ABORT ;
その他の
( tx_eof )
開始する
もし( count_length < ( ` PREAMBLE_LENGTH ` SFD_LENGTH ` DATA_LENGTH - 1 ) )
next_tx_state = ` TRANSMIT_PAD ;
その他の
next_tx_state = ` TRANSMIT_FCS ;
終わり
その他の
next_tx_state = ` TRANSMIT_DATA ;
` TRANSMIT_PAD :もし( coll_event_p )
next_tx_state = ` TRANSMIT_JAM ;
その他の
場合(
== count_length ( ` PREAMBLE_LENGTH ` SFD_LENGTH ` DATA_LENGTH - 1 ) )
next_tx_state = ` TRANSMIT_FCS ;
その他の
next_tx_state = ` TRANSMIT_PAD ;
` TRANSMIT_FCS :もし( coll_event_p )
next_tx_state = ` TRANSMIT_JAM ;
その他の
(
) excessive_length
next_tx_state = ` WAIT_ABORT ;
その他の
もし( count_fcs == ` FCS_LENGTH - 1 )
next_tx_state = ` WAIT_DONE ;
その他の
next_tx_state = ` TRANSMIT_FCS ;
` TRANSMIT_JAM :もし( count_jam == ` JAM_LENGTH - 3 )
開始する
場合(
| late_coll | excessive_coll )
next_tx_state = ` WAIT_ABORT ;
その他の
next_tx_state = ` WAIT_BACKOFF ;
終わり
その他の
next_tx_state = ` TRANSMIT_JAM ;
` WAIT_BACKOFF :もし( backoff_p )
next_tx_state = ` WAIT_TRANSMIT ;
その他の
next_tx_state = ` WAIT_BACKOFF ;
` WAIT_DONE :もし( coll_event_p )
next_tx_state = ` TRANSMIT_JAM ;
その他の
(
) excessive_length
next_tx_state = ` WAIT_ABORT ;
その他の
next_tx_state = ` TRANSMIT_DONE ;
` TRANSMIT_DONE : next_tx_state = ` WRITE_STATUS ;
` WAIT_ABORT : next_tx_state = ` TRANSMIT_ABORT ;
` TRANSMIT_ABORT : next_tx_state = ` WRITE_STATUS ;
` WRITE_STATUS : next_tx_state = ` TRANSMIT_IDLE ;
デフォルト: next_tx_state = ` TRANSMIT_IDLE ;
endcase
いつも@ (
) current_tx_state
ケース(
) current_tx_state
` TRANSMIT_IDLE :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b000 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` NEW_TRANSMIT :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b1 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b000 ;
compute_crc = 1'b0 ;tx_status_valid_n = 1'b1; 終わり
` WAIT_TRANSMIT :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b000 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` TRANSMIT_PREAMBLE :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b1 transmit_enable ;
transmit_preamble = 1'b1 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b001 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` TRANSMIT_SFD :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b1 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b1 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b010 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` TRANSMIT_DATA :
開始する
= 1'b1 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b1 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b000 ;
compute_crc = 1'b1 ;
tx_status_valid_n = 1'b1 ;
終わり
` TRANSMIT_PAD :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b1 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b001 ;
compute_crc = 1'b1 ;
tx_status_valid_n = 1'b1 ;
終わり
` TRANSMIT_FCS :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b1 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b1 ;
start_backoff = 1'b0 ;
data_select = 3'b011 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` WAIT_DONE :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b000 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` TRANSMIT_DONE :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b1 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b000 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` TRANSMIT_JAM :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b1 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b001 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` WAIT_BACKOFF :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b1 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b1 ;
data_select = 3'b000 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` WAIT_ABORT :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b000 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` TRANSMIT_ABORT :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b1 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b000 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` WRITE_STATUS :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b000 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b0 ;
終わり
デフォルト:
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;start_backoff = 1'b0;
data_select = 3'b000;
compute_crc = 1'b0;
tx_status_valid_n = 1'b1;
end
endcase
assign tx_status [0] = excess_deferral;
assign tx_status [1] = late_coll;
assign tx_status [2] = excessive_coll;
assign tx_status [3] = 1'b0;
assign tx_status [4] = excessive_length;
assign tx_status [5] = (excess_deferral | late_coll | excessive_coll |
tx_underrun | excessive_length);
assign tx_status [6] = ‾(excess_deferral | late_coll | excessive_coll |
tx_underrun | excessive_length);
always @(posedge clk)
if (tx_underrun)
transmit_error <= 1'b1;
else
transmit_error <= 1'b0;
endmoduleLast edited by audrey on 16 Apr 2007 6:51; edited 1 time in total
、 必要なテストの場合は
、 テストベンチのために役立つタスクusung wriring 。
plsの構¥文Ñを書くことが私に
、 どのように役立ちます。
私はシミュレーションはModelSimを使用しています...
私havのコードを
、 nはコードのテストケースを添付を必要と書か
モジュールrx_mac (
rx_clk 、
reset_n 、
rx_dv 、
rx_error 、
rx_data 、
データ、
rx_status_valid_n 、
rx_status 、
、 data_valid
last_data 、
eth_address
) ;
入力rx_clk 、
reset_n 、
rx_dv 、
rx_error ;
入力[ 3:0 ] rx_data ;
入力[ 47:0 ] eth_address ;
出力rx_status_valid_n 、
、 data_valid
last_data ;
出力[ 3:0 ]のデータ;
出力[
午後3時00 ] rx_status ;
ワイヤSFD_start_detect 、
SFD_detected 、
FCS_start_check 、
data_en 、
address_match 、
マルチキャスト、
放送、
crc_ok ;
ワイヤー[ 3:0 ] data_tap 、データ;
rx_sm rx_sm (
。クロック( rx_clk ) 、
。 reset_n ( reset_n ) 、
。 rx_dv ( rx_dv ) 、
。 rx_error ( rx_error ) 、
。 SFD_detected ( SFD_detected ) 、
。 address_match ( address_match ) 、
。マルチキャスト(
マルチキャスト ) 、
。ブロードキャスト(放送) 、
。 crc_ok ( crc_ok ) 、
。 SFD_start_detect ( SFD_start_detect ) 、
。 FCS_start_check ( FCS_start_check ) 、
。 data_en ( data_en ) 、
。 data_valid ( data_valid ) 、
。 last_data ( last_data ) 、
。 rx_status_valid_n ( rx_status_valid_n ) 、
。 rx_status ( rx_status )
) ;
rx_buffer rx_buffer (
。クロック( rx_clk ) 、
。 reset_n ( reset_n ) 、
。 rx_data ( rx_data ) 、
、 ( data_tap
) data_tap 。
データ(データ) 、
。 data_en ( data_en )
) ;
SFD_detector rx_sfd (
。クロック( rx_clk ) 、
。 reset_n ( reset_n ) 、
、 ( data_tap
) data_tap 。
。 SFD_start_detect ( SFD_start_detect ) 、
。 SFD_detected ( SFD_detected )
) ;
急性骨髄性白血病rx_aml (
。クロック( rx_clk ) 、
。 reset_n ( reset_n ) 、
、 ( data_tap
) data_tap 。
。 eth_address ( eth_address ) 、
。 SFD_detected ( SFD_detected ) 、
。 address_match ( address_match ) 、
。マルチキャスト(
マルチキャスト ) 、
。ブロードキャスト(放送)
) ;
fcs_check rx_fcs (
。クロック( rx_clk ) 、
。 reset_n ( reset_n ) 、
。 FCS_start_check ( FCS_start_check ) 、
データ(データ) 、
。 crc_ok ( crc_ok )
) ;
endmodule` INIT_COUNT ( 4'b0000 )
を定義` END_COUNT ( 4'b1100 )
を定義` )放送( 48'hFFFFFFFFFFFF定義
` ZERO_DA ( 48'h000000000000 )
を定義`定義MULTICAST_SIGN ( 48'h010000000000 )
モジュールの急性骨髄性白血病(
クロック、
reset_n 、
data_tap 、
、 eth_address
SFD_detected 、
address_match 、
放送、
マルチキャスト
) ;
入力クロック
は 、
SFD_detected 、
reset_n ;
入力[ 7:0 ] data_tap ;
入力[ 47:0 ] eth_address ;
出力address_match 、
マルチキャスト、
放送;
、 address_match登録
マルチキャスト、
放送、
start_count ;
[ 1:0 ] state_AML
登録 ;
] AML_count [ 3:0登録;
] data_tap_temp [ 7:0登録;
] ダ[ 47:0登録;
パラメータAML_IDLE = 2'b00 、
AML_RUN = 2'b01 、
AML_STOP = 2'b10 ;
( posedgeクロックまたはnegedge reset_n )
は常に@( ! reset_n )
< = AML_IDLE state_AML ;
その他の
ケース(
) state_AML
AML_IDLE :
(
) SFD_detected
開始する
start_count < = 1'b1 ;
state_AML < = AML_RUN ;
終わり
その他の
開始する
start_count < = 1'b0 ;
DAをZERO_DA = ` ;
< = AML_IDLE state_AML ;
終わり
AML_RUN :
( AML_count == ` END_COUNT )
state_AML < = AML_STOP ;
その他の
開始する
state_AML < = AML_RUN ;
ケース( AML_count )
4'b0000 : DAを[ 7:0 ] = data_tap_temp [ 7:0 ] ;
4'b0001 : DAを[
15時08分 ] = data_tap_temp [ 7:0 ] ;
4'b0010 : DAを[ 23:16 ] = data_tap_temp [ 7:0 ] ;
4'b0011 : DAを[ 31:24 ] = data_tap_temp [ 7:0 ] ;
4'b0100 : DAを[ 39:32 ] = data_tap_temp [ 7:0 ] ;
4'b0101 : DAを[ 47:40 ] = data_tap_temp [ 7:0 ] ;
デフォルト:
DAをZERO_DA = ` ;
endcase
終わり
AML_STOP :
開始する
start_count < = 1'b0 ;
< = AML_IDLE state_AML ;
終わり
endcase
( posedgeクロックまたはnegedge reset_n )
は常に@開始する
( ! reset_n )
開始する
address_match = 1'b0 ;
放送= 1'b0 ;
マルチキャスト= 1'b0 ;
終わり
その他の
( state_AML == AML_IDLE )
開始する
address_match = 1'b0 ;
放送= 1'b0 ;
マルチキャスト= 1'b0 ;
終わり
その他の
ケース(ダ)
`放送:
開始する
放送= 1'b1 ;
address_match = 1'b1 ;
終わり
eth_address :
address_match = 1'b1 ;
( eth_address | ` MULTICAST_SIGN ) :
開始する
マルチキャスト= 1'b1 ;
address_match = 1'b1 ;
終わり
デフォルト:
address_match = 1'b0 ;
endcase
終わり
( posedgeクロックまたはnegedge reset_n )
は常に@開始する
( ! reset_n )
data_tap_temp < = 8'b00000000 ;
その他の
data_tap_temp < = data_tap ;
終わり
( posedgeクロックまたはnegedge reset_n )
は常に@( ! reset_n )
AML_count < = ` INIT_COUNT ;
その他の
場合( !
) start_count
AML_count < = ` INIT_COUNT ;
その他の
AML_count < = ( AML_count 1'b1 ) ;
endmodule
` BUFFER_INIT_VALUE 32'hFFFFFFFF定義
` CRCO_RESET 9'b000000000定義
` CRC_NOT 9'b111111111定義
モジュールfcs_check (
クロック、
reset_n 、
FCS_start_check 、
データ、
crc_ok
) ;
入力FCS_start_check ;
入力[ 7:0 ]のデータ;
入力クロック;
入力reset_n ;
出力crc_ok ;
登録crc_ok ;
] crc_buffer [ 31:0登録;
機能¥[ 31:0 ] count_crc ;
入力[ 3:0 ]エ;
入力[ 31:0 ] ç ;
[ 3:0登録]エ;
[ 31:0
登録 ] ç ;
] new_crc [ 31:0登録;
開始する
new_crc [ 0 ] =エ[ 3 ] ^ ç [ 28 ] ;
new_crc [ 1 ] =エ[ 2 ] ^エ[ 3 ] ^ ç [ 28 ] ^ ç [ 29 ] ;
new_crc [ 2 ] =エ[ 1 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 3 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 2 ] ^ ç [ 29 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 4 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 3 ] ^ ç [ 0 ] ^ ç [ 28 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 5 ] =エ[ 0 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 1 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 31 ] ;
new_crc [ 6 ] =エ[ 1 ] ^エ[ 2 ] ^ ç [ 2 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 7 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 3 ] ^ ç [ 3 ] ^ ç [ 28 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 8 ] =エ[ 0 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 4 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 31 ] ;
new_crc [ 9 ] =エ[ 1 ] ^エ[ 2 ] ^ ç [ 5 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 10 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 3 ] ^ ç [ 6 ] ^ ç [ 28 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 11 ] =エ[ 0 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 7 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 31 ] ;
new_crc [ 12 ] =エ[ 1 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 8 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 13 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 2 ] ^ ç [ 9 ] ^ ç [ 29 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 14 ] =エ[ 0 ] ^エ[ 1 ] ^ ç [ 10 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 15 ] =エ[ 0 ] ^ ç [ 11 ] ^ ç [ 31 ] ;
new_crc [ 16 ] =エ[ 3 ] ^ ç [ 12 ] ^ ç [ 28 ] ;
new_crc [ 17 ] =エ[ 2 ] ^ ç [ 13 ] ^ ç [ 29 ] ;
new_crc [ 18 ] =エ[ 1 ] ^ ç [ 14 ] ^ ç [ 30 ] ;
new_crc [ 19 ] =エ[ 0 ] ^ ç [ 15 ] ^ ç [ 31 ] ;
new_crc [ 20 ] = ç [ 16 ] ;
new_crc [ 21 ] = ç [ 17 ] ;
new_crc [ 22 ] =エ[ 3 ] ^ ç [ 18 ] ^ ç [ 28 ] ;
new_crc [ 23 ] =エ[ 2 ] ^エ[ 3 ] ^ ç [ 19 ] ^ ç [ 28 ] ^ ç [ 29 ] ;
new_crc [ 24 ] =エ[ 1 ] ^エ[ 2 ] ^ ç [ 20 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 25 ] =エ[ 0 ] ^エ[ 1 ] ^ ç [ 21 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 26 ] =エ[ 0 ] ^エ[ 3 ] ^ ç [ 22 ] ^ ç [ 28 ] ^ ç [ 31 ] ;
new_crc [ 27 ] =エ[ 2 ] ^ ç [ 23 ] ^ ç [ 29 ] ;
new_crc [ 28 ] =エ[ 1 ] ^ ç [ 24 ] ^ ç [ 30 ] ;
new_crc [ 29 ] =エ[ 0 ] ^ ç [ 25 ] ^ ç [ 31 ] ;
new_crc [ 30 ] = ç [ 26 ] ;
new_crc [ 31 ] = ç [ 27 ] ;
count_crc = new_crc ;
終わり
endfunction
常に( posedgeクロック)
@開始する
もし( crc_buffer == 32'hc704dd7b ) / / :マジックナンバー
crc_ok < = 1'b1 ;
その他の
crc_ok < = 1'b0 ;
終わり
常に( posedgeクロック)
@開始する
( ! reset_n )
crc_buffer < = ` BUFFER_INIT_VALUE ;
その他の
( FCS_start_check )
crc_buffer < = count_crc (データ、 crc_buffer ) ;
その他の
crc_buffer < = ` BUFFER_INIT_VALUE ;
終わり
endmodule
モジュールrx_buffer (
クロック、
reset_n 、
rx_data 、
data_tap 、
データ、
data_en
) ;
入力クロック、 data_en 、 reset_n ;
入力[ 7:0 ] rx_data ;
出力[ 7:0 ] data_tap 、データ;
] data_tap [ 7:0登録;
] data_temp [ 7:0登録;
( posedgeクロックまたはnegedge reset_n )
は常に@開始する
( ! reset_n )
data_tap < = 8'b00000000 ;
その他の
data_tap < = rx_data ;
終わり
( posedgeクロックまたはnegedge reset_n )
は常に@開始する
( ! reset_n )
data_temp < = 8'b00000000 ;
その他の
data_temp < = data_tap ;
終わり
= data_enデータを割り当てる
か ?data_temp : 8'bzzzzzzzz ;
endmodule` INITIAL_COUNT 12'b000000000000定義
` MAX_COUNT 12'b101111011100定義
` STATUS_RESET 16'b0000000000000000定義
` 15'b000000000000000 STATUS_ERROR定義
` 12'b000000001011 eo_DA定義
` 12'b000000001101 GET_CRC_OUT定義
` CRCO_ZERO 9'b000000000定義
` Rx_IDLE 4'b000定義
` SFD_detect 4'b001定義
` Rx_RUN 4'b010定義
` 4'b011 Rx_HOLD定義
` Rx_STOP 4'b100定義
` WRITE_STATUS 4'b101定義
` HOLD1_STATUS 4'b110定義
` HOLD2_STATUS 4'b111定義
モジュールrx_sm (
クロック、
reset_n 、
rx_dv 、
rx_error 、
SFD_detected 、
address_match 、
マルチキャスト、
放送、
crc_ok 、
SFD_start_detect 、
data_en 、
FCS_start_check 、
last_data 、
、 data_valid
rx_status_valid_n 、
rx_status
) ;
入力クロック
は 、
reset_n 、
rx_dv 、
rx_error 、
SFD_detected 、
address_match 、
マルチキャスト、
放送、
crc_ok ;
出力SFD_start_detect 、
data_en 、
FCS_start_check 、
last_data 、
、 data_valid
rx_status_valid_n ;
出力[
午後3時00 ] rx_status ;
、 SFD_start_detect登録
FCS_start_check 、
data_en 、
last_data 、
broadcast_temp 、
multicast_temp 、
address_match_temp 、
、 data_valid
rx_error_temp 、
sending_data_n_status 、
rx_status_valid_n ;
] rx_sm_state [ 3:0登録;
、 [
12時 ] nibble_count登録
nibble_count_temp ;
] rx_status [
15時00分 登録;
( posedgeクロックまたはnegedge reset_n )
は常に@開始する
( ! reset_n )
rx_sm_state < = ` Rx_IDLE ;
その他の
( rx_error )
開始する
rx_error_temp < = 1'b1 ;
rx_sm_state < = ` Rx_HOLD ;
終わり
その他の
場合( ( nibble_count_temp 2'b10 ) == ` MAX_COUNT )
開始する
rx_error_temp < = 1'b1 ;
rx_sm_state < = ` Rx_HOLD ;
終わり
その他の
ケース(
) rx_sm_state
` Rx_IDLE :
開始する
( rx_dv )
開始する
rx_sm_state < = ` SFD_detect ;
SFD_start_detect < = 1'b1 ;
終わり
その他の
開始する
SFD_start_detect < = 1'b0 ;
data_en < = 1'b0 ;
FCS_start_check < = 1'b0 ;
rx_status_valid_n < = 1'b1 ;
rx_status < = ` STATUS_RESET ;
last_data < = 1'b0 ;
< = 1'b0 data_valid ;
sending_data_n_status < = 1'b0 ;
rx_sm_state < = ` Rx_IDLE ;
rx_error_temp < = 1'b0 ;
終わり
終わり
` SFD_detect :
開始する
( ! rx_dv )
rx_sm_state < = ` Rx_HOLD ;
その他の
(
) SFD_detected
開始する
SFD_start_detect < = 1'b0 ;
FCS_start_check < = 1'b1 ;
< = 1'b1 data_valid ;
sending_data_n_status < = 1'b1 ;
data_en < = 1'b1 ;
rx_sm_state < = ` Rx_RUN ;
終わり
その他の
rx_sm_state < = ` SFD_detect ;
終わり
` Rx_RUN :
開始する
( ! rx_dv )
開始する
last_data < = 1'b1 ;
rx_sm_state < = ` Rx_HOLD ;
終わり
その他の
rx_sm_state < = ` Rx_RUN ;
終わり
` Rx_HOLD :
開始する
last_data < = 1'b0 ;
< = 1'b0 data_valid ;
data_en < = 1'b0 ;
rx_sm_state < = ` Rx_STOP ;
終わり
` Rx_STOP :
開始する
FCS_start_check < = 1'b0 ;
rx_sm_state < = ` WRITE_STATUS ;
終わり
` WRITE_STATUS :
開始する
rx_status_valid_n < = 1'b0 ;
rx_status [ 0 ] < = rx_error_temp ;
rx_status [ 1 ] < = address_match_temp ;
rx_status [ 2 ] < = ( broadcast_temp | multicast_temp ) ;
rx_status [ 3 ] < = crc_ok ;
rx_status [
15時04分 ] < = nibble_count 1'b1 ;
rx_sm_state < = ` HOLD1_STATUS ;
終わり
` HOLD1_STATUS :
開始する
rx_sm_state < = ` HOLD2_STATUS ;
終わり
` HOLD2_STATUS :
rx_sm_state < = ` Rx_IDLE ;
デフォルト:
rx_sm_state < = ` Rx_IDLE ;
endcase
終わり
( posedgeクロックまたはnegedge reset_n )
は常に@開始する
( ! reset_n )
nibble_count_temp < = ` INITIAL_COUNT ;
その他の
( ! data_en )
nibble_count_temp < = ` INITIAL_COUNT ;
その他の
nibble_count_temp < = ( nibble_count_temp 1'b1 ) ;
終わり
( posedgeクロックまたはnegedge reset_n )
は常に@開始する
( ! reset_n )
nibble_count < = ` INITIAL_COUNT ;
その他の
( data_en )
nibble_count < = nibble_count_temp ;
その他の
nibble_count < = nibble_count ;
終わり
常に( posedgeクロック)
@開始する
( ! reset_n )
開始する
broadcast_temp < = 1'b0 ;
multicast_temp < = 1'b0 ;
address_match_temp < = 1'b0 ;
終わり
その他の
( ! sending_data_n_status )
開始する
broadcast_temp < = 1'b0 ;
multicast_temp < = 1'b0 ;
address_match_temp < = 1'b0 ;
終わり
その他の
( address_match )
開始する
broadcast_temp < =放送;
multicast_temp < =マルチキャスト;
address_match_temp < = address_match ;
終わり
その他の
開始する
broadcast_temp < = broadcast_temp ;
multicast_temp < = multicast_temp ;
address_match_temp < = address_match_temp ;
終わり
終わり
endmodule
モジュールSFD_detector (
クロック、
reset_n 、
data_tap 、
SFD_start_detect 、
SFD_detected
) ;
入力クロック、 SFD_start_detect 、 reset_n ;
入力[ 3:0 ] data_tap ;
出力SFD_detected ;
SFD_detected登録;
( posedgeクロックまたはnegedge reset_n )
は常に@開始する
( ! reset_n )
< = 1'b0 SFD_detected ;
その他の
( ! SFD_start_detect )
< = 1'b0 SFD_detected ;
その他の
開始する
もし( data_tap == 4'b1101 )
< = 1'b1 SFD_detected ;
その他の
< = 1'b0 SFD_detected ;
終わり
終わり
endmoduleモジュールtxethmac (
tx_data 、
tx_sof 、
tx_eof 、
tx_underrun 、
full_duplex 、
reset_n 、
CRSを、
コル、
tx_clk 、
、 tx_data_used
tx_done 、
tx_abort 、
、 tx_retransmit
tx_status 、
tx_status_valid_n 、
、 txd
tx_en 、
tx_er
) ;
/ / DMAのから
入力[ 7:0 ] tx_data ;
入力tx_sof ;
入力tx_eof ;
入力tx_underrun ;
入力full_duplex ;
入力reset_n ;
/ / MIIから
CRSを入力;
入力コル;
入力tx_clk ;
/ / MIIに
出力[ 7:0 ] txd ;
出力tx_en ;
出力tx_er ;
/ / DMAをする
出力tx_data_used ;
出力tx_done ;
出力tx_abort ;
出力tx_retransmit ;
出力[
6時00分 ] tx_status ;
出力tx_status_valid_n ;
ワイヤー[ 7:0 ]のデータ;
ワイヤtransmit_error ;
ワイヤtransmit_enable ;
ワイヤcompute_crc ;
ワイヤー[ 7:0 ]のCRC ;
ワイヤー[ 2:0 ] data_select ;
ワイヤtransmit_available_p ;
ワイヤtransmit_new_p ;
ワイヤexcess_deferral ;
ワイヤtransmit_preamble ;
ワイヤtransmit_sfd ;
ワイヤー[ 3:0 ] coll_attempt ;
ワイヤlate_coll ;
ワイヤexcessive_coll ;
ワイヤcoll_event_p ;
ワイヤtransmit_64byte ;
ワイヤtransmit_fcs ;
ワイヤ[
11時00 ] count_length ;
ワイヤー[ 3:0 ] count_fcs ;
ワイヤexcessive_length ;
ワイヤー[ 3:0 ] count_jam ;
ワイヤ[
九時 ]ランダム;
ワイヤbackoff_p ;
ワイヤstart_backoff ;
/ /モジュールのインスタンス
tx_1 fifo_synch (
データ(データ) 、
。 transmit_enable ( transmit_enable ) 、
。 transmit_error ( transmit_error ) 、
。クロック( tx_clk ) 、
。 txd ( txd ) 、
。 tx_en ( tx_en ) 、
。 tx_er ( tx_er )
) ;
ifg_timer tx_2 (
。 CRSを( CRSを) 、
。 full_duplex ( full_duplex ) 、
。 transmit_enable ( transmit_enable ) 、
。クロック( tx_clk ) 、
。 reset_n ( reset_n ) 、
。 transmit_available_p ( transmit_available_p )
) ;
defer_counter tx_3 (
。 transmit_available_p ( transmit_available_p ) 、
。 transmit_new_p ( transmit_new_p ) 、
。クロック( tx_clk ) 、
。 reset_n ( reset_n ) 、
。 excess_deferral ( excess_deferral )
) ;
frame_length_counter tx_4 (
。 transmit_enable ( transmit_enable ) 、
。 transmit_fcs ( transmit_fcs ) 、
。クロック( tx_clk ) 、
。 reset_n ( reset_n ) 、
。 count_length ( count_length ) 、
。 count_fcs ( count_fcs ) 、
。 excessive_length ( excessive_length ) 、
。 transmit_64byte (
) transmit_64byte
) ;
/ / coll_counter tx_5 (
/ / 。 transmit_new_p ( transmit_new_p ) 、
/ / 。 transmit_enable (
) transmit_enable 、
/ / 。 transmit_preamble ( transmit_preamble ) 、
/ / 。 transmit_sfd (
) transmit_sfd 、
/ / 。 transmit_64byte (
) transmit_64byte 、
/ / 。クロック( tx_clk ) 、
/ / 。 reset_n ( reset_n ) 、
/ / 。コル(コル) 、
/ / 。 full_duplex ( full_duplex ) 、
/ / 。 coll_event_p ( coll_event_p ) 、
/ / 。 late_coll ( late_coll ) 、
/ / 。 excessive_coll ( excessive_coll ) 、
/ / 。 coll_attempt ( coll_attempt )
/ / ) ;
/ / random_number_gen tx_6 (
/ / 。 coll_attempt ( coll_attempt ) 、
/ / 。クロック( tx_clk ) 、
/ / 。 reset_n ( reset_n ) 、
/ / 。ランダム(
) のランダムな
/ / ) ;
/ / backoff_timer tx_7 (
/ / 。 start_backoff ( start_backoff ) 、
/ / 。ランダム(
) のランダムな、
/ / 。クロック( tx_clk ) 、
/ / 。 reset_n ( reset_n ) 、
/ / 。 backoff_p ( backoff_p )
/ / ) ;
/ / jam_timer tx_8 (
/ / 。 coll_event_p ( coll_event_p ) 、
/ / 。クロック( tx_clk ) 、
/ / 。 reset_n ( reset_n ) 、
/ / 。 count_jam ( count_jam )
/ / ) ;
crc_gen tx_9 (
。 compute_crc ( compute_crc ) 、
データ(データ) 、
。クロック( tx_clk ) 、
。 reset_n ( reset_n ) 、
。のCRC (
) のCRC
) ;
data_mux tx_10 (
、 ( data_select
) data_select 。
。 data_in ( tx_data ) 、
。のCRC (
CRC )
を 、
。 data_out (データ)
) ;
tx_state_machine tx_11 (
。 tx_sof ( tx_sof ) 、
。 tx_eof ( tx_eof ) 、
。 tx_underrun ( tx_underrun ) 、
。クロック( tx_clk ) 、
。 reset_n ( reset_n ) 、
。 transmit_available_p ( transmit_available_p ) 、
。 excess_deferral ( excess_deferral ) 、
。 coll_event_p ( coll_event_p ) 、
。 late_coll ( late_coll ) 、
。 excessive_coll ( excessive_coll ) 、
。 backoff_p ( backoff_p ) 、
。 count_length ( count_length ) 、
。 count_fcs ( count_fcs ) 、
。 excessive_length ( excessive_length ) 、
。 count_jam ( count_jam ) 、
。 tx_data_used ( tx_data_used ) 、
。 tx_done ( tx_done ) 、
。 tx_abort ( tx_abort ) 、
( ) tx_retransmit
、 tx_retransmit 。
。 tx_status ( tx_status ) 、
。 tx_status_valid_n ( tx_status_valid_n ) 、
。 transmit_new_p ( transmit_new_p ) 、
。 transmit_enable ( transmit_enable ) 、
。 transmit_preamble ( transmit_preamble ) 、
。 transmit_sfd ( transmit_sfd ) 、
。 transmit_fcs ( transmit_fcs ) 、
。 transmit_error ( transmit_error ) 、
。 start_backoff ( start_backoff ) 、
。 compute_crc ( compute_crc ) 、
( data_select
) data_select 。
) ;` ) CRC_INIT_VALUE ( 32'hFFFF_FFFF定義
` CRC_IDLE ( 2'b00 )
を定義` CRC_RUN ( 2'b01 )
を定義` CRC_STOP ( 2'b11 )
を定義
モジュールcrc_gen (
、 compute_crc
データ、
クロック、
reset_n 、
のCRC
) ;
入力compute_crc ;
入力[ 7:0 ]のデータ;
入力クロック;
入力reset_n ;
出力[ 7:0 ]のCRC ;
] state_crc [ 1:0登録;
] crc_buffer [ 31:0登録;
] crc_end [ 2:0登録;
機能¥[ 31:0 ] count_crc ; / /最初のシリアルデータのビットがD [ 0 ]
入力[ 3:0 ]エ;
入力[ 31:0 ] ç ;
] new_crc [ 31:0登録;
開始する
new_crc [ 0 ] =エ[ 3 ] ^ ç [ 28 ] ;
new_crc [ 1 ] =エ[ 2 ] ^エ[ 3 ] ^ ç [ 28 ] ^ ç [ 29 ] ;
new_crc [ 2 ] =エ[ 1 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 3 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 2 ] ^ ç [ 29 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 4 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 3 ] ^ ç [ 0 ] ^ ç [ 28 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 5 ] =エ[ 0 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 1 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 31 ] ;
new_crc [ 6 ] =エ[ 1 ] ^エ[ 2 ] ^ ç [ 2 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 7 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 3 ] ^ ç [ 3 ] ^ ç [ 28 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 8 ] =エ[ 0 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 4 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 31 ] ;
new_crc [ 9 ] =エ[ 1 ] ^エ[ 2 ] ^ ç [ 5 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 10 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 3 ] ^ ç [ 6 ] ^ ç [ 28 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 11 ] =エ[ 0 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 7 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 31 ] ;
new_crc [ 12 ] =エ[ 1 ] ^エ[ 2 ] ^エ[ 3 ] ^ ç [ 8 ] ^ ç [ 28 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 13 ] =エ[ 0 ] ^エ[ 1 ] ^エ[ 2 ] ^ ç [ 9 ] ^ ç [ 29 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 14 ] =エ[ 0 ] ^エ[ 1 ] ^ ç [ 10 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 15 ] =エ[ 0 ] ^ ç [ 11 ] ^ ç [ 31 ] ;
new_crc [ 16 ] =エ[ 3 ] ^ ç [ 12 ] ^ ç [ 28 ] ;
new_crc [ 17 ] =エ[ 2 ] ^ ç [ 13 ] ^ ç [ 29 ] ;
new_crc [ 18 ] =エ[ 1 ] ^ ç [ 14 ] ^ ç [ 30 ] ;
new_crc [ 19 ] =エ[ 0 ] ^ ç [ 15 ] ^ ç [ 31 ] ;
new_crc [ 20 ] = ç [ 16 ] ;
new_crc [ 21 ] = ç [ 17 ] ;
new_crc [ 22 ] =エ[ 3 ] ^ ç [ 18 ] ^ ç [ 28 ] ;
new_crc [ 23 ] =エ[ 2 ] ^エ[ 3 ] ^ ç [ 19 ] ^ ç [ 28 ] ^ ç [ 29 ] ;
new_crc [ 24 ] =エ[ 1 ] ^エ[ 2 ] ^ ç [ 20 ] ^ ç [ 29 ] ^ ç [ 30 ] ;
new_crc [ 25 ] =エ[ 0 ] ^エ[ 1 ] ^ ç [ 21 ] ^ ç [ 30 ] ^ ç [ 31 ] ;
new_crc [ 26 ] =エ[ 0 ] ^エ[ 3 ] ^ ç [ 22 ] ^ ç [ 28 ] ^ ç [ 31 ] ;
new_crc [ 27 ] =エ[ 2 ] ^ ç [ 23 ] ^ ç [ 29 ] ;
new_crc [ 28 ] =エ[ 1 ] ^ ç [ 24 ] ^ ç [ 30 ] ;
new_crc [ 29 ] =エ[ 0 ] ^ ç [ 25 ] ^ ç [ 31 ] ;
new_crc [ 30 ] = ç [ 26 ] ;
new_crc [ 31 ] = ç [ 27 ] ;
count_crc = new_crc ;
終わり
endfunction
CRCを 割り当てる[ 7 ] = 〜 crc_buffer [ 24 ] ;
CRCを 割り当てる[ 6 ] = 〜 crc_buffer [ 25 ] ;
CRCを 割り当てる[ 5 ] = 〜 crc_buffer [ 26 ] ;
CRCを 割り当てる[ 4 ] = 〜 crc_buffer [ 27 ] ;
CRCを 割り当てる[ 3 ] = 〜 crc_buffer [ 28 ] ;
CRCを 割り当てる[ 2 ] = 〜 crc_buffer [ 29 ] ;
CRCを 割り当てる[ 1 ] = 〜 crc_buffer [ 30 ] ;
CRCを 割り当てる[ 0 ] = 〜 crc_buffer [ 31 ] ;
( posedgeクロックまたはnegedge reset_n )
は常に@( ! reset_n )
state_crc < = ` CRC_IDLE ;
その他の
ケース(
) state_crc
` CRC_IDLE :もし( compute_crc )
開始する
state_crc < = ` CRC_RUN ;
crc_buffer < = count_crc (データ
は 、 ` CRC_INIT_VALUE ) ;
終わり
その他の
開始する
state_crc < = ` CRC_IDLE ;
crc_buffer < = 32'h0000_0000 ;
crc_end < = 3'd0 ;
終わり
` CRC_RUN :もし( ! compute_crc )
開始する
state_crc < = ` CRC_STOP ;
crc_buffer < = crc_buffer < < 8 ;
終わり
その他の
開始する
state_crc < = ` CRC_RUN ;
crc_buffer < = count_crc (データ、 crc_buffer ) ;
終わり
` CRC_STOP :もし( crc_end == 3'110 )
開始する
state_crc < = ` CRC_IDLE ;
crc_buffer < = 32'h0000_0000 ;
終わり
その他の
開始する
state_crc < = ` CRC_STOP ;
crc_buffer < = crc_buffer < < 4 ;
crc_end < = crc_end 1'b1 ;
終わり
endcase
endmodule
` PATTERN_PREAMBLE ( 8'b01010101 )
を定義` PATTERN_SFD ( 8'b11010101 )
を定義
モジュールdata_mux (
data_select 、
data_in 、
、 CRCが
data_out 、
count_length
) ;
入力[ 2:0 ] data_select ;
入力[ 7:0 ] data_in ;
入力[ 7:0 ]のCRC ;
入力[ 7:0 ] count_length ;
出力[ 7:0 ] data_out ;
] data_out [ 7:0登録;
いつも@ ( data_selectまたはdata_inまたはCRC )
ケース( data_select )
3'b000 : data_out = data_in ;
3'b001 : data_out = ` PATTERN_PREAMBLE ;
3'b010 : data_out = ` PATTERN_SFD ;
3'b011 : data_out =のCRC ;
3'b100 : data_out = src_add ;
3'b101 : data_out = dst_add ;
3'b110 : data_out = count_length ;
デフォルト: data_out = 8'h00 ;
endcase
endmodule
モジュールfifo_synch (
データ、
、 transmit_enable
transmit_error 、
クロック、
、 txd
tx_en 、
tx_er
) ;
入力[ 7:0 ]のデータ;
入力transmit_enable ;
入力transmit_error ;
入力クロック;
出力[ 7:0 ] txd ;
出力tx_en ;
出力tx_er ;
] txd [ 7:0登録;
登録tx_en ;
登録tx_er ;
常に( posedgeクロック)
@(
) transmit_enable
開始する
txd < =データ;
tx_en < = 1'b1 ;
tx_er < = transmit_error ;
終わり
その他の
開始する
txd < = 8'h00 ;
tx_en < = 1'b0 ;
tx_er < = 1'b0 ;
終わり
endmodule` COUNT_LENGTH_IDLE ( 2'b00 )
を定義` COUNT_LENGTH_RUN ( 2'b01 )
を定義`定義COUNT_LENGTH_FCS ( 2'b11 )
` MIN_LENGTH ( 12'd144 )
を定義` MAX_LENGTH ( 12'd3052 )
を定義
モジュールframe_length_counter (
、 transmit_enable
transmit_fcs 、
クロック、
reset_n 、
、 count_length
count_fcs 、
、 excessive_length
transmit_64byte
) ;
入力transmit_enable ;
入力transmit_fcs ;
入力クロック;
入力reset_n ;
出力[
午前11時00分 ] count_length ;
出力[ 3:0 ] count_fcs ;
出力excessive_length ;
出力transmit_64byte ;
[
11 :
00 ] count_length
登録 ;
登録[ 3:0 ] count_fcs ;
excessive_length登録;
登録transmit_64byte ;
[ 1:0 ] state_length
登録 ;
機能¥[
11時00分 ] inc_length ;
入力[
11時00 ] count_length ;
開始する
= count_length 1'b1 inc_length ;
終わり
endfunction
( posedgeクロックまたはnegedge reset_n )
は常に@( ! reset_n )
開始する
state_length < = ` COUNT_LENGTH_IDLE ;
< = 12'd0 count_length ;
count_fcs < = 4'd0 ;
終わり
その他の
ケース(
) state_length
` COUNT_LENGTH_IDLE :もし( transmit_enable )
開始する
state_length < = ` COUNT_LENGTH_RUN ;
< = 12'd1 count_length ;
終わり
その他の
state_length < = ` COUNT_LENGTH_IDLE ;
` COUNT_LENGTH_RUN :もし( ! transmit_enable )
state_length < = ` COUNT_LENGTH_IDLE ;
その他の
( transmit_fcs )
開始する
state_length < = ` COUNT_LENGTH_FCS ;
count_length < = inc_length (
) count_length ;
count_fcs < = 4'd1 ;
終わり
その他の
開始する
state_length < = ` COUNT_LENGTH_RUN ;
count_length < = inc_length (
) count_length ;
終わり
` COUNT_LENGTH_FCS :もし( ! transmit_enable )
state_length < = ` COUNT_LENGTH_IDLE ;
その他の
開始する
state_length < = ` COUNT_LENGTH_FCS ;
count_length < = inc_length (
) count_length ;
count_fcs < = ( count_fcs 1'b1 ) ;
終わり
endcase
いつも@ (
) count_length
開始する
transmit_64byte = ( count_length > ` MIN_LENGTH - 1 ) ?1'b1 : 1'b0 ;
= ( count_length
> `
MAX_LENGTH - 1 ) excessive_length ?1'b1 : 1'b0 ;
終わり
endmodule`定義IFG_LENGTH_1 ( 5'd15 )
`定義IFG_LENGTH_2 ( 5'd22 )
` IFG_IDLE ( 1'b0 )
を定義` IFG_RUN ( 1'b1 )
を定義
モジュールifg_timer (
CRSを、
full_duplex 、
、 transmit_enable
クロック、
reset_n 、
transmit_available_p
) ;
CRSを入力;
入力full_duplex ;
入力transmit_enable ;
入力クロック;
入力reset_n ;
出力transmit_available_p ;
登録transmit_available_p ;
] count_ifg [ 4:0登録;
登録state_ifg ;
機能¥[ 4:0 ] inc_ifg ;
入力[ 4:0 ] count_ifg ;
開始する
inc_ifg = count_ifg 1'b1 ;
終わり
endfunction
( posedgeクロックまたはnegedge reset_n )
は常に@( ! reset_n )
state_ifg < = ` IFG_IDLE ;
その他の
( full_duplex )
ケース(
) state_ifg
` IFG_IDLE :もし( ! transmit_enable )
開始する
state_ifg < = ` IFG_RUN ;
count_ifg < = 5'd1 ;
transmit_available_p < = 1'b0 ;
終わり
その他の
開始する
state_ifg < = ` IFG_IDLE ;
count_ifg < = 5'd0 ;
transmit_available_p < = 1'b0 ;
終わり
` IFG_RUN :もし( transmit_enable )
state_ifg < = ` IFG_IDLE ;
その他の
場合( == ` ) IFG_LENGTH_2 - 1 count_ifg
開始する
state_ifg < = ` IFG_IDLE ;
transmit_available_p < = 1'b1 ;
終わり
その他の
開始する
state_ifg < = ` IFG_RUN ;
count_ifg < =
( count_ifg ) inc_ifg ;
終わり
endcase
その他の
ケース(
) state_ifg
` IFG_IDLE :もし( ! CRSを)
開始する
state_ifg < = ` IFG_RUN ;
count_ifg < = 5'd1 ;
transmit_available_p < = 1'b0 ;
終わり
その他の
開始する
state_ifg < = ` IFG_IDLE ;
count_ifg < = 5'd0 ;
transmit_available_p < = 1'b0 ;
終わり
` IFG_RUN :もし( CRSを& & ( count_ifg < = ` IFG_LENGTH_1 - 1 ) )
state_ifg < = ` IFG_IDLE ;
その他の
場合( == ` ) IFG_LENGTH_2 - 1 count_ifg
開始する
state_ifg < = ` IFG_IDLE ;
transmit_available_p < = 1'b1 ;
終わり
その他の
開始する
state_ifg < = ` IFG_RUN ;
count_ifg < =
( count_ifg ) inc_ifg ;
終わり
endcase
endmodule
` TRANSMIT_IDLE ( 4'b0000 )
を定義`定義NEW_TRANSMIT ( 4'b0001 )
`定義WAIT_TRANSMIT ( 4'b0011 )
` TRANSMIT_PREAMBLE ( 4'b0010 )
を定義` TRANSMIT_SFD ( 4'b0110 )
を定義` TRANSMIT_DATA ( 4'b0111 )
を定義` TRANSMIT_PAD ( 4'b0101 )
を定義`定義TRANSMIT_FCS ( 4'b0100 )
` WAIT_DONE ( 4'b1100 )
を定義` TRANSMIT_DONE ( 4'b1101 )
を定義` TRANSMIT_JAM ( 4'b1111 )
を定義` WAIT_BACKOFF ( 4'b1110 )
を定義`定義WAIT_ABORT ( 4'b1010 )
`定義TRANSMIT_ABORT ( 4'b1011 )
`定義WRITE_STATUS ( 4'b1001 )
/ / ` ( 4'b1000 )
を定義
` PREAMBLE_LENGTH ( 12'd15 )
を定義` SFD_LENGTH ( 12'd1 )
を定義` DATA_LENGTH ( 12'd120 )
を定義`定義FCS_LENGTH ( 4'd
<img src=¥"http://www.edaboard.com/images/smiles/icon_cool.gif¥" alt=¥"涼しい¥" border=¥"0¥" />`定義JAM_LENGTH ( 4'd
<img src=¥"http://www.edaboard.com/images/smiles/icon_cool.gif¥" alt=¥"涼しい¥" border=¥"0¥" />` WIDTH_STATUS 7定義
モジュールtx_state_machine (
tx_sof 、
tx_eof 、
tx_underrun 、
クロック、
reset_n 、
transmit_available_p 、
excess_deferral 、
coll_event_p 、
late_coll 、
excessive_coll 、
backoff_p 、
、 count_length
count_fcs 、
、 excessive_length
count_jam 、
、 tx_data_used
tx_done 、
tx_abort 、
、 tx_retransmit
tx_status 、
tx_status_valid_n 、
transmit_new_p 、
、 transmit_enable
transmit_preamble 、
、 transmit_sfd
transmit_fcs 、
transmit_error 、
start_backoff 、
、 compute_crc
data_select
) ;
入力tx_sof ;
入力tx_eof ;
入力tx_underrun ;
入力クロック;
入力reset_n ;
入力transmit_available_p ;
入力excess_deferral ;
入力excessive_length ;
入力excessive_coll ;
入力late_coll ;
入力coll_event_p ;
入力backoff_p ;
入力[
11時00 ] count_length ;
入力[ 3:0 ] count_fcs ;
入力[ 3:0 ] count_jam ;
出力tx_data_used ;
出力tx_done ;
出力tx_abort ;
出力tx_retransmit ;
出力[ ` WIDTH_STATUS - 1 : 0 ] tx_status ;
出力tx_status_valid_n ;
出力transmit_new_p ;
出力transmit_enable ;
出力transmit_preamble ;
出力transmit_sfd ;
出力transmit_fcs ;
出力transmit_error ;
出力start_backoff ;
出力compute_crc ;
出力[ 2:0 ] data_select ;
tx_data_used登録;
登録tx_done ;
登録tx_abort ;
登録tx_retransmit ;
/ /登録[ ` WIDTH_STATUS - 1 : 0 ] tx_status ;
登録tx_status_valid_n ;
登録transmit_new_p ;
transmit_enable登録;
登録transmit_preamble ;
transmit_sfd登録;
登録transmit_fcs ;
登録transmit_error ;
登録start_backoff ;
登録compute_crc ;
] data_select [ 2:0登録;
] current_tx_state
[ 3:0 登録;
] next_tx_state [ 3:0登録;
( posedgeクロックまたはnegedge reset_n )
は常に@( ! reset_n )
current_tx_state < = ` TRANSMIT_IDLE ;
その他の
current_tx_state < = next_tx_state ;
いつも@ ( current_tx_stateまたはtx_sofまたはtx_eofまたはtx_underrunまたは
transmit_available_pまたはexcess_deferralまたはexcessive_lengthまたは
excessive_collまたはlate_collまたはcoll_event_pまたはbackoff_pまたは
count_lengthまたはcount_fcsまたはcount_jam )
ケース(
) current_tx_state
` TRANSMIT_IDLE :もし( tx_sof )
next_tx_state = ` NEW_TRANSMIT ;
その他の
next_tx_state = ` TRANSMIT_IDLE ;
` NEW_TRANSMIT :もし( ! tx_sof )
next_tx_state = ` TRANSMIT_IDLE ;
その他の
next_tx_state = ` WAIT_TRANSMIT ;
` WAIT_TRANSMIT :もし( ! tx_sof )
next_tx_state = ` TRANSMIT_IDLE ;
その他の
( excess_deferral )
next_tx_state = ` WAIT_ABORT ;
その他の
( transmit_available_p )
next_tx_state = ` TRANSMIT_PREAMBLE ;
その他の
next_tx_state = ` WAIT_TRANSMIT ;
` TRANSMIT_PREAMBLE :もし( ! tx_sof )
next_tx_state = ` TRANSMIT_IDLE ;
その他の
もし( count_length == ` PREAMBLE_LENGTH - 1 )
next_tx_state = ` TRANSMIT_SFD ;
その他の
next_tx_state = ` TRANSMIT_PREAMBLE ;
` TRANSMIT_SFD :もし( ! tx_sof )
next_tx_state = ` TRANSMIT_IDLE ;
その他の
next_tx_state = ` TRANSMIT_DATA ;
` TRANSMIT_DATA :もし( coll_event_p )
next_tx_state = ` TRANSMIT_JAM ;
その他の
もし( tx_underrun | |
) excessive_length
next_tx_state = ` WAIT_ABORT ;
その他の
( tx_eof )
開始する
もし( count_length < ( ` PREAMBLE_LENGTH ` SFD_LENGTH ` DATA_LENGTH - 1 ) )
next_tx_state = ` TRANSMIT_PAD ;
その他の
next_tx_state = ` TRANSMIT_FCS ;
終わり
その他の
next_tx_state = ` TRANSMIT_DATA ;
` TRANSMIT_PAD :もし( coll_event_p )
next_tx_state = ` TRANSMIT_JAM ;
その他の
場合(
== count_length ( ` PREAMBLE_LENGTH ` SFD_LENGTH ` DATA_LENGTH - 1 ) )
next_tx_state = ` TRANSMIT_FCS ;
その他の
next_tx_state = ` TRANSMIT_PAD ;
` TRANSMIT_FCS :もし( coll_event_p )
next_tx_state = ` TRANSMIT_JAM ;
その他の
(
) excessive_length
next_tx_state = ` WAIT_ABORT ;
その他の
もし( count_fcs == ` FCS_LENGTH - 1 )
next_tx_state = ` WAIT_DONE ;
その他の
next_tx_state = ` TRANSMIT_FCS ;
` TRANSMIT_JAM :もし( count_jam == ` JAM_LENGTH - 3 )
開始する
場合(
| late_coll | excessive_coll )
next_tx_state = ` WAIT_ABORT ;
その他の
next_tx_state = ` WAIT_BACKOFF ;
終わり
その他の
next_tx_state = ` TRANSMIT_JAM ;
` WAIT_BACKOFF :もし( backoff_p )
next_tx_state = ` WAIT_TRANSMIT ;
その他の
next_tx_state = ` WAIT_BACKOFF ;
` WAIT_DONE :もし( coll_event_p )
next_tx_state = ` TRANSMIT_JAM ;
その他の
(
) excessive_length
next_tx_state = ` WAIT_ABORT ;
その他の
next_tx_state = ` TRANSMIT_DONE ;
` TRANSMIT_DONE : next_tx_state = ` WRITE_STATUS ;
` WAIT_ABORT : next_tx_state = ` TRANSMIT_ABORT ;
` TRANSMIT_ABORT : next_tx_state = ` WRITE_STATUS ;
` WRITE_STATUS : next_tx_state = ` TRANSMIT_IDLE ;
デフォルト: next_tx_state = ` TRANSMIT_IDLE ;
endcase
いつも@ (
) current_tx_state
ケース(
) current_tx_state
` TRANSMIT_IDLE :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b000 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` NEW_TRANSMIT :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b1 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b000 ;
compute_crc = 1'b0 ;tx_status_valid_n = 1'b1; 終わり
` WAIT_TRANSMIT :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b000 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` TRANSMIT_PREAMBLE :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b1 transmit_enable ;
transmit_preamble = 1'b1 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b001 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` TRANSMIT_SFD :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b1 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b1 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b010 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` TRANSMIT_DATA :
開始する
= 1'b1 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b1 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b000 ;
compute_crc = 1'b1 ;
tx_status_valid_n = 1'b1 ;
終わり
` TRANSMIT_PAD :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b1 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b001 ;
compute_crc = 1'b1 ;
tx_status_valid_n = 1'b1 ;
終わり
` TRANSMIT_FCS :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b1 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b1 ;
start_backoff = 1'b0 ;
data_select = 3'b011 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` WAIT_DONE :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b000 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` TRANSMIT_DONE :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b1 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b000 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` TRANSMIT_JAM :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b1 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b001 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` WAIT_BACKOFF :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b1 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b1 ;
data_select = 3'b000 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` WAIT_ABORT :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b000 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` TRANSMIT_ABORT :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b1 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b000 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b1 ;
終わり
` WRITE_STATUS :
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;
start_backoff = 1'b0 ;
data_select = 3'b000 ;
compute_crc = 1'b0 ;
tx_status_valid_n = 1'b0 ;
終わり
デフォルト:
開始する
= 1'b0 tx_data_used ;
tx_done = 1'b0 ;
tx_abort = 1'b0 ;
= 1'b0 tx_retransmit ;
transmit_new_p = 1'b0 ;
= 1'b0 transmit_enable ;
transmit_preamble = 1'b0 ;
transmit_sfd = 1'b0 ;
transmit_fcs = 1'b0 ;start_backoff = 1'b0;
data_select = 3'b000;
compute_crc = 1'b0;
tx_status_valid_n = 1'b1;
end
endcase
assign tx_status [0] = excess_deferral;
assign tx_status [1] = late_coll;
assign tx_status [2] = excessive_coll;
assign tx_status [3] = 1'b0;
assign tx_status [4] = excessive_length;
assign tx_status [5] = (excess_deferral | late_coll | excessive_coll |
tx_underrun | excessive_length);
assign tx_status [6] = ‾(excess_deferral | late_coll | excessive_coll |
tx_underrun | excessive_length);
always @(posedge clk)
if (tx_underrun)
transmit_error <= 1'b1;
else
transmit_error <= 1'b0;
endmoduleLast edited by audrey on 16 Apr 2007 6:51; edited 1 time in total