SOPC电子钟.docx
《SOPC电子钟.docx》由会员分享,可在线阅读,更多相关《SOPC电子钟.docx(29页珍藏版)》请在冰豆网上搜索。
SOPC电子钟
摘要
本文介绍基于NiosⅡ的电子时钟的设计方法,在文章中主要分为硬件设计和软件设计两个部分。
在设计的过程中,采用QuartersⅡ作为仿真平台。
在各个部分中,给出每一步的设计方法。
读者只要根据所给的方法做,就能设计好一个完整的电子时钟。
关键字NiosⅡQuartersⅡ电子时钟设计方法
第一章设计要求与软硬件规划
在本章中我将给出一个电子钟的软、硬件方案设计以及系统功能和一些具体的功能实现等。
1.1系统功能
电子钟的功能包括下面两个方面:
1、在液晶屏上显示时间、日期、状态提示;
2、对时间、日期能够进行设置。
1.2硬件系统组成规划
1.2.1需要的硬件设备
在硬件系统组织规划中系统需使用的外围器件包括下面四个方面:
1、LCD:
电子钟显示屏幕;
2、按钮:
电子钟设置功能键;
3、Flash存储器:
存储硬件和程序;
4、SRAM存储器:
程序运行时将其导入SRAM。
在SOPCBuilder中建立系统要添加的模块包括:
1、NiosⅡ32bitsCPU;
2、定时器;
3、按键PIO;
4、LCDDisplay;
5、外部RAM总线(Avalon三态桥);
6、外部RAM接口;
7、外部Flash接口;
8、重新配置请求PIO;
9、JTAGUARTInterface;
10、EPCSSerialFlashController。
1.2.2端口定义
在系统中需要对一些端口进行定义,具体的定义方式在下面的表中给出:
序号
名称
输入/输出
描述
1
clk
In
时钟输入,50MHz
2
reset_n
In
复位输入
3
in_port_to_the_button_[3..0]
In
4个按键输入
4
be_n_to_the_ext_ram[3..0]
Out
字节选择
5
ext_ram_bus_address[22..0]
Out
SRAM地址
6
ext_ram_bus_data[31..0]
Inout
SRAM数据
7
read_n_to_the_ext_flash
Out
FLASH输出使能(即读信号)
8
read_n_to_the_ext_ram
Out
SRAM输出使能
9
select_n_to_the_ext_flash
Out
FLASH片选信号
10
select_n_to_the_ext_ram
Out
SRAM片选信号
11
write_n_to_the_ext_flash
Out
FLASH写信号
12
write_n_to_the_ext_ram
Out
SRAM写信号
13
LCD_E_from_the_lcd_display
Out
LCD使能信号
14
LCD_RW_from_the_lcd_display
Out
LCD读写信号
15
LCD_RS_from_the_lcd_display
Out
LCD端口寻址信号
16
LCD_data_to_and_from_the_lcd_display[6..0]
Inout
LCD数据
17
bidir_port_to_and_from_the_reconfig_request_pio
Inout
重新配置请求
1.2软件系统规划
软件功能包括显示、设置和时间算法三大部分。
1.2.1显示部分
显示部分分为下面几个部分:
(1)显示时间(小时:
分钟:
秒)
(2)显示日期(年-月-日)
(3)显示状态提示(如BeijingTime、Sethour等等)
1.2.2设置部分
设置功能包括设置小时、分钟、年份、月份、日期和退出设置。
编写程序前对开发板上4个功能键的分配如下:
(1)主菜单
SW0:
设置选择键,可依次选择设置小时、分钟、年份、月份、日期
SW1:
显示日期键
SW2:
显示时间键
(2)子菜单(即进入到对某个对象设置后的键盘功能)
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”,暂停计时,这样能更清楚地看到设置值的变化。
而在设置年或月或日时,因为计时单位较小,计时值的变化一般不会影响到日期的值,所以可以使begin=0,边设置日期边计时。
(3)按键处理子程序handle_button_press(FILE*lcd)是一个主要的子程序。
它首先采用多分支if…elseif…else形式,根据flag的取值,执行不同的程序块。
在每一个条件下(如flag=0,flag=1,……,flag=5),又采用开关(switch)分支结构,根据edge_capture的值判断应执行哪个程序段。
flag=0
flag=1
flag=2
flag=3
flag=4
flag=5
进入主菜单
进入小时设置子菜单
进入分钟设置子菜单
进入年份设置子菜单
进入月份设置子菜单
进入日期设置子菜单
按键所代表的十六进制数
哪个按键被按下
SW0
SW1
SW2
SW3
edge_capture取值(十六进制)
0x1
0x2
0x4
0x8
下面以表格形式给出按键处理子程序进行处理的关键步骤。
具体的工作过程如下面所示:
(1)flag初始值为0(主菜单模式),若要设置小时,则用户按下SW0,则调用timer_set子程序,flag变为1,并在lcd上显示相应的提示信息,提示用户对小时进行设置;
(2)因为此时flag=1,则进入小时设置子菜单,若用户按动SW1,则调用增加小时数值子程序,若用户按动SW2,则调用减小小时数值子程序当flag=1时,若按下SW0,则调用timer_set子程序,且flag变为2……
第二章硬件部分设计
2.1创建工程
硬件部分的设计可以分为下面几个设计过程:
1、创建一个QuartusⅡ工程
2、启动QuartusⅡ6.0
3、创建工程quartus_nios2_project
①法建立一个工程,取名为quartus_nios2_project.qpf,选择元件为Cyclone库的EP1C20F400C7
②新建设计文件quartus_nios2_project.bdf
③在设计文件中依次添加一些引脚,增添结果如下图所示:
具体的方法如下面所示:
(1)将“C:
\altera\kits\nios2\examples\verilog\niosII_cyclone_1c20\standard”中所有文件拷入自己新建的工作目录elec_timer_std;
(2)在QuartusⅡ6.0中打开其中的standard.qpf文件;
(3)打开顶层图形文件standard.bdf;
(4)根据实际需要删除或添加引脚,对引脚重命名。
对引脚的命名结果如下图所示:
2.2创建NiosⅡ系统模块
1、启动SOPCBuilder
(1)在QuartusⅡ6.0中执行“Tools>SOPCBuilder”命令,则出现CreateNewSystem设置向导;
(2)在“SystemName”栏中输入系统名称first_nios2_system;
(3)点击OK按钮,弹出AlteraSOPCBuilder主窗口;
(4)在Target-Board选择NiosDevelopmentBoardCyclone(EP1C20);
(5)在Clock-clk中输入50,具体情况如下面所示:
注意:
要在QuartusⅡ6.0中启动SOPCBuilder,事先必须已打开了相应的QuartusⅡ工程!
如果系统已经有NiosⅡ系统模块,此时要修改已有的NiosⅡ系统模块,具体的的方法如下:
(1)在standard.bdf文件中双击std_1c20,则自动打开SOPCBuilder;
(2)在SOPCBuilder的模块表中将不用组件(或称模块)的Use复选框去掉;更改某些组件的名称;删除不用的组件(如systemID);添加所需的新组件;
(3)如果需要,还可以右击cpu,选择“Edit”,对该cpu的类型、InstuctionsCaches大小等选项重新进行设置。
具体情况如下表所示:
2.3添加CPU和外围器件
添加CPU和外围器件需从SOPCBuilder的元件池中选择以下元件加入到当前系统中:
NiosⅡ32bitCPU、JTAGUART接口、定时器、按键PIO、LCDDisplay、外部RAM总线(Avalon三态桥)、外部RAM接口、外部Flash接口和新配置请求PIO。
2.3.1添加NiosⅡ32bitCPU
添加NiosⅡ32bitCPU的方法如下面所示:
(1)在模块池的AvalonModule下选择NiosⅡProcessor-AlteraCorporation;
(2)点击Add,出现设置向导(默认名为cpu_0);
(3)在NiosⅡCore页中选择NiosⅡ/S,在Caches&TightlycoupledMemoris页中选择InstuctionsCaches为4Kbytes,在JTAGDebugModule页中选择Level1;
(4)点击Finish返回主窗口,将cpu_0重命名为cpu。
情况如下图所示:
2.3.2添加JTAGUARTInterface
添加JTAGUARTInterface,具体的做法如下面所示:
(1)在模块池中选择Communication->JTAGUART,点击Add,会出现JTAGUART-jtaguart_0的设置向导;
(2)保持系统默认的选项,点击Finish,返回主窗口;将jtaguart_0重命名为jtag_uart。
具体的情况如下图所示:
2.3.3添加定时器
添加定时器的方法如下所示:
在模块池中选择Other->Intervaltimer,点击Add,会出现AvalonTimer-timer_0的设置向导
(1)在InitialPeriod栏中选择“1msec”,在PresetConfiguration栏中选择“Full-featured”;
(2)点击Finish,返回主窗口,将timer_0重命名为system_timer。
2.3.4添加外部存储Flash接口
在模块池中选择memory->FlashMemory(CommonFlashInterface),点击Add,会出现FlashMemory(CommonFlashInterface)-cfi_flash_0的设置向导。
(1)根据所使用的开发板,在Presets项选择Flash器件为AMD29LV065D-120R;
(2)其余保持系统默认的选项,点击Finish,返回主窗口;
将cfi_flash_0重命名为ext_flash。
2.3.5添加外部RAM接口
根据开发板类型在元件池中选择相应的SRAM,在本例中选择EP1C20->IDT71V416SRAM,点击Add,会出现SRAM(twoIDT71V416chips)-sram_0的设置向导;在Attributes栏中,确定存储器大小为1024KB;其余保持系统默认的选项,点击Finish,返回主窗口;将sram_0重命名为ext_ram。
结果如下图所示:
2.3.6添加外部RAM总线
AvalonTri-StateBridge是Nios处理器与FPGA片外存储器之间相互通信的桥梁。
在模块池中选择Bridge->AvalonTri-StateBridge,点击Add,会出现AvalonTri-StateBridge-tri_state_bridge_0的设置向导;保持系统默认的选项,点击Finish,返回主窗口;将tri_state_bridge_0重命名为ext_ram_bus。
2.3.7添加ButtonPIO
在模块池中选择Other->PIO(ParallelI/O),点击Add,会出现AvalonPIO-pio_0的设置向导;确定以下选项:
Width为4bits,Direction选中Inputportonly,则使能了InputOptions栏;点击InputOptions标签页;在EdgeCaptureRegster域选取Synchronouslycapture;选择FallingEdge;在Interrupt域选取GenerateIRQ;选择Edge;点击Finish,返回主窗口;将pio_0重命名为button_pio。
在添加按键PIO组件时,在InputOptions标签页中,在EdgeCaptureRegster域不要选择“EitherEdge”,而应选择FallingEdge。
否则当按动按键时,按键被按下和弹起所产生脉冲的两个边沿都将被捕获到,则计数器会跳动两次。
如果是加1计数器,则每按动按键一次,计数器会加2。
2.3.8添加重新配置请求PIO
重新配置请求PIO可使器件根据其它外围设备的输入自动进行重新配置。
选择Other->PIO(ParallelI/O),点击Add,会出现AvalonPIO-pio_0的设置向导;添加方法与添加其它PIO的过程一样,不同的是设置以下属性:
width设为1bit,在Direction中选择Bidirectional(tri-state)ports选项,其余设置均保持默认选项;
点击Finish,返回主窗口;将AvalonPIO-pio_0重命名为reconfig_request_pio。
2.3.9添加LCDDisplay
在模块池中选择Display->CharacterLCD(16ⅹ2optrex16207),点击Add,则直接添加到模块表中,将lcd_16207_0重命名为lcd_display。
情况如下所示:
2.4指定基地址
(1)在SOPCBuilder的模块表中点击ext_flash,并修改其Base为0x0,此时会在信息栏出现基地址冲突错误,如图所示;
(2)选中ext_flash那一行,执行Module->LockBaseAddress菜单命令,会在ext_flash的基地址旁边出现一个锁子的图标;
(3)执行System->AutoAssignBaseAddress菜单命令。
使SOPCBuilder给其它没有锁定的地址重新分配地址,则之前出现的那些错误信息都消失了。
结果如下图所示:
2.5系统设置
选择NiosⅡMore”cpu”Settings标签页,按照下图所示对系统进行设置。
2.6生成NiosⅡ系统模块
(1)选择SystemGerneration标签页
(2)在SystemGerneration中选中HDL选项;如果安装了ModelSim软件并需要仿真此设计,可以选择Simulation选项;
(3)点击Generate,则生成系统模块,成功则显示“SUCCESS:
SYSTEMGENERATIONCOMPLETED”;
(4)点击Exit退出SOPCBuilder。
2.7将NiosⅡ系统模块的符号添加到BDF文件
在生成过程中,SOPCBuilder会生成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中执行“Processing->StartCompilation”命令,进行全编译。
2.8配置FPGA
在QuartusⅡ6.0中执行“Tools->Programmer”命令,将quartus_nios2_project.sof下载到目标板上。
第三章软件部分设计
3.1创建工程
创建一个NiosⅡIDE工程分为下面几个步骤:
(1)启动NiosⅡIDE6.0
既可以在“开始>所有程序>Altera”中启动,也可以直接在SOPCBuilder的SystemGeneration标签页中单击“RunNiosⅡIDE”按钮来启动。
则弹出如下对话框,提示用户选择一个工作空间来存储所有的工程,选择系统默认的目录即可。
(2)建立新的软件工程elec_timer_std
执行File->New->C/C++application命令;在弹出的NewProject对话框中,Name栏填入新建软件工程名elec_timer_std,SOPCBuilderSystem栏选择刚才修改的NiosⅡ系统模块std_1c20,CPU项选择cpu,左侧的SelectProjectTemplete域中,选择BlankProject,点击next;在弹出的对话框中选择creatanewsystemnamed…单选钮,点击Finish,则在QuartusⅡ的工作目录elec_timer_std下自动生成software文件夹,新创建的工程elec_timer_std会出现在C/C++工程浏览器中,同时会自动创建一个系统库工程<软件工程名>_syslib。
新建C/C++工程如下所示:
创建软件工程后的NiosⅡIDE工作界面
若事先已创建好一个软件工程,当启动NiosⅡIDE后没有打开该工程,则需要将它们导入,导入的方法如下面所示:
(1)执行File->Import命令;
(2)在弹出的Import对话框中,选择“ExistingProjectintoWorkspace”,单击“Next”;
(3)在弹出的对话框中单击Browse,则弹出“浏览文件夹”对话框,选择事先已创建好的软件工程所对应的文件夹elec_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”菜单命令,或点击鼠标右建,选择new>headfile,在弹出的对话框中,键入time.h。
(2)创建源文件
在C/C++工程浏览器中,选择elec_timer_std,点击鼠标右建,选择new>file,在弹出的对话框中,键入time.c。
(3)编译工程
在左侧的C/C++工程浏览器中,选择elec_timer_std,点击鼠标右键,在弹出菜单中选择BuildProject;或执行“Project>BuildAll”菜单命令。
编译完成后会在Task浏览器中显示警告和错误信息。
(4)运行程序
NiosⅡIDE提供三种运行平台,分别为NiosⅡHardware、NiosⅡInstructionSetSimulator和NiosⅡModelSim;这里选择NiosⅡHardware作为平台。
具体步骤如下所示:
(1)执行Run->Run命令,弹出Run对话框;
(2)在左边的Configration栏双击NiosⅡHardware,出现运行设置对话框,在Main标签页中选择工程名为elec_timer_std,在TargetConnection标签页中确认JTAGcable栏中为与目标板相连的下载电缆;
(3)然后单击Run,将程序下载到FPGA中;
若没有错误,则按动开发板上的按键,在线测试设计是否满足预定的功能。
运行设置对话框
程序不可能一次就运行成功,如果需要的话我们可以在线调试程序,具体的调试过程如下,NiosⅡIDE提供了两种调试平台,分别为NiosⅡHardware和NiosⅡInstructionSetSimulator;这里选择NiosⅡHardware作为平台。
调试步骤如下:
(1)选择Run->Debug,在弹出的对话框中,确认左边的Configration选中NiosⅡHardware,main标签页中选择工程名为elec_timer_std,在TargetConnection标签页中确认JTAGcable栏中为与目标板相连的下载电缆;
(2)单击Debug按钮,则启动调试器。
NiosⅡIDE在调试界面的Run菜单中提供以下几种调试方式:
(1)StepInto(F5):
单步跟踪时进入子程序;
(2)StepOver(F6):
单步跟踪时执行子程序,但不进入子程序;
(3)Resume(F8):
从当前代码处继续运行;
(4)RuntoLine(Ctrl+R):
运行到断点停止;
3.2.2将程序和硬件下载到外部Flash中
许多NiosⅡ处理器系统都使用外部存储器来存储:
程序代码、程序数据、FPGA的配置数据和文件系统。
因此可以将程序和FPGA的配置数据下载到Flash中,使系统能够脱机运行。
这时我们需要下载程序,程序的下载步骤如下所示:
(1)执行Tools->FlashProgrammer命令,启动编程器;
(2)在“FlashProgrammer”界面中单击“New”按钮,在Main标签页中选中“Programsoftwareprojectintoflashprogrammer”复选框;在Project栏中填入要下载软件的工程名elec_timer_std;则在NiosⅡELFExecutable中和TargetHardware中均为系统默认选项(不可选);选中“ProgramFPGAconfigurationdataintohardware-imageregionofflashprogrammer”复选框,并确认在FPGAConfiguration(sof)栏中是要下载的硬件目标文