wire [31:0]DDR_dq;
81 wire [3:0]DDR_dqs_n;
82 wire [3:0]DDR_dqs_p;
83 wire DDR_odt;
84 wire DDR_ras_n;
85 wire DDR_reset_n;
86 wire DDR_we_n;
87 wire FCLK_CLK0;
88 wire FIXED_IO_ddr_vrn;
89 wire FIXED_IO_ddr_vrp;
90 wire [53:0]FIXED_IO_mio;
91 wire FIXED_IO_ps_clk;
92 wire FIXED_IO_ps_porb;
93 wire FIXED_IO_ps_srstb;
94 wire RES;
95 wire SCLK;
96 wire SDIN;
97 wire VBAT;
98 wire VDD;
99 wire [0:0]m_axis_tvalid;
100 wire [0:0]peripheral_aresetn;
101 wire s_axis_s2mm_tlast;
102
103 reg [8-1:0] cnt;
104 wire add_cnt;
105 wire end_cnt;
106
107 system system_i
108 (.DC(DC),
109 .DDR_addr(DDR_addr),
110 .DDR_ba(DDR_ba),
111 .DDR_cas_n(DDR_cas_n),
112 .DDR_ck_n(DDR_ck_n),
113 .DDR_ck_p(DDR_ck_p),
114 .DDR_cke(DDR_cke),
115 .DDR_cs_n(DDR_cs_n),
116 .DDR_dm(DDR_dm),
117 .DDR_dq(DDR_dq),
118 .DDR_dqs_n(DDR_dqs_n),
119 .DDR_dqs_p(DDR_dqs_p),
120 .DDR_odt(DDR_odt),
121 .DDR_ras_n(DDR_ras_n),
122 .DDR_reset_n(DDR_reset_n),
123 .DDR_we_n(DDR_we_n),
124 .FCLK_CLK0(FCLK_CLK0),
125 .FIXED_IO_ddr_vrn(FIXED_IO_ddr_vrn),
126 .FIXED_IO_ddr_vrp(FIXED_IO_ddr_vrp),
127 .FIXED_IO_mio(FIXED_IO_mio),
128 .FIXED_IO_ps_clk(FIXED_IO_ps_clk),
129 .FIXED_IO_ps_porb(FIXED_IO_ps_porb),
130 .FIXED_IO_ps_srstb(FIXED_IO_ps_srstb),
131 .RES(RES),
132 .SCLK(SCLK),
133 .SDIN(SDIN),
134 .VBAT(VBAT),
135 .VDD(VDD),
136 .m_axis_tvalid(m_axis_tvalid),
137 .peripheral_aresetn(peripheral_aresetn),
138 .s_axis_s2mm_tlast(s_axis_s2mm_tlast));
139
140 always @(posedge FCLK_CLK0)begin
141 if(!peripheral_aresetn)begin
142 cnt <= 0;
143 end
144 else if(add_cnt)begin
145 if(end_cnt)
146 cnt <= 0;
147 else
148 cnt <= cnt + 1;
149 end
150 end
151
152 assign add_cnt = m_axis_tvalid;
153 assign end_cnt = add_cnt && cnt== DATA_NUM-1;
154
155 assign s_axis_s2mm_tlast = end_cnt;
156
157 endmodule
user_wrapper
当自定义IP核输出256个数据时,拉高tlast信号结束传输。打开综合后的设计,添加调试探针,抓取DMA与自定义IP之间的接口信号,set up debug后完成接下来的流程。
六、软硬件联调
在硬件系统中定义数据帧长度为256个,数据位宽为16bit,因此C代码中DMA启动传输函数中数据长度参数为512byte。测试数据生成与检测代码非常简单:
我们直接查看ILA抓取AXI S总线波形:
看到CPU产生数据从1到4重复递增,IP核输出结果从2到8重复递增,输出为输入的2倍。
传输完成后进入DMA发送和接收中断,软件检测结果正确。在Memory窗口能够直接查看内存绝对地址里的数据,选定DDR接收缓存区起始地址,其中的数据与AXI总线传回数据一致,证明系统联调成功。之后任意算法模块均可采用本文方式进行设计和集成,可以说一劳永逸!
|