作者:chenzhufly QQ:36886052
本文主要涉及lightweight HPS-to-FPGA bridge的应用,SoC中ARM通过lightweightHPS-to-FPGA bridge控制FPGA侧的3个LED。
1、 硬件环境
硬件平台:Embest SoC --LarkBoard
软件平台:开发板-linux-3.10.31
Quartus 14.0
2、 系统设计框图
ARM通过lightweight HPS-to-FPGA bridge控制FPGA侧的3个LED,其中Lark Board中FPGA侧的LED硬件连接如下:
3、 SoC中硬件系统设计
硬件连接关系如下图所示:
其中PIO_LED的地址分配我0x0 - 0xf
硬件系统例化文件如下:
- .pio_led_external_connection_export (o_fpga_led[2:0]),
设计完毕后开始生成硬件系统信息,并在Quartus中编译生成sof文件,接着转换成rbf文件,用来替换TF卡中的rbf文件
具体代码可以详见附件中的工程文件,在此不在赘述
4、ARM侧代码设计
注意: lightweight HPS-to-FPGA bridge在ARM中的地址映射为0xff200000,通过上面的设计可以看出LED的偏移地址为0,通过这个地址的操作就可以控制FPGA侧的LED.
详细代码如下 blinker.c:
- #include <sys/mman.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <stdint.h>
-
- #define PAGE_SIZE 4096
- #define LWHPS2FPGA_BRIDGE_BASE 0xff200000
- #define BLINK_OFFSET 0x0
-
- volatile unsigned char *blink_mem;
- void *bridge_map;
-
- int main(int argc, char *argv[])
- {
- int fd, ret = EXIT_FAILURE;
- unsigned char value;
- off_t blink_base = LWHPS2FPGA_BRIDGE_BASE;
-
- if (argc < 2) {
- fprintf(stderr, "Usage: %s number\n", argv[0]);
- exit(EXIT_FAILURE);
- }
-
- /* check the bounds of the value being set */
- value = atoi(argv[1]);
- if (value < 0 || value > 7) {
- fprintf(stderr, "Invalid delay setting."
- "Delay must be between 1 and 15, inclusive.\n");
- exit(EXIT_FAILURE);
- }
-
- /* open the memory device file */
- fd = open("/dev/mem", O_RDWR|O_SYNC);
- if (fd < 0) {
- perror("open");
- exit(EXIT_FAILURE);
- }
-
- /* map the LWHPS2FPGA bridge into process memory */
- bridge_map = mmap(NULL, PAGE_SIZE, PROT_WRITE, MAP_SHARED,
- fd, blink_base);
- if (bridge_map == MAP_FAILED) {
- perror("mmap");
- goto cleanup;
- }
-
- /* get the delay_ctrl peripheral's base address */
- blink_mem = (unsigned char *) (bridge_map + BLINK_OFFSET);
-
- /* write the value */
- *blink_mem = value;
-
- if (munmap(bridge_map, PAGE_SIZE) < 0) {
- perror("munmap");
- goto cleanup;
- }
-
- ret = 0;
-
- cleanup:
- close(fd);
- return ret;
- }
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 编辑