[系统相关] 【Altera SoC体验之旅】LWHPS2FPGA深入浅出(1)-点亮LED

chenzhufly   2015-2-21 01:24 楼主

作者:chenzhufly QQ:36886052

本文主要涉及lightweight HPS-to-FPGA bridge的应用,SoCARM通过lightweightHPS-to-FPGA bridge控制FPGA侧的3LED
1、 硬件环境
硬件平台:Embest SoC --LarkBoard
软件平台:开发板-linux-3.10.31
Quartus 14.0
2、 系统设计框图
3.png
ARM通过lightweight HPS-to-FPGA bridge控制FPGA侧的3个LED,其中Lark Board中FPGA侧的LED硬件连接如下:
5.png 6.png
3、 SoC中硬件系统设计 硬件连接关系如下图所示:
1.png
其中PIO_LED的地址分配我0x0 - 0xf
2.png
硬件系统例化文件如下:
  1. .pio_led_external_connection_export (o_fpga_led[2:0]),
设计完毕后开始生成硬件系统信息,并在Quartus中编译生成sof文件,接着转换成rbf文件,用来替换TF卡中的rbf文件
4.png
具体代码可以详见附件中的工程文件,在此不在赘述 4、ARM侧代码设计 注意: lightweight HPS-to-FPGA bridge在ARM中的地址映射为0xff200000,通过上面的设计可以看出LED的偏移地址为0,通过这个地址的操作就可以控制FPGA侧的LED. 详细代码如下 blinker.c:
  1. #include <sys/mman.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <unistd.h>
  8. #include <stdint.h>
  9. #define PAGE_SIZE 4096
  10. #define LWHPS2FPGA_BRIDGE_BASE 0xff200000
  11. #define BLINK_OFFSET 0x0
  12. volatile unsigned char *blink_mem;
  13. void *bridge_map;
  14. int main(int argc, char *argv[])
  15. {
  16. int fd, ret = EXIT_FAILURE;
  17. unsigned char value;
  18. off_t blink_base = LWHPS2FPGA_BRIDGE_BASE;
  19. if (argc < 2) {
  20. fprintf(stderr, "Usage: %s number\n", argv[0]);
  21. exit(EXIT_FAILURE);
  22. }
  23. /* check the bounds of the value being set */
  24. value = atoi(argv[1]);
  25. if (value < 0 || value > 7) {
  26. fprintf(stderr, "Invalid delay setting."
  27. "Delay must be between 1 and 15, inclusive.\n");
  28. exit(EXIT_FAILURE);
  29. }
  30. /* open the memory device file */
  31. fd = open("/dev/mem", O_RDWR|O_SYNC);
  32. if (fd < 0) {
  33. perror("open");
  34. exit(EXIT_FAILURE);
  35. }
  36. /* map the LWHPS2FPGA bridge into process memory */
  37. bridge_map = mmap(NULL, PAGE_SIZE, PROT_WRITE, MAP_SHARED,
  38. fd, blink_base);
  39. if (bridge_map == MAP_FAILED) {
  40. perror("mmap");
  41. goto cleanup;
  42. }
  43. /* get the delay_ctrl peripheral's base address */
  44. blink_mem = (unsigned char *) (bridge_map + BLINK_OFFSET);
  45. /* write the value */
  46. *blink_mem = value;
  47. if (munmap(bridge_map, PAGE_SIZE) < 0) {
  48. perror("munmap");
  49. goto cleanup;
  50. }
  51. ret = 0;
  52. cleanup:
  53. close(fd);
  54. return ret;
  55. }
5、测试结果 运行./blinker 0 LED全亮 运行./blinker 7 LED全灭 6、小结 1)通过上述过程,可以完成通过lightweight HPS-to-FPGA bridge控制FPGA侧LED的目的 2)这个应用比较简单,易于操作,还需要向更加深入的方向努力 FPGA工程文件:
test.zip (14.84 MB)
(下载次数: 634, 2015-2-21 01:21 上传)
本帖最后由 chenzhufly 于 2015-3-23 20:48 编辑
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙 =================================== 做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰

回复评论 (10)

对FPGA不了解,谢谢楼主的分享。
点赞  2015-2-21 10:46
初学,感谢分享!
点赞  2015-3-31 09:16
感谢楼主分享。。。。
分享铸就美好未来。。。
点赞  2015-3-31 23:51
初学,太感谢分享了。
点赞  2015-4-7 16:25
谢谢了哈
点赞  2015-4-22 16:12
TKS,SHARE
点赞  2015-8-23 15:43
陈版主,刚开始弄SOC,请问下你这是ARM跑裸机点LED的实验吗?
点赞  2015-10-27 15:18
肯定不是啊,交代的很清楚

1、  硬件环境
硬件平台:Embest SoC --LarkBoard
软件平台:开发板-linux-3.10.31
                 Quartus 14.0
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙 =================================== 做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
点赞  2015-10-27 15:51
谢楼主分享
点赞  2015-11-4 14:02
裸跑arm端的LED和这个有什么区别吗??具体流程楼主搞过吗??
点赞  2015-11-9 20:44
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复