NO.3.1 SOPC技术 第5章 Nios II 系统的外围设备.

Slides:



Advertisements
Similar presentations
主讲:王幸民 理学院计算机基础教学部.
Advertisements

现代电子技术实验 ——综合实验之单片机部分
什么是SOPC: SOPC是英文System On a Programmable Chip的缩写,称为片上可编程系统。SOPC将传统的EDA技术、计算机系统、嵌入式系统、数字信号处理等融为一体,综合了各自的优势,且在结构上形成一块芯片。 为什么用SOPC:SOPC是现代电子技术和电子系统设计的发展趋势,建立了电子系统设计的新模式。用户利用SOPC开发平台,自行设计高速、高性能的DSP处理器、特定功能的CPU及其外围接口电路,创建结构最为简洁的电子系统。
C语言程序设计 主讲教师 :张群燕 电话:
第2章 SOPC硬件开发环境及流程.
第一章 C语言概述 计算机公共教学部.
補充: Input from a text file
序列埠通訊.
基于操作系统的编程复习 张玉宏
所有培训资料均可从网站 何宾 Tel: 版权所有,禁止未经授权的商业使用行为 何宾 Tel: 所有培训资料均可从网站
C程序设计 第10章 文 件 主讲教师: 鲁 萍 西安建筑科技大学 理学院.
第十三章 文件.
电工电子实验中心.
第一章 嵌入式系统开发基础 本章介绍了嵌入式系统开发的基础知识,从嵌入式计算机的历史由来、嵌入式系统的定义、嵌入式系统的基本特点、嵌入式系统的分类及应用、嵌入式系统软硬件各部分组成、嵌入式系统的开发流程、嵌入式技术的发展趋势等方面进行了介绍,涉及到嵌入式系统开发的基本内容,使读者系统地建立起的嵌入式系统整体概念。
所有培训资料均可从网站 何宾 Tel: 版权所有,禁止未经授权的商业使用行为 何宾 Tel: 所有培训资料均可从网站
複習 struct score_Type{ int chinese,english; }; struct my_Type{
C File System.
CH2 開發環境介紹 最簡單的互動設計 – Arduino一試就上手 孫駿榮、吳明展、盧聰勇.
主讲教师:吴琼 微信群:C语言2016 QQ群: 密码scu2016 昵称:“真名+学号”
C的發展史 C程式初體驗 C程式設計基本注意事項 上機實習課程
PIC16F1827介紹 以微控器為基礎之電路設計實務-微處理器實驗室.
计算概论 第二十一讲 文件操作 北京大学信息学院.
Timer & KEYPAD 11/24.
Bootloader技术分析.
YM100开发实验板 演讲人:熊小燕 2009年月12月16日
程序讲解 第一题: 将指定文件的m行到n行字符写到显示屏上,m和n值从键盘输入。 运行时输入及结果: please enter m,n:
C 程式設計— 檔案處理 台大資訊工程學系 資訊系統訓練班.
Function.
怎样从0开始写bootloader? 李明 北京亚嵌教育研究中心
EDA 原理及应用 何宾
程序设计专题一 结构化程序设计与递归函数 主讲教师: 刘新国.
11.1 文件的基本概念 11.2 文件的打开与关闭 11.3 文件的顺序读写 11.4 文件的随机读写 11.5 文件检测
初始化串列通訊埠 在啟始串列傳輸介面時有以下3個步驟:假設傳輸的通訊協定為9600bps,傳送8個位元資料,沒有同位位元,1個停止位元。
第7章 编译预处理 本章要求: 本章重点: 本章难点: 掌握用#define定义无参数宏和带有参数宏定义和调用方法;
第十二章 文件 12.1 C文件概述 文件:存储在外部介质上数据的集合,是操作系统数据管理的单位 文件分类 按文件的逻辑结构: 按存储介质:
fp=fopen("CD2.dat","wb"); fwrite(&min,8,1,fp); fclose(fp);
重點 資料結構之選定會影響演算法 選擇對的資料結構讓您上天堂 程式.
File(檔案處理) 學習目標:開檔、讀檔、更新檔與關閉檔案.
THE C PROGRAMMING LANGUAGE
任务九 基于BasicRF的无线传感网络应用
第10章 檔案與資料夾處理 10-1 C語言的檔案輸入與輸出 10-2 文字檔案的讀寫 10-3 二進位檔案的讀寫
Instructor:Po-Yu Kuo 教師:郭柏佑
第9章 文件操作 文件 使用文件的目的 操作系统管理数据的基本单位 存储在外存储器上的数据的集合
計數式重複敘述 for 迴圈 P
组员:吴迪&王柳杨&金虎&陈武荣&谭金柏
第5讲 结构化程序设计(Part II) 周水庚 2018年10月11日.
研讨课4 文件操作.
第九章 预处理命令.
一、文件的基本概念 第十三章 文 件 所谓“文件”是指一组相关数据的有序集合。 这个数据集有一
程式結構&語法.
第3章 變數、算術運算、 數學函數及輸入輸出.
ARM Developer Suite 介 绍.
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
本节内容 文件读写 视频提供:昆山爱达人信息技术有限公司.
第一章 C语言概述 目录 什么是语言、程序 C语言的历史与发展 C语言的书写形式与程序结构 运行C语言的步骤与方法
第二章 类型、对象、运算符和表达式.
第二章ADS1.2开发环境创建与简介.
第13章 文 件.
C 程式設計— 檔案處理 台大資訊工程學系 資訊系統訓練班.
結構、檔案處理(Structure, File)
第1章程序设计和C语言.
第六章 S3C2410的串口UART及编程 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)
MPLAB IDE 8 建立專案.
单片机应用技术 (C语言版) 第4章 C51程序设计入门
第七章 文件 7.1 文件的基本概念 7.2 文件类型指针 7.3 文件的打开与关闭 7.4 文件的读/写 7.5 文件的随机读/写
第6章 嵌入式软件开发基础.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
C语言程序设计 第13章 文件操作.
Presentation transcript:

NO.3.1 SOPC技术 第5章 Nios II 系统的外围设备

4. 使用IDE Flash Programmer编程   完成所有的软/硬件开发工作后,可以使用NiosⅡ IDE提供的Flash Programmer工具将程序下载到FPGA平台上的FLASH存储器中。Flash Programmer是NiosⅡ IDE 6.0提供的新工具,它可以将配置数据、NiosⅡ程序及其他数据文件下载到目标板上的FLASH存储器中,这里所说的FLASH存储器包括业界标准的CFI或CFI兼容的FLASH存储器,以及Altera公司的EPCS系列串行配置器件。 IDE提供flash programmer功能,以帮助用户对flash进行管理和编程

IDE Flash Programmer 通过2个过程将数据写入flash: (1)用Altera提供的“Flash编程设计”对FPGA进行配置; (2) IDE Flash Programmer将文件内容→ “Flash编程设计” → Flash

每个Flash编程设计应包含的元件:

使用IDE Flash Programmer编程,首先要保证在SOPC Builder中,在Target选项区中的Board的下拉列表框中选择用户当前使用的目标板Flash 编程设计。 SmartSOPC_Board_1C6是现用核心板提供的目标板Flash编程设计,可以对核心板上的NOR Flash(元件标号U7)和EPCS (元件标号U10)进行编程。 SOPC Builder使用“目标板flash编程设计”就象用外设元件一样,不同的是外设原件描述的是系统和外设的连接关系,而前者描述系统和电路板之间的关系。前者提供了对flash进行编程所需的全部信息,包括flash的容量、引脚连接等。创建“目标板flash编程设计”方法见5.12

  使用NiosⅡIDE对FLASH存储器编程的步骤: 启动Nios II IDE。 建立软件工程,然后编译连接(Build Project) 选中要进行编程的工程,然后选Tools>Flash Programmer菜单启动Flash Programmer对话框,如图5.5.2。 单击Flash Programmer对话框左下角的New命令按钮,建立一个新编程任务,可以修改这个新任务的名称。

(5) 在Main页面中可以选择所要编程的内容,包括工程名称、FPGA配置文件的名称以及目标存储器。 若选中program software project into flash memory project,可将工程的.elf文件写入Flash(EPCS)。 若选中program FPGA configuration data into hardware-image region of flash memory,可将FPGA的配置文件写入Flash(EPCS)。 若选中Program file into a flash memory选项,可将二进制文件写入Flash。需要选择要编程的二进制文件及要编程的存储器(U7为Flash,U10为EPCS)。

注意:如果在SOPC Builder中没有指定目标板(smartSOPC_Board_1C6),program flash按钮将是灰色不能使用。 在Project中填入要下载软件的工程名,如hello_led_0;在Nios Ⅱ ELF Executable中填入 .elf文件名,如hello_led_.elf;在FPGA Configuration中填入要下载的硬件配置程序文件,如SmallCore.sof。这样对各个选项按照当前软、硬件配置设置好后,点击Program Flash就可将软、硬件程序下载到Flash目标板上的Flash中(如图5.46所示)。再次复位开发板时,开发板就直接在user模式下运行,即导入的是用户设计的软、硬件程序。 图5.5.2 Flash Programmer对话框

(4) 在Target Connection页面中选择与目标板相连的下载电缆,如图5.5.3。 (5) 设置好这些内容之后,单击Apply按钮,然后单击Program Flash按钮,NiosⅡ IDE重新编译工程并对FLASH存储器进行编程。(若在SOPC Builder中没有指定目标板,则Program Flash按钮将是灰色不能使用。) 从IDE的Console窗口可以看见编程过程。(见图5.5.4) 完成Flash编程后,需让系统重新上电,使FPGA使用EPCS中配置数据重新配置FPGA, 程序才能正常运行。 完成Flash编程后,由于当前的EPCS中的配置上烧写Flash的配置,所以写入Flash的用户程序并不会马上运行。需让系统重新上电,(使FPGA使用EPCS中配置数据重新配置FPGA?),程序才能正常运行。

图5.5.3 Flash Programmer 中目标连接设置

在console窗口显示编程过程及编程结束标志 图5.5.4

通信接口 目前存在的所有计算机通信接口在嵌入式领域中都有其广泛的应用,应用最为广泛的接口设备包括 RS-232接口(串口UART) USB接口(通用串行总线接口) IrDA(Infra Red Data Association-红外线接口) SPI(串行外围设备接口)、 I2C、CAN总线接口、 蓝牙接口(Bluetooth) Ethernet(以太网接口)、 IEEE1394接口和通用可编程接口GPIO。

5.5 UART内核 UART(Universal Asynchronous Receiver/Transmitter通用异步接收器/发生器)内核带有Avalon接口,为嵌入式系统和外部设备提供了串行字符流动通信方式,其数据以RS-232协议的形式与外界进行交互。 提供可调整的波特率;可配置奇偶校验位、停止位和数据位等。 UART是字符型外设,SOPC Builder提供了UART内核

UART内核的结构框图 NiosII处理器通过访问寄存器来控制内核 内核提供一个高电平有效中断请求输出,接收和发送时请求一个中断。 7,8或9位的txdata保持寄存器和发送移位寄存器 内部波特率时钟通过时钟分频器产生,divisor用来产生波特率时钟 Status每个单独的位反映UART内核的特定状态,control包含控制uart内核操作的位

UART内核寄存器映射 寄存器映射只是对编写内核的驱动程序才有用

UART内核配置选项 1、波特率设置 2、数据位、停止位、奇偶校验位 3、流控制 4、Avalon流控制传输 流控制:选中时,UART硬件包括CTS/RTS端口,Avalon主控器可检测CTS和发送RTS流控制信号

软件编程 Altera提供的驱动程序执行HAL字符模式设备驱动程序。HAL用户应通过熟悉的HAL API函数和ANSI C标准库函数访问UART,而不是访问UART寄存器。 altera_avalon_uart_regs.h 寄存器级访问头文件 altera_avalon_uart.h, altera_avalon_uart.c HAL系统库的UART内核设备驱动程序

实验4.10:ANSI C标准库来访问UART;如果检测到字符’t’,则报告检测到字符’t’;如果检测到字符’v’,则退出程序。 #include<stdio.h> #include<string.h> #include "system.h" int main () { char* msg = "Detected the character 't'.\n"; FILE* fp; char prompt = 0; printf("Please Enter some characters: \n"); fp = fopen (UART_NAME, "r+"); //打开文件进行读和写

if (fp) { while (prompt != 'v') // 循环直至接收到 'v' { prompt = getc(fp); // 从UART中获取字符 if (prompt == 't') { // 如果字符为 't' 打印信息 fwrite (msg, strlen (msg), 1, fp); } if (ferror(fp)) // 检查错误是否在UART连接上出现 clearerr(fp); // 如果是,清除它 fprintf(fp, "Closing the UART file handle.\n"); fclose (fp); else { printf("Fail to open file...\n"); } return 0; }

System.h 描述的UART设备 #define UART_NAME "/dev/uart" #define UART_TYPE "altera_avalon_uart" #define UART_BASE 0x00B00840 #define UART_IRQ 1 #define UART_BAUD 115200 #define UART_DATA_BITS 8 #define UART_FIXED_BAUD 0 #define UART_PARITY 'N' #define UART_STOP_BITS 1 #define UART_USE_CTS_RTS 0 #define UART_USE_EOP_REGISTER 0 #define UART_SIM_TRUE_BAUD 0 #define UART_SIM_CHAR_STREAM "" #define UART_FREQ 48000000

5.6 JTAG-UART内核 具有Avalon接口的JTAG UART核是实现在PC机和FPGA上的SOPC Builder系统间进行串行通信的一种实现方式 JTAG UART用来替代RS-232完成与PC主机的字符输入/输出, NiosII 处理器通过读/写控制和数据寄存器与JTAG UART核通信

5.7 JTAG-UART内核 对于NiosII 处理器, HAL系统库中包含该设备的驱动程序,允许使用ANSI C标准库stdio.h访问JTAG UART核 对PC机, Altera提供JTAG终端软件来管理PC机与目标系统的连接,对JTAG数据流解码和在屏幕上显示字符

JTAG UART核方框图

JTAG UART核配置 缺省的深度值(64)IRQ门限值(8)是最优的,不用改变 较大的值消耗更多的片内存储器资源

软件编程 HAL用户应通过HAL API 和ANSI C 标准库访问JTAG-UART,而不是访问JTAG-UART寄存器。 altera_avalon_jtag_uart_regs.h altera_avalon_jtag_uart.h altera_avalon_jtag_uart.c

例:使用标准库通过JTAG UART核读和发送一个消息 #include <stdio.h> #include <string.h> #include "system.h" int main() { char *msg=“Detected the character ’t’.\n”; FILE *fp; char prompt=0; printf("Please Enter some characters: \n"); fp=fopen(“/dev/jtag_uart”,”r+”); //为读写操作打开文件 If(fp) { while(prompt!=‘v’) //循环直到接收一个”v” { prompt=getc(fp); //从JTAG UART中读取一个字符 if(prompt==‘t’) //若字符是“t”,则输出信息 { fwrite(msg,strlen(msg),1,fp); }

if(ferror(fp)) //检查是否有错误产生 clearerr(fp); } //若有则清除 fprintf(fp,”Closing the JTAG UART file handle.\n”); fclose(fp); } else { printf("Fail to open file...\n"); } return 0; }

5.7 定时器内核 定时器可作为系统的周期性时钟源(Tick);可以作为计数器测定事件发生的时间;作“看门狗”(Watchdog)。 定时器内核特性: 可控制定时器的启动、停止或复位 两种计数模式:单次减一和连续减一计数模式 计数器达到0时产生中断请求(IRQ) 可作为看门狗定时器 可选择输出周期性脉冲 可由软件使能或屏蔽定时器中断

定时器内核结构框图 定时器计数值由periodl和periodh装入;当前计数值由snapl和snaph读出;可输出IRQ、看门狗复位信号、输出周期脉冲到片外

定时器寄存器 寄存器映射只对开发驱动程序的人员有用。如果使用HAL系统库提供的标准的特性,程序开发人员可以不必通过寄存器来直接访问定时器,应该使用HAL API访问定时器。

1. 状态寄存器(status)

2. 控制寄存器(control)

3. periodl & periodh 寄存器 periodl 和 periodh 寄存器一起存储超时周期的计数值。当对此寄存器进行写操作或内部计数器减到0时,保存在periodl &和periodh 中的值会装载到内部计数器中。

4. snapl & snaph 寄存器 5. 中断操作 可通过对snapl & snaph 寄存器的写操作来获取32位内部计数器的当前值。 只要内部计数器减到0且控制寄存器的ITO位设为1,定时器内核就会产生IRQ.用户可用以下任一方式应答IRQ: 清除状态寄存器的TO位,等待下一个超时事件的发生; 通过将控制寄存器的ITO位清零来禁止中断。

定时器内核(interval timer)配置选项 Timeout Period: 设置periodl 和 periodh 寄存器的初始值,此值可根据系统输入时钟频率和initial period中的设置计算获得。 可使用配置向导指定其硬件特性

定时器内核配置选项 Preset Configurations: 提供的预定义硬件配置: Simple periodic interrupt Full-featured Watchdog

当使能以下各项时: Writeable period:主控制器可通过写periodl 和 periodh改变向下计数周期 Readable snapshot:主控制器可读当前向下计数的值 Start/stop control bits:主控制器可通过写控制寄存器的START和STOP位来启动后停止定时器。 Timeout pulse:当定时器计数到0时将输出持续一个周期的高电平。 System reset on timeout:配置定时器用于看门狗。

软件设计 定时器提供了硬件的寄存器级访问和HAL层的API函数: altera_avalon_time_regs.h: 定义内核的寄存器映射并提供硬件设备访问宏定义; altera_avalon_timer.h、altera_avalon_timer_sc.c、 altera_avalon_timer_ts.c、 altera_avalon_timer_vars.c 实现了HAL系统库的定时器设备驱动程序 (在components/altera_avalon_timer中)

软件设计 HAL API提供如下两种定时器设备的驱动程序: 系统时钟定时器---该驱动程序支持报警(alarms)。 时间戳定时器 -----该驱动程序支持高精度的时间测量。 HAL特定的访问定时器设备的API函数在components/altera_hal/HAL/inc/sys/alt_alarm.h和sys/alt_timestamp.h中定义。

【实验4.5】利用系统时钟服务产生1s的周期性事件,并借此控制LED闪烁 #include <stdio.h> #include "system.h" //包含基本的硬件描述信息 #include "altera_avalon_pio_regs.h" //包含基本的IO寄存器信息 #include "alt_types.h" //Altera定义的数据类型 #include "sys/alt_alarm.h" //系统时钟服务头文件

#ifndef LED_PIO_BASE //这是LED_PIO核的基地址 #define LED_PIO_BASE 0xffffffff //user's definition here #endif #if LED_PIO_BASE == 0xffffffff #error "No definition of LED_PIO core...\n" #define LEDCON 0xff static alt_alarm alarm; //按调用API函数规定定义的变量 static unsigned char led = 0xff;

功能:按调用规定系统时钟回调函数,在该函数中实现用户功能 入口参数:context,系统传给回调函数的参数 出口参数:返回下一次的系统时钟服务的周期值 alt_u32 my_alarm_callback (void* context) { if(led == 0xff){ led = 0x00; }else{ led = 0xff; } IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,led); //操作IO口 return alt_ticks_per_second(); }

功能:初始化LED_PIO为输出,其余输入,屏蔽中断,清边沿捕获寄存器 void InitPIO(void) { /* LED_PIO为输出,其余输入 */ IOWR_ALTERA_AVALON_PIO_DIRECTION(LED_PIO_BASE, LEDCON); /* 禁止所有PIO中断 */ IOWR_ALTERA_AVALON_PIO_IRQ_MASK(LED_PIO_BASE, 0x00); /* 清清边沿捕获寄存器 */ IOWR_ALTERA_AVALON_PIO_EDGE_CAP(LED_PIO_BASE, 0x00); }

IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0xff); //灭LED int main() { InitPIO(); IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0xff); //灭LED printf("test alarm...\n"); //打印提示信息 printf("alt_ticks_per_second() is %ld", alt_ticks_per_second()); if (alt_alarm_start (&alarm,alt_ticks_per_second() //启动系统时钟 ,my_alarm_callback,NULL) < 0) printf ("No system clock available\n"); } while(1); //等待时钟事件发生 return 0; 函数原型:int alt_alarm_start (alt_alarm * alarm,alt_u32 nticks,alt_u32(*callback)(void * context),void *context), 功能:启动系统时钟服务(altera_hal/HAL/inc/sys/alt_alarm.h中有其说明,altera_hal/HAL/src/里有alt_alarm_start.c) Alarm:一个指向alt_alarm结构体系类型的指针变量。Nticks:每隔nticks执行一次回调函数。 Callback:用户回调函数指针。 Context:传给回调函数的参数,不需要时填NULL 程序开发者使用HAL API访问定时器设备,HAL API中的参数要用到定时器设备的信息,这些信息在system.h中定义。 Components\altera_avalon_timer(文件夹)\HAL\inc\altera_avalon_timer.h Components\altera_avalon_timer(文件夹)\HAL\src\altera_avalon_timer_sc.c, altera_avalon_timer_ts.c, altera_avalon_timer_vars.c------提供定时器设备的驱动程序的实现

5.8 System ID 内核 SOPC Builder 生成NiosII 系统时,将为每个Nios II系统生成一个标识符,供编译器和用户辨别所运行的程序是否与目标系统匹配。当程序运行在与之不匹配的系统上时会产生不可预测的结果。 系统ID内核寄存器包括ID寄存器(SOPC Builder系统ID)和timestamp寄存器(SOPC Builder 生成时间) 在下载程序运行或调试之前,Nios II IDE 会检查硬件中的系统ID内核是否匹配所期望的软件系统ID,如不匹配,则终止下载。