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