SOC FPGA之流水灯设计

一、DS-5简介

        Altera Soc EDS开发套件的核心是Altera版ARM Development Studio 5(DS-5)工具包,为SoC器件提供了完整的嵌入式开发环境、FPGA自适应调试和对Altera工具的兼容。

1.1 DS-5 eclipse破解

首先下载破解器

然后进入cmd运行,进入到破解器所在文件夹

 然后输入patcher.exe --license ?:licensepath

最后显示.dat文件即可,将license添加到eclipse中就好了

1.2 ARM编译器

        ARM编译器用于生成面向ARM、Thumb、Thumb22、VFP和NEON指令集的应用程序。
        ARM编译器工具链可用于编译由C、C++或ARM汇编语言源代码编写的程序,可以为32位ARM、16位Thumb和Thumb-2指令集生成优化代码,并支持完整的符号ISO标准的C和C++代码,通过向量化NEON编译器支持NEON SIMD指令集。

1.3 GNU编译器

        Altera Soc EDS自带的裸机GNU编译工具是基于ARM架构的处理器,用于编译Linux应用程序,可以直接从命令行直接启动,也可以在Eclipse中创建Linux可执行程序项目从而调用此套编译器。

二、基于ARM编译器的流水灯实例

2.1 创建项目

新建C Project

用SOC EDS提供的HALIB中给的API访问板上硬件,所以需要在项目编译选项中添加HWLIB路径
选择主菜单Project->Properties,在弹出的Properties for LedWater对话框中点击Includes

本实例要添加的是项目编译时需要包含的HALIB路径,点击Include path(-I),通过File system选择<SocEDS安装路径>\ip\altera\hps\altera_hps\hwlib\include

在C项目中添加主程序main.c,File->New->Source File

创建硬件设备描述头文件hps_0.h
SOC EDS提供了由Qsys硬件系统信息转换为软件开发所需设备描述头文件的工具swinfo2header,通过Shell进入Qsys工程所在目录并输入

sopc-create-header-files soc_system.sopcinfo -single hps_0.h -module hps_0

根据.sopcinfo文件生成hps_0.h文件,并将其拷贝至Eclipse当前项目目录中

另一种生成hps_0.h文件是编写Shell脚本generate_hps_qsys_header.sh

#!/bin/sh
sopc-create-header-files\
"/cygdrive/d/chapter7/Hardware/soc_system.sopcinfo"
--single hps_0.h
--module hps_0

脚本文件编译完成后将其保存在当前项目目录中,在命令行中切换到当前项目目录,然后执行哎脚本,即可在当前项目目录下生成 hps_0.h

在Eclipse中右键点击项目名称选择Refresh就可以看到hps_0.h文件已经被添加至当前项目

将<SocEDS安装路径>\embedded/\ip\altera\hps\altera_hps\hwlib\src\hwmgr中的看门狗驱动程序alt_watchdg.c拷贝至项目目录并对其进行裁剪

#include <stdint.h>
#include <stdbool.h>
#include "socal/hps.h"
#include "socal/socal.h"
#include "socal/alt_rstmgr.h"
#include "socal/alt_l4wd.h"
#include "hwlib.h"
#include "alt_mpu_registers.h"
#include "alt_watchdog.h"
#include "alt_clock_manager.h"

#define WDOG_RESET_KEY           0x00000076
#define ALT_WDOG_RST_WIDTH       8             //8个或更多MPU时钟周期


bool cpu_wdog_in_gpt_mode(void)
{
    return !(alt_read_word(CPU_WDTGPT_TMR_BASE + WDOG_CTRL_REG_OFFSET) & WDOG_WDT_MODE);
}

/****************************************************************************************/
/* 启动指定看门狗定时器                                                                 */
/****************************************************************************************/
ALT_STATUS_CODE alt_wdog_start(ALT_WDOG_TIMER_t tmr_id)
{
    ALT_STATUS_CODE     ret = ALT_E_BAD_ARG;    //返回值
    uint32_t            regdata;                //定义数据变量


    if (tmr_id == ALT_WDOG_CPU)
    {
        regdata = alt_read_word(CPU_WDTGPT_TMR_BASE + WDOG_CTRL_REG_OFFSET);
        alt_write_word(CPU_WDTGPT_TMR_BASE + WDOG_CTRL_REG_OFFSET, regdata | WDOG_TMR_ENABLE);
        ret = ALT_E_SUCCESS;
    }
    else if ((tmr_id == ALT_WDOG0) || (tmr_id == ALT_WDOG0_INIT))
    {
        regdata = alt_read_word(ALT_L4WD0_WDT_CR_ADDR);
        alt_write_word(ALT_L4WD0_WDT_CR_ADDR, regdata | ALT_L4WD_CR_WDT_EN_SET_MSK);
        ret = ALT_E_SUCCESS;
    }
    else if ((tmr_id == ALT_WDOG1) || (tmr_id == ALT_WDOG1_INIT))
    {
        regdata = alt_read_word(ALT_L4WD1_WDT_CR_ADDR);
        alt_write_word(ALT_L4WD1_WDT_CR_ADDR, regdata | ALT_L4WD_CR_WDT_EN_SET_MSK);
        ret = ALT_E_SUCCESS;
    }
    return  ret;
}

/****************************************************************************************/
/* 重新加载计数器的倒数计时器,并重启看门狗定时器                                       */
/* 可以在看门狗定时器计数结束前任意时刻重启定时器                                       */
/* 本质上是清除中断                                                                     */
/****************************************************************************************/
ALT_STATUS_CODE alt_wdog_reset(ALT_WDOG_TIMER_t tmr_id)
{
    uint32_t                regdata;        //定义读数据


    if (tmr_id == ALT_WDOG_CPU)
    {
        regdata = alt_read_word(CPU_WDTGPT_TMR_BASE + WDOG_LOAD_REG_OFFSET);
        alt_write_word(CPU_WDTGPT_TMR_BASE + WDOG_LOAD_REG_OFFSET, regdata);     //验证硬件操作

        if (cpu_wdog_in_wdt_mode())
        {
            alt_write_word((CPU_WDTGPT_TMR_BASE + WDOG_RSTSTAT_REG_OFFSET), WDOG_RST_STAT_BIT);   //根据当前模式,清除复位位
        }
        else
        {
            alt_write_word((CPU_WDTGPT_TMR_BASE + WDOG_INTSTAT_REG_OFFSET), WDOG_INT_STAT_BIT);   //清除中断状态位
        }
    }
    else if ((tmr_id == ALT_WDOG0) || (tmr_id == ALT_WDOG0_INIT))
    {
        alt_write_word(ALT_L4WD0_WDT_CRR_ADDR, WDOG_RESET_KEY);               //重启计数器,清除看门狗0定时器中断
    }
    else if ((tmr_id == ALT_WDOG1) || (tmr_id == ALT_WDOG1_INIT))             //重启计数器,清除看门狗1定时器中断
    {
        alt_write_word(ALT_L4WD1_WDT_CRR_ADDR, WDOG_RESET_KEY);
    }
    else { return  ALT_E_BAD_ARG; }
    return ALT_E_SUCCESS;
}

ARM链接器支持分散加载机制,可通过一个描述性分散文件(*.scat)指定链接生成可执行影响存储器映射情况,使开发人员完全控制映像各部分的组织、布局情况。分散文件通常用于控制需要复杂存储器映射的映像。

创建分散文件OnchiioRAM.scat,选择File->New->Other ,在Scatter File Editor中选择Scatter File

流水灯仅需对映像存储器映射进行控制,控制映像在片内65KB的OnchipRAM连续的存储区域加载执行,地址映射为0xFFFF0000~0xFFFFFFFF,编辑该分散文件内容如下:

PCRAM 0xFFFF0000 0x10000
{
    ;APP code region
    APP_CODE +0
    {
        *(+RO,+RW,+ZI)
    }
    ;Application heap and stack
    ARM_LIB_STACKHEAP 0xFFFF8000 EMPTY 0x8000
    {}
}

保存编辑好的Scatter文件并保存该文件,再次打开该文件即可看到映像加载区和执行区两种存储器映像视图

编辑主程序文件main.c,使板上LED呈现流水灯实验现象

/************/
/*LedWater example*/
/************/

#include <stdio.h>
#include "hwlib.h"
#include "alt_watchdog.h"
#include "socal\socal.h"
#include "socal\hps.h"
#include "socal\alt_gpio.h"
#include "socal\alt_rstmgr.h"
#include "socal\alt_l4wd.h"
#include "hps_0.h"

void delay(int time);    //delay function declaration

int main()
{
	int i = 0x01000000;
	int j = 0x00000001;
    alt_wdog_start (ALT_WDOG0);                              //start the watchdog
	alt_write_word(ALT_RSTMGR_BRGMODRST_ADDR, 0x00000000);   //remove bridge reset mode
	alt_write_word(ALT_GPIO1_SWPORTA_DDR_ADDR,0x0F000000);   //set GPIO1 direction as output

	while( 1 )
	{
		alt_write_word(ALT_GPIO1_SWPORTA_DR_ADDR,        i);   //update led state controled by GPIO1 value
	    alt_write_word(ALT_LWFPGASLVS_OFST + LED_PIO_BASE, j); //update led state controled by FPGA peripheral

		if ( (i & 0x0F000000) == 0x08000000 )i = 0x01000000;
		else
			i = i << 1;
		if ( (j & 0x0000000F) == 0x00000008 )j = 0x00000001;
		else
			j = j << 1;
        delay(100000000);  //delay
		alt_wdog_reset(ALT_WDOG0);    //kick the watchdog
    }
	return 1;
}
void delay(int time)
{
	int k;
	for( k=0; k<time; k++ );
}

2.2 项目编译

在编译之前需要为ARM Linker指定生成可执行程序所需的分散文件OnchiioRAM.scat

在Properties中选择ARM Linker->Image Layout,选择文件

在注册单选择Project->Build Project或者工程名右键Build Project
编译过程中可在Console窗口查看相关信息,整个编译过程为先启动ARM C Compiler进行编译生成目标文件,再启动ARM C Linker链接为可执行程序,最后生成LedWater.axf可执行程序映象

将之前生成的software\spb_bsp\uboot-socfpga\spl\u-boot-spl拷贝至当前目录,将.sof文件下载之FPGA中即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SOC FPGA是一种将FPGA和处理器相结合的芯片,可以实现数字信号处理、存储和控制等多种功能。EDIB是一种高速总线通信协议,主要应用于数据中心和网络设备领域。 基于SOC FPGA的高速EDIB总线通信电路设计,需要考虑以下几个方面: 首先,需要选用一款SOC FPGA芯片,能够支持EDIB协议,并具有足够的逻辑资源和高速串行通信接口。 其次,需要设计相应的信号处理和控制电路,以实现EDIB协议中的数据传输、时序控制、错误检测等功能。这部分电路可以使用硬件逻辑实现,也可以使用高层次综合工具进行软件/硬件交互设计。 最后,需要考虑电路的高速设计和信号完整性。设计过程中需要遵循高速布局和布线的原则,以确保信号在传输过程中不会失真或受到外界干扰。 以上是基于SOC FPGA的高速EDIB总线通信电路设计的主要考虑因素。通过合理的设计和实现,可以实现高效、稳定的数据传输和控制。 ### 回答2: 基于SOC FPGA的高速EDIB总线通信电路设计,是一项较为复杂的工程,需要涉及到数字系统设计、通信协议、高速电路设计等多个方面。 首先,要对所需的通信协议进行了解和设计,确定数据通信协议和控制信号协议,合理地分配不同信号和数据在总线上的传输规则,并考虑其时序、同步和数据完整性等因素。 其次,对于高速电路设计,需要根据通信协议的要求,设计总线驱动电路和接收电路,包括输出驱动器、输入缓存器和滤波器等电路。同时,还需要考虑信号相位和噪声干扰等因素对总线传输的影响,并进行相应的优化和调试。 最后,针对基于SOC FPGA设计,需要深入理解FPGA内部结构和各种资源的使用方法,选择合适的时钟资源和数据流水线实现方案,并进行底层的仿真验证和功能测试,确保总线通信电路的正确性和稳定性。 总的来说,基于SOC FPGA的高速EDIB总线通信电路设计需要多方面的知识和技能,并需要经过严格的设计和测试流程才能保证其可靠性和稳定性。 ### 回答3: 基于SoC FPGA的高速EDIB总线通信电路设计是一种针对SoC FPGA芯片应用的通信电路设计方案。EDIB总线是嵌入式数字接口总线的简称,它是一种高速低功耗的数字信号接口技术,专门用于FPGA和各种数字外设之间的数据传输。该设计方案采用了较为先进的SoC FPGA芯片,结合EDIB总线技术实现了快速稳定的数据传输。 在该方案中,主要的设计原则包括选用合适的SoC FPGA芯片,搭建合适的电路板以及利用EDIF总线技术进行数据传输。SoC FPGA芯片作为该电路的核心部件,主要负责将数据传输至各种数字外设上,并保证高速稳定的数据传输。对于电路板的设计,需要充分考虑电路板的布局和引脚分配等因素,保证整个电路板具有良好的电气性能和机械可靠性。而EDIB总线技术则是该电路设计的关键之一,使用EDIB总线技术可以实现高速低功耗的数字信号接口,有效地减少了通信过程中的数据传输延迟、功耗和干扰等问题,实现了更加可靠的数据传输。 总的来说,该方案是一种基于SoC FPGA芯片和EDIB总线技术实现的高速稳定的通信电路设计方案,对于各种数字外设的数据传输具有较强的适用性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值