找回密码
 注册
关于网站域名变更的通知
查看: 291|回复: 1
打印 上一主题 下一主题

转——LWHPS2FPGA深入浅出(1)-点亮LED 

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-19 09:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
转——LWHPS2FPGA深入浅出(1)-点亮LED

- G/ o, Z' N* q& W, x2 X0 n
0 G+ E; b4 t/ ]  N( x- |0 z
! P2 j, O- R8 {3 t

作者:chenzhufly  QQ:36886052

% e, g9 Z3 H4 \  s# ^+ N

   本文主要涉及lightweight HPS-to-FPGA bridge的应用,SoCARM通过lightweightHPS-to-FPGA bridge控制FPGA侧的3LED
1、  硬件环境
硬件平台:Embest SoC --LarkBoard
软件平台:开发板-linux-3.10.31
                 Quartus 14.0

' Y+ }; |3 k, D/ Y9 z
2、  系统设计框图

. `" Q9 R$ W2 u6 Z9 q/ C4 K1 H# W5 G

5 A. D: |+ {, v$ ^- e, [+ o: ^# R9 j& K" Q) @; Z/ J9 T: h

. V$ {: L1 S, D8 I, m: p9 h
ARM通过lightweight HPS-to-FPGA bridge控制FPGA侧的3个LED,其中Lark Board中FPGA侧的LED硬件连接如下:
$ v% ]( p, a+ H+ _; \! B8 u
# A; C( R) n  {+ H" E
3、  SoC中硬件系统设计% N- f9 j% @- Y0 X: _
硬件连接关系如下图所示:

6 v$ J- i/ a* @" l" O) K- H& P# o
0 j4 M7 s/ r! J0 h+ e  j4 R. N' C& r& f1 A! r
1 i* c9 I- Y5 E/ u5 T& U

4 z' N. K  g8 X1 p4 c; k9 E% k
其中PIO_LED的地址分配我0x0 - 0xf

( [- ^7 l' p) h3 c# M
! G/ M( M. a' M% t) T9 u6 L

2 }2 g/ x, r- u硬件系统例化文件如下:, _! v  P' n4 e' W4 ^
  • .pio_led_external_connection_export                     (o_fpga_led[2:0]),; B0 Y$ r1 u9 a" L
. \. Y$ n  A; f" y
[color=rgb(51, 102, 153) !important]复制代码
& d* c" ^& u5 a: o% W

% t( K7 R1 q1 W. [. }# H" v) j0 C: t" H! k% s4 i  `8 }

- Q. ]2 F. u  p0 p设计完毕后开始生成硬件系统信息,并在Quartus中编译生成sof文件,接着转换成rbf文件,用来替换TF卡中的rbf文件
3 W% E: O) j* B2 n- r& }0 E
3 p3 X8 a0 o2 s- S0 e
具体代码可以详见附件中的工程文件,在此不在赘述
) J) k) I! D1 K0 d7 X
1 ?  L0 [/ U* Z+ c- f8 [4、ARM侧代码设计
( k: v. I9 e$ K) ~+ l2 r% W2 X0 `     注意: lightweight HPS-to-FPGA bridge在ARM中的地址映射为0xff200000,通过上面的设计可以看出LED的偏移地址为0,通过这个地址的操作就可以控制FPGA侧的LED.+ Q* |; P, W# r: K7 u' g
# I6 g2 E+ j( l0 q$ ^: ~: N
详细代码如下 blinker.c:3 F! d5 ^0 W5 C# Z
  • #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;
  • }
    9 v# t4 j, p6 k: Y. ?# {

$ t: ]3 `: b+ ^8 A

4 K1 M4 [6 c8 `+ l" K9 u! I- |% a: y/ Z( b
5、测试结果
% J& U3 G: Z$ D% t( r; f# l7 u7 Q8 ?: \运行./blinker 0    LED全亮
. _# `1 u" h$ r8 V! L/ m运行./blinker 7    LED全灭
% M4 e! ]2 }* d5 Z
+ v. a* o1 ^+ y) w. L% G# W

2 n  C  s/ X: c5 q6、小结
% H8 T) ^! [3 I  }( h+ a) s8 ]3 v( g1)通过上述过程,可以完成通过lightweight HPS-to-FPGA bridge控制FPGA侧LED的目的, O$ o4 M8 x2 z
2)这个应用比较简单,易于操作,还需要向更加深入的方向努力8 w/ J' a- B* h0 W/ r+ u

% \2 V& \$ b, a8 JFPGA工程文件:
游客,如果您要查看本帖隐藏内容请回复
5 d& j# ?4 m* q1 w2 r
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-9 03:24 , Processed in 0.171875 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表