本程式由多個verilog檔案組成,包括了hdl資料夾裡所有的相關檔案以及一些必要的IP核。
文件功能介紹crc.v
:主要在udp發送時使用,計算udp的包的CRC數值。
ethernet.v
:對udp_send.v和udp_receive.v檔的封裝。
ethernet_top.v
:整個工程的範例頂層文件,只是展示如何呼叫文件和其他相關的ip核文件。
udp_receive.v
:負責udp的接收處理過程。
udp_send.v
:負責udp的發送處理過程。
clk
:接收模組的主時脈。
rst_n
:接收模組的全域重設訊號。
rx_data_len
:接收資料的udp資料包長度,是udp標頭的參數。
rx_total_len
:接收資料的ip資料包長度,是ip資料標頭的參數。
update
:當接收到新的udp資料包時,該值會拉高一周期。
ip_header
:接收的整個IP封包頭,僅支援160位元的IP資料標頭。
udp_header
:接收的整個UDP資料標頭,僅支援64位元的UDP資料標頭。
mac
: 接收的整個MAC資料包,包括目的MAC,來源MAC和IP包類型識別。
data_o
:接收的有效資料。
src_mac
:封包的來源MAC位址。
src_addr
:封包的來源IP位址。
src_port
:封包的來源連接埠位址。
DF
:IP封包的參數,為0代表封包可分片,為1代表不可分片。
MF
:IP封包的參數,為1代表還有分片,為0代表這是最後一片。
e_rxdv
:RTL8211的控制IO,當為高時代表接收資料有效。
rxd
:RTL8211的接收資料IO。
CAN_RECEIVE_BROADCAST
:是否支援接收廣播封包,也就是MAC位址為FFFFFFFFFFFF的封包。
DST_ADDR
:設定目的位址的IP位址,也就是RTL8211的網路卡位址。
DST_PORT
:設定目的位址的連接埠位址,也就是RTL8211的連接埠。
DST_MAC
:設定目的位址的MAC位址,也就是RTL8211的MAC位址。
IDLE
:空閒狀態,只要接收到前導碼,就進入R_PRE狀態。
R_PRE
:接收前導碼,接收7個前導碼和一個開始位元資料後,進入R_MAC狀態。
R_MAC
:接收MAC資料狀態,接收完成後進入R_HEADER狀態。
R_HEADER
:接收IP資料標頭及UDP資料報頭,接收完畢進入R_DATA狀態。
R_DATA
:接收UDP有效數據,接收完畢後進入R_FINISH。
R_FINISH
:返回IDLE狀態。
clk
, rst_n
訊號如上;
data_i
:需要發送出去的數據,在tx_dv為高時將需要發送的數據通過該端口傳輸到UDP數據包。
tx_data_len
:發送的資料長度,UDP資料包的參數。
crc
:整個乙太網路封包的CRC校驗碼,保留資料校驗使用。
crcen
:crc模組的使能訊號,為高crc校驗模組才可以計算。
crcrst
:crc模組的複位訊號,為高crc檢定模組重設。
start
:UDP發送模組的開始訊號,為高驅動模組開始群組幀發送。
busy
:UDP發送模組的忙線訊號,當模組正在群組框架發送的過程中時該訊號拉高。
tx_dv
:UDP發送模組的指示訊號,告知目前UDP模組已經可以將資料傳送出去,請將需要傳送的資料發過來。
dst_mac
:目的位址的MAC位址。
dst_addr
:目的位址的IP位址。
dst_port
:目的位址的連接埠位址。
DF
, MF
如上所述。
tx_en
:RTL8211的發送啟用訊號,為高發送資料有效。
txer
:RTL8211的發送錯誤訊號。
txd
:RTL8211的發送資料IO。
IP_HEADER_LEN
:ip封包的長度,預設就好,不需要改。
TTL
:IP封包的參數,生存時間。
SRC_ADDR
:來源位址的IP位址。
SRC_PORT
:來源位址的連接埠。
SRC_MAC
:來源位址的MAC位址。
IDLE
:空閒狀態,start為高進入MAKE_IP狀態。
MAKE_IP
:產生IP封包,進入MAKE_SUM狀態。
MAKE_SUM
:計算IP封包的首部校驗和,計算完畢進入SEND_PRE狀態。
SEND_PRE
:發送7個前導碼和1個開始碼。然後進入SEND_MAC狀態。
SEND_MAC
:發送目的MAC,來源MAC和IP封包類型,然後進入SEND_HEADER狀態。
SEND_HEADER
:傳送IP資料標頭和UDP資料報頭,然後進入SEND_DATA狀態。
SEND_DATA
:發送有效數據,發送完成進入SEND_CRC狀態。
SEND_CRC
:傳送CRC數據,傳送完成進入IDLE_CODE狀態。
IDLE_CODE
:發送12個空閒碼,乙太網路封包的要求。發送完畢回到IDLE狀態
為了滿足125Mhz的時序要求,這兩個核心部分的程式碼盡力做了一些修改,比如udp_send中,發送如MAC,數據報頭時,都採用了狀態機根據計數器的值發送對應位的數據, 之前曾經試過直接發高八位,然後透過不斷地移位將沒有發送過得資料移到高八位,但這個方法無法滿足125Mhz的時序要求,所以改成了現在這個方式。又例如計算首部檢定和, 將計算的過程分成了幾步來計算,也有效的減少了時序違例的總數。
但即使如此,仍有部分訊號不符合時序要求,時序報告會產生負1ns左右的時序路徑。
未完待續,等著填坑。 。 。
填坑文章(探索千兆網)1. 認識乙太網路影格的整個結構(探索千兆網)2. 為確保數位電路時序裕量所做的努力