TA的每日心情 | 开心 2021-12-29 14:09 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
|
PL端:基于上期的工程,通过观察PL端捕捉信号看出个axis_data_fifo的逻辑信号的时序关系。将其进行梳理,
并建立一个fifo对DMA的双向数据进行缓冲,为后期逻辑设计建立基础。并引出PS端的AXI_EMIO对fifo进行控制。具体代码如下:
- `timescale 1ns / 1ps
- module top
- (Clk100,
- Clk50,
- Rst_N,
- DP_AUX_IN,
- DP_AUX_OE,
- DP_AUX_OUT,
- DP_HPD );
- output Rst_N;
- output Clk100;
- output Clk50;
- input DP_AUX_IN;
- output DP_AUX_OE;
- output DP_AUX_OUT;
- input DP_HPD;
-
-
- wire Clk100;
- wire Clk50;
- wire DP_AUX_IN;
- wire DP_AUX_OE;
- wire DP_AUX_OUT;
- wire DP_HPD;
- wire [31:0]M_AXIS_MM2S_0_tdata;
- wire [3:0]M_AXIS_MM2S_0_tkeep;
- wire M_AXIS_MM2S_0_tlast;
- wire M_AXIS_MM2S_0_tvalid;
- wire Rst_N;
- wire [31:0]S_AXIS_S2MM_0_tdata;
- reg S_AXIS_S2MM_0_tlast;
- reg S_AXIS_S2MM_0_tvalid;
- wire [31:0] dout;
- wire [9:0] rd_data_count;
- wire [9:0] wr_data_count;
- wire rd_en;
- reg [1:0] rd_en_f;
- reg [1:0] empty_f;
- wire [0:0]gpio_rtl_0_tri_o;
- reg fifo_rd_en;
- Mercury_XU5 Mercury_XU5_i
- (.Clk100(Clk100),
- .Clk50(Clk50),
- .DP_AUX_IN(DP_AUX_IN),
- .DP_AUX_OE(DP_AUX_OE),
- .DP_AUX_OUT(DP_AUX_OUT),
- .DP_HPD(DP_HPD),
- .gpio_rtl_0_tri_o(gpio_rtl_0_tri_o),
- .M_AXIS_MM2S_0_tdata(M_AXIS_MM2S_0_tdata),
- .M_AXIS_MM2S_0_tkeep(M_AXIS_MM2S_0_tkeep),
- .M_AXIS_MM2S_0_tlast(M_AXIS_MM2S_0_tlast),
- .M_AXIS_MM2S_0_tready(1),
- .M_AXIS_MM2S_0_tvalid(M_AXIS_MM2S_0_tvalid),
- .Rst_N(Rst_N),
- .S_AXIS_0_tdata(dout),
- .S_AXIS_0_tkeep(4'b1111),
- .S_AXIS_0_tlast(S_AXIS_S2MM_0_tlast),
- .S_AXIS_0_tready(),
- .S_AXIS_0_tvalid(S_AXIS_S2MM_0_tvalid)
- );
- fifo_generator_0 fifo_u0 (
- .wr_clk(Clk100), // input wire wr_clk
- .rd_clk(Clk100), // input wire rd_clk
- .din(M_AXIS_MM2S_0_tdata), // input wire [31 : 0] din
- .wr_en(M_AXIS_MM2S_0_tvalid), // input wire wr_en
- .rd_en(fifo_rd_en), // input wire rd_en
- .dout(dout), // output wire [31 : 0] dout
- .full(), // output wire full
- .empty(empty), // output wire empty
- .rd_data_count(rd_data_count), // output wire [9 : 0] rd_data_count
- .wr_data_count(wr_data_count) // output wire [9 : 0] wr_data_count
- );
- always @(posedge Clk100 or negedge Rst_N ) begin
- if(!Rst_N) begin
- rd_en_f <= 2'b11;
- end else begin
- rd_en_f[0] <= gpio_rtl_0_tri_o;
- fifo_rd_en <= gpio_rtl_0_tri_o;
- rd_en_f[1] <= rd_en_f[0];
- end
- end
- always @(posedge Clk100 or negedge Rst_N ) begin
- if(!Rst_N) begin
- empty_f <= 2'b11;
- end else begin
- empty_f[0] <= empty;
- empty_f[1] <= empty_f[0];
- end
- end
- always @(posedge Clk100 or negedge Rst_N ) begin
- if(!Rst_N) begin
- S_AXIS_S2MM_0_tlast <= 1'b0;
- end else begin
- if(empty_f == 2'b01 ) begin
- S_AXIS_S2MM_0_tlast <= 1'b1;
- end else begin
- S_AXIS_S2MM_0_tlast <= 1'b0;
- end
- end
- end
- always @(posedge Clk100 or negedge Rst_N ) begin
- if(!Rst_N) begin
- S_AXIS_S2MM_0_tvalid <= 1'b0;
- end else begin
- if(rd_en_f == 2'b01 ) begin
- S_AXIS_S2MM_0_tvalid <= 1'b1;
- end
- if(empty_f == 2'b01 ) begin
- S_AXIS_S2MM_0_tvalid <= 1'b0;
- end
- end
- end
- ila_0 ILA_U0 (
- .clk(Clk100), // input wire clk
- .probe0(rd_data_count), // input wire [9:0] probe0
- .probe1(wr_data_count), // input wire [9:0] probe1
- .probe2(dout), // input wire [31:0] probe2
- .probe3(M_AXIS_MM2S_0_tdata), // input wire [31:0] probe3
- .probe4(M_AXIS_MM2S_0_tvalid), // input wire [0:0] probe4
- .probe5(gpio_rtl_0_tri_o), // input wire [0:0] probe5
- .probe6(rd_en_f), // input wire [0:0] probe6
- .probe7(S_AXIS_S2MM_0_tvalid), // input wire [0:0] probe7
- .probe8(fifo_rd_en), // input wire [0:0] probe8
- .probe9(S_AXIS_S2MM_0_tlast) // input wire [0:0] probe9
- );
复制代码
PL部分逻辑框图:
PS端部分逻辑代码:
memset((UINTPTR) TxBufferPtr, Value, MAX_PKT_LEN); //生成发数据 XAxiDma_send(&AxiDma,(UINTPTR) TxBufferPtr,MAX_PKT_LEN); //向DMA数据交互缓冲区内写入MAX_PKT_LEN长度的数据。
//此逻辑执行完后数据已经从DMA刷新至PL端建立的fifo中,PL端 //的逻辑可以对数据行进具体操作。
XGpio_DiscreteWrite(&Gpio, fifo_en, 1); //通过AXI_EMIO对PL端fifo进行控制,将数据读出至axis_data_fifo,将数据交付至A**线,由A**线进行处理
XAxiDma_receive (&AxiDma,(UINTPTR) RxBufferPtr,MAX_PKT_LEN); //将数据传输至DMA控制器,并刷新到PS端的内存之中,便于PS对数据进行处理。
最终测试结果如下:
PL 端数据FIFO的读写端信号:
PL端axis_data_fifo数据流:
PS端接收发送端memory:
至此已完成PS_PL 的数据交互,并长期运行稳定。XSA文件与PS端代码可下载附。
src.zip
(1.17 MB, 下载次数: 1, 售价: 1 与非币)
|
|