SOPC-电子钟._第1页
SOPC-电子钟._第2页
SOPC-电子钟._第3页
SOPC-电子钟._第4页
SOPC-电子钟._第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、摘要本文介绍基于Nios 的电子时钟的设计方法,在文章中主要分为硬件设计和软件设计两个部分。在设计的过程中,采用Quarters作为仿真平台。在各个部分中,给出每一步的设计方法。读者只要根据所给的方法做,就能设计好一个完整的电子时钟。关键字 Nios Quarters 电子时钟 设计方法第一章 设计要求与软硬件规划在本章中我将给出一个电子钟的软、硬件方案设计以及系统功能和一些具体的功能实现等。 1.1 系统功能电子钟的功能包括下面两个方面:1、在液晶屏上显示时间、日期、状态提示;2、对时间、日期能够进行设置。1.2 硬件系统组成规划1.2.1 需要的硬件设备在硬件系统组织规划中系统需使用的外围

2、器件包括下面四个方面:1、LCD:电子钟显示屏幕;2、按钮:电子钟设置功能键;3、Flash存储器:存储硬件和程序;4、SRAM存储器:程序运行时将其导入SRAM。在SOPC Builder中建立系统要添加的模块包括:1、Nios 32bits CPU;2、定时器;3、按键PIO;4、LCD Display ;5、外部RAM总线(Avalon 三态桥) ;6、外部RAM接口;7、外部Flash接口;8、重新配置请求PIO;9、JTAG UART Interface;10、EPCS Serial Flash Controller。1.2.2 端口定义 在系统中需要对一些端口进行定义,具体的定义方

3、式在下面的表中给出:序号名称输入/输出描述1clk In时钟输入,50MHz2reset_n In复位输入3in_port_to_the_button_3.0In4个按键输入4be_n_to_the_ext_ram3.0Out字节选择5ext_ram_bus_address22.0OutSRAM地址6ext_ram_bus_data31.0Inout SRAM数据7read_n_to_the_ext_flash OutFLASH输出使能(即读信号)8read_n_to_the_ext_ram OutSRAM输出使能9select_n_to_the_ext_flash OutFLASH片选信号1

4、0select_n_to_the_ext_ram OutSRAM片选信号11write_n_to_the_ext_flash OutFLASH写信号12write_n_to_the_ext_ram OutSRAM写信号13LCD_E_from_the_lcd_display OutLCD使能信号14LCD_RW_from_the_lcd_display OutLCD读写信号15LCD_RS_from_the_lcd_display OutLCD端口寻址信号16LCD_data_to_and_from_the_lcd_display6.0Inout LCD数据17bidir_port_to_an

5、d_from_the_reconfig_request_pio Inout 重新配置请求1.2 软件系统规划软件功能包括显示、设置和时间算法三大部分。1.2.1 显示部分 显示部分分为下面几个部分:(1) 显示时间(小时:分钟:秒)(2) 显示日期(年-月-日)(3) 显示状态提示(如Beijing Time、Set hour等等)1.2.2 设置部分设置功能包括设置小时、分钟、年份、月份、日期和退出设置。编写程序前对开发板上4个功能键的分配如下:(1)主菜单SW0:设置选择键,可依次选择设置小时、分钟、年份、月份、日期SW1:显示日期键SW2 :显示时间键(2)子菜单(即进入到对某个对象设置

6、后的键盘功能)SW1 :对象数字增加SW2 :对象数字减少SW3 :退出,返回主菜单1.2.3软件系统规划(1) 时间累加(2) 确定每个月的最大天数,使年、月、日能够正确累加1.2.4 电子钟主程序流程图系统的电子钟的主流程图如下面所示:1.2.5 程序的设计说明(1) 显示日期是调用display_day(lcd)子程序,在lcd上显示年-月-日;(2) 显示时间是调用display_time(lcd)子程序,在lcd上显示小时:分钟:秒。当begin=0时开始计时;当begin=1时,暂停计时。一旦有按键按下,当选择设置小时或分钟时,则将begin置为“1”,暂停计时,这样能更清楚地看到

7、设置值的变化。而在设置年或月或日时,因为计时单位较小,计时值的变化一般不会影响到日期的值,所以可以使begin=0,边设置日期边计时。 (3) 按键处理子程序handle_button_press(FILE * lcd) 是一个主要的子程序。它首先采用多分支ifelse ifelse形式,根据flag的取值,执行不同的程序块。在每一个条件下(如flag=0,flag=1,flag=5),又采用开关(switch)分支结构,根据edge_capture的值判断应执行哪个程序段。flag=0flag=1flag=2flag=3flag=4flag=5进入主菜单进入小时设置子菜单进入分钟设置子菜单进

8、入年份设置子菜单进入月份设置子菜单 进入日期设置子菜单按键所代表的十六进制数哪个按键被按下SW0SW1SW2SW3edge_capture取值(十六进制)0x10x20x40x8下面以表格形式给出按键处理子程序进行处理的关键步骤。具体的工作过程如下面所示:(1)f lag初始值为0(主菜单模式),若要设置小时,则用户按下SW0,则调用timer_set子程序,flag变为1,并在lcd上显示相应的提示信息,提示用户对小时进行设置;(2) 因为此时flag=1,则进入小时设置子菜单,若用户按动SW1,则调用增加小时数值子程序,若用户按动SW2,则调用减小小时数值子程序 当flag=1时,若按下S

9、W0,则调用timer_set子程序,且flag变为2第二章 硬件部分设计2.1 创建工程 硬件部分的设计可以分为下面几个设计过程:1、创建一个Quartus工程2、启动Quartus 6.03、创建工程quartus_nios2_project法建立一个工程,取名为quartus_nios2_project.qpf,选择元件为Cyclone库的EP1C20F400C7 新建设计文件quartus_nios2_project.bdf 在设计文件中依次添加一些引脚,增添结果如下图所示:具体的方法如下面所示:(1)将“C:alterakitsnios2examplesverilog niosII_

10、cyclone_1c20standard”中所有文件拷入自己新建的工作目录elec_timer_std;(2) 在Quartus 6.0中打开其中的standard.qpf文件;(3) 打开顶层图形文件standard.bdf;(4) 根据实际需要删除或添加引脚,对引脚重命名。对引脚的命名结果如下图所示:2.2 创建Nios 系统模块1、启动SOPC Builder (1) 在Quartus 6.0中执行“ToolsSOPC Builder”命令,则出现Create New System设置向导;(2) 在“System Name”栏中输入系统名称first_nios2_system;(3)

11、点击OK按钮,弹出Altera SOPC Builder主窗口;(4) 在Target-Board选择Nios Development Board Cyclone(EP1C20) ;(5) 在Clock-clk中输入50,具体情况如下面所示:注意:要在Quartus 6.0中启动SOPC Builder,事先必须已打开了相应的Quartus 工程!如果系统已经有Nios 系统模块,此时要修改已有的Nios 系统模块,具体的的方法如下:(1) 在standard.bdf文件中双击std_1c20,则自动打开SOPC Builder ;(2) 在SOPC Builder的模块表中将不用组件(或称模

12、块)的Use复选框去掉;更改某些组件的名称;删除不用的组件(如system ID);添加所需的新组件;(3) 如果需要,还可以右击cpu,选择“Edit”,对该cpu的类型、 Instuctions Caches大小等选项重新进行设置。具体情况如下表所示: 2.3 添加CPU和外围器件添加CPU和外围器件需从SOPC Builder的元件池中选择以下元件加入到当前系统中: Nios 32bit CPU、 JTAG UART 接口、定时器、按键PIO、LCD Display、外部RAM总线(Avalon 三态桥)、外部RAM接口、外部Flash接口和新配置请求PIO。2.3.1 添加Nios 3

13、2bit CPU 添加Nios 32bit CPU的方法如下面所示:(1) 在模块池的Avalon Module下选择 Nios Processor-Altera Corporation;(2) 点击Add,出现设置向导(默认名为cpu_0);(3) 在Nios Core页中选择Nios /S,在Caches & Tightly coupled Memoris页中选择Instuctions Caches为4 Kbytes,在JTAG Debug Module页中选择Level 1;(4) 点击Finish返回主窗口,将cpu_0重命名为cpu。情况如下图所示:2.3.2 添加JTAG UART

14、 Interface添加JTAG UART Interface,具体的做法如下面所示:(1) 在模块池中选择Communication-JTAG UART,点击Add,会出现JTAG UART-jtag uart_0的设置向导;(2) 保持系统默认的选项,点击Finish,返回主窗口;将jtag uart_0重命名为jtag_uart。具体的情况如下图所示:2.3.3 添加定时器添加定时器的方法如下所示:在模块池中选择Other-Interval timer,点击Add,会出现Avalon Timer-timer_0的设置向导(1) 在Initial Period栏中选择“1 msec”,在P

15、reset Configuration栏中选择“Full-featured”;(2) 点击Finish,返回主窗口,将timer_0重命名为system_timer 。2.3.4 添加外部存储Flash接口在模块池中选择memory-Flash Memory(Common Flash Interface),点击Add,会出现Flash Memory(Common Flash Interface)-cfi_flash_0的设置向导。(1) 根据所使用的开发板,在Presets项选择Flash器件为AMD29LV065D-120R;(2) 其余保持系统默认的选项,点击Finish,返回主窗口;将c

16、fi_flash_0重命名为ext_flash。2.3.5 添加外部RAM接口根据开发板类型在元件池中选择相应的SRAM,在本例中选择EP1C20-IDT71V416 SRAM ,点击Add,会出现SRAM(two IDT71V416 chips)-sram_0的设置向导;在Attributes栏中,确定存储器大小为1024KB;其余保持系统默认的选项,点击Finish,返回主窗口;将sram_0重命名为ext_ram。结果如下图所示:2.3.6 添加外部RAM总线Avalon Tri-State Bridge是Nios处理器与FPGA片外存储器之间相互通信的桥梁。在模块池中选择Bridge-

17、 Avalon Tri-State Bridge,点击Add,会出现Avalon Tri-State Bridge-tri_state_bridge_0的设置向导;保持系统默认的选项,点击Finish,返回主窗口;将tri_state_bridge_0重命名为ext_ram_bus。2.3.7 添加Button PIO在模块池中选择Other- PIO(Parallel I/O),点击Add,会出现Avalon PIO-pio_0的设置向导;确定以下选项:Width为4bits,Direction选中Input port only,则使能了Input Options栏;点击Input Opti

18、ons标签页;在Edge Capture Regster域选取Synchronously capture;选择Falling Edge;在Interrupt域选取Generate IRQ;选择Edge;点击Finish,返回主窗口;将pio_0重命名为button_pio。在添加按键PIO组件时,在Input Options标签页中,在Edge Capture Regster域不要选择“Either Edge”,而应选择Falling Edge。否则当按动按键时,按键被按下和弹起所产生脉冲的两个边沿都将被捕获到,则计数器会跳动两次。如果是加1计数器,则每按动按键一次,计数器会加2。2.3.8

19、添加重新配置请求PIO重新配置请求PIO可使器件根据其它外围设备的输入自动进行重新配置。选择Other- PIO(Parallel I/O),点击Add,会出现Avalon PIO-pio_0的设置向导;添加方法与添加其它PIO的过程一样,不同的是设置以下属性:width设为1bit,在Direction中选择Bidirectional(tri-state) ports选项,其余设置均保持默认选项;点击Finish,返回主窗口;将Avalon PIO- pio_0重命名为reconfig_request_pio。2.3.9添加LCD Display在模块池中选择Display- Charact

20、er LCD(162 optrex 16207),点击Add,则直接添加到模块表中,将lcd_16207_0重命名为lcd_display。情况如下所示:2.4 指定基地址(1) 在SOPC Builder的模块表中点击ext_flash,并修改其Base为0x0,此时会在信息栏出现基地址冲突错误,如图所示;(2) 选中ext_flash那一行,执行Module-Lock Base Address菜单命令,会在ext_flash的基地址旁边出现一个锁子的图标;(3) 执行System-Auto Assign Base Address菜单命令。使SOPC Builder给其它没有锁定的地址重新分

21、配地址,则之前出现的那些错误信息都消失了。结果如下图所示: 2.5 系统设置选择Nios More ”cpu” Settings标签页,按照下图所示对系统进行设置。 2.6 生成Nios 系统模块(1) 选择System Gerneration标签页(2) 在System Gerneration中选中HDL选项;如果安装了ModelSim软件并需要仿真此设计,可以选择Simulation选项;(3)点击Generate,则生成系统模块,成功则显示“SUCCESS:SYSTEM GENERATION COMPLETED”;(4) 点击Exit退出SOPC Builder。2.7将Nios 系统模

22、块的符号添加到BDF文件在生成过程中,SOPC Builder会生成Nios 系统模块的符号(Symbol),可以将该符号像添加其它Quartus符号一样添加到当前项目的BDF文件quartus_nios2_project.bdf中(1)双击BDF文件空白处,出现Symbol对话框,选择Project-first_nios2_system(2) 点击OK按钮,将其添加到BDF文件中;(3) 将first_nio2_system模块与输入输出引脚相连,指定目标器件,并进行引脚锁定,完成系统的硬件设计;(4) 保存BDF文件。(5)编译Quartus 的工程设计文件在Quartus 6.0中执行“

23、Processing-Start Compilation”命令,进行全编译。2.8 配置FPGA在Quartus 6.0中执行“Tools-Programmer”命令,将quartus_nios2_project.sof下载到目标板上。第三章软件部分设计3.1 创建工程创建一个Nios IDE 工程分为下面几个步骤:(1) 启动Nios IDE 6.0既可以在“开始所有程序Altera”中启动,也可以直接在SOPC Builder 的System Generation标签页中单击“Run Nios IDE”按钮来启动。则弹出如下对话框,提示用户选择一个工作空间来存储所有的工程,选择系统默认的目

24、录即可 。 (2) 建立新的软件工程elec_timer_std 执行File-New-C/C+ application命令;在弹出的New Project对话框中,Name栏填入新建软件工程名elec_timer_std,SOPC Builder System栏选择刚才修改的Nios 系统模块std_1c20 ,CPU项选择cpu,左侧的Select Project Templete域中,选择Blank Project,点击next;在弹出的对话框中选择creat a new system named 单选钮,点击Finish,则在Quartus 的工作目录elec_timer_std下自动

25、生成software文件夹,新创建的工程elec_timer_std会出现在C/C+工程浏览器中 ,同时会自动创建一个系统库工程_syslib。新建C/C+工程如下所示:创建软件工程后的Nios IDE 工作界面若事先已创建好一个软件工程,当启动NiosIDE后没有打开该工程,则需要将它们导入,导入的方法如下面所示: (1) 执行File-Import命令;(2) 在弹出的Import对话框中,选择“Existing Project into Workspace”,单击“Next”;(3) 在弹出的对话框中单击Browse,则弹出“浏览文件夹”对话框,选择事先已创建好的软件工程所对应的文件夹e

26、lec_timer_std ,单击“确定”,再单击Finish,则此工程会添加到工作区;再将系统库工程elec_timer_std _syslib也导入。3.2 建立源文件time.c和头文件time.h 3.2.1创建源文件time.h 创建源文件time.h的步骤如下所示:(1) 创建头文件在Nios IDE左侧的C/C+工程浏览器中,选择elec_timer_std,执行“File new file”菜单命令,或点击鼠标右建,选择newhead file,在弹出的对话框中,键入time.h。(2) 创建源文件在C/C+工程浏览器中,选择elec_timer_std ,点击鼠标右建,选择n

27、ewfile,在弹出的对话框中,键入time.c。(3) 编译工程在左侧的C/C+工程浏览器中,选择elec_timer_std,点击鼠标右键,在弹出菜单中选择Build Project;或执行“Project Build All”菜单命令。编译完成后会在Task浏览器中显示警告和错误信息。 (4) 运行程序Nios IDE提供三种运行平台,分别为Nios Hardware、 Nios Instruction Set Simulator和Nios ModelSim;这里选择Nios Hardware作为平台。 具体步骤如下所示:(1) 执行Run-Run命令,弹出Run对话框;(2) 在左边的

28、Configration栏双击Nios Hardware ,出现运行设置对话框,在Main标签页中选择工程名为elec_timer_std,在Target Connection标签页中确认JTAG cable栏中为与目标板相连的下载电缆;(3) 然后单击Run,将程序下载到FPGA中;若没有错误,则按动开发板上的按键,在线测试设计是否满足预定的功能。运行设置对话框程序不可能一次就运行成功,如果需要的话我们可以在线调试程序,具体的调试过程如下,Nios IDE提供了两种调试平台,分别为Nios Hardware和 Nios Instruction Set Simulator;这里选择Nios H

29、ardware作为平台。调试步骤如下:(1) 选择Run-Debug,在弹出的对话框中,确认左边的Configration选中Nios Hardware ,main标签页中选择工程名为elec_timer_std,在Target Connection标签页中确认JTAG cable栏中为与目标板相连的下载电缆;(2) 单击Debug按钮,则启动调试器。Nios IDE在调试界面的Run菜单中提供以下几种调试方式:(1) Step Into(F5):单步跟踪时进入子程序;(2) Step Over(F6):单步跟踪时执行子程序,但不进入子程序;(3) Resume(F8):从当前代码处继续运行;

30、(4) Run to Line(Ctrl+R):运行到断点停止;3.2.2 将程序和硬件下载到外部Flash中许多Nios 处理器系统都使用外部存储器来存储:程序代码、程序数据、FPGA的配置数据和文件系统。因此可以将程序和FPGA的配置数据下载到Flash中,使系统能够脱机运行。这时我们需要下载程序,程序的下载步骤如下所示:(1) 执行Tools-Flash Programmer命令,启动编程器;(2) 在“Flash Programmer”界面中单击“New”按钮,在Main标签页中选中“Program software project into flash programmer”复选框;

31、在Project栏中填入要下载软件的工程名elec_timer_std;则在Nios ELF Executable中和Target Hardware中均为系统默认选项(不可选);选中“Program FPGA configuration data into hardware-image region of flash programmer”复选框,并确认在FPGA Configuration(sof)栏中是要下载的硬件目标文件standard.sof ;(3) 单击Program Flash按钮,即可完成对flash的编程。具体的结果如下所示:3.2.3 关键变量说明 程序中定义了下面的变量,

32、下面对变量进行说明:static alt_u8 hour;/小时static alt_u8 minute;/分钟static alt_u8 second;/秒static alt_u16 year;/年份static alt_u8 month;/月份static alt_u8 day;/日期static alt_u8 max_day;/当前月份最后一天时间变量static int flag;/设置按键标志变量static int begin;/是否开始计时标志变量volatile int edge_capture; /按键响应变量,针对Button PIO, 被volatile修饰,代表了某个

33、被按下的键,程序中采用volatile修饰变量edge_capture ,这是操作系统内核编程经常用到的一个修饰关键字。如果将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化。一般说来,3.2.4 操作lcd 的设计系统中使用了Altera提供的一个极其简易的lcdOptrex16207,在官方文档Altera Embedded Peripherals中,能找到所提供的应用程序的操作接口。已给的lcd驱动,支持应用程序以文件读写的方式控制这个字符类设备(文件读写只对字符类设备有效),因此,对lcd的控制代码如下:3.2.5 Button PIO以中断的设计Button

34、PIO以中断的形式与应用程序通信,该设备的初始化程序比较特殊,也是整个软件设计的一个难点。参考Altera官方文档中有关于中断编程的介绍,给出按键初始化程序片断: /在设备初始化时,要进行中断设置、中断处理子程序注册等操作 static void init_button_pio() /强制类型转化,获取一个指向中断寄存器的指针,保存中断的返回值 void* edge_capture_ptr = (void*)&edge_capture; /中断的初始配置 IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0xf); /往中断寄存器里写0,重置 IO

35、WR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0x0); /注册一个中断处理子程序handle_button_interrupts()alt_irq_register(BUTTON_PIO_IRQ,edge_capture_ptr,handle_button_interrupts);/按键中断处理子程序static void handle_button_interrupts(void* context,alt_u32 id) volatile int* edge_capture_ptr = (volatile int*)context; /通过读寄

36、存器,获取中断的返回值,保存到edge_capture_ptr指向的存储空间中 *edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE); /往中断寄存器里写0,重置,即允许了下一次,同时结束本次中断处理 IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0);3.2.6 time.h的设计下面我给出time.h的头文件,具体的设计在后面给出,头文件源码如下:#ifndef _TIME_H_#define _TIME_H_#include “alt_types.h“ /

37、定义了HAL的数据类型#include /定义了I/O库所用到的某些宏和变量#include #include “system.h“ /提供了关于Nios 系统硬件的软件描述#include sys/alt_irq.h#include altera_avalon_pio_regs.h#define ESC 27#define ESC_TOP_LEFT “1;0H“/ LCD第1行第0列#define ESC_COL2_INDENT3 “2;3H“/ 第2行第3列#define ESC_COL2_INDENT2 “2;2H“/ 第2行第2列#define ESC_CLEAR “K“/ 清屏#de

38、fine ESC_COL1_INDENT5 “1;5H“/ 第1行第5列3.2.7 time.c源码设计 在上面的基础上,下面我给出time.c的源代码,代码如下:#include time.h/*1. 函数声明(共21个子函数) */static void init_button_pio();/按键初始化函数static void handle_button_interrupts(void* context,alt_u32 id);/按键中断处理函数static void lcd_init(FILE * lcd);/LCD初始化函数static void initial_time();/时间

39、初始化函数static void last_day(); /获取每个月的最后一天的函数 static void display_day(FILE * lcd );/LCD上显示日期函数static void display_time(FILE * lcd );/LCD上显示时间函数static void handle_button_press(FILE * lcd);/按键处理函数static void timer_set(FILE* lcd);/选择设置对象函数static void clear(FILE* lcd);/LCD清屏函数static void exit_set();/退出设置函数/*函数声明 */ static void set_houri(); /小时数增加函数static void set_hourd(); /小时数减少函数static void set_minutei();static void set_minuted();static void set_yeari();static void set_yeard();static void set_monthi();static void set_monthd();static void set_da

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论