当前位置:   article > 正文

zynq PL部分无需打包,与PS AXI通信(linux系统)_ps axi转网络通信

ps axi转网络通信

项目需求,FPGA的程序部署到ZYNQ上。查了一下发现网上几乎所有的教程都是打包成IP核,这对于我这个多层文件多个IP核很难实现。整体打包始终报错,加上觉得后面修改程序啥的太麻烦,而且PS和PL数据传输比较少,没有时效性要求。就尝试将PL和PS独立出来,方便修改。我觉得这应该是个挺常见的需求不知道为什么搜不到,可能关键字没找对。

再次强调,ZYNQ是个有PL外设的ARM。这就很好办了。首先block design反应了各个模块和ARM 核的关系,生成的wrapper也就是最终的外设部署。那么只要在顶层文件中直接添加PL模块,实现了PS和PL 的并列排布。PS和PL的数据通过AXI总线访问,预留端口,在顶层模块中直接wire 相连即可

程序涉密,所以用个简单的PL程序代替。

PL程序如图。除了心跳灯,就是assign将ps输入的数据回传给ps。

将一个AXI lite的总线打包为IP核

顶层添加输入输出

低层添加

AXI总线改写,用过的都懂

将AXI的IP核添加到block design,并引出输入输出

接下来就生成底层文件,并将PL模块添加到其中

  1. `timescale 1 ps / 1 ps
  2. module ps_system_wrapper
  3. (DDR_addr,
  4. DDR_ba,
  5. DDR_cas_n,
  6. DDR_ck_n,
  7. DDR_ck_p,
  8. DDR_cke,
  9. DDR_cs_n,
  10. DDR_dm,
  11. DDR_dq,
  12. DDR_dqs_n,
  13. DDR_dqs_p,
  14. DDR_odt,
  15. DDR_ras_n,
  16. DDR_reset_n,
  17. DDR_we_n,
  18. FIXED_IO_ddr_vrn,
  19. FIXED_IO_ddr_vrp,
  20. FIXED_IO_mio,
  21. FIXED_IO_ps_clk,
  22. FIXED_IO_ps_porb,
  23. FIXED_IO_ps_srstb,
  24. led,
  25. clk,
  26. rst_n
  27. );
  28. inout [14:0]DDR_addr;
  29. inout [2:0]DDR_ba;
  30. inout DDR_cas_n;
  31. inout DDR_ck_n;
  32. inout DDR_ck_p;
  33. inout DDR_cke;
  34. inout DDR_cs_n;
  35. inout [3:0]DDR_dm;
  36. inout [31:0]DDR_dq;
  37. inout [3:0]DDR_dqs_n;
  38. inout [3:0]DDR_dqs_p;
  39. inout DDR_odt;
  40. inout DDR_ras_n;
  41. inout DDR_reset_n;
  42. inout DDR_we_n;
  43. inout FIXED_IO_ddr_vrn;
  44. inout FIXED_IO_ddr_vrp;
  45. inout [53:0]FIXED_IO_mio;
  46. inout FIXED_IO_ps_clk;
  47. inout FIXED_IO_ps_porb;
  48. inout FIXED_IO_ps_srstb;
  49. output[3:0] led;
  50. input clk;
  51. input rst_n;
  52. wire [14:0]DDR_addr;
  53. wire [2:0]DDR_ba;
  54. wire DDR_cas_n;
  55. wire DDR_ck_n;
  56. wire DDR_ck_p;
  57. wire DDR_cke;
  58. wire DDR_cs_n;
  59. wire [3:0]DDR_dm;
  60. wire [31:0]DDR_dq;
  61. wire [3:0]DDR_dqs_n;
  62. wire [3:0]DDR_dqs_p;
  63. wire DDR_odt;
  64. wire DDR_ras_n;
  65. wire DDR_reset_n;
  66. wire DDR_we_n;
  67. wire FIXED_IO_ddr_vrn;
  68. wire FIXED_IO_ddr_vrp;
  69. wire [53:0]FIXED_IO_mio;
  70. wire FIXED_IO_ps_clk;
  71. wire FIXED_IO_ps_porb;
  72. wire FIXED_IO_ps_srstb;
  73. wire [31:0]pl_to_ps_0;
  74. wire [31:0]ps_to_pl_0;
  75. ps_system ps_system_i
  76. (.DDR_addr(DDR_addr),
  77. .DDR_ba(DDR_ba),
  78. .DDR_cas_n(DDR_cas_n),
  79. .DDR_ck_n(DDR_ck_n),
  80. .DDR_ck_p(DDR_ck_p),
  81. .DDR_cke(DDR_cke),
  82. .DDR_cs_n(DDR_cs_n),
  83. .DDR_dm(DDR_dm),
  84. .DDR_dq(DDR_dq),
  85. .DDR_dqs_n(DDR_dqs_n),
  86. .DDR_dqs_p(DDR_dqs_p),
  87. .DDR_odt(DDR_odt),
  88. .DDR_ras_n(DDR_ras_n),
  89. .DDR_reset_n(DDR_reset_n),
  90. .DDR_we_n(DDR_we_n),
  91. .FIXED_IO_ddr_vrn(FIXED_IO_ddr_vrn),
  92. .FIXED_IO_ddr_vrp(FIXED_IO_ddr_vrp),
  93. .FIXED_IO_mio(FIXED_IO_mio),
  94. .FIXED_IO_ps_clk(FIXED_IO_ps_clk),
  95. .FIXED_IO_ps_porb(FIXED_IO_ps_porb),
  96. .FIXED_IO_ps_srstb(FIXED_IO_ps_srstb),
  97. .pl_to_ps_0(pl_to_ps_0),
  98. .ps_to_pl_0(ps_to_pl_0));
  99. wire [3:0] led;
  100. wire clk;
  101. wire rst_n;
  102. led_stream pl_system
  103. (
  104. .led(led),
  105. .clk(clk),
  106. .rst_n(rst_n),
  107. .cnt_output_pl2ps(pl_to_ps_0),

最终的效果如图所示

可以看到实现了PS和PL 的并列

裸机 SDK程序如图,写入、加一、读出、串口打印

串口打印,可以看到满足了需求

linux系统代码测试如图:

  1. 22 #define ZYNQ_AXI_REG_BASE 0x43C00000
  2. 23 #define WRITE_AXI_REG_BASE 0
  3. 24 #define READ_AXI_REG_BASE 4
  4. 25
  5. 26
  6. 27 /* 映射后的寄存器虚拟地址指针 */
  7. 28 static void __iomem *write_addr;
  8. 29 static void __iomem *read_addr;
  9. 30
  10. 31 static int AXI_wr_rd_init(void)
  11. 32 {
  12. 33 u32 val = 100;
  13. 34 //int ret;
  14. 35
  15. 36 /* 寄存器地址映射 */
  16. 37 write_addr = ioremap(ZYNQ_AXI_REG_BASE + WRITE_AXI_REG_BASE, 4);
  17. 38 read_addr = ioremap(ZYNQ_AXI_REG_BASE + READ_AXI_REG_BASE, 4);
  18. 39
  19. 40 printk("testing……");
  20. 41
  21. 42 writel(val, write_addr);
  22. 43 msleep(1000);
  23. 44 val = readl(read_addr);
  24. 45
  25. 46 printk("%d",val);
  26. 47
  27. 48 /* 取消寄存器地址映射 */
  28. 49 iounmap(write_addr);
  29. 50 iounmap(read_addr);
  30. 51
  31. 52 return 0;
  32. 53 }

通过ioremap找到linux中的虚拟地址之后写入,读出

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/856896
推荐阅读
相关标签
  

闽ICP备14008679号