From 7b85b7cadd71a90ad2938f696ba5ce9f36b356fb Mon Sep 17 00:00:00 2001 From: yangshenbo Date: Fri, 9 Jan 2026 21:46:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BF=E7=9C=9F=E6=97=A0=E8=AF=AF=EF=BC=8C?= =?UTF-8?q?=E6=88=90=E5=8A=9F=E5=B0=86=E4=B8=80=E4=B8=AAudp=E7=AB=AF?= =?UTF-8?q?=E5=8F=A3=E5=8F=98=E6=88=90=E4=B8=A4=E4=B8=AA=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=E2=80=94=E2=80=94udp=20process=20data=E4=B8=BA=E6=9D=BF?= =?UTF-8?q?=E7=BA=A7=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- UDP_data_process.v | 60 ++++++---- .../a83dc5096e9434783ed57f826a2f50e2.png | Bin 0 -> 10973 bytes .../局部截取_20260109_211301.png | Bin 0 -> 9212 bytes .../局部截取_20260109_211614.png | Bin 0 -> 15929 bytes .../局部截取_20260109_212429.png | Bin 0 -> 7127 bytes .../局部截取_20260109_214254.png | Bin 0 -> 13237 bytes readme/变成两个udp,一个负责收一个负责发.md | 81 +++++++++++++ status_to_udp.v | 113 ++++++++++++------ 8 files changed, 193 insertions(+), 61 deletions(-) create mode 100644 readme/变成两个udp,一个负责收一个负责发.assets/a83dc5096e9434783ed57f826a2f50e2.png create mode 100644 readme/变成两个udp,一个负责收一个负责发.assets/局部截取_20260109_211301.png create mode 100644 readme/变成两个udp,一个负责收一个负责发.assets/局部截取_20260109_211614.png create mode 100644 readme/变成两个udp,一个负责收一个负责发.assets/局部截取_20260109_212429.png create mode 100644 readme/变成两个udp,一个负责收一个负责发.assets/局部截取_20260109_214254.png create mode 100644 readme/变成两个udp,一个负责收一个负责发.md diff --git a/UDP_data_process.v b/UDP_data_process.v index 3a080dc..bf3385b 100644 --- a/UDP_data_process.v +++ b/UDP_data_process.v @@ -29,17 +29,25 @@ module UDP_data_process ( input eth_linked, output reg pulse_second, -// input data_fifo_rden, // UDP接收FIFO接口 - output reg udp_app_recv_fifo_rden, - input [7:0] udp_app_recv_fifo_rddata, - input [11:0] udp_app_recv_fifo_rdcnt, - input udp_app_recv_fifo_empty, - // UDP发送FIFO接口 - input udp_app_send_fifo_rden, - output [7:0] udp_app_send_fifo_rddata, - output [11:0] udp_app_send_fifo_rdcnt, - output udp_app_send_fifo_empty, + output reg udp_app_recv_fifo_rden_0, + input [7:0] udp_app_recv_fifo_rddata_0, + input [11:0] udp_app_recv_fifo_rdcnt_0, + input udp_app_recv_fifo_empty_0, + // UDP0发送FIFO接口 + input udp_app_send_fifo_rden_0, + output [7:0] udp_app_send_fifo_rddata_0, + output [11:0] udp_app_send_fifo_rdcnt_0, + output udp_app_send_fifo_empty_0, + + // UDP1接收FIFO接口 + //we don't need + + // UDP1发送FIFO接口 + input udp_app_send_fifo_rden_1, + output [7:0] udp_app_send_fifo_rddata_1, + output [11:0] udp_app_send_fifo_rdcnt_1, + output udp_app_send_fifo_empty_1, // TOE寄存器接口 output reg TOE_reg_wren, output reg TOE_reg_rden, @@ -63,7 +71,7 @@ module UDP_data_process ( input [31:0] DAQ_Status_Info_data ); -// wire udp_app_recv_fifo_rden_r; + wire udp_app_recv_fifo_ready; wire udp_recv_data_tvalid; wire [31:0]udp_recv_data; @@ -168,24 +176,23 @@ ila_00 ila_udp_data ( // --------------------------- always@(posedge clk) if(reset) - udp_app_recv_fifo_rden <= 1'b0; - else if(udp_app_recv_fifo_rdcnt == 12'b1) //上板后不得注释!!记得取消注释 //实际应该是读计数为1时候就要拉低了,不然板子会多读一个。 仿真又坑了我。跑一次比特流要15分钟呢! //仿真需要 udp_app_recv_fifo_rdcnt == 12'b0 时才拉低 - udp_app_recv_fifo_rden <= 1'b0; - else if((~udp_app_recv_fifo_empty) && udp_app_recv_fifo_ready && (~deal_busy) && eth_linked) //如果连接成功才会去读,连接失败不能去读fifo。 - udp_app_recv_fifo_rden <= 1'b1; + udp_app_recv_fifo_rden_0 <= 1'b0; //仿真和上板的区别有2个地方,一个是这边,另外一个是秒脉冲的计数器(2处) + else if(udp_app_recv_fifo_rdcnt_0 == 12'b1) //上板后不得注释!!记得取消注释 //实际应该是读计数为1时候就要拉低了,不然板子会多读一个。 + udp_app_recv_fifo_rden_0 <= 1'b0; + else if((~udp_app_recv_fifo_empty_0) && udp_app_recv_fifo_ready && (~deal_busy) && eth_linked) //如果连接成功才会去读,连接失败不能去读fifo。 + udp_app_recv_fifo_rden_0 <= 1'b1; else - udp_app_recv_fifo_rden <= 1'b0; + udp_app_recv_fifo_rden_0 <= 1'b0; -//assign udp_app_recv_fifo_rden_r = udp_app_recv_fifo_rden && (~udp_app_recv_fifo_empty); // udp recv data does not delay, so the en needn't delay axis_dwidth_converter_0 axis_dwidth_converter_udprx( .aclk (clk), // input .aresetn (~reset), // input - .s_axis_tvalid(udp_app_recv_fifo_rden), // input + .s_axis_tvalid(udp_app_recv_fifo_rden_0), // input .s_axis_tready(udp_app_recv_fifo_ready), // output - .s_axis_tdata (udp_app_recv_fifo_rddata), // input [7:0] + .s_axis_tdata (udp_app_recv_fifo_rddata_0), // input [7:0] .m_axis_tvalid(udp_recv_data_tvalid), // output .m_axis_tready(1'b1), // input .m_axis_tdata (udp_recv_data) // output [63:0] @@ -448,10 +455,15 @@ status_to_udp status_to_udp_0 ( .DAQ_Status_Info_last(DAQ_Status_Info_last), .DAQ_Status_Info_data(DAQ_Status_Info_data), - .udp_app_send_fifo_rden(udp_app_send_fifo_rden), - .udp_app_send_fifo_rddata(udp_app_send_fifo_rddata), - .udp_app_send_fifo_rdcnt(udp_app_send_fifo_rdcnt), - .udp_app_send_fifo_empty(udp_app_send_fifo_empty) + .udp_app_send_fifo_rden_0(udp_app_send_fifo_rden_0), + .udp_app_send_fifo_rddata_0(udp_app_send_fifo_rddata_0), + .udp_app_send_fifo_rdcnt_0(udp_app_send_fifo_rdcnt_0), + .udp_app_send_fifo_empty_0(udp_app_send_fifo_empty_0), + + .udp_app_send_fifo_rden_1(udp_app_send_fifo_rden_1), + .udp_app_send_fifo_rddata_1(udp_app_send_fifo_rddata_1), + .udp_app_send_fifo_rdcnt_1(udp_app_send_fifo_rdcnt_1), + .udp_app_send_fifo_empty_1(udp_app_send_fifo_empty_1) ); diff --git a/readme/变成两个udp,一个负责收一个负责发.assets/a83dc5096e9434783ed57f826a2f50e2.png b/readme/变成两个udp,一个负责收一个负责发.assets/a83dc5096e9434783ed57f826a2f50e2.png new file mode 100644 index 0000000000000000000000000000000000000000..0c13a4bd0c231d96db377323c57ec0e0eaa4b218 GIT binary patch literal 10973 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 CTqWHA literal 0 HcmV?d00001 diff --git a/readme/变成两个udp,一个负责收一个负责发.assets/局部截取_20260109_211301.png b/readme/变成两个udp,一个负责收一个负责发.assets/局部截取_20260109_211301.png new file mode 100644 index 0000000000000000000000000000000000000000..9795027f235fe46b74b1b3bc9aae5c9dc976d5f8 GIT binary patch literal 9212 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 G_x}KwWn@?Y literal 0 HcmV?d00001 diff --git a/readme/变成两个udp,一个负责收一个负责发.assets/局部截取_20260109_211614.png b/readme/变成两个udp,一个负责收一个负责发.assets/局部截取_20260109_211614.png new file mode 100644 index 0000000000000000000000000000000000000000..d9f5e1bf05fd0227bb27a117bb0a4ec8f1ac9338 GIT binary patch literal 15929 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 literal 0 HcmV?d00001 diff --git a/readme/变成两个udp,一个负责收一个负责发.assets/局部截取_20260109_212429.png b/readme/变成两个udp,一个负责收一个负责发.assets/局部截取_20260109_212429.png new file mode 100644 index 0000000000000000000000000000000000000000..09e293020347b61a1a56ef7113bc006a13a12989 GIT binary patch literal 7127 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 E05seAw*UYD literal 0 HcmV?d00001 diff --git a/readme/变成两个udp,一个负责收一个负责发.assets/局部截取_20260109_214254.png b/readme/变成两个udp,一个负责收一个负责发.assets/局部截取_20260109_214254.png new file mode 100644 index 0000000000000000000000000000000000000000..97790537a5ab2e7bf9f324e086ad94d5675e9d52 GIT binary patch literal 13237 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 I`SQ*G0j*lW5&!@I literal 0 HcmV?d00001 diff --git a/readme/变成两个udp,一个负责收一个负责发.md b/readme/变成两个udp,一个负责收一个负责发.md new file mode 100644 index 0000000..16c6d19 --- /dev/null +++ b/readme/变成两个udp,一个负责收一个负责发.md @@ -0,0 +1,81 @@ +# 功能分析 + +## 原先 + +UDP_data_process.v主要负责接收UDP传过来的信息,然后执行对应操作。比如说接收到一个TOE写的网络包,然后会进行解析与执行。接收到开启秒脉冲的包,就会控制pluse_second。 + +转发功能全打包到status_to_udp.v中,实现功能解耦,代码也更好看。从TOE和另外3个信息模块拿到数据,打包成UDP帧结构,然后发送出去。 + +## 现在 + +![a83dc5096e9434783ed57f826a2f50e2](./变成两个udp,一个负责收一个负责发.assets/a83dc5096e9434783ed57f826a2f50e2.png) + +本来是一个udp接口收发数据,现在实际是两个。udp1只负责发送状态数据,**不需要接收**,udp0负责配置数据和指令等,**需要接收TOE命令**。所以在你的模块顶层会有两组这个udp数据接口。 + +# 改动 + +## status to udp + +仲裁存储状态机不用改。TOE valid的来进的是TOE_rec_fifo 。而状态信息进的是info_cache_fifo。 + +发送状态机需要改。关键是fifo_wr_en fifo_wr_data得改。 + +改了fifo发现,端口添加很容易,关键是添加了fifo_wr_en_TOE,fifo_wr_data_TOE! + +## UDP_data_process + +除了端口改了。 + +由于该模块主要是执行功能,所以主要改接口就ok了 + +![局部截取_20260109_212429](./变成两个udp,一个负责收一个负责发.assets/局部截取_20260109_212429.png) + + + +# 仿真 + +## Status to udp 转发模块验证 + +### 保证状态信息info转发正确 + +//秒脉冲开启//////////////////////////////////// + + send_fifo_data(64'h4d44000410000001); + + send_fifo_data_32(31'h34D1ED6F); + + \#100000; + + send_fifo_data(64'h4d44000410000000); + + send_fifo_data_32(31'h3010F0D8); + +////////////////////////////////////////////// + +之后验证fifo_wr_en fifo_wr_data[31:0]是否正确 + +![局部截取_20260109_211614](./变成两个udp,一个负责收一个负责发.assets/局部截取_20260109_211614.png) + + + +### 保证状态TOE转发正确 + + + + \#1000; + + send_toe_data(66'h10102030405060708,66'h2b1b2b3b4b5b6b7b8,66'h3c1c2c3c4c5c6c7c8,66'h0a1a2a3a4a5a6a7a8,4); + + \#5000; + +之后验证fifo_wr_en_TOE fifo_wr_data_TOE[31:0]是否正确 + +![局部截取_20260109_211301](./变成两个udp,一个负责收一个负责发.assets/局部截取_20260109_211301.png) + +成功! + +## udp_data_process + +![局部截取_20260109_214254](./变成两个udp,一个负责收一个负责发.assets/局部截取_20260109_214254.png) + +成功! \ No newline at end of file diff --git a/status_to_udp.v b/status_to_udp.v index 34e2abc..32968d5 100644 --- a/status_to_udp.v +++ b/status_to_udp.v @@ -22,12 +22,18 @@ module status_to_udp ( input DAQ_Status_Info_valid, input DAQ_Status_Info_last, input [31:0] DAQ_Status_Info_data, + + // UDP0发送FIFO接口(负责TOE) + input udp_app_send_fifo_rden_0, + output [7:0] udp_app_send_fifo_rddata_0, + output [11:0] udp_app_send_fifo_rdcnt_0, + output udp_app_send_fifo_empty_0, - // UDP发送FIFO接口 - input udp_app_send_fifo_rden, - output [7:0] udp_app_send_fifo_rddata, - output [11:0] udp_app_send_fifo_rdcnt, - output udp_app_send_fifo_empty + // UDP1发送FIFO接口(负责3块板子) + input udp_app_send_fifo_rden_1, + output [7:0] udp_app_send_fifo_rddata_1, + output [11:0] udp_app_send_fifo_rdcnt_1, + output udp_app_send_fifo_empty_1 ); // =========================== 参数定义 =========================== @@ -42,15 +48,16 @@ localparam RECV_XYZ = 4'd6; localparam WAIT_DAQ_VALID = 4'd7; // 新增:等待DAQ valid localparam RECV_DAQ = 4'd8; -reg [2:0] S_state; -localparam SEND_IDLE = 3'd0; -localparam SEND_TOE_HEAD_LENGTH = 3'd1; -localparam SEND_TOE_DATA_1 = 3'd2; -localparam SEND_TOE_DATA_LENGTH = 3'd3; -localparam SEND_TOE_DATA_2 = 3'd4; -localparam SEND_CRC = 3'd5; -localparam SEND_INFO_HEAD_LENGTH = 3'd6; -localparam SEND_INFO_DATA = 3'd7; +reg [3:0] S_state; +localparam SEND_IDLE = 4'd0; +localparam SEND_TOE_HEAD_LENGTH = 4'd1; +localparam SEND_TOE_DATA_1 = 4'd2; +localparam SEND_TOE_DATA_LENGTH = 4'd3; +localparam SEND_TOE_DATA_2 = 4'd4; +localparam SEND_CRC_TOE = 4'd5; +localparam SEND_INFO_HEAD_LENGTH = 4'd6; +localparam SEND_INFO_DATA = 4'd7; +localparam SEND_CRC_INFO = 4'd8; // =========================== 寄存器定义 =========================== reg [31:0] data_buffer; @@ -58,9 +65,11 @@ reg [1:0] byte_counter; reg buffer_valid; // FIFO相关信号 -reg fifo_wr_en; +reg fifo_wr_en; //udp1 reg [31:0] fifo_wr_data; -wire fifo_full; +reg fifo_wr_en_TOE; //udp0 +reg [31:0] fifo_wr_data_TOE; + wire TOE_rec_fifo_empty; reg TOE_rec_fifo_rden; wire [65:0] TOE_rec_fifo_dout; @@ -89,20 +98,37 @@ wire [31:0] info_cache_fifo_dout; wire info_cache_fifo_full; wire info_cache_fifo_empty; -// =========================== FIFO实例化 =========================== +// =========================== FIFO =========================== -//512 depth 32to8 -fifo_generator_32to8 fifo_32to8 ( +//512 depth 32to8 --responsible for UDP0(TOE) +fifo_generator_32to8 fifo_32to8_TOE ( + .clk(clk), // input wire clk + .rst(reset), // input wire rst + .wr_en(fifo_wr_en_TOE), // input wire wr_en + .din(fifo_wr_data_TOE), // input wire [31 : 0] din + .full(), // output wire full + + .rd_en(udp_app_send_fifo_rden_0), // input wire rd_en + .dout(udp_app_send_fifo_rddata_0), // output wire [7 : 0] dout + .empty(udp_app_send_fifo_empty_0), // output wire empty + .rd_data_count(udp_app_send_fifo_rdcnt_0), // output wire [11 : 0] rd_data_count + + .wr_rst_busy(), // output wire wr_rst_busy + .rd_rst_busy() // output wire rd_rst_busy +); + +//512 depth 32to8 --responsible for UDP1(state_info) +fifo_generator_32to8 fifo_32to8_INFO ( .clk(clk), // input wire clk .rst(reset), // input wire rst .wr_en(fifo_wr_en), // input wire wr_en .din(fifo_wr_data), // input wire [31 : 0] din - .full(fifo_full), // output wire full + .full(), // output wire full - .rd_en(udp_app_send_fifo_rden), // input wire rd_en - .dout(udp_app_send_fifo_rddata), // output wire [7 : 0] dout - .empty(udp_app_send_fifo_empty), // output wire empty - .rd_data_count(udp_app_send_fifo_rdcnt), // output wire [11 : 0] rd_data_count + .rd_en(udp_app_send_fifo_rden_1), // input wire rd_en + .dout(udp_app_send_fifo_rddata_1), // output wire [7 : 0] dout + .empty(udp_app_send_fifo_empty_1), // output wire empty + .rd_data_count(udp_app_send_fifo_rdcnt_1), // output wire [11 : 0] rd_data_count .wr_rst_busy(), // output wire wr_rst_busy .rd_rst_busy() // output wire rd_rst_busy @@ -364,6 +390,8 @@ always @(posedge clk or posedge reset) begin S_state <= SEND_IDLE; fifo_wr_en <= 1'b0; fifo_wr_data <= 32'b0; + fifo_wr_en_TOE <= 1'b0;//udp0 + fifo_wr_data_TOE <= 32'b0; crc32_calc <= 32'hFFFFFFFF; info_cache_fifo_rden <= 1'b0; TOE_payload <= 64'b0; @@ -374,6 +402,8 @@ always @(posedge clk or posedge reset) begin SEND_IDLE: begin //0 fifo_wr_en <= 1'b0; fifo_wr_data <= 32'b0; + fifo_wr_en_TOE <= 1'b0;//udp0 + fifo_wr_data_TOE <= 32'b0; crc32_calc <= 32'hFFFFFFFF; send_finish <= 1'b0; Info_data_bytes_num_reg <= 1'b0; @@ -390,35 +420,35 @@ always @(posedge clk or posedge reset) begin end SEND_TOE_HEAD_LENGTH: begin //1 - fifo_wr_en <= 1'b1; - fifo_wr_data <= 32'h4547000c; + fifo_wr_en_TOE <= 1'b1; + fifo_wr_data_TOE <= 32'h4547000c; S_state <= SEND_TOE_DATA_1; end SEND_TOE_DATA_1: begin //2 - fifo_wr_en <= 1'b1; - fifo_wr_data <= TOE_payload[63:32]; + fifo_wr_en_TOE <= 1'b1; + fifo_wr_data_TOE <= TOE_payload[63:32]; crc32_calc <= calc_crc32(TOE_payload[63:32], crc32_calc); S_state <= SEND_TOE_DATA_LENGTH; end SEND_TOE_DATA_LENGTH: begin //3 - fifo_wr_en <= 1'b1; - fifo_wr_data <= 32'd4; // 固定四字节长度 + fifo_wr_en_TOE <= 1'b1; + fifo_wr_data_TOE <= 32'd4; // 固定四字节长度 crc32_calc <= calc_crc32(32'd4, crc32_calc); S_state <= SEND_TOE_DATA_2; end SEND_TOE_DATA_2: begin //4 - fifo_wr_en <= 1'b1; - fifo_wr_data <= TOE_payload[31:0]; + fifo_wr_en_TOE <= 1'b1; + fifo_wr_data_TOE <= TOE_payload[31:0]; crc32_calc <= calc_crc32(TOE_payload[31:0], crc32_calc); - S_state <= SEND_CRC; + S_state <= SEND_CRC_TOE; end - SEND_CRC: begin //5 - fifo_wr_en <= 1'b1; - fifo_wr_data <= crc32_calc; + SEND_CRC_TOE: begin //5 + fifo_wr_en_TOE <= 1'b1; + fifo_wr_data_TOE <= crc32_calc; S_state <= SEND_IDLE; send_finish <= 1'b1; info_cache_fifo_rden <= 1'b0; @@ -439,11 +469,20 @@ always @(posedge clk or posedge reset) begin if(info_cache_fifo_empty) begin info_cache_fifo_rden <= 1'b0; - S_state <= SEND_CRC; + S_state <= SEND_CRC_INFO; end else begin info_cache_fifo_rden <= 1'b1; end end + + SEND_CRC_INFO: begin //8 + fifo_wr_en <= 1'b1; + fifo_wr_data <= crc32_calc; + S_state <= SEND_IDLE; + send_finish <= 1'b1; + info_cache_fifo_rden <= 1'b0; + end + default: S_state <= SEND_IDLE; endcase