SoC FPGA 芯片:
Intel Cyclone V SE 系列
Cyclone V系列中的 5CSEBA2U19I7N,5CSEBA5U19C8N,5CSEBA6U23I7
主要区别:
5CSEBA2U19I7N:工业级(-40℃~100℃) 逻辑单元 25K
5CSEBA5U19C8N:商业级(0℃~85℃) 逻辑单元 82K
硬核 主频925MHz
Altera
英特尔SOC FPGA 芯片三个系列:Cyclone V SE/SX Arria V Arria10
英特尔对标赛灵思,Xilinx synq 667MHz 825MHz 256K 赛灵思synq不是相互独立的
创建工程时用到的型号:5CSEBA2U19I7N
新型SoC芯片:
灵活高效的数据运算和事务处理能力,集成FPGA的高速并行处理优势
基于两者独特的片上互联结构,可以将FPGA上的通用逻辑资源经过配置,
映射成ARM处理器的一个或者多个具有特定功能的外设,通过高达128位宽的AXI高速总线进行通信,完成数据和控制命令的交互。
FPGA变成了ARM处理器的外设。linux下操作FPGA侧寄存器
战略上 Intel Cyclone V SE 系列 对标 Xilinx S系列
Cyclone 10
Cyclone V 最低的系统成本和功耗,以及全新的性能水平,大容量应用优势,相比前代产品总体功耗降低40%,高效的逻辑集成功能
集成收发器变体和SoC FPGA变体(包括基于ARM的硬处理器系统(HPS))。
E GX GT SE SX ST
SE: A2 A4 A5 A6(20 40 85 110)
5C SE B A2 U 19 I 7 N
5C:Cyclone V
SE:SoC with enhanced logic/memory
B:No hard PCIe or hard memmory controller
A2:25K logic elements
U:Ultra FineLine BGA(FBGA)
19:484 pins
I:Industrial(Tj=-40℃to100℃)
7:FPGA Fabric Speed Grade
S
L
N:Optional Suffix Lead-free packaging
Cyclone IV
硬件处理器系统(HPS):
双核 Cortex-A9
顺序控制,丰富外设,开源驱动
HPS运行成熟的Linux操作系统,提供统一的系统API,降低开发软件难度
现场可编程逻辑门阵列资源 FPGA:
高带宽的数据通信
并行运算,高速接口,灵活定制
HDL;硬件描述语言,Verilog,VHDL 状态机
开发方式差别
并行处理,响应及时,ADC采集
通用可编程逻辑门阵列+存储器 ,在单纯的FPGA芯片上使用FPGA的逻辑和存储器搭建一个软核CPU系统。
软核:SOPC技术 Inter PSG vs Xilinx CPU主频最高至150~160MHz
HPS-to-FPGA 桥:
高速桥接总线 ,一边采集一边存储
Avalon总线 MM总线,Avalon ST总线
5CSEBA2U19I7N:
25K的FPGA逻辑单元(LE)
1433600bit嵌入式RAM存储器
36个数字信号处理器(DSP)
5个模拟锁相环PLL
4个数字锁相环PLL
双核 Cortex-A9 硬处理器系统,主频800~925MHz
DDR3控制器 800MHz
1000以太网 x2
NAND FLASH
QSPI FLASH
SD/MMC
SPI /主从 x2
USB x1 / UART x2/ I2C x4 /CAN x2
开发Soc FPGA:
2013年,Quartus II 13.1之后,兼容性的问题 AD13
软件:17.0 / 17.1
厂家提供:
1、使用Quartus prime 17.1,英特尔,新建文件,保存编译,分配引脚
2、Quartus集成工具:platform Designer (Qsys),重点掌握,为Soc FPGA添加外设,配置HPS
3、SoC EDS,独立的软件 大小为3G,工具,类似cmd终端,纯命令行命令 ls,cd
4、SoC EDS集成 DS-5 AE arm公司 ARMDS
软件的编程,I2C控制器应用的 C 设备文件
含FPGA的编程,映射,FFT变换,printf输出,标准的linux应用开发
第三方:
1、终端putty
2、winscp
GHRD 黄金硬件参考设计
HPS参数配置
IO交错配置
DDR3存储器参数配置
FPGA工程信号连接和引脚分配
platform Designer:
AC501_SoC_GHRD 工程 基于Verilog
vga_pll TFT显示屏
key_filter
soc_system u0 arm系统 platform Designer生成
soc_system.qsys 打开系统
clk_0 系统默认 输入 时钟源IP 50000000Hz
hps_0 Arria V/Cyclone V Hard Process arm处理器
sysid_qsys System ID Peripheral 输入数字 软件识别系统 32bit
led_pio 2位的输出型IO Enable
buton_pio
uart_0
spi_0 速率为2MHz 2000000 1923076Hz 8位宽数据模式 如果2个不够用,在FPGA添加spi
clock_bridge_0
alt_vip_vfr_tft_0 Frame Reader 设置参数 800*480 width height
图像帧缓存读取控制器 直接从AXI总线上以DMA的方式读取内存中的数据的IP,驱动RGB TFT显示屏
Frame Buffer II (4K Ready)
alt_vip_itc_0
i2c_0 IP Catalog仅支持NIOS下的驱动代码,linux下暂无对该IP的驱动支持,使用开源的opencores网站的oc_i2c控制器
使用虚拟地址映射的方式来进行编程控制
通过配置Linux内核以使能现有的驱动程序
AC501_SoC_GHRD 修改工程文件
通过Platform Designer(原Qsys)加一个 Altera UART 外设到HPS的轻量级FPGA到HPS桥(fpga2hps_lw_bridge),
然后更新到Quartus工程中,再重新编译生成HPS启动的U-boot镜像文件和preloader镜像文件并更新到AC501_SoC的启动的SD中,
重新生成包含了Altera UART 外设的HPS系统,编译得到新的dts文件和dtb文件,最后将dtb文件拷贝到AC501_SoC开发板的linux系统SD卡中,
以使linux系统能够获得新增加的Altera UART外设
clk_0 hps_0 h2f_reset
桥:
h2f_axi_clock
f2h_axi_clock
h2f_lw_axi_clock
sysid_qsys
led_pio
button_pio
uart_0
spi_0
i2c_0
alt_vip_vfr_tft
clock_master
clock_bridge_0 66Hz时钟
复位
sysid_qsys
control_slave Avlon Memory Mapped Slave:获取内部寄存器
Avlon Memory Mapped Slave连接到了 h2f_lw_axi_master
fpga和arm之间的通信:数据交换
arm控制 fpga
两者之间有三座桥: 位宽 32 64 128bit unused 关闭
f2h_axi_briege:
fpga -> hps
slave
h2f_axi_briege:
hps -> fpga
master
h2f_lw_axi_briege:
hps -> fpga
master
轻量 2M字节 uart i2c spi
总线连接: clk h2f_lw_axi_clock
irq
reset
sl h2f_lw_axi_master
hps Arria V/Cyclone V Hard Processor System
altera_hps
FPGA-to-HPS SDRAM Interface +
f2h_sdram0_data AXI Slave
fpga 需要大容量的DDR3 hps给一个总线接口
IO的复用:
选择FPGA
800MHz
Platform Designer安装路径 intelFPGA 17.1 是一个路径
DS5编写基本C程序
Quartus
Platform Designer
SoC EDS
DS-5 AE
Modelsim
putty
GHRD
Eclipse for DS-5 v5.27.1
因为环境变量,不建议在开始菜单中打开,使用SoC EDS 输入eclipse& 打开。
编译环境 C Project
工程名
选择编译器 GCC 4.x arm-linux-gnueabihf
新建文件 main.c
1:打开soc eds command shell软件
2:eclipse&
3:file -> new -> c project
4:创建main.c文件
5:编写C程序
6:编译得到可执行文件
7:制作开发板Linux系统镜像SD卡
8:将编译得到的可执行文件拷贝到开发板的SD卡中
9:用micro USB教据线连接开发板和电脑
10:将sD卡插入开发板的卡槽中
11:查看电脑上的串口号,打开putty软件,打开该串口,波特率是115200
12:给开发板上电
13:root
14:挂载sD卡的FAT分区 mount -t vfat /dev/mmcblk0p1 /mnt15:切换到mnt目录下 cd /mnt16: 执行程序: ./hello world在这里插入代码片
Linux下使用网络进行调试:
ifconfig,udhcpc,手动设置,静态IP地址
vi /etc/network/interfaces
#iface eth0 inet dhcp
iface eth0 inet static
address 192.168.30.166
netmask 255.255.255.0
gateway 192.168.30.1
reboot
windows软件 WinSCP,新建站点 IP地址 passwd ,主机名,拖动,添加权限,调试
eclipse 编辑后不会自动保存
gdb调试:
gdb设置:打开Run->Debug Configurations,在调试配置界面,双击”C/C++ Application“栏,将会生成 ”hello Debug“调试目标
Debugger Debugger:gdbserver
Debugger Options
GDB debugger:路径 intelFPGA/17.1/emedded/ds-5/sw/gcc/bin/arm-linux-gnueabihf-gdb.exe
arm-linux-gnueabihf-gdb.exe从哪里来:
exe文件:
linux 下编译器:gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux
fpga/ac620_soc/AC501_SoC_CD_Files/配套软件/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin
Connection Type: TCP 192.168.30.166 Port number: 10000
开发板运行:
#gdbserver :10000 hello_world
Process hello_world created; pid = 1622
Listening on port 10000
PC 点击Debug
Remote debugging from host 192.168.30.188
查看变量,设置断点,双击设置断点
在这里插入代码片
基于gdbserver调试实验:
1、保证电脑能够通过网络访问开发板
ifconfig etho 192.168
vi /etc/network/interfaces 编辑这个文件
#iface ethO inet dhcp找到修改这个,前面加#
iface ethO inet static 改为静态分配配ip
address 192.168.35.225
netmask 255.255.255.0
gateway 192.168.35.254
保持,然后reboot
2、使用passwd命令为root账户设置密码
3、将希望调试的程序拷贝到开发板中
4、为程序添加可执行权限 chmod 777 he1lo world
5、在DS-5软件里面配置调试相关设置debugger: gdbserver选择qdb.exe
connect :tcp ip address
gdbserver :10000 hello world
6、在开发板上启动调试
7、在DS-5里面点击debug开始调试
PC中的DS5软件与开发板上gbserver进行通信
虚拟地址映射:
在AC501_SoC_GHRD工程中,我们在platform Designer集成开发工具中为HPS
添加了若干个外设,包括PIO,UART,SPI,IIC Frame Buffer等。
这些IP外设通过LW_H2F_AXI bridge或 F2H_AXI bridge 连接到了HPS的内部总线上,
能够被总线上的主机(HPS,MPU,DMA)直接寻址。
因此,从处理器操作外设的基本原理来看,就是通过寻址的方式,让总线上的主机(HPS,MPU,DMA)
能够直接读写指定地址存储的数据。
FPGA和ARM
arm如何通过编程控制FPGA侧的外设
FPGA 绝对地址
HPS 增加MPU,外设由MPU管理,MPU将外设的地址经过转换,映射出新的地址,不再是绝对地址
标准的Linux驱动程序,在驱动程序中对外设的寄存器进行读写操作,然后提供给用户应用层标准的UNIX编程接口
SoC FPGA
1、为使用虚拟地址映射的方式将外设寄存器映射到Linux用户空间
2、为配置Linux内核,打开对添加的外设IP的驱动支持,即使用系统自带的驱动程序直接驱动外设IP。
虚拟地址映射的实现:
1、得到存储器管理单元(MPU)的虚拟地址
2、通过添加h2f_lw_axi_master桥在MPU上的偏移地址来得到h2f_lw_axi_master桥的虚拟地址
3、添加FPGA侧具体外设在h2f_lw_axi_master桥上的偏移地址来得到该外设在Linux系统中的虚拟地址
Linux系统中,通过mmap()函数实现虚拟地址的映射
void *mmap(void *addr,size_t len,int port,int flags,int fd,off_t offset);
该函数会在调用程序的虚拟地址空间addr处创建设备文件fd,偏移地址offset的一个长度为length的映射,映射内核地址空间一段内存到用户进程地址空间。
要将MPU映射到用户空间,打开MPU得到其描述符,通过open函数实现
if((fd = open(“/dev/mem”,(O_RDWR | O_SYNC))) == -1)
{
printf(“ERROR:could not open “/dev/mem”…\n”);
return 1;
}
再使用该文件描述符来完成h2f_lw_axi_master总线的虚拟地址映射。
void *periph_virtual_base;
periph_virtual_base = mmap(NULL,HW_REGS_SPAN,(PORT_READ | PORT_WRITE),MAP_SHARED,fd,HW_REGS_BASE);
void类型指针 periph_virtual_base 表示外设虚拟地址
使用mmap函数将MMU上偏移地址HW_REGS_BASE的地址映射为虚拟地址,并赋值给periph_virtual_base指针
映射的地址空间长度为HW_REGS_SPAN大小
LED_PIO_BASE和BUTTON_PIO_BASE为led_pio和button_pio外设在lw_h2f_bridge上的基地址,
宏定义在hps_0.h中定义,ALT_LWFPGASLVS_OFST即为lw_h2f_bridge在外设地址空间中的基地址。
外设从设备标识 说明 基地址 地址空间
STM space trace macrocell 0xFC000000 48MB
DAP Debug Access Port 0xFF000000 2MB
LWFPGASLAVES FPGA slaves accessed with lightweight HPS-to-FPGA bridge 0xFF200000 2MB
LWHPS2FPGAREGS Lightweight HPS-to-FPGA bridge global programmer’s view(GPV) registers 0xFF400000 1MB
HPS2FPGAREGS HPS-to-FPGA bridge GPV registers 0xFF500000 1MB
0xFC000000~0xFFFFFFFF LWFPGASLAVES
HPS -> MPU -> h2f_lw_axi_master总线 -> 外设
大小 0x4000000 十进制:67108864 除以 1024 等于64MB
0xFC000000 + 0x4000000
int fpga_init(long int *virtual_base){
mmap();
*virtual_base = periph_virtual_base; //将外设虚拟地址保存,用以释放时候使用
}
LWFPGASLAVES基地址:
ALT_LWFPGASLVA_OFST 0xFF200000
LED_PIO_BASE 0x10040
led_pio_virtual_base = periph_virtual_base + ((unsigned long)(ALT_LWFPGASLVS_OFST + LED_PIO_BASE) & (unsigned long)(HW_REGS_MASK));
BUTTON_PIO_BASE 0x100C0
//清除边沿捕获寄存器的bit0的值
*(button_pio_virtual_base + 3) = 0x3; 0011
0 1 2 3 第3号寄存器写入0x3
edgecapture 边沿捕获寄存器 Enable bit-clearing for edge capture register 写入任意值清除所有位,写1对应位
BUTTON 2位宽
0x1 01
bool led0 = true; led0 = !led0;
*(button_pio_virtual_base + 3) = 0x1;
*(button_pio_virtual_base + 4) = 0x1;
outset
*(button_pio_virtual_base + 5) = 0x1;
outclear
0x2 10
*(button_pio_virtual_base + 3) = 0x2;
*(button_pio_virtual_base + 4) = 0x2;
outset
*(button_pio_virtual_base + 5) = 0x2;
outclear
0x3:
*(button_pio_virtual_base + 3) = 0x3;
*(led_pio_virtual_base + 0) = led1 * 2 | led0;
LED
uart_0 0x0060
fpga_init(long int*)
取消虚拟地址映射 与mmap对应 periph_virtual_base = mmap(NULL,HW_REGS_SPAN,(PROT_READ | PORT_WRITE),MAP_SHARE,fd,HW_REGS_BASE);
if(munmap(virtual_base,HW_REGS_SPAN) !=0)
{
printf(“ERROR: munmap()failed…\n”);
close(fd);
return (1);
}
close(fd);
return 0;
没有gdbserver 选项 点击select other 点击Chande Workspace Settings 选择Debug
安装时注意 安装到 D intelFPGA 17.1 embedded ds-5 新建ds-5文件夹
界面恢复 windows perspective reset perspective
8层PCB板级设计