大俠好,歡迎來到FPGA技術江湖,江湖偌大,相見即是緣分。大俠可以關注FPGA技術江湖,在“闖蕩江湖”、"行俠仗義"欄里獲取其他感興趣的資源,或者一起煮酒言歡。
今天給大俠帶來基于FPGA的千兆以太網設計,話不多說,上貨。
一、設計概述
由于設計比較復雜,本篇帶來設計流程以及設計思路,僅供各位大俠參考。
本篇通過管理數據輸入輸出MDIO配置PHY寄存器,使其工作在千兆通信模式下。FPGA通過ddio_out的IP核將數據單沿轉雙沿通過TX發(fā)送到PHY-A,PHY—B把收到的數據RX通過ddio_in的IP核雙沿轉單沿給FPGA采集,實現FPGA與PHY的交互通信。通過FPGA的SDRAM控制模塊對SDRAM進行讀寫和刷新的操作,從而進行數據的存儲與讀取的操作。
根據UDP/IP協議將數據打包,并且通過IP源地址以及目的地址等來計算IP頭部checksum和UDP頭部checksum,在PC機上通過上位機軟件Wireshark獲取FPGA發(fā)送的1024byte的數據包,并且上位機顯示通過UDP協議接收數據,數據位打包時加上CRC32冗余校驗碼,在FPGA的接收端可以加上CRC32解碼操作,用來驗證數據在傳輸過程中是否出錯。
二、設計框架
整體模塊比較復雜,自頂向下設計流程,分模塊較多,需要注意各個端口信號,最好可以做成端口信號表,以免自己搞混淆。
注:復位省略,_t后綴表示數據或標志信號經過一級寄存器打拍操作。輸入時鐘25M,PLL倍頻輸出sclk125M,tx_data是偏移90度125M時鐘。
三、數據流框圖描述
四、DDIO模塊簡單描述
DDIO模塊描述:
1、DDIO為調用的FPGA內部IP核;
2、ddioin是將雙沿數轉為單沿數據,ddioout是將單沿數據轉化雙沿數據。
ddioin時序圖:
五、ram64模塊時序描述
ram64模塊描述:
ram64是深度為64位寬為8的LCs分布式RAM。
作用:
同頻異相的同步化操作。
write時序圖:
RAM64的Read控制模塊描述:
rx_clk時鐘域下的start_en和CRC_en轉化到sclk時鐘域下,都要先進行打三拍操作之后在被引用。(數據跨時鐘域處理可以用雙口RAM或FIFO,一般的標志信號有打拍法就可以)
1、?在start_ttt為高時,產生一個rd_flag信號,rd_flag信號在rd_cnt == batch_data – 1 時拉低,rd_flag信號為高時,rd_cnt開始計數自加1,在rd_cnt == batch_data – 1并且rd_flag=1時清零。
2、 Rd_en在CRC_en_ttt==1時拉高,否則為低。Rd_addr在rd_en=1時自加,在rd_cnt == batch_data – 1并且rd_flag=1時清零。
六、image模塊時序描述
image模塊描述:
por_img_pixel_max:像素點最大值;
por_img_udp_cnt:udp包計數器;
por_img_udp_max:UDP包最大值;
por_img_row_max:圖片行最大值;
por_img_row_cnt:圖片行計數器。
頭包時序:??
在mac_cnt=50時,取出image_w_h;
等于51時,取出image_w_l;
等于52、53、54時,分別取出image_h_h、image_h_l、image_type。
數據包時序:
Image_row_end_flag信號在por_img_pixel_cnt == por_img_pixel_mux&& por_img_udp_cnt == por_img_udp_mux&&colour_cnt == 2時拉高一個時鐘周期。
Image_end_flag信號在por_img_row_cnt == por_img_row_mux&&por_img_pixel_cnt == por_img_pixel_mux&& por_img_udp_cnt == por_img_udp_mux&&colour_cnt == 2時,拉高一個時鐘周期。
七、TWO_buffer模塊時序描述
TWO_buffer模塊描述:two_buffer:乒乓操作。
作用:使得SDRAM每次都能讀到一行完整的圖片數據。
1、?解決包間隔時間問題;
2、?分時、交替存儲和讀取,起到緩沖作用;
3、sel_w在image_row_end==1時進行反轉;sel_r在sdram_read_ack ==1時進行反轉。
八、SDRAM控制模塊描述
SDRAM控制模塊描述:
1、512Kbit*32bit*4bank(64Mbit);
2、模式寄存器設置:0032,潛伏期3,突發(fā)長度4;
3、自刷新時間間隔:15us。
Sdram狀態(tài)EBD描述:
Arbit_state:
Write_state:
讀寫模塊狀態(tài)機基本相似,自刷新模塊狀態(tài)機直接用線性序列機就可實現。這里不做重復概述。
九、RAM_2k模塊描述
RAM_2k模塊描述:
1、位寬24位,深度2K;
2、作用:緩存從SDRAM讀出的圖片的一行數據;
3、等待數據頭包的發(fā)送和包間隔,并且進行圖像一橫數據的分包成幀發(fā)送。
十、frame(成幀)模塊的描述
frame(成幀)模塊的描述:
根據千兆以太網協議(附錄)進行幀包的配置,以太網(IEEE 802.3)幀格式:
1、前導碼:7字節(jié)0x55,一串1、0間隔,用于信號同步?有的說是AA;
2、幀起始定界符:1字節(jié)0xD5(10101011),表示一幀開始?有的說是AB;
3、DA(目的MAC):6字節(jié)?如果設置為全1 為廣播包;
4、SA(源MAC):6字節(jié);
5、類型/長度:2字節(jié),0~1500保留為長度域值,1536~65535保留為類型域值(0x0600~0xFFFF);
6、數據:46~1500字節(jié);
7、幀校驗序列(FCS):4字節(jié),使用CRC計算從目的MAC到數據域這部分內容而得到的校驗和。
注釋:
1、head_flag在image_end=1時拉高,在head_cnt=cnt_len時拉低。
2、cnt_flag在head_flag=1||data_flag=1時拉高,在cnt=cnt_len+pkt_gap時拉低
3、sd_req在head_flag=1&&head_cnt=cnt_len||por_img_udp_cnt=por_img_udp_max&& data_flag=1&&data_cnt=cnt_len時拉高,在sd_ack=1時拉低。
4、ram_wr_en在sd_req=1時拉高,在image_row_end=1時拉低。
5、data_flag在cnt_end_flag=1 時拉高,在data_cnt=cnt_len時拉低。
6、colour_flag在data_cnt=60時拉高,在data_cnt=cnt_len時拉低。
7、ram_rd_addr在por_img_udp_cnt=por_img_udp_max && data_cnt=cnt_len清零。
十一、check_sum模塊描述
check_sum模塊描述:
check_sum是將成幀數據進行指定算法計算后的結果,用于數據校驗。上位機會對接收到的數據做check_sum計算并且與成幀模塊的check_sum計算結果進行比較,做出正確或錯誤提示。(wireshark數據包監(jiān)控軟件)
Chueck_sum部分波形圖:
注釋:
1、實現方法:將從frame模塊輸入到check_sum的數據進行check_sum計算,同時將輸入data_in先存入一個深度為2k的RAM中,在所有chenck_sum算完之后,在建數據一個一個讀出,在協議的相應位置加入check_sum值。
十二、crc模塊描述
crc模塊描述:
1、crc:循環(huán)冗余校驗碼,8位輸入,32位輸出。
算子方程式:
2、將輸入數據進行crc運算,在crc校驗運算完的同時,將32位校驗碼補在數據流的后四位。
總結
上位機軟件:
1、receive_image上位機與從機通信軟件;
2、wireshark數據包監(jiān)控軟件。
總結:
1、先進行DDIO的回環(huán)測試;
2、模塊化設計編程實現,測試通過之后在進行top裝配測試;
3、時序未出現違規(guī)時,查看slack是否大于0.3ns,注意時序約束;
4、注意assign語句的使用,盡量用時序進行操作,避免不必要的時序違例;
5、注意標志信號的使用,盡量避免運算式在判斷條件里出現且進行多重判斷邏輯嵌套;
6、?了解上位機與從機之間通信的基本原理;
7、?熟悉wireshark數據包監(jiān)控軟件的使用。
本篇大概分享了設計框架及思路,給各位大俠做設計學習參考,若想要詳細學習,可閱讀以下推文,系統(tǒng)性學習。
FPGA就業(yè)班,05.04開班,新增課程內容不加價,高薪就業(yè),線上線下同步!