其实在这个开发板上安装 Linux 和在树莓派上安装 Linux 并没有太大区别,遇到问题的时候可以参考一些树莓派资料尝试解决。
当然,实际操作上有一些细节不太一样,尤其是在系统启动之后的配置方面。
硬件准备
除了 FPGA 本身和用来操作的电脑之外,大致还需要:
- USB 键鼠一套:首次运行 Linux 用来配置系统
- VGA 显示器一台:首次运行 Linux 用来配置系统
- 网线一根:连接电脑
- SD 卡一张(8G+,CLASS 10+):作为文件系统。
其实键鼠和显示器不是必须的。如果第一次配置时直接采用无头模式(headless),需要进行比较复杂的操作,可参考下文。
镜像选择
根据官方教程,有一些预编译的镜像可以选择,下载地址:
Terasic - DE Boards - Cyclone - DE1-SoC Board
Title | Linux Kernel | Min. microSD Capacity | Size(KB) | Date Added |
---|---|---|---|---|
Linux Console | 3.12 | 4GB | 66495 | 2014-01-14 |
Linux Console with framebuffer | 3.12 | 4GB | 328524 | 2014-03-24 |
Linux LXDE Desktop | 4.5 | 8GB | 1240466 | 2016-11-14 |
Linux Ubuntu Desktop | 4.5 | 8GB | 1933049 | 2016-12-28 |
Desktop 版本也有 3.12 内核的可供下载,但是官方并不建议使用。
本文基于官网的最新预编译版 Linux Ubuntu Desktop (Ubuntu 16.04.1 LTS),其他发行版的大致配置步骤应当相似,但并不保证一定能够使用。
烧录 SD 卡
这个部分和树莓派的操作完全相同(除了不能用树莓派定制的 Image 写入工具)。
建议参考:
Win32DiskImager写入ubuntu镜像-百度经验 (baidu.com)
设置 FPGA 工作模式
建议参考:
DE1-SoC User Manual —— 3.1 Settings of FPGA Configuration Mode,依照表 3-2 所示拨动 SW10 开关到指定的位置就可以了:
默认情况下开关应当在 10010
模式。对于运行普通的 Linux,或者需要使用 Linux 上的程序对 FPGA 进行重编程,需要设置开关为 01010
,对于运行需要 Frame Buffer 的 Linux 则需要设置开关为 00000
(带有 GUI 的 Linux 都需要 Frame Buffer)。
初次启动与配置
把 SD 卡插入 FPGA,连接好外设,然后开机,没有意外的话就可以看到 Linux 的企鹅在屏幕上出现,然后就可以登录系统了。注意:预编译系统的用户名为 root
,密码为 terasic
。
为了下次登录调试方便,对网络进行设置。
- 用网线将 FPGA 和电脑连接起来,FPGA 开机状态下应该能看到 “未识别的网络” 的字样。
- 打开 “控制面板网络和Internet网络连接”,右键打开“以太网”的属性页面,为其手动分配一个 IP 地址(很简单,具体做法请百度)。
这里以
192.168.137.1
为例。 - 右键 WLAN(或者其他有 Internet 连接的网卡)打开“属性”页面,选择共享选项卡,选择“以太网”(即 FPGA 对应的网卡)并启用共享功能。
设置共享的目的是为了让 DHCP 服务器给 FPGA 分配一个 IP 地址,从而让电脑可以和 FPGA 通过网线进行通讯。
配置静态 IP。
如果有显示器,需要使用 Network Manager 进行配置,桌面环境下 NM 有 GUI,可以直接取消 DHCP 并设置静态 IP 地址和子网掩码以及网关地址。
设置方法参见 NetworkManager (简体中文) - ArchWiki (archlinux.org))。
这里以下面的配置为例,注意配置之后可能需要重启才能生效。
address 192.168.137.2 # IP 地址 netmask 255.255.255.0 # 子网掩码 gateway 192.168.137.1 # 网关地址 dns-nameservers 192.168.137.1 # DNS服务器
- 如果没有显示器,请直接参考本文最后的 无头配置网络 部分。
设置 SSH 连接。
推荐一个 SSH Terminal:MobaXterm,比 PuTTY 好用很多。
具体设置方法比较简单,总体思路是使用 Windows 上的 SSH 客户端连接 FPGA 的 IP 地址,然后通过 SSH 进行操作。
如果需要使用 GUI ,可以参考之前的 X11 Forwarding,设置 X11 Forwarding 在 Windows 上显示图形界面。
一个 FPGA 为什么需要GUI ?!如果需要传送文件,可以使用 SFTP,Xshell、MobaXterm 这类常用的 SSH 软件都已经集成了基于 SFTP 的文件传输功能。
- 到此就可以重启,尝试 SSH 连接,如果一切正常就可以把键鼠和显示器都撤走了。以后的开发工作可以通过 SSH 和 SFTP 完成。
常见问题
- 如果出现 SSH 连接不上,请尝试附加参数
-v
查看详细日志信息。连接失败的原因大概率是禁用了 root 用户使用密码登录。可以先使用 ubuntu 用户登录,然后修改 SSH 配置。请参考:ssh 怎样以root用户登录_liming066的博客-CSDN博客_ssh用root登录 一般情况下是用不到这块板子的 GUI 的(为了配置方便除外)...所以我一般选择禁用。
systemctl disable lightdm
另外这个预编译版竟然还安装了 Apache2 服务器(FPGA 一般不会被用来做 服务器 吧...),卸载之:
systemctl stop apache2 systemctl disable apache2 apt-get remove --purge apache2 rm /etc/init.d/apache*
然后重启。
无头情况下的配置
注意:在无头环境下进行错误的网络设置可能会使 DHCP 失效,网络无法连接,进而不得不使用键鼠 + 显示器的配置方案。
与有显示器的环境相比,无头情况下 DE1-SoC 获取到的 IP 并不能很快地看到,也就不能直接通过 SSH 连接。所以我们的第一步就是获取开发板的 IP 地址。
无头情况下获取 IP
- 要获取 IP 地址,首先应该通过 DHCP 的方式给板子分配一个地址。
这里的做法和上面有显示器环境的网络配置相同,即网线连接 -> 设置电脑 IP -> 网络共享。
- 设置好网络共享之后,打开 Wireshark 软件,选择 “以太网” 网卡进行抓包。原理是,开发板连接到互联网后会尝试和 Ubuntu 的服务器通信,也会使用 NTP 协议对时,种种操作会经过我们的电脑,此时打开抓包软件自然而然地就可以发现 DE1-SoC 的流量,也就拿到了其 IP 地址。
- 拿到 IP 之后直接打开 SSH 软件,使用 ubuntu 用户登录,然后修改 SSH 配置文件,允许 Root 用户使用 SSH 登录(参照上文链接),就可以随意进行操作了。
- 美中不足的是,这样每次开发板关机后再打开时 IP 会发生变化(因为每次 DHCP 发放的地址并不相同),如果每次使用抓包的方式获取 IP,效率太低。因此设置静态 IP,让开发板用固定的 IP 上网。
设置静态 IP 上网
打开终端,输入:
ip a
查看设备 eth0(默认有线网卡)上的获取到的 IP 地址。
打开网络配置文件,将 eth0 设置为静态 IP 模式。
nano /etc/network/interfaces # 打开网络配置文件
此时应该能看到 eth0 的默认配置如下:
auto eth0 iface eth0 inet dhcp
将其更改为:
auto eth0 iface eth0 inet static address 192.168.137.2 netmask 255.255.255.0 gateway 192.168.137.1 dns-nameservers 192.168.137.1
解释如下:
auto eth0
,开机自动启动eth0
网卡;static
表示静态 IP 上网,默认值为dhcp
即通过 DHCP 服务获取 IP 地址。address
,静态 IP 地址,可以根据自己需求更改,也可以直接写成第 1 步中 DHCP 分配的地址;netmask
,子网掩码,和电脑保持一致;gateway
,网关。这里我们的情况是使用电脑共享网络给开发板使用,所以网关地址就是电脑的 IP 地址;dns-nameservers
,DNS 服务器地址,可以设置成114.114.114.114
之类的,也可以设置成电脑,由电脑来做 DNS。
设置完毕后重启,仍然不会生效。
原因是带有桌面环境的 Ubuntu 发行版都集成了 Network Manager(因为 NM 有带 GUI 的网络配置程序),默认由它负责网络的管理,而我们刚刚编辑的是另一个内置网络管理工具 Networking 的配置文件,默认情况下它并不生效。
既然我们是无头环境,NM 的 GUI 就没有什么用了,所以我们要让 Networking 开始使能,全面接管系统的网络配置工作:
systemctl disable network-manager systemctl enable networking
然后重启,如果 Networking 配置正确的话,应该可以用 SSH 直接连接之前设置的 IP 地址了。
如果仍然不能正常工作,可以再启动 Wireshark 抓包进行分析和调试。
- 关于 Ubuntu 无头环境下使用 Networking 配置静态 IP,请参考:Ubuntu 16.04 Server 设置静态IP - 简玄冰 - 博客园 (cnblogs.com)