软件版本:VIVADO2017.4 操作系统:Ubuntu16.4 64bit 硬件平台:XILINX FPGA MK7160FA 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! 3.1概述 如果读者对于CH02和CH03还有一些疑惑,那么本节课的内容,可以让你更加简单地弄明白什么是BAR地址空间操作,什么是对开发板DMA 内存地址空间操作。如果你掌握了如何通过XDMA读写BAR地址空间和DMA 内存地址空间操作,那么基于XMDA的所有原理性设计都会变的so easy! 3.2 FPGA 代码 FPGA可以用任何一个章节的,这里继续CH01的代码,并且增加了在线逻辑分析仪IP方便观察FPGA的内部信号。具体就不重复了,不清楚的可以看CH01部分教程内容。 3.3 QT程序设计如果你足够细心,你会发现在CH01里面的BRAM 和DDR我们在前面的课程中没有用到。那么这节课就可以用起来了。测试的原理是分别往BAR地址空间和DDR地址空间写入测试数据,然后读出看看写入的和读出的十分一致。同理,。程序比较简单,读者可以自己阅读QT源码。 void MainWindow::on_TestDDR_clicked() { unsigned char buf1[4096]; unsigned char buf2[4096]; unsigned int i=0; unsigned int error_cnt =0;
for(i=0;i<4096;i++) { buf1[i]=i; }
put_data_to_fpga_ddr(FPGA_AXI_START_ADDR,buf1,4096);
get_data_from_fpga_ddr(FPGA_AXI_START_ADDR,buf2,4096);
for(i=0;i<4096;i++) { if(buf1[i]!=buf2[i]) error_cnt++; } if(error_cnt) { m_ddrpass++; QString str = QString("%1 %2").arg("AXI bad data = ").arg(error_cnt); ui->labelDDRPASS->setText(str); } else { m_ddrpass++; QString str = QString("%1 %2").arg("AXI PASS Times = ").arg(m_ddrpass); ui->labelDDRPASS->setText(str); }
}
void MainWindow::on_TestBAR_clicked() { uint32_t val; unsigned int m_bar_failed=0; unsigned int m_bar_pass=0; unsigned int i=0;
for(i=0;i<1024;i=i+4) { write_control(i,i); val = read_control(i); if(val!=i) { m_bar_failed++; } else { m_bar_pass++; } } QString str = QString("%1 %2").arg("BAR good data = ").arg(m_bar_pass); ui->labelBARPASS->setText(str); } |
3.4 测试结果我们可以采用断点调试方法,直观的观察每次的读写情况 |