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

安徽省建设干校学校网站移动端网站建设的方案

安徽省建设干校学校网站,移动端网站建设的方案,北京 建公司网站要多少钱,wordpress需要账号一、TCP/IP协议簇 前面说到TCP/IP是一个协议簇#xff0c;其中包含有IP协议、TCP协议、UDP协议、ARP协议、DNS协议、FTP协议等。设备之间要想完成通信#xff0c;就必须通过这些网络通信协议。 物理层的主要作用就是传输比特流#xff08;将1、0转化为电流强弱来进行传输其中包含有IP协议、TCP协议、UDP协议、ARP协议、DNS协议、FTP协议等。设备之间要想完成通信就必须通过这些网络通信协议。 物理层的主要作用就是传输比特流将1、0转化为电流强弱来进行传输到达目的地后在转化为1、0即数模转换与模数转换。         数据链路层接收来自物理层的位流形式的数据并封装成帧传送到上一层也将来自上层的数据帧拆装为位流形式的数据转发到物理层。MAC数据包位于数据链路层当MAC数据包经过数据链路层到达网络层时前导码、帧起始界定符、目的 MAC 地址、源 MAC 地址、类型/长度以及校验字节均被去除只有有效数据传入了网络层。         网路层通过路由选择算法为报文该层的数据单位由上一层数据打包而来通过通信子网选择最适当的路径。这一层定义的是IP地址通过IP地址寻址所以产生了IP协议。传入网络层的数据包并不完全是需要传输的有效数据他的前面还包含着 20 字节的IP协议首部。网络层在接收到数据包后取下数据包的IP首部将剩余有效数据包发送到传输层。         而传输层提供了主机应用程序进程之间的端到端的服务基本功能是分割与重组数据、按端口号寻址、连接管理、差错控制和流量控制、纠错功能。若传输层使用UDP协议那么传入传输层的数据包为UDP数据包。         应用层是计算机用户以及各种应用程序和网络之间的接口。 以太网数据包就是对各层协议的逐层封装来实现数据传输MAC帧中的数据段为IP数据报文IP报文中的数据段位UDP报文UDP报文中的数据段为传输数据。 1.1 IP IP协议规定了数据传输时的基本单元和格式位于以太网MAC格式的数据段由IP首部和数据字段组成。 版本(4bit)定义IP协议版本设置为二进制的0100时表示IPv4设置为二进制的0110时表示IPv6。首部长度 (4bit)定义数据报协议头长度表示IP首部一共有多少个32位。协议头最小值为5最大值为15。服务类型 (8bit)定义上层协议对处理当前数据报所期望的服务质量并对数据报按照重要性级别进行分配。前3位成为优先位后面4位成为服务类型最后1位没有定义。这些8位字段用于分配优先级、延迟、吞吐量以及可靠性。总长度(16bit)定义整个IP数据报的字节长度包括协议头部和数据。其最大值为65535字节。标识 (16bit)包含一个整数用于标识主机发送的数据报通常每发送一份数据包值加一。标记(3bit)由3位字段构成其中最低位 (ME控制分段存在下一个分段置为1否则置0代表该分段是最后一个分段。中间位(DF) 指出数据报是否可进行分段如果为1则机器不能将该数据报进行分段。第三位即最高位保留不使用值为0。分段偏移 (13bit)在接收方进行数据报重组时用来标识分段的顺序。生存时间 (8bit)一种计数器在丢弃数据报的每个点值依次减1直至减少为0。这样确保数据报拥有有限的环路过程(即TTL)限制了数据报的寿命。协议 (8bit)该字段指出在IP处理过程完成之后有哪种上层协议接收导入数据报。首部校验和(16bit)该字段帮助确保IP协议头的完整性。由于某些协议头字段的改变这就需要对每个点重新计算和检验。计算过程是先将校验和字段置为0然后将整个头部每 16 位划分为一部分将个部分相加再将计算结果取反码插入到校验和字段中。源地址 (32bit)发送端IP地址该字段在IPV4数据报从源主机到目的主机传输期间必须保持不变。目的地址 (32bit)接收端IP地址该字段在IPv4数据报从源主机到目的主机传输期间同样必须保持不变。 1.1.1 IP首部校验和 IP首部校验和计算步骤 将16位检验和字段置为0然后将IP首部按照16位分成多个单元对各个单元采用反码加法运算(即高位溢出位会加到低位通常的补码运算是直接丢掉溢出的高位)此时仍然可能出现进位的情况将得到的和再次分成高16位和低16位进行累加;最后将得到的和的反码填入校验和字段。 IP首部校验和校验 对IP首部中每个16bit进行二进制反码求和将计算结果再取反码若结果为0通过检验否则不通过检验。 例验证IP首部 45 00 00 30 80 4c 40 00 80 06 b5 2e d3 43 11 7b cb 51 15 3d (1)对 IP 首部进行反码求和45000030804c40008006b52ed343117bcb51153d3fffc      03003fffcffff (2)对和结果取反码~ffff0校验正确。 1.2 UDP UDP (User Datagram Protocol)即用户数据报协议是一种面向无连接的传输层协议。无连接是指在传输数据时数据的发送端和接收端不建立逻辑连接。即发送端只管发送不会管接收端到底有没有接收到数据而接收端也不会向发送端反馈反馈是否收到数据。 UDP首部共8个字节同IP首部一样也是一行以32位(4个字节)为单位。 源端口号(16byte)用于区分不同服务的端口端口号的范围从0到 65535。目的端口号(16byte)16位接收端端口号。UDP长度(16byte)包含 UDP 首部长度数据长度。UDP校验和(16byte)提供了与TCP校验字段相同的功能可选。 1.2.1 UDP校验和 UDP校验和的计算需要三部分数据UDP 伪首部、UDP首部和有效数据。伪首部包含IP首部一些字段其目的是让UDP两次检查数据是否已经正确到达目的地只是单纯做校验使用。 UDP校验和计算步骤校验字节强制置0将三部分数据按2字节 即16比特分开分别相加若如果大于 FFFF 那么把高16位与低16位相加直到最终结果为16比特数据。将计算结果取反作为 UDP 校验和字节。  例 (1) 将校验和字段00 92置为00 00: a9 fe bf lf a9 fe 01 17 00 11 00 28 04 d2 04 d2 00 28 00 00 68 74 74 70 3a 2f 2f 77 7777 2e 63 6d 73 6f 66 74 2e 63 6e 20 51 51 3a 31 30 38 36 35 36 30 30 (2) 以2字节为单位数据反码求和: a9fe bflf a9fe 0117 0011 0028 04d2 04d2 0028 0000 6874 7470 3a2f 2f77 7777 2e63 6d73 6f66 742e 636e 2051 513a 3130 3836 3536 3030 6 ff67 (3) 将进位(6)加到低 16 位(f67)上6 ff67 ff6d (4)将 ff6d 取反得: checksum 0092  二、以太网UDP数据回环实验 上位机通过网口调试助手发送数据给FPGAFPGA通过以太网接口接收数据并将收到的数据发送给上位机完成以太网UDP数据的回环。 GMII TO RGMII模块负责将双沿 (DDR) 数据和单沿 (SDR) 数据之间的转换GMII接收侧的引脚同时连接至 ARP顶层模块和UDP顶层模块这个两个模块会分别根据ARP协议和UDP协议解析数据。而GMII发送侧引脚只能和ARP顶层模块和UDP顶层模块的其中一个连接因此以太网控制模块会根据当前接收到的协议类型选择切换GMII发送侧引脚和ARP顶层模块或者UDP顶层模块连接并且根据输入的ARP接收的类型控制ARP顶层模块返回ARP应答信号。ARP顶层模块解析ARP 请求命令并返回开发板的MAC地址。UDP顶层模块实现了以太网 UDP 数据包的接收、发送以及 CRC 校验的功能。以太网单次会接收到大量数据因此需要FIFO模块用来缓存数据由于所使用的GMII接收时钟和GMII发送时钟实际上为同一个时钟因此这里使用同步FIFO。 2.1 UDP模块 UDP模块实现了以太网帧格式和UDP协议功能由UDP接收模块、UDP发送模块和CRC校验模块组成。 UDP接收模块接收模块较为简单只需要判断目的MAC地址与开发板MAC地址、目的IP地址与开发板IP地址是否一致。接收模块的解析顺序是:前导码顺起始界定符→以太网头→IP首部→UDP首部→UDP数据(有效数据)→接收结束。IP数据报一般以32bit为单位为了和IP数据报格式保持一致所以要把8位数据转成32位数据因此接收模块实际上是完成了8位数据转32位数据的功能。 UDP发送模块发送模块多了IP首部校验和和CRC循环冗余校验的计算CRC的校验在CRC校验模块里完成。发送模块的发送顺序是前导码起始界定符→以太网头→IP首部→UDP首部→UDP数据(有效数据)→CRC校验。输入的有效数据为32位数据GMII接口为8位数据接口因此发送模块实际上完成的是32位数据转8位数据的功能。 CRC校验模块CRC校验模块是对UDP发送模块的数据(不包括前导码和起始界定符)做校验把校验结果值拼在以太网倾格式的FCS字段如果CRC校验值计算错误或者没有的话那么电脑网卡会直接丢弃该顿导致收不到数据。CRC32 校验在FPGA实现的原理是LFSR (Linear Feedback Shif Register线性反馈移位寄存器)其思想是各个寄存器储存着上一次CRC32运算的结果寄存器的输出即为CRC32的值。 2.1.1 UDP接收模块 UDP接收模块按照UDP的数据格式解析数据并实现将8位用户数据转成32位数据的功能通过三段式状态机来解析以太网包。 module udp_rx(input clk , //时钟信号input rst_n , //复位信号低电平有效input gmii_rx_dv , //GMII输入数据有效信号input [7:0] gmii_rxd , //GMII输入数据output reg rec_pkt_done, //以太网单包数据接收完成信号output reg rec_en , //以太网接收的数据使能信号output reg [31:0] rec_data , //以太网接收的数据output reg [15:0] rec_byte_num //以太网接收的有效字节数 单位:byte );//parameter define //开发板MAC地址 00-11-22-33-44-55 parameter BOARD_MAC 48h00_11_22_33_44_55; //开发板IP地址 192.168.1.10 parameter BOARD_IP {8d192,8d168,8d1,8d10};localparam st_idle 7b000_0001; //初始状态等待接收前导码 localparam st_preamble 7b000_0010; //接收前导码状态 localparam st_eth_head 7b000_0100; //接收以太网帧头 localparam st_ip_head 7b000_1000; //接收IP首部 localparam st_udp_head 7b001_0000; //接收UDP首部 localparam st_rx_data 7b010_0000; //接收有效数据 localparam st_rx_end 7b100_0000; //接收结束localparam ETH_TYPE 16h0800 ; //以太网协议类型 IP协议 localparam UDP_TYPE 8d17 ; //UDP协议类型//reg define reg [6:0] cur_state ; reg [6:0] next_state ;reg skip_en ; //控制状态跳转使能信号 reg error_en ; //解析错误使能信号 reg [4:0] cnt ; //解析数据计数器 reg [47:0] des_mac ; //目的MAC地址 reg [15:0] eth_type ; //以太网类型 reg [31:0] des_ip ; //目的IP地址 reg [5:0] ip_head_byte_num; //IP首部长度 reg [15:0] udp_byte_num ; //UDP长度 reg [15:0] data_byte_num ; //数据长度 reg [15:0] data_cnt ; //有效数据计数 reg [1:0] rec_en_cnt ; //8bit转32bit计数器//***************************************************** //** main code //*****************************************************//(三段式状态机)同步时序描述状态转移 always (posedge clk or negedge rst_n) beginif(!rst_n)cur_state st_idle; elsecur_state next_state; end//组合逻辑判断状态转移条件 always (*) beginnext_state st_idle;case(cur_state)st_idle : begin //等待接收前导码if(skip_en) next_state st_preamble;elsenext_state st_idle; endst_preamble : begin //接收前导码if(skip_en) next_state st_eth_head;else if(error_en) next_state st_rx_end; elsenext_state st_preamble; endst_eth_head : begin //接收以太网帧头if(skip_en) next_state st_ip_head;else if(error_en) next_state st_rx_end;elsenext_state st_eth_head; end st_ip_head : begin //接收IP首部if(skip_en)next_state st_udp_head;else if(error_en)next_state st_rx_end;elsenext_state st_ip_head; end st_udp_head : begin //接收UDP首部if(skip_en)next_state st_rx_data;elsenext_state st_udp_head; end st_rx_data : begin //接收有效数据if(skip_en)next_state st_rx_end;elsenext_state st_rx_data; end st_rx_end : begin //接收结束if(skip_en)next_state st_idle;elsenext_state st_rx_end; enddefault : next_state st_idle;endcase end //时序电路描述状态输出,解析以太网数据 always (posedge clk or negedge rst_n) beginif(!rst_n) beginskip_en 1b0;error_en 1b0;cnt 5d0;des_mac 48d0;eth_type 16d0;des_ip 32d0;ip_head_byte_num 6d0;udp_byte_num 16d0;data_byte_num 16d0;data_cnt 16d0;rec_en_cnt 2d0;rec_en 1b0;rec_data 32d0;rec_pkt_done 1b0;rec_byte_num 16d0;endelse beginskip_en 1b0;error_en 1b0; rec_en 1b0;rec_pkt_done 1b0;case(next_state)st_idle : beginif((gmii_rx_dv 1b1) (gmii_rxd 8h55)) skip_en 1b1;endst_preamble : beginif(gmii_rx_dv) begin //解析前导码cnt cnt 5d1;if((cnt 5d6) (gmii_rxd ! 8h55)) //7个8h55 error_en 1b1;else if(cnt5d6) begincnt 5d0;if(gmii_rxd8hd5) //1个8hd5skip_en 1b1;elseerror_en 1b1; end end endst_eth_head : beginif(gmii_rx_dv) begincnt cnt 5b1;if(cnt 5d6) des_mac {des_mac[39:0],gmii_rxd}; //目的MAC地址else if(cnt 5d12) eth_type[15:8] gmii_rxd; //以太网协议类型else if(cnt 5d13) begineth_type[7:0] gmii_rxd;cnt 5d0;//判断MAC地址是否为开发板MAC地址或者公共地址if(((des_mac BOARD_MAC) ||(des_mac 48hff_ff_ff_ff_ff_ff)) eth_type[15:8] ETH_TYPE[15:8] gmii_rxd ETH_TYPE[7:0]) skip_en 1b1;elseerror_en 1b1;end end endst_ip_head : beginif(gmii_rx_dv) begincnt cnt 5d1;if(cnt 5d0)ip_head_byte_num {gmii_rxd[3:0],2d0}; //寄存IP首部长度else if(cnt 5d9) beginif(gmii_rxd ! UDP_TYPE) begin//如果当前接收的数据不是UDP协议停止解析数据 error_en 1b1; cnt 5d0; endend else if((cnt 5d16) (cnt 5d18))des_ip {des_ip[23:0],gmii_rxd}; //寄存目的IP地址else if(cnt 5d19) begindes_ip {des_ip[23:0],gmii_rxd}; //判断IP地址是否为开发板IP地址if((des_ip[23:0] BOARD_IP[31:8]) (gmii_rxd BOARD_IP[7:0])) begin if(cnt ip_head_byte_num - 1b1) beginskip_en 1b1; cnt 5d0;end end else begin //IP错误停止解析数据 error_en 1b1; cnt 5d0;end end else if(cnt ip_head_byte_num - 1b1) begin skip_en 1b1; //IP首部解析完成cnt 5d0; end end end st_udp_head : beginif(gmii_rx_dv) begincnt cnt 5d1;if(cnt 5d4)udp_byte_num[15:8] gmii_rxd; //解析UDP字节长度 else if(cnt 5d5)udp_byte_num[7:0] gmii_rxd;else if(cnt 5d7) begin//有效数据字节长度UDP首部8个字节所以减去8data_byte_num udp_byte_num - 16d8; skip_en 1b1;cnt 5d0;end end end st_rx_data : begin //接收数据转换成32bit if(gmii_rx_dv) begindata_cnt data_cnt 16d1;rec_en_cnt rec_en_cnt 2d1;if(data_cnt data_byte_num - 16d1) beginskip_en 1b1; //有效数据接收完成data_cnt 16d0;rec_en_cnt 2d0;rec_pkt_done 1b1; rec_en 1b1; rec_byte_num data_byte_num;end //先收到的数据放在了rec_data的高位,所以当数据不是4的倍数时,//低位数据为无效数据可根据有效字节数来判断(rec_byte_num)if(rec_en_cnt 2d0)rec_data[31:24] gmii_rxd;else if(rec_en_cnt 2d1)rec_data[23:16] gmii_rxd;else if(rec_en_cnt 2d2) rec_data[15:8] gmii_rxd; else if(rec_en_cnt2d3) beginrec_en 1b1;rec_data[7:0] gmii_rxd;end end end st_rx_end : begin //单包数据接收完成 if(gmii_rx_dv 1b0 skip_en 1b0)skip_en 1b1; end default : ;endcase end endendmodule 2.1.2 UDP发送模块 module udp_tx( input clk , //时钟信号input rst_n , //复位信号低电平有效input tx_start_en, //以太网开始发送信号input [31:0] tx_data , //以太网待发送数据 input [15:0] tx_byte_num, //以太网发送的有效字节数input [47:0] des_mac , //发送的目标MAC地址input [31:0] des_ip , //发送的目标IP地址 input [31:0] crc_data , //CRC校验数据input [7:0] crc_next , //CRC下次校验完成数据output reg tx_done , //以太网发送完成信号output reg tx_req , //读数据请求信号output reg gmii_tx_en , //GMII输出数据有效信号output reg [7:0] gmii_txd , //GMII输出数据output reg crc_en , //CRC开始校验使能output reg crc_clr //CRC数据复位信号 );//parameter define //开发板MAC地址 00-11-22-33-44-55 parameter BOARD_MAC 48h00_11_22_33_44_55; //开发板IP地址 192.168.1.10 parameter BOARD_IP {8d192,8d168,8d1,8d10}; //目的MAC地址 ff_ff_ff_ff_ff_ff parameter DES_MAC 48hff_ff_ff_ff_ff_ff; //目的IP地址 192.168.1.102 parameter DES_IP {8d192,8d168,8d1,8d102};localparam st_idle 7b000_0001; //初始状态等待开始发送信号 localparam st_check_sum 7b000_0010; //IP首部校验和 localparam st_preamble 7b000_0100; //发送前导码帧起始界定符 localparam st_eth_head 7b000_1000; //发送以太网帧头 localparam st_ip_head 7b001_0000; //发送IP首部UDP首部 localparam st_tx_data 7b010_0000; //发送数据 localparam st_crc 7b100_0000; //发送CRC校验值localparam ETH_TYPE 16h0800 ; //以太网协议类型 IP协议 //以太网数据最小46个字节IP首部20个字节UDP首部8个字节 //所以数据至少46-20-818个字节 localparam MIN_DATA_NUM 16d18 ; localparam UDP_TYPE 8d17 ; //UDP协议类型 //reg define reg [6:0] cur_state ; reg [6:0] next_state ;reg [7:0] preamble[7:0] ; //前导码 reg [7:0] eth_head[13:0] ; //以太网首部 reg [31:0] ip_head[6:0] ; //IP首部 UDP首部reg start_en_d0 ; reg start_en_d1 ; reg [15:0] tx_data_num ; //发送的有效数据字节个数 reg [15:0] total_num ; //总字节数 reg trig_tx_en ; reg [15:0] udp_num ; //UDP字节数 reg skip_en ; //控制状态跳转使能信号 reg [4:0] cnt ; reg [31:0] check_buffer ; //首部校验和 reg [1:0] tx_byte_sel ; //32位数据转8位数据计数器 reg [15:0] data_cnt ; //发送数据个数计数器 reg tx_done_t ; reg [4:0] real_add_cnt ; //以太网数据实际多发的字节数//wire define wire pos_start_en ;//开始发送数据上升沿 wire [15:0] real_tx_data_num;//实际发送的字节数(以太网最少字节要求) //***************************************************** //** main code //*****************************************************assign pos_start_en (~start_en_d1) start_en_d0; assign real_tx_data_num (tx_data_num MIN_DATA_NUM) ? tx_data_num : MIN_DATA_NUM; //采tx_start_en的上升沿 always (posedge clk or negedge rst_n) beginif(!rst_n) beginstart_en_d0 1b0;start_en_d1 1b0;end else beginstart_en_d0 tx_start_en;start_en_d1 start_en_d0;end end //寄存数据有效字节 always (posedge clk or negedge rst_n) beginif(!rst_n) begintx_data_num 16d0;total_num 16d0;udp_num 16d0;endelse beginif(pos_start_en cur_statest_idle) begin//数据长度tx_data_num tx_byte_num; //UDP长度UDP首部长度 有效数据 udp_num tx_byte_num 16d8; //IP长度IP首部长度 UDP首部 有效数据 total_num tx_byte_num 16d20 16d8; end end end//触发发送信号 always (posedge clk or negedge rst_n) beginif(!rst_n) trig_tx_en 1b0;elsetrig_tx_en pos_start_en;endalways (posedge clk or negedge rst_n) beginif(!rst_n)cur_state st_idle; elsecur_state next_state; endalways (*) beginnext_state st_idle;case(cur_state)st_idle : begin //等待发送数据if(skip_en) next_state st_check_sum;elsenext_state st_idle;end st_check_sum: begin //IP首部校验if(skip_en)next_state st_preamble;elsenext_state st_check_sum; end st_preamble : begin //发送前导码帧起始界定符if(skip_en)next_state st_eth_head;elsenext_state st_preamble; endst_eth_head : begin //发送以太网首部if(skip_en)next_state st_ip_head;elsenext_state st_eth_head; end st_ip_head : begin //发送IP首部UDP首部 if(skip_en)next_state st_tx_data;elsenext_state st_ip_head; endst_tx_data : begin //发送数据 if(skip_en)next_state st_crc;elsenext_state st_tx_data; endst_crc: begin //发送CRC校验值if(skip_en)next_state st_idle;elsenext_state st_crc; enddefault : next_state st_idle; endcase end //发送数据 always (posedge clk or negedge rst_n) beginif(!rst_n) beginskip_en 1b0; cnt 5d0;check_buffer 32d0;ip_head[1][31:16] 16d0;tx_byte_sel 2b0;crc_en 1b0;gmii_tx_en 1b0;gmii_txd 8d0;tx_req 1b0;tx_done_t 1b0; data_cnt 16d0;real_add_cnt 5d0;//初始化数组 //前导码 7个8h55 1个8hd5preamble[0] 8h55; preamble[1] 8h55;preamble[2] 8h55;preamble[3] 8h55;preamble[4] 8h55;preamble[5] 8h55;preamble[6] 8h55;preamble[7] 8hd5;//目的MAC地址eth_head[0] DES_MAC[47:40];eth_head[1] DES_MAC[39:32];eth_head[2] DES_MAC[31:24];eth_head[3] DES_MAC[23:16];eth_head[4] DES_MAC[15:8];eth_head[5] DES_MAC[7:0];//源MAC地址eth_head[6] BOARD_MAC[47:40];eth_head[7] BOARD_MAC[39:32];eth_head[8] BOARD_MAC[31:24];eth_head[9] BOARD_MAC[23:16];eth_head[10] BOARD_MAC[15:8];eth_head[11] BOARD_MAC[7:0];//以太网类型eth_head[12] ETH_TYPE[15:8];eth_head[13] ETH_TYPE[7:0]; endelse beginskip_en 1b0;tx_req 1b0;crc_en 1b0;gmii_tx_en 1b0;tx_done_t 1b0;case(next_state)st_idle : beginif(trig_tx_en) beginskip_en 1b1; //版本号4 首部长度5(单位:32bit,20byte/45)ip_head[0] {8h45,8h00,total_num}; //16位标识每次发送累加1 ip_head[1][31:16] ip_head[1][31:16] 1b1; //bit[15:13]: 010表示不分片ip_head[1][15:0] 16h4000; //协议17(udp) ip_head[2] {8h40,UDP_TYPE,16h0}; //源IP地址 ip_head[3] BOARD_IP;//目的IP地址 if(des_ip ! 32d0)ip_head[4] des_ip;elseip_head[4] DES_IP; //16位源端口号1234 16位目的端口号1234 ip_head[5] {16d1234,16d1234}; //16位udp长度16位udp校验和 ip_head[6] {udp_num,16h0000}; //更新MAC地址if(des_mac ! 48b0) begin//目的MAC地址eth_head[0] des_mac[47:40];eth_head[1] des_mac[39:32];eth_head[2] des_mac[31:24];eth_head[3] des_mac[23:16];eth_head[4] des_mac[15:8];eth_head[5] des_mac[7:0];endend end st_check_sum: begin //IP首部校验cnt cnt 5d1;if(cnt 5d0) begin check_buffer ip_head[0][31:16] ip_head[0][15:0] ip_head[1][31:16] ip_head[1][15:0] ip_head[2][31:16] ip_head[2][15:0] ip_head[3][31:16] ip_head[3][15:0] ip_head[4][31:16] ip_head[4][15:0];endelse if(cnt 5d1) //可能出现进位,累加一次check_buffer check_buffer[31:16] check_buffer[15:0];else if(cnt 5d2) begin //可能再次出现进位,累加一次check_buffer check_buffer[31:16] check_buffer[15:0];end else if(cnt 5d3) begin //按位取反 skip_en 1b1;cnt 5d0; ip_head[2][15:0] ~check_buffer[15:0];end end st_preamble : begin //发送前导码帧起始界定符gmii_tx_en 1b1;gmii_txd preamble[cnt];if(cnt 5d7) begin skip_en 1b1;cnt 5d0; endelse cnt cnt 5d1; endst_eth_head : begin //发送以太网首部gmii_tx_en 1b1;crc_en 1b1;gmii_txd eth_head[cnt];if (cnt 5d13) beginskip_en 1b1;cnt 5d0;end else cnt cnt 5d1; end st_ip_head : begin //发送IP首部 UDP首部crc_en 1b1;gmii_tx_en 1b1;tx_byte_sel tx_byte_sel 2d1;if(tx_byte_sel 2d0)gmii_txd ip_head[cnt][31:24];else if(tx_byte_sel 2d1)gmii_txd ip_head[cnt][23:16];else if(tx_byte_sel 2d2) begingmii_txd ip_head[cnt][15:8];if(cnt 5d6) begin//提前读请求数据等待数据有效时发送tx_req 1b1; endend else if(tx_byte_sel 2d3) begingmii_txd ip_head[cnt][7:0]; if(cnt 5d6) beginskip_en 1b1; cnt 5d0;end elsecnt cnt 5d1; end endst_tx_data : begin //发送数据crc_en 1b1;gmii_tx_en 1b1;tx_byte_sel tx_byte_sel 2d1; if(tx_byte_sel 1b0)gmii_txd tx_data[31:24];else if(tx_byte_sel 2d1)gmii_txd tx_data[23:16]; else if(tx_byte_sel 2d2) begingmii_txd tx_data[15:8]; if(data_cnt ! tx_data_num - 16d2)tx_req 1b1; endelse if(tx_byte_sel 2d3)gmii_txd tx_data[7:0]; if(data_cnt tx_data_num - 16d1)data_cnt data_cnt 16d1; else if(data_cnt tx_data_num - 16d1)begin//如果发送的有效数据少于18个字节在后面填补充位//填充的值为0tx_req 1b0;if(data_cnt real_add_cnt real_tx_data_num - 16d1)real_add_cnt real_add_cnt 5d1; else beginskip_en 1b1;data_cnt 16d0;real_add_cnt 5d0;tx_byte_sel 2d0; end if(real_add_cnt 0) begingmii_txd 8d0;end end end st_crc : begin //发送CRC校验值gmii_tx_en 1b1;tx_byte_sel tx_byte_sel 2d1;if(tx_byte_sel 2d0)gmii_txd {~crc_next[0], ~crc_next[1], ~crc_next[2],~crc_next[3],~crc_next[4], ~crc_next[5], ~crc_next[6],~crc_next[7]};else if(tx_byte_sel 2d1)gmii_txd {~crc_data[16], ~crc_data[17], ~crc_data[18],~crc_data[19],~crc_data[20], ~crc_data[21], ~crc_data[22],~crc_data[23]};else if(tx_byte_sel 2d2) begingmii_txd {~crc_data[8], ~crc_data[9], ~crc_data[10],~crc_data[11],~crc_data[12], ~crc_data[13], ~crc_data[14],~crc_data[15]}; endelse if(tx_byte_sel 2d3) begingmii_txd {~crc_data[0], ~crc_data[1], ~crc_data[2],~crc_data[3],~crc_data[4], ~crc_data[5], ~crc_data[6],~crc_data[7]}; tx_done_t 1b1;skip_en 1b1;end end default :; endcase end end //发送完成信号及crc值复位信号 always (posedge clk or negedge rst_n) beginif(!rst_n) begintx_done 1b0;crc_clr 1b0;endelse begintx_done tx_done_t;crc_clr tx_done_t;end endendmodule2.2 UDP控制模块 module eth_ctrl(input clk , //系统时钟input rst_n , //系统复位信号低电平有效 //ARP相关端口信号 input arp_rx_done, //ARP接收完成信号input arp_rx_type, //ARP接收类型 0:请求 1:应答output reg arp_tx_en, //ARP发送使能信号output arp_tx_type, //ARP发送类型 0:请求 1:应答input arp_tx_done, //ARP发送完成信号input arp_gmii_tx_en, //ARP GMII输出数据有效信号 input [7:0] arp_gmii_txd, //ARP GMII输出数据//UDP相关端口信号input udp_tx_start_en,//UDP开始发送信号input udp_tx_done, //UDP发送完成信号input udp_gmii_tx_en, //UDP GMII输出数据有效信号 input [7:0] udp_gmii_txd, //UDP GMII输出数据 //GMII发送引脚 output gmii_tx_en, //GMII输出数据有效信号 output [7:0] gmii_txd //UDP GMII输出数据 );//reg define reg protocol_sw; //协议切换信号 reg udp_tx_busy; //UDP正在发送数据标志信号 reg arp_rx_flag; //接收到ARP请求信号的标志//***************************************************** //** main code //*****************************************************assign arp_tx_type 1b1; //ARP发送类型固定为ARP应答 assign gmii_tx_en protocol_sw ? udp_gmii_tx_en : arp_gmii_tx_en; assign gmii_txd protocol_sw ? udp_gmii_txd : arp_gmii_txd;//控制UDP发送忙信号 always (posedge clk or negedge rst_n) beginif(!rst_n)udp_tx_busy 1b0;else if(udp_tx_start_en) udp_tx_busy 1b1;else if(udp_tx_done)udp_tx_busy 1b0; end//控制接收到ARP请求信号的标志 always (posedge clk or negedge rst_n) beginif(!rst_n)arp_rx_flag 1b0;else if(arp_rx_done (arp_rx_type 1b0)) arp_rx_flag 1b1;else if(protocol_sw 1b0)arp_rx_flag 1b0; end//控制protocol_sw和arp_tx_en信号 always (posedge clk or negedge rst_n) beginif(!rst_n) beginprotocol_sw 1b0;arp_tx_en 1b0;endelse beginarp_tx_en 1b0;if(udp_tx_start_en)protocol_sw 1b1;else if(arp_rx_flag (udp_tx_busy 1b0)) beginprotocol_sw 1b0;arp_tx_en 1b1;end end endendmodule其他模块和以太网ARP测试实验一样
http://wiki.neutronadmin.com/news/59868/

相关文章:

  • 明星网站怎么设计wordpress主题使用
  • 销售平台网站建设方案模板wordpress值得买主题
  • 怎么提高网站响应速度嘉兴网站建设的地方
  • 做苗木选择哪个网站上海注册公司需要多少钱
  • 免费空间 上传网站购物网站 购物车界面如何做
  • 食品网站设计网络营销服务概念
  • 网站设计与建设实训静态网站如何添加关键词
  • 海纳企业网站建设软文吧
  • 网站绑定两个域名怎么做跳转iis7 新建网站
  • 电子商务网站开发数据库表格深圳有几个区地图
  • 贵阳市观山湖区网站建设动态设计参考网站
  • 网站报价详情金山石化网站建设
  • 手机网站源码带后台最简单的安卓开发工具
  • 扬州门户网站开发wordpress还能用
  • 做网站哪些比较好wordpress 主题 搜索引擎
  • 做品牌的人常用的网站500强企业排名(2022最新名单)
  • 怎么用ps做网站前台美工无极最新招聘
  • 淘宝客商城网站建设不停弹窗的网站怎么做
  • 基于wordpress门户网站wordpress 美食主题
  • 做任务赚话费的网站中国十大企业管理培训机构
  • 商业网站的后缀网站建设域名服务器购买
  • 如何建立游戏网站平台哪些网站是做快消品的
  • 网站优化文章怎么做做玩网站怎么上传
  • 广元网站建设优化开启wordpress mu
  • 门户网站建设 简报引流渠道有哪些平台
  • 镇海建设交通局网站首页昆山设计网站的公司哪家好
  • 外贸手表网站模板免费商品列表网页模板源代码
  • 网站主页设计布局图网站建设推广技术
  • 中国科协网站建设招标广州公司搜索seo网络推广
  • 哪个网站做漫画可以有钱邢台规划局网站建设