第一章 准备

1.1 安装软件

《Altera De1-SoC培训教材》中的环境

  • quartus 13.1
  • embedded command shell 13.1
  • 我所用的linux是de1soc_lxde_1604

1.1.1下载链接 **

[1] 培训教材.https://pan.baidu.com/s/1uFRa-5kuf9m_q_UyVIRS4A
[2] Quartus下载. https://www.altera.com.cn/downloads/download-center.html
[3] DE1-SoC Board资源.https://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=Taiwan&CategoryNo=173&No=869&PartNo=4
[4] Quartus 13.1 crack. https://pan.baidu.com/s/1xKbBXYKyD2_76tdNFyC9Sg

1.1.2 Embedded command shell出现问题

打开”~\altera\13.1\embedded”路径下的Embedded_Command_Shell.bat文件,出现两个warning

  1. WARNING: DS-5 install not detected in /cygdrive/d/altera/13.1/embedded/ds-5. SoC EDS may not function correctly without an embedded DS-5 install.
  2. find_fast_cwd: WARNING: Couldn’t compute FAST_CWD pointer

解决方法

  1. 打开同路径下的ds-5_installer,在同路径下安装ds-5。注意ds-5在ECS 13.1环境下需要安装在同路径下,否则shell无法找到
  2. 出现这个错误是embedded中的host_tools中cygwin版本过低,为1.7,应下载高版本如2.0。

1.2 驱动安装

开发板接通电源后,有两根线可以用来de1-soc与计算机连接

  • USB-Blaster II。用于配置FPGA与HPS Debug。在quartus安装目录~\altera\13.1\quartus\drivers\usb-blaster-ii\路径下寻找驱动
  • UART-to-USB。用于计算机与HPS通信。在《培训教材实验包》的tool\drivers\USB2UART_driver中寻找驱动

1.3 在DE1-SOC上运行Linux

1.3.1 电脑串口设置

使用串口终端工具putty与DE1-SOC连接。

如图保存设置后,打开开发板电源,点击putty中的open。注意串口不一定是COM3,要使用设备管理器查看

1.3.2 制作microSD card Image

使用tool工具包中Win32DiskImager将linux镜像刻录到microSD卡(4G以上)上

1.3.3 运行Linux

将刻录了Linux的SD卡插入开发板上microSD card的插槽上,打开开发板电源。
打开putty,load de1-soc_usb,点击open。
若putty没有反应,按下enter键,若开发板启动正常,应出现用户名输入。用户名为root,密码在下载的Linux镜像文件夹中找,是readme.txt。

1.3.4 计算机与开发板上linux进行数据传输

1. U盘传输

  1. 电脑中的文件拷贝到U盘中
  2. U盘插到DE1-soc的USB接口,1、2均可
  3. 输入命令mount –t vfat /dev/sda1 /mnt,将U盘挂载到开发板上
  4. 拷贝命令 cp /mnt/test.doc /home/root/test.doc将test.doc复制到root路径下

2. ftp传输

  1. 安装计算机文件传输工具filezillawinscp
  2. 开发板插入网线
  3. 检查linux中curl版本 curl –v/–version
  4. 写登陆网络的脚本
  5. 保存为connect.sh,然后chmod 777 conncect.sh。运行./connect.sh,连接校园网。
  6. 若./connect.sh | iconv –f gbk –t utf-8出现”连接成功”字样,说明连接成功。
    注意,如果是使用校园网登陆,不能固定ip。

网络登陆脚本connect.sh


#!/bin/bash
USERID=20**********
PASSWORD=20**********
echo login
curl ‘https://connect.cuc.edu.cn/action.jsp’ –data “act=1&userid=$USERID&passwd=$PASSWORD

注意

使用SSH安全登录开发板,用到了SSH密匙。 putty和filezilla均通过密匙登录开发板。
之后filezilla可以传输文件了。

第二章 de1-soc硬件实验

2.1 Qsys生成HPS及FPGA所需文件

  1. 通过Quartus 中的设计工具Qsys选择设计所需的硬件模块,定义Soc FPGA系统的硬件架构。原本是需要同时设计好HPS和FPGA两个部分,但HPS部分原则上只要修改de1_soc_training\lab\HW中的DE1_Soc_GHRD项目即可。FPGA部分,如LED/Button PIO组件,可自己手动添加。
  2. generate生成Qsys系统。它生成了可以被Quartus编译的HDL文件。

2.2 Quartus生成FPGA所需的.soc文件,下载并测试。

  1. assignments-settings中增加soc_system.qip和soc_system_timing.sdc
  2. 修改ghrd_top.v中soc_system u0模块中led_pio_external_connection_export(LEDR)/button_pio_external_connection_export(KEY)
  3. analysis and synthesis
  4. 打开tools-tcl script,选择hps_sdram_p0_pin_assignments.tcl,然后run
    complication
  5. 下载.soc置de1-soc中
  6. 根据培训教材测试

2.3 Qsys生成的供SoC系统开发的文件

  • SOPC info file(.sopcinfo):文档用于生成Device Tree
  • Handoff Folder:里面有关于产生preloader相关配置文件【暂时用不到】
  • System View Descr(.svd):用户DS-5 debug功能【暂时用不到】

解释

  • Device Tree:Device Tree由一系列被命名的结点(node)和属性(property)组成,而结点本身可包含子结点。所谓属性,其实就是成对出现的name和value。https://blog.csdn.net/21cnbao/article/details/8457546
  • preload:将目标文件加入RAM中,系统启动更快
  • DS-5:调试用,基本用不到

2.3.1 生成preloader image file过程【软件实验中没有用到】

  1. 使用soc eds目录中的embedded command shell.bat启动bsp-editor
  2. 选择handoff\soc_system_hps_0文件夹中的配置,则系统在工程内产生software文件夹,并产生settings.bsp文件。
  3. 按下bsp-editor的generate按钮,生成preloader的原始文档以及makefile。文档存放位置为software\spl_bsp\generated文件夹下
  4. 然后使用embedded command shell.bat进入software\spl_bsp文件夹,make生成u-boot-spl和u-boot-spl.bin两个文件,前者是可执行文件preloader elf file,后者是二进制文件preloader binary file,两个文件在DE1_SoC_GHRD\software\spl_bsp\uboot-socfpga\spl文件夹下.
  5. 最后将u-boot-spl.bin复制到software\spl_bsp文件夹下,shell到该路径,输入指令mkpimage –o preloader_with_header.img u-boot-spl.bin生成preloader_with_header.img文件。

2.3.1 生成Device Tree

在软件实验三种用到了SOPC info file(.sopcinfo)

第三章 软件实验一

目标:在DE1-SoC上输出“Hello World\n”
文件
main.c

#include <stdio.h>
int main(int argc, char **argv)
{printf("hello world\n");return 0;
}

Makefile

TARGET = my_first_hpsCROSS_COMPILE = arm-linux-gnueabihf-
CFLAGS = -g -Wall -I $(SOCEDS_DEST_ROOT)/ip/altera/hps/altera_hps/hwlib/include
LDFLAGS = -g -Wall
CC = $(CROSS_COMPILE)gcc
ARCH = armbuild: $(TARGET)$(TARGET): main.o$(CC) $(LDFLAGS) $^ -o $@
%.o : %.c$(CC) $(CFLAGS) -c $< -o $@.PHONY: clean
clean:rm -f $(TARGET) *.a *.o *~

编译运行步骤

  1. 使用embedded command shell.bat编译,在main.c和Makefile的路径下输入命令“make”,生成了my_first_hps文件
  2. 将my_first_hps通过网络/U盘放入DE1-SoC linux系统中
  3. 使用命令“chmod 777 my_first_hps”将my_first_hps改为可执行文件
  4. 输入命令“./my_first_hps”,可看到putty屏幕输出“hello world”

第四章 软件实验二

本实验与实验一相同,只用到DE1-SoC的HPS部分。只需在embedded command shell.bat中使用两个文件*.c和Makefile生成可执行文件,将文件传输到linux系统中并改成可执行文件,即可运行。

4.1. 目标

控制HPS的LED和KEY。运行可执行文件后,HPS的LED会先闪烁两次。之后按下HPS的KEY,LED亮起,否则熄灭。

4.2. 原理

通过linux内核memory-mapped device访问GPIO控制器。

4.3. 软件API

可以通过如下软件 API 访问 GPIO 控制器的寄存器

* open: 打开内存映射设备驱动
* mmap: 映射物理地址到用户空间
* alt_read_word: 从指定寄存器读取一个值
* alt_write_word: 写入一个值到指定寄存器
* munmap:清除内存映射
* close:关闭设备驱动

通过一些宏访问寄存器

* alt_setbits_word:设定制定寄存器的指定位为1
* alt_clrbits_word:设定制定寄存器的指定位为0

4.4. 关键命令

配置LED引脚为输出引脚

alt_setbits_word( (virtual_base + ( ( uint32_t )( ALT_GPIO1_SWPORTA_DDR_ADDR ) & ( uint32_t)( HW_REGS_MASK ) ) ), USER_IO_DIR );

点亮LED

alt_setbits_word( (virtual_base + ( ( uint32_t )( ALT_GPIO1_SWPORTA_DR_ADDR ) & ( uint32_t)( HW_REGS_MASK ) ) ), BIT_LED );

读取KEY值

alt_read_word( ( virtual_base + ( ( uint32_t )( ALT_GPIO1_EXT_PORTA_ADDR ) & ( uint_t )( HW_REGS_MASK ) ) ) );

4.5. 代码

main.c

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include "hwlib.h"
#include "socal/socal.h"
#include "socal/hps.h"
#include "socal/alt_gpio.h"#define HW_REGS_BASE ( ALT_STM_OFST )
#define HW_REGS_SPAN ( 0x04000000 )
#define HW_REGS_MASK ( HW_REGS_SPAN - 1 )#define USER_IO_DIR     (0x01000000)
#define BIT_LED         (0x01000000)
#define BUTTON_MASK     (0x02000000)int main(int argc, char **argv) {void *virtual_base;int fd;uint32_t  scan_input;int i;      // map the address space for the LED registers into user space so we can interact with them.// we'll actually map in the entire CSR span of the HPS since we want to access various registers within that spanif( ( fd = open( "/dev/mem", ( O_RDWR | O_SYNC ) ) ) == -1 ) {printf( "ERROR: could not open \"/dev/mem\"...\n" );return( 1 );}virtual_base = mmap( NULL, HW_REGS_SPAN, ( PROT_READ | PROT_WRITE ), MAP_SHARED, fd, HW_REGS_BASE );if( virtual_base == MAP_FAILED ) {printf( "ERROR: mmap() failed...\n" );close( fd );return( 1 );}// initialize the pio controller// led: set the direction of the HPS GPIO1 bits attached to LEDs to outputalt_setbits_word( ( virtual_base + ( ( uint32_t )( ALT_GPIO1_SWPORTA_DDR_ADDR ) & ( uint32_t )( HW_REGS_MASK ) ) ), USER_IO_DIR );printf("led test\r\n");printf("the led flash 2 times\r\n");for(i=0;i<2;i++){alt_setbits_word( ( virtual_base + ( ( uint32_t )( ALT_GPIO1_SWPORTA_DR_ADDR ) & ( uint32_t )( HW_REGS_MASK ) ) ), BIT_LED );usleep(500*1000);alt_clrbits_word( ( virtual_base + ( ( uint32_t )( ALT_GPIO1_SWPORTA_DR_ADDR ) & ( uint32_t )( HW_REGS_MASK ) ) ), BIT_LED );usleep(500*1000);}printf("user key test \r\n");printf("press key to control led\r\n");while(1){scan_input = alt_read_word( ( virtual_base + ( ( uint32_t )(  ALT_GPIO1_EXT_PORTA_ADDR ) & ( uint32_t )( HW_REGS_MASK ) ) ) );      //usleep(1000*1000);if(~scan_input&BUTTON_MASK)alt_setbits_word( ( virtual_base + ( ( uint32_t )( ALT_GPIO1_SWPORTA_DR_ADDR ) & ( uint32_t )( HW_REGS_MASK ) ) ), BIT_LED );else    alt_clrbits_word( ( virtual_base + ( ( uint32_t )( ALT_GPIO1_SWPORTA_DR_ADDR ) & ( uint32_t )( HW_REGS_MASK ) ) ), BIT_LED );}   // clean up our memory mapping and exitif( munmap( virtual_base, HW_REGS_SPAN ) != 0 ) {printf( "ERROR: munmap() failed...\n" );close( fd );return( 1 );}   close( fd );return( 0 );
}

Makefile

#
TARGET = hps_gpio#
CROSS_COMPILE = arm-linux-gnueabihf-
CFLAGS = -g -Wall  -I ${SOCEDS_DEST_ROOT}/ip/altera/hps/altera_hps/hwlib/include
LDFLAGS =  -g -Wall
CC = $(CROSS_COMPILE)gcc
ARCH= armbuild: $(TARGET)$(TARGET): main.o $(CC) $(LDFLAGS)   $^ -o $@ %.o : %.c$(CC) $(CFLAGS) -c $< -o $@.PHONY: clean
clean:rm -f $(TARGET) *.a *.o *~

4.6. 编译运行步骤

  1. 同软件实验一,使用embedded command shell.bat编译,在main.c和Makefile的路径下输入命令“make”,生成了hps_gpio文件
  2. 将hps_gpio通过网络/U盘放入DE1-SoC linux系统中
  3. 使用命令“chmod 777 hps_gpio”将hps_gpio改为可执行文件
  4. 输入命令“./ hps_gpio”,可看到开发板上属于HPS的LED灯先闪烁两次,然后按下HPS的按钮可以控制LED亮灭

第五章 软件实验三

本章实现HPS与FPGA交互。

5.1 目标

使用HPS控制FPGA的10颗LED灯闪烁60次

5.2 原理

FPGA端的PIO控制器pio_led连接到HPS/ARM lightweight axi bridge,获得在HPS/ARM总线上的物理地址空间。linux通过内核memory-mapped device驱动访问PIO控制器pio_led的寄存器物理地址,从而控制pio_led【同软件实验二】

5.3 过程

5.3.1 生成HPS头文件hps0.h

  1. 与硬件实验的步骤相同,建Quartus工程,使用Qsys生成SOPC info file(.sopcinfo)文件,该文件存放在Quartus工程的目录下
  2. 在Quartus工程路径下编写文件generate_hps_qsys_header.sh。该脚本用来生成hps头文件hps0.h。
  3. 打开embedded command shell,到Quatus工程路径下,输入命令”./generate_hps_qsys_header.sh”,生成hps头文件

generate_hps_qsys_header.sh

#!/bin/sh
export PATH=$PATH:/cygdrive/d/altera/quartus13.1/quartus/sopc_builder/bin
sopc-create-header-files "./soc_system.sopcinfo" --single hps_0.h --module hps_0

5.3.2 生成HPS可执行文件

注意hps0.h和main.c及Makefile在一个文件夹中
main.c

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include "hwlib.h"
#include "socal/socal.h"
#include "socal/hps.h"
#include "socal/alt_gpio.h"
#include "hps_0.h"#define HW_REGS_BASE ( ALT_STM_OFST )
#define HW_REGS_SPAN ( 0x04000000 )
#define HW_REGS_MASK ( HW_REGS_SPAN - 1 )int main() {void *virtual_base;int fd;int loop_count;int led_direction;int led_mask;void *h2p_lw_led_addr;// map the address space for the LED registers into user space so we can interact with them.// we'll actually map in the entire CSR span of the HPS since we want to access various registers within that spanif( ( fd = open( "/dev/mem", ( O_RDWR | O_SYNC ) ) ) == -1 ) {printf( "ERROR: could not open \"/dev/mem\"...\n" );return( 1 );}virtual_base = mmap( NULL, HW_REGS_SPAN, ( PROT_READ | PROT_WRITE ), MAP_SHARED, fd, HW_REGS_BASE );if( virtual_base == MAP_FAILED ) {printf( "ERROR: mmap() failed...\n" );close( fd );return( 1 );}h2p_lw_led_addr=virtual_base + ( ( unsigned long  )( ALT_LWFPGASLVS_OFST + PIO_LED_BASE ) & ( unsigned long)( HW_REGS_MASK ) );// toggle the LEDs a bitloop_count = 0;led_mask = 0x01;led_direction = 0; // 0: left to right directionwhile( loop_count < 60 ) {// control led,  add ~ because the led is low-active*(uint32_t *)h2p_lw_led_addr = ~led_mask; // wait 100msusleep( 100*1000 );// update led maskif (led_direction == 0){led_mask <<= 1;if (led_mask == (0x01 << (PIO_LED_DATA_WIDTH-1)))led_direction = 1;}else{led_mask >>= 1;if (led_mask == 0x01){ led_direction = 0;loop_count++;}}} // while// clean up our memory mapping and exitif( munmap( virtual_base, HW_REGS_SPAN ) != 0 ) {printf( "ERROR: munmap() failed...\n" );close( fd );return( 1 );}close( fd );return( 0 );
}

Makefile

#
TARGET = my_first_hps-fpga#
CROSS_COMPILE = arm-linux-gnueabihf-
CFLAGS = -static -g -Wall  -I${SOCEDS_DEST_ROOT}/ip/altera/hps/altera_hps/hwlib/include
LDFLAGS =  -g -Wall
CC = $(CROSS_COMPILE)gcc
ARCH= armbuild: $(TARGET)
$(TARGET): main.o $(CC) $(LDFLAGS)   $^ -o $@
%.o : %.c$(CC) $(CFLAGS) -c $< -o $@.PHONY: clean
clean:rm -f $(TARGET) *.a *.o *~

5.3.3 编译运行

  1. embedded command shell.bat生成文件my_first_hps-fpga,放入Linux中
  2. 编译Quartus工程,将.soc文件下载到DE1-soc中
  3. 可以观察到FPGA的10颗LED闪烁60次

de1-soc培训教材记录相关推荐

  1. 视易锋云服务器曲库维护,视易网管培训教材之歌库歌星部分(锋云服务器).doc...

    视易网管培训教材之歌库歌星部分(锋云服务器) 网管手册-锋云歌库歌星部分 本文着重介绍了锋云环境下的歌库及歌星的相关操作,大家可参考此文档来完成加歌.修改歌曲信息.删除歌曲信息.添加歌星.编辑歌星等日 ...

  2. 电视监控系统培训教材

    电视监控系统培训教材     典型的电视监控系统主要由前端设备和后端设备这两大部分组成,其中后端设备可进一步分为中心控制设备和分控制设备.前.后端设备有多种构成方式,它们之间的联系(也可称作传输系统) ...

  3. 【经典推荐】教育大数据分析师系列丛书(培训教材)

    <中小学教育大数据分析师系列丛书(培训教材)>紧扣国家<教育部关于实施全国中小学教师信息技术应用能力提升工程2.0的意见><教育信息化2.0行动计划>.国家智慧教育 ...

  4. Sun Solaris 培训教材

    标题:Sun Solaris 培训教材 <上一帖 | 下一帖> Sun Solaris 培训教材 (一) . Sun发展简史 一.Sun发展简史 (一)硬件体系 81--89 Sun1/2 ...

  5. 白皮书 CPU卡培训教材

    白皮书 CPU卡培训教材 一. CPU卡简介 1. IC卡定义 IC卡是集成电路卡(Integrated Circuit Card)的简称,是镶嵌集成电路芯片的塑料卡片,其外形和尺寸都遵循国际标准(I ...

  6. 《Flex 3权威指南》——Adobe官方培训教材

    Adobe官方培训教材 手把手教你渐入Flex技术佳境 涵盖Flex 3新特性 媒体评论 这是一部杰作,将Flex开发讲解得通通透透.             --Huw Collingbourne, ...

  7. 员工培训案例分析答案_培训主管的技巧:培训教材问题解析、培训实施分析报告(附案例)...

    关注[本头条号]更多关于企业管理.员工激励.薪酬制度.绩效激励等内容免费与你分享!私信"资料"送您关于员工管理.绩效薪酬的干货视频. 培训分析 在本章节中,我们将以某公司实施的员工 ...

  8. 华为ipd产品开发流程_亲历华为IPD变革是怎样一种体验|附完整版培训教材

    华为作为国内率先推行IPD并取得巨大成功的企业,一直以来都被业界所推崇.许多公司也效仿华为实施了IPD体系变革,以期推动企业的快速发展.华为是怎么推行IPD的?在华为亲身经历IPD变革是怎样一种体验? ...

  9. 【正式发布】火星人敏捷开发手册2012-12-25(基于Scrum的敏捷开发免费培训教材及公司内部宣传材料)...

    2012-12-25:新增松结对编程4页. 预告:下一更新日期:2013-03-01. 您可以在非商业场合免费使用(详见文档最后的授权页面): 作为培训前的预习阅读. 打印并张贴在公司走廊上. 作为企 ...

最新文章

  1. $@ 与 $* 差在哪?
  2. microbiomeMarker:整合多种biomarker分析工具的R包
  3. 红帽linux lnmp搭建,Linux(redhat5.4)下lnmp环境的搭建
  4. 08-Isolation using virtualization in the Secure World_Whitepaper
  5. 线段树-Count on a Treap-神题
  6. 工作140:封装写法
  7. 开机预读快还是不预读快_WIN 7下的超级预读比VISTA要好,改进不少!推荐开启超级预读!...
  8. 华为云ModelArts
  9. 微软“.Net社区虚拟大会”dotnetConf2015:关键词:.NET 创新、开源、跨平台
  10. 在Oracle用SQL处理以 System.currentTimeMillis
  11. QFile和C语言对文件操作的性能比较.--读取double型二进制数据文件
  12. select * 与 count(*)数量不一致_技术分享 | MySQL:count(*)、count(字段) 实现上区别
  13. 深入剖析引用参数Ref和Out
  14. 2022-2028年中国差旅管理行业市场全景调查及投资潜力研究报告
  15. 用AS3+Flash+FlashBuilder开发AIR
  16. shapefile数据下的 dbf shp shx sbn sbx mdb adf等类型的文件的解释
  17. Notepad ++中的一个著名插件FingerText
  18. SVG黑科技微信排版『Apple连续向上滑动』模板代码
  19. 腾讯受邀参加2019世界移动通信大会5G论坛,分享5G技术探索
  20. Word中更新图表所有的域

热门文章

  1. 5个常用的开源聊天应用
  2. creo扫描选择多条链作为轨迹_Proe/Creo如何使用可变截面扫描创建曲面?
  3. 网易极客战记-KITHGARD地牢--迷一般的 Kithmaze (需解锁)
  4. 读写U盘(FAT32)引导扇区
  5. app及Java服务端实现JT808协议的定义解析
  6. 开源实践 | OceanBase 在红象云腾大数据场景下的实践与思考
  7. AI“看片儿”比人快,鉴黄师却说不靠谱?
  8. 如何清空php缓存数据库,ThinkPHP实现一键清除缓存方法
  9. html拍拍网图片素材,美图拍拍1.3.5 全新逼真场景素材上线啦!
  10. 上传加载loading