当前位置: 首页 > news >正文

二、FPGA发送UDP帧代码

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;entity UDP_TX isPort (--------reset and global clock-------------UDP_LEN : IN std_logic_vector(7 downto 0);   --UDP业务数据长度UDP_PARA : IN std_logic_vector(191 downto 0); -- 目标MAC 本地MAC  本地IP 目标IP 本地端口 目标端口------业务数据从 fifo rx ------------------------fifo_RX_outdata : IN std_logic_vector(7 downto 0);fifo_RX_RE : OUT std_logic;FIFO_RX_AlmostFull : in std_logic;OSC25M : in std_logic;RESET : in std_logic;MTXD : out std_logic_vector(3 downto 0);MTXEN : out std_logic;MTXC : OUT std_logic);
end UDP_TX;architecture Behavioral of UDP_TX issignal CLK25M : std_logic;signal TCLK25M,RCLK25M : std_logic;signal TXCNT: std_logic_vector(12 downto 0);signal TX_DATA_END: std_logic_vector(12 downto 0);signal mrxdv2 : std_logic;signal RXCNT: std_logic_vector(12 downto 0);signal MRXD2: std_logic_vector(3 downto 0);signal TXBUF: std_logic_vector(7 downto 0);signal CRC: std_logic_vector(31 downto 0);signal CRCBUF,CRCSUM: std_logic_vector(3 downto 0);signal IPIDCNT: std_logic_vector(15 downto 0);signal IPSUM: std_logic_vector(15 downto 0);signal IPSUM1: std_logic_vector(16 downto 0);signal BUFFHIG: std_logic_vector(7 downto 0);-- 目标MAC 本地MAC  本地IP 目标IP 本地端口 目标端口signal UDP_RCV_DATA : std_logic_vector(31 downto 0);signal RCV_IPIDCNT : std_logic_vector(15 downto 0);signal RCV_IPIDCNT_NEXT : std_logic_vector(15 downto 0);signal UDP_TX_EN  : std_logic_vector(1 downto 0);signal UDP_TX_ALL_LEN : std_logic_vector(15 downto 0);signal UDP_TX_DATA_LEN : std_logic_vector(15 downto 0);signal UDP_TX_IDLE_CNT : std_logic_vector(7 downto 0);signal UDP_RCV_ADDR : std_logic;   --0:使用前1K地址, 1:使用后面1K地址signal UDP_RCV_OVER : std_logic;signal UDP_RCV_CHECK: std_logic_vector(1 downto 0);signal UDP_RCV5_CNT : std_logic_vector(4 downto 0);signal UDP_RCV_LEN : std_logic_vector(15 downto 0);signal UDP_RCV_ALL_LEN : std_logic_vector(15 downto 0);signal UDP_RCV_FIFO : std_logic_vector(7 downto 0);Alias  DST_MAC:std_logic_vector(47 downto 0) IS UDP_PARA(191 downto 144);Alias  LOC_MAC:std_logic_vector(47 downto 0) IS UDP_PARA(143 downto 96);Alias  LOC_IP:std_logic_vector(31 downto 0) IS UDP_PARA(95 downto 64);Alias  DST_IP:std_logic_vector(31 downto 0) IS UDP_PARA(63 downto 32);Alias  LOC_PORT:std_logic_vector(15 downto 0) IS UDP_PARA(31 downto 16);Alias  DST_PORT:std_logic_vector(15 downto 0) IS UDP_PARA(15 downto 0);signal FIFO_RDATA : std_logic_vector(7 downto 0);beginCLK25M<=OSC25M;
-- UDP数据=业务数据*16 + 8个UDP� 4个网管数�
UDP_TX_DATA_LEN	<= (UDP_LEN & "0000") + "0000000000001000" + "0000000000000100" ;
--UDP发送总长=UDP_TX_DATA_LEN + 20
UDP_TX_ALL_LEN <= UDP_TX_DATA_LEN + "0000000000010100" ;   -- 数据长度=报文长度-首部8个字节,UDP首部结束位置"0000001100100"
TX_DATA_END <= (UDP_TX_DATA_LEN(11 downto 0) & '0') - "0000000010000" + "0000001100100";TCLK25M<=not CLK25M;
RCLK25M<=CLK25M;MTXC<=TCLK25M;
CRCSUM<=CRCBUF xor CRC(3 downto 0);
------------------------------------UDP_TX---------------
IPSUM<=IPSUM1(15 downto 0)+("000000000000000" & IPSUM1(16));
process(CLK25M,RESET)beginif(RESET='0') thenTXCNT<=(others => '0');elsif(CLK25M'event and CLK25M='1') thenif(UDP_TX_EN ="00" or UDP_TX_EN ="11")then-- 添加帧间歇,最少96bitif(UDP_TX_IDLE_CNT < "10000000") then UDP_TX_IDLE_CNT<=UDP_TX_IDLE_CNT+'1';elsif(FIFO_RX_AlmostFull ='1')then UDP_TX_EN <= "01";end if;fifo_RX_RE <= '0';TXCNT<=(others => '0');BUFFHIG<=(others => '0');IPSUM1<=(others => '0');--------------------------发送业务帧----------------------------------------elsif(TXCNT(12) = '0' and UDP_TX_EN = "01") thenTXCNT<=TXCNT+'1';UDP_TX_IDLE_CNT <=(others => '0');-- 头部校验和计�if(TXCNT > "0000000101011" and TXCNT < "0000000111111")THENif(TXCNT(1 downto 0)="00")then BUFFHIG <= TXBUF;elsif(TXCNT(1 downto 0)="10")then IPSUM1<=('0' & BUFFHIG & TXBUF)+ ('0' & IPSUM1(15 downto 0)) + ("0000000000000000" & IPSUM1(16));end if;end if;case TXCNT iswhen "0000000001111" => TXBUF<=DST_MAC(47  downto 40);CRCBUF<=DST_MAC(43  downto 40);IPIDCNT<=IPIDCNT+'1';  --目标MACwhen "0000000010001" => TXBUF<=DST_MAC(39  downto 32);CRCBUF<=DST_MAC(35  downto 32);  --目标MACwhen "0000000010011" => TXBUF<=DST_MAC(31  downto 24);CRCBUF<=DST_MAC(27  downto 24);  --目标MACwhen "0000000010101" => TXBUF<=DST_MAC(23  downto 16);CRCBUF<=DST_MAC(19  downto 16);  --目标MACwhen "0000000010111" => TXBUF<=DST_MAC(15  downto  8);CRCBUF<=DST_MAC(11  downto  8);  --目标MACwhen "0000000011001" => TXBUF<=DST_MAC( 7  downto  0);CRCBUF<=DST_MAC( 3  downto  0);  --目标MACwhen "0000000011011" => TXBUF<=LOC_MAC(47  downto 40);CRCBUF<=LOC_MAC(43  downto 40);  --本机MACwhen "0000000011101" => TXBUF<=LOC_MAC(39  downto 32);CRCBUF<=LOC_MAC(35  downto 32);  --本机MACwhen "0000000011111" => TXBUF<=LOC_MAC(31  downto 24);CRCBUF<=LOC_MAC(27  downto 24);  --本机MACwhen "0000000100001" => TXBUF<=LOC_MAC(23  downto 16);CRCBUF<=LOC_MAC(19  downto 16);  --本机MACwhen "0000000100011" => TXBUF<=LOC_MAC(15  downto  8);CRCBUF<=LOC_MAC(11  downto  8);  --本机MACwhen "0000000100101" => TXBUF<=LOC_MAC( 7  downto  0);CRCBUF<=LOC_MAC( 3  downto  0);  --本机MACwhen "0000000100111" => TXBUF<="00001000";CRCBUF<="1000";  --协议类型when "0000000101001" => TXBUF<="00000000";CRCBUF<="0000";  --协议类型when "0000000101011" => TXBUF<="01000101";CRCBUF<="0101";  --版本�4500     IP报头when "0000000101101" => TXBUF<="00000000";CRCBUF<="0000";  --版本�when "0000000101111" => TXBUF<=UDP_TX_ALL_LEN(15  downto 8);CRCBUF<=UDP_TX_ALL_LEN(11  downto 8);  --总长=UDP报文长度+20when "0000000110001" => TXBUF<=UDP_TX_ALL_LEN( 7  downto 0);CRCBUF<=UDP_TX_ALL_LEN( 3  downto 0);   --总长=UDP报文长度+20when "0000000110011" => TXBUF<=IPIDCNT(15 downto 8);CRCBUF<=IPIDCNT(11 downto 8);  --ip:分段标识�when "0000000110101" => TXBUF<=IPIDCNT( 7 downto 0);CRCBUF<=IPIDCNT( 3 downto 0);when "0000000110111" => TXBUF<="00000000";CRCBUF<="0000";  --ip:标志�when "0000000111001" => TXBUF<="00000000";CRCBUF<="0000";  --ip:偏移�when "0000000111011" => TXBUF<="11111111";CRCBUF<="1111";  --ip:生存时间when "0000000111101" => TXBUF<="00010001";CRCBUF<="0001";  --ip:包类�when "0000000111111" => TXBUF<=not IPSUM(15 downto 8);CRCBUF<=not IPSUM(11 downto 8);--IPSUM   报头校验�when "0000001000001" => TXBUF<=not IPSUM( 7 downto 0);CRCBUF<=not IPSUM( 3 downto 0);when "0000001000011" => TXBUF<=LOC_IP(31  downto 24);CRCBUF<=LOC_IP(27  downto 24);  --源IP地址when "0000001000101" => TXBUF<=LOC_IP(23  downto 16);CRCBUF<=LOC_IP(19  downto 16);  --源IP地址when "0000001000111" => TXBUF<=LOC_IP(15  downto  8);CRCBUF<=LOC_IP(11  downto  8);  --源IP地址when "0000001001001" => TXBUF<=LOC_IP( 7  downto  0);CRCBUF<=LOC_IP( 3  downto  0);  --源IP地址when "0000001001011" => TXBUF<=DST_IP(31  downto 24);CRCBUF<=DST_IP(27  downto 24);  --目标IP地址when "0000001001101" => TXBUF<=DST_IP(23  downto 16);CRCBUF<=DST_IP(19  downto 16);  --目标IP地址when "0000001001111" => TXBUF<=DST_IP(15  downto  8);CRCBUF<=DST_IP(11  downto  8);  --目标IP地址when "0000001010001" => TXBUF<=DST_IP( 7  downto  0);CRCBUF<=DST_IP( 3  downto  0);  --目标IP地址when "0000001010011" => TXBUF<=LOC_PORT(15  downto 8);CRCBUF<=LOC_PORT(11  downto 8);  --源端�    UDP报头when "0000001010101" => TXBUF<=LOC_PORT( 7  downto 0);CRCBUF<=LOC_PORT( 3  downto 0);  --源端�when "0000001010111" => TXBUF<=DST_PORT(15  downto 8);CRCBUF<=DST_PORT(11  downto 8);  --目标端口when "0000001011001" => TXBUF<=DST_PORT( 7  downto 0);CRCBUF<=DST_PORT( 3  downto 0);  --目标端口when "0000001011011" => TXBUF<=UDP_TX_DATA_LEN(15  downto 8);CRCBUF<=UDP_TX_DATA_LEN(11  downto 8);   --数据长度�when "0000001011101" => TXBUF<=UDP_TX_DATA_LEN(7  downto 0);CRCBUF<=UDP_TX_DATA_LEN(3  downto 0); --数据长度�when "0000001011111" => TXBUF<="00000000";CRCBUF<="0000";  --校验和:忽略when "0000001100001" => TXBUF<="00000000";CRCBUF<="0000"; --校验和:忽略when "0000001100011" => TXBUF<="10101010";CRCBUF<="1010";  NULL;     --可以添加网管开销字段-UDP数据when "0000001100101" => TXBUF<="10101010";CRCBUF<="1010"; when "0000001100111" => TXBUF<="10101010";CRCBUF<="1010";when "0000001101001" => TXBUF<="10101010";CRCBUF<="1010";when others => NULL;end case;if(TXCNT<"0000000001111") then      --SFD  <15   前导码MTXD<="0101";MTXEN<='1';IPSUM1<=('0' & LOC_IP(31 downto 16))+('0' & LOC_IP(15 downto 0));elsif(TXCNT="0000000001111") then   -- 帧起始界定符MTXD<="1101";IPSUM1<=('0' & DST_IP(31 downto 16))+('0' & DST_IP(15 downto 0)) + ('0' & IPSUM1(15 downto 0))+ ("0000000000000000" & IPSUM1(16));elsif(TXCNT<"0000001101011") then   --ROM add26-42=17  IP:源IP,目标IP、源端口、目标端口、报文长�校验和:随意�01if(TXCNT(0)='0') thenMTXD<=TXBUF(3 downto 0);CRCBUF<=TXBUF(7 downto 4);else MTXD<=TXBUF(7 downto 4);end if;elsif(TXCNT="0000001101011") thenMTXD<=TXBUF(7 downto 4);-- TXBUF<=fifo_RX_outdata;CRCBUF<=fifo_RX_outdata(3 downto 0);TXBUF<=FIFO_RDATA;CRCBUF<=FIFO_RDATA(3 downto 0);elsif(TXCNT < TX_DATA_END) then   if(TXCNT(0)='0') thenfifo_RX_RE <= '1';--not TXCNT(0);MTXD<=TXBUF(3 downto 0);CRCBUF<=TXBUF(7 downto 4);else MTXD<=TXBUF(7 downto 4);TXBUF<=fifo_RX_outdata;CRCBUF<=fifo_RX_outdata(3 downto 0);fifo_RX_RE <= '0';--not TXCNT(0);FIFO_RDATA <= fifo_RX_outdata;--FIFO长时间使能禁用,fifo_RX_outdata值会被清零end if;elsif(TXCNT<(TX_DATA_END + "0000000001000")) then  --CRCMTXD<=not CRC(3 downto 0);elsif(TXCNT=(TX_DATA_END + "0000000001000")) then  --ENDMTXEN<='0';UDP_TX_EN <= "00";end if;elseMTXEN<='0';UDP_TX_EN <= "00";end if; end if;
end process;
process(CLK25M)beginif(CLK25M'event and CLK25M='1') thenif(TXCNT<="0000000001111") thenCRC<=(others => '1');elsif(TXCNT<TX_DATA_END) then case CRCSUM iswhen "0000" => CRC<=("0000" & CRC(31 downto 4)) xor "00000000000000000000000000000000";when "0001" => CRC<=("0000" & CRC(31 downto 4)) xor "00011101101101110001000001100100";when "0010" => CRC<=("0000" & CRC(31 downto 4)) xor "00111011011011100010000011001000";when "0011" => CRC<=("0000" & CRC(31 downto 4)) xor "00100110110110010011000010101100";when "0100" => CRC<=("0000" & CRC(31 downto 4)) xor "01110110110111000100000110010000";when "0101" => CRC<=("0000" & CRC(31 downto 4)) xor "01101011011010110101000111110100";when "0110" => CRC<=("0000" & CRC(31 downto 4)) xor "01001101101100100110000101011000";when "0111" => CRC<=("0000" & CRC(31 downto 4)) xor "01010000000001010111000100111100";when "1000" => CRC<=("0000" & CRC(31 downto 4)) xor "11101101101110001000001100100000";when "1001" => CRC<=("0000" & CRC(31 downto 4)) xor "11110000000011111001001101000100";when "1010" => CRC<=("0000" & CRC(31 downto 4)) xor "11010110110101101010001111101000";when "1011" => CRC<=("0000" & CRC(31 downto 4)) xor "11001011011000011011001110001100";when "1100" => CRC<=("0000" & CRC(31 downto 4)) xor "10011011011001001100001010110000";when "1101" => CRC<=("0000" & CRC(31 downto 4)) xor "10000110110100111101001011010100";when "1110" => CRC<=("0000" & CRC(31 downto 4)) xor "10100000000010101110001001111000";when "1111" => CRC<=("0000" & CRC(31 downto 4)) xor "10111101101111011111001000011100";when others => NULL;end case;elsif(TXCNT<(TX_DATA_END + "0000000001000")) then CRC(27 downto 0)<=CRC(31 downto 4);end if;end if;
end process;end Behavioral;

(发送的数据从FIFO中提取出来的,如果单纯测试可以不用FIFO直接写死就行)

以太网接口使用4bit数据线,发送一个字节需要2个时间周期,先发低4位,后发高4位

http://www.dtcms.com/a/598677.html

相关文章:

  • 如何获取Dev-C++的官方安装包?
  • 迪奥官网网站做的好吗合肥网站制作价格
  • 重塑机器人未来:空间智能驱动产业智能化升级
  • 离石古楼角网站建设如何学习网站开发
  • 网站建设验收单格式中国交通建设集团
  • 做网站的是什么职业手机网站源码怎么打开
  • 无需安装!PostgreSQL 18 Windows 便携部署方案
  • 网站开发哪里培训好物联卡官方免费申请入口
  • 网站怎么做支付宝接口购买了网站如何使用
  • wordpress 抽奖aso优化服务站
  • 国产外骨骼机器人成跨境新爆单
  • 广州网站建设骏域伊春网站建设
  • 做网站厦门泗阳做网站
  • 成都网站建设 3e网络wordpress最新下载
  • 线上培训机构有哪些基本seo
  • yolov11n主干网络换为MobileNetv3
  • 做网站优化有前景吗wordpress 前台文件上传
  • UEC++ 创建默认子对象CreateDefaultSubobject
  • 免费直播网站贵州灵溪seo整站优化
  • 数字电路零基础入门教程
  • 自己做淘宝客登录网站进口网站建设
  • 网站怎么做搜索功能WordPress连接符
  • snapan项目--kkfileview介绍及部署(下)
  • WordPress插件--Markdown编辑器
  • 计算机图形学·13 构建模型
  • 营销型网站哪家做的好苏州网站优化找哪家
  • 嵌入式面试高频题:模拟电路+数字电路(含标准答案)
  • 长沙河东做网站深圳ui设计
  • 作业1111
  • 若依使用技巧