[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA_PCIE通信(linux)连载-05QT 上位机读写 FPGA内存

文档创建者:FPGA课程
浏览次数:217
最后更新:2024-09-18
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-FPGA部分 » 2_FPGA实验篇(仅旗舰) » 7-FPGA PCIE通信(Linux)
​ 软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
实验平台:米联客-MLK-H3-CZ08-7100开发板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!



1概述
如果读者对于前面demo还有一些疑惑,那么本节课的内容,可以让你更加简单地弄明白什么是BAR地址空间操作,什么是对开发板DDR内存地址空间操作。如果你掌握了如何通过XDMA读写BAR地址空间和DMA 内存地址空间操作,那么基于XMDA的所有原理性设计都会变的so easy!
2系统框图
本系统中通过XDMA IP将开发板及PCIE上位机识别连接。AXI Interconnect IP通过使用AXI-FULL及AXI-LITE总线将XDMA与内存部分DDR或者Bram连接。通过PCIE上位机发出读写指令控制XDMA对开发板内存进行读写操作。
5fe2152fb3104c37ac1c4d96101d8dea.jpg
3FPGA 代码
FPGA可以用任何一个章节的,这里就用“03基于XDMA实现PCIE通信方案”的代码,简单。具体就不重复了,不清楚的可以看“03基于XDMA实现PCIE通信方案”相关部分教程内容。本方案中的上位机没有使用中断功能。
b5497d1e68dc49a6814f2884b1fbdfe2.jpg
4上位机程序设计
以下代码中on_TestDDR_clicked是上是对AXI4接口的DDR或者BRAM测试。on_TestBAR_clicked是对用户的BAR空间测试。
  1. void MainWindow::on_TestDDR_clicked() {
  2. unsigned int buf1[1024]; unsigned int buf2[1024]; unsigned int i=0;
  3. unsigned int error_cnt =0;

  4. for(i=0;i<1024;i++) {
  5. buf1[i]=i; }

  6. h2c_transfer(0, 1024*4,(unsigned char *)buf1);

  7. c2h_transfer(0, 1024*4,(unsigned char *)buf2);

  8. for(i=0;i<1024;i++) {
  9. if(buf1[i] != buf2[i])
  10. error_cnt++;
  11. }
  12. if(error_cnt) {
  13. QString str   =   QString("%1 %2").arg("DDR bad data = ").arg(error_cnt); ui->labelDDRPASS->setText(str);
  14. }
  15. else
  16. {
  17. m_pass1++;
  18. QString str   =   QString("%1 %2").arg("DDR PASS Times = ").arg(m_pass1); ui->labelDDRPASS->setText(str);
  19. }

  20. }

  21. void MainWindow::on_TestBAR_clicked() {
  22. unsigned int val;  unsigned int i=0;

  23. unsigned int error_cnt =0;

  24. for(i=0;i<1024;i++) {
  25. user_write(0x10000+i*4,4,(unsigned char *)&i); }

  26. for(i=0;i<1024;i++) {
  27. user_read(0x10000+i*4,4,(unsigned char *)&val); if(i!= val)
  28. error  cnt++;
  29. _
  30. }

  31. if(error_cnt) {
  32. QString str   =   QString("%1 %2").arg("DDR bad data = ").arg(error_cnt); ui->labelBARPASS->setText(str);
  33. }
  34. else
  35. {
  36. m_pass2++;
  37. QString str   =   QString("%1 %2").arg("DDR PASS Times = ").arg(m_pass2); ui->labelBARPASS->setText(str);
  38. }


  39. }
复制代码
5硬件安装
注意先下载程序,调试阶段下载bit文件,然后再开电脑。这样才能正确识别和后续测试工作正常开展。
a25b584c055b43e690781ca1d6c94be0.jpg
6实验结果

15d33678eea6492bbc09ebff3ad08745.jpg



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则