1 / 46

NO.3.1

NO.3.1. SOPC 技术. 第 5 章 Nios II 系统的外围设备. 4. 使用 IDE Flash Programmer 编程.

cleave
Download Presentation

NO.3.1

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

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

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

  5. 使用IDE Flash Programmer编程,首先要保证在SOPC Builder中,在Target选项区中的Board的下拉列表框中选择用户当前使用的目标板Flash 编程设计。 SmartSOPC_Board_1C6是现用核心板提供的目标板Flash编程设计,可以对核心板上的NOR Flash(元件标号U7)和EPCS (元件标号U10)进行编程。

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

  7. 若选中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)。 (5) 在Main页面中可以选择所要编程的内容,包括工程名称、FPGA配置文件的名称以及目标存储器。

  8. 图5.5.2 Flash Programmer对话框

  9. (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, 程序才能正常运行。

  10. 图5.5.3 Flash Programmer 中目标连接设置

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

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

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

  14. UART内核的结构框图

  15. UART内核寄存器映射

  16. UART内核配置选项 1、波特率设置 2、数据位、停止位、奇偶校验位 3、流控制 4、Avalon流控制传输

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

  18. 实验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+"); //打开文件进行读和写

  19. 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; }

  20. 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

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

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

  23. JTAG UART核方框图

  24. 缺省的深度值(64)IRQ门限值(8)是最优的,不用改变缺省的深度值(64)IRQ门限值(8)是最优的,不用改变 JTAG UART核配置

  25. 软件编程 HAL用户应通过HAL API和ANSI C 标准库访问JTAG-UART,而不是访问JTAG-UART寄存器。 对JTAG UART核的操作与下列文件有关。 altera_avalon_jtag_uart_regs.h altera_avalon_jtag_uart.h altera_avalon_jtag_uart.c

  26. #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); } 例:使用标准库通过JTAG UART核读和发送一个消息

  27. 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; }

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

  29. 定时器内核结构框图

  30. 定时器寄存器

  31. 1. 状态寄存器(status)

  32. 2. 控制寄存器(control)

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

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

  35. 定时器内核(interval timer)配置选项 Timeout Period:设置periodl 和 periodh 寄存器的初始值,此值可根据系统输入时钟频率和initial period中的设置计算获得。

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

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

  38. 定时器提供了硬件的寄存器级访问和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中) 软件设计

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

  40. 【实验4.5】利用系统时钟服务产生1s的周期性事件,并借此控制LED闪烁【实验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" //系统时钟服务头文件

  41. #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" #endif #define LEDCON 0xff static alt_alarm alarm; //按调用API函数规定定义的变量 static unsigned char led = 0xff;

  42. 功能:按调用规定系统时钟回调函数,在该函数中实现用户功能功能:按调用规定系统时钟回调函数,在该函数中实现用户功能 入口参数: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(); }

  43. 功能:初始化LED_PIO为输出,其余输入,屏蔽中断,清边沿捕获寄存器功能:初始化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); }

  44. 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; }

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

More Related