1、实验3:ucosII实时操作系统 ———————————————————————————————— 作者: ———————————————————————————————— 日期: 2 个人收集整理 勿做商业用途 实验3 uC/os
2、II 实时操作系统 一、实验目的: 1。 掌握PC上安装的硬件设计环境Quartus II和应用程序设计环境Nios II; 2. 了解Nios II让uC/os II跑在DE2—70上实现多任务并发性; 3。 了解基于FPGA的嵌入式系统开发过程。 二、实验步骤: (一)硬件工程的初建:新建“demo_ucos"工程 图3-1 鼠标左键双击桌面上的“Quartus II”快捷方式图标,耐心等待片刻,即可启动 “Quartus II”设计页面,如图3-1所示。 在“Quartus II”设计页面内,鼠标左键单击File-> New Project Wizard,弹出“
3、New Project 图3-2 Wizard:introduction”,如图3-2所示. 鼠标左键单击“next”按钮跳过此页,进入“New Project Wizard: Directory, Name, Top-level entity”页面。 在“New Project Wizard: Directory, Name, Top—level entity”页面: “the working directory for this project”(工程路径)可以任意填写,例如:“E:\demo\demo_ucosii"。 “工程的工作目录”如前“E:\demo\demo_ucos
4、ii",表示将会在E盘上产生一个文件夹“demo”,在“demo”文件夹里产生另一个文件夹“demo_ucosii”(工程文件夹,保存工程文件),此实验后续步骤中产生的各种文件会自动保存到路径“E:\demo\demo_ucosii"下。 “the name of this project”(工程名字)填写为“demo_ucos”。 这里需要注意:由于“SOPC Builer”工具不能识别空格、中划线等符号,故实验所有步骤中如果需要命名,命名中不允许有空格、中划线出现,但“SOPC Builer”工具能识别下划线。 “the name of the top—level design ent
5、ity for this project”(工程顶层实体名称)会自动与工程名字相同,也为“demo_ucos",如图3—3所示.这里需要注意:编写顶层文件时注意这个名字. 图3-3 鼠标左键单击“next”按钮,会弹出如图3—4所示的问句. 图3—4 图3-5 鼠标左键单击“是”按钮,进入“Add Files [page 2 of 5]”页,如图3—5所示。 由于实验到这里还没有建立任何文档,再加上后面步骤中也可以添加,鼠标左键单击“Next”按钮跳过此页,进入“Family & Device Settings [page 3 of 5]”页面。 在“Family & Devic
6、e Settings [page 3 of 5]"页面: “Device family”栏里的“family"选择“Cyclone II”; 图3-6 “Available devices”栏里选择“EP2C70F896C6"器件,其它为缺省设置,如图3-6所示。 鼠标左键单击“next"按钮的话,还会出现第4页EDA工具的设置和第5页的“Summary”,如果用到可以在此设置。由于目前没有用到,所以在这里就可以用鼠标左键单击“Finish”按钮,完成工程的初建。新建的“Quartus II—E:/demo/demo_ucosii/demo_ucos—demo_ucos”工程页面如图3
7、—7所示。 图3-7 在“Quartus II—E:/demo/demo_ucosii/demo_ucos-demo_ucos”工程页面,“entity”栏下,可以看到“Cyclone II: EP2C70F896C6"和工程名字“demo_ucos”. 这里需要注意:工程初建过程牵涉到几个方面,过程中的步骤没有先后之分。例如,完成“Quartus II”工程的初建后,如果发现“entity"栏里不是“Cyclone II: EP2C70F896C6”,比如是“Stratix II: AUTO”,如图3-8所示. 图3—8 鼠标左键双击或者箭头指着“Stratix II: AUTO”
8、然后鼠标单击右键,在下拉菜单里点击“settings”,两种方法都能使“Settings-demo_ucos”的设置页(如图3-6所示)弹出,在“Device"中可以重新设置。 图3-9 初建的“Quartus II—E:/demo/demo_ucosii/demo_ucos—demo_ucos”工程页面,会自动保存在路径“E:\demo\demo_ucosii”下,如果在“Quartus II”工程页面关闭时想要完成工程后续设计,可以打开此路径下的工程文件夹“demo_ucosii”,如图3—9所示。 鼠标左键双击带有蓝色“Quartus”图标的“demo_ucos”文件,就可以打开“
9、Quartus II—E:/demo/demo_ucosii/demo_ucos—demo_ucos”工程页面。 (二)利用“SOPC Builder”工具配置硬件 事实上,为了方便可以把实验2的硬件配置拷贝到实验3来用。 在“Quartus II—E:/demo/demo_ucosii/demo_ucos-demo_ucos"工程页面,鼠标左键单击“open"按钮,弹出“打开”对话框。在对话框“查找范围"选择实验2所在的路径“E:/demo/demo_MEMtest",把此路径下的“nios0.sopc"文件拷贝到实验3所在的路径“E:/demo/demo_ucosii”下. 鼠
10、标左键双击“nios0。sopc"文件,打开后可以重新配置硬件。有些在实验3需要用到的硬件可以保留,有些用不到的硬件可以一个个删除:鼠标左键单击硬件名称使其蓝色高亮,然后单击硬件默认显示栏下的“Remove”按钮,即可删去此硬件。 为了加深印象,这里还是把重新建立实验3工程的“SOPC Builder”工具页面全过程列出来供参考。 图3-10 在“Quartus II-E:/demo/demo_ucosii/demo_ucos-demo_ucos”工程页面,鼠标左键单击Tools—〉 SOPC Builder,弹出“Create New System”对话框. 在“Create New
11、 System”对话框里: “System Name”项后输入“nios0”(也可以取其他名称); “Target HDL"项一般选择“Verilog”。 如图3—10所示. 鼠标左键单击“OK”按钮,弹出配置这个工程硬件的“SOPC Builder”工具页面,如图3—11所示。 在“SOPC Builder"工具页面可以添加实现此工程所需硬件,形成良好的硬件系统.添加的硬件会在默认空白区出现,并且可以修改、删除,在默认空白区还显示硬件的主从连接. “Target HDL”项一般选择“Verilog",表示“SOPC Builder”会将你稍后所配置的IP,以Verilog表示,
12、若你熟悉VHDL,也可以选择VHDL。这里的设定不是限制了日后只能用Verilog或VHDL写代码,因为Quartus II本来就允许Verilog与VHDL混合編程,也就是说Verilog的module可以使用VHDL的entity,VHDL的entity可以使用Verilog的module,最后都能顺利编译. 图3-11 图3-12 这里需要注意:如果配置硬件的过程中暂停设计,关闭“SOPC Builder"工具页面会弹出一个问句,如图3-12所示。鼠标左键单击“Save”按钮,建立的硬件系统信息就保存到路径“E:/demo/demo_ucosii”下的文件“nios0。sopc”中
13、 如果需要再次打开此工程的“SOPC Builder"工具页面想要完成后续的硬件配置,可以先打开“Quartus II—E:/demo/demo_ucosii/demo_ucos-demo_ucos”工程页面(方法如图3-9所示),在工程页面内,鼠标左键单击“open”按钮弹出“打开”页面。在“查找范围"找到路径“E:\demo\demo_ucosii”下的“nios0。sopc”文件,鼠标左键双击 “nios0。sopc” 文件即可打开此工程的“SOPC Builder"工具页面. (三)配置硬件 1.定义时钟 图3-13 确认“SOPC Builder”工具页面的“Tar
14、get/Device Family”是“Cyclone II"。在如图3-13所示的“Clock Settings”栏里可以看到50.0MHz,代表Nios II CPU在DE2-70可以运行在50.0MHz,但这时CPU降频在跑,正常情況下,Nios II CPU在DE2-70可以运行100.0MHz,所以可以用PLL将clk倍频成100.0Mhz. 2.增加用来保存 Nios程序的片上存储器(On Chip Memory(RAM or ROM)) “On Chip Memory”在FPGA芯片内,是DE2-70上所有存储器中存储量最小,但是速度最快的存储器。 在“SOPC Bui
15、lder”工具页面,鼠标左键单击System Contents—> Component Library—〉 Memories and Memory Controllers -> On Chip -〉 On Chip Memory(RAM or ROM) —〉 Add 。弹出“on chip memory"设置页面,如图3-14所示。在“on chip memory”设置页面: 图3-14 “Total Memory Size”设置为80960; 其他为缺省设置,鼠标左键单击“Finish”按钮。不用管状态框里的错误,添加 Nios处理器后会自动消失。 “Total memory s
16、ize”与能使用的M4K存储器数量、FPGA、Nios II CPU和Megafunction(如fcfifo)都会影响“On—chip Memory”的size,本教程使用 80k. 图3-15 “On Chip Memory”会在“SOPC Builder"工具页面默认空白区有显示如图3—15所示。如果想修改“On Chip Memory"的设置,可以左键双击硬件名称,会重新弹出如图3-14所示的设置页面. 对于其他硬件来说,方法类似. 把“onchip_memory2_0”改成“onchip_mem”。 3.添加Nios II/s处理器(Nios II Processor
17、 在“SOPC Builder"工具页面,鼠标左键单击System Contents-〉Component Library->Nios II Processor —> Add,弹出“Nios II Processor"设置页面。 在“Nios II Processor”设置页面:设置Nios II/f处理器, “Reset Vector”指向“cfi_flash",“Exception Vector"指向“onchip_mem” ,如图3-16所示。这里需要注意:如果在添加CPU之后才添加“cfi_flash”,一定要记住回头修改CPU的“Reset Vector”,使其指向“cfi_f
18、lash”。鼠标左键单击“Finish"按钮,把“cpu_0”改成“cpu”。 图3—16 4.添加调试接口(JTAG—UART) 在“SOPC Builder”工具页面,鼠标左键单击System Contents—>Component Library—〉Interface Protocols —〉 Serial —> JTAG UART —>Add,弹出“JTAG UART”设置页,如图3—17所示.使用缺省设置,鼠标左键单击 “Finish”按钮。 图3-17 把“jtag_uart_0"改成“jtag_uart”。 JTAG UART是PC与SOPC进行序列传输的一种方式
19、也是Nios II CPU标准的输出/输入设备。如printf()通过JTAG UART,经过USB Blaster将输出结果显示在PC的Nios II EDS上的console,scanf()通过USB Blaster经过JTAG UART将输入传给SOPC。 5.添加两个内部定时器(Interval Timer) 图3-18 在“SOPC Builder"工具页面,鼠标左键单击System Contents->Component Library->Peripherals —〉Microcontroller Peripherals -〉 Interval Timer —〉Add,
20、弹出“Interval Timer"设置页,按照图3-18所示设置,鼠标左键单击“Finish”按钮。 把“timer_0”改成“timer”。 同样方法再添加一个“time_1",把名字改为“timestamp". 6.添加系统ID(System ID) 图3-19 在“SOPC Builder”工程页面,鼠标左键单击System Contents-〉Component Library—>Peripherals—〉 Debug and Performance—> System ID Peripheral—〉Add,弹出“System ID peripheral”设置页面,如图3
21、19所示。使用缺省设置,鼠标左键单击“Finish”按钮,把“sysid_0"的名称改为“sysid". “SOPC Builder”会使用System ID为每个系统提供识别符号,Nios II EDS可以识别符号防止使用者往FPGA上烧录了与“。ptf”不符合的“.sof”. 7.增加PLL 本实验需要两个时钟:(1) 100MHz的C0,用于“nios0”硬件系统总线的clk_c0_cpu;(2) 100MHz的C1 ,用于SDRAM的clk_c1_sdram。这里需要注意:c1的“Clock phase shift"设置为-65deg,对SDRAM超频,使实验数据更漂亮。
22、 在“SOPC Builder”工具页面,鼠标左键单击System Contents->Component Library—> PLL—〉 PLL —> Add。在弹出的对话框里,鼠标左键单击“Launch Altera’s ALTPLL MegaWizard”,使按钮周框内侧出现虚方框,如图3-20所示。 图3-20 图3-21 鼠标左键单击“next”按钮,进入ALTPLL多项设置页面.默认进入的页面是: 1 parameter settings栏的“General / Modes"设置页,显示为: 1 parameter settings为深兰色背景,“General / Mod
23、es”为General / Modes ,如图3—21左上角所示,此页缺省设置。 鼠标左键单击 2 output clocks栏,默认转换到“c03-Core/External output clocks”的设置页面,在“c03—Core/External output clocks”的设置页面: 2 output clocks为深兰色背景,“clk c0”为clk c0,“clk c0”各参数按照图3-22所示页面设置。 图3-22 图3—23 鼠标左键单击2 output clocks栏下的“clk c1”,进入“c13-Core/External output clocks”的设
24、置页,页面显示: 2 output clocks为深兰色背景,“clk c1”为clk c1,“clk c1"的设置按照图3—23所示。 鼠标左键单击“Finish"按钮,并且单击经过的所有页面的“Finish”按钮。 设置了PLL后,在本工程硬件系统的“SOPC Builder”工具页面,“Clock Settings” 栏下:“clk_0” 改名为“clk_50”; “pll_0_c0” 改名为“clk_c0_cpu”; “pll_0_c1",改名为“clk_c1_sdram”,如图3—24所示。 图3—24 8.增加SDRAM控制器 DE2-70多媒体开发板上有两片容量
25、为32Mbytes的SDRAM(IS42S16160B),按照4M*16*4分布,“Data width”只有16 bit.而Nios II CPU与其他ip都是32 bit,由于Data width不同,传输数据时,Avalon bus会启动Dynamic Bus Sizing机制,2个clk才能完成32 bit传输. 以传输来说,既然Nios II CPU是32 bit,所有的ip都是32 bit,SDRAM的16 bit反而是传输上的瓶颈。此处,将2片16 bit SDRAM合并成1个32 bit SDRAM使用,可以让整个系统顺畅地以32 bit运行,不再需要Avalon bus的D
26、ynamic Bus Sizing机制,充分发挥DE2—70两片SDRAM的优势。 在“SOPC Builder”工具页面,鼠标左键单击System Contents->Component Library -> Memories and Memory Controllers —> SDRAM —〉 SDRAM Controller —〉 Add. 图2-25 图2-26 进入“SDRAM Controller”的多项设置页面,默认进入“Parameter Settings"的 Memory Profile 设置页面,此页面的设置严格按照如图3—25所示.“Data w
27、idth”设置为32bits,注意图3—25所示页面下部的变化,“Memory size”显示“64Mbytes”。这里需要注意:编写顶层文件时,必须让两个SDRAM同步工作,数据也必须是高16位由一个SDRAM进出,低16位由另一个SDRAM进出。 图3-25所示页面完成后,鼠标左键单击“Timing",进入Timing 设置页面。严格按照如图3-26所示设置各参数,设置完成后,鼠标左键单击“Finish”按钮. 将名称改为“sdram". 9.增加字符LCD(Character LCD) 在“SOPC Builder”工具页面的“System Contents”栏中,鼠标左
28、键单击Component Library->Peripherals —〉 Display —> Character LCD —>Add,弹出“Character LCD”设置页图3-27 面,如图3—27所示.使用缺省设置,鼠标左键单击“Finish”按钮,名称改为“lcd”。 10.增加用于FLASH的Avalon三态桥 在“SOPC Builder”工具页面,鼠标左键单击System Contents—〉Component Library —〉 Bridge and Adapters -> Memory Mapped -> Avalon—MM Tristate Bridge -
29、> Add,弹出“Avalon-MM Tristate Bridge”设置页面. 在“Avalon—MM Tristate Bridge”设置页面,所有参数为缺省设置. 鼠标左键单击“Finish"按钮,将名称改为“tristate_bridge_flash"。 提示框里也会有红色提示,先不要管。 11.增加FLASH DE2-70多媒体开发板上有一片容量为2M×16比特(8M 字节)的 FLASH 芯片,型号为S29GL064。 在“SOPC Builder”工具页面,鼠标左键单击System Contents—〉Component Library —〉 Memories
30、and Memory Controllers —> FLASH —> Flash Memory Interface (CFI) -〉 Add。 图3-28 进入 “Flash Memory Interface (CFI)”多项设置页面,默认进入“Parameter Settings”的 Attributes 设置页面,严格按照如图3—28所示设置各参数. 图3-29 然后鼠标左键单击“Timing” 标签,进入“Flash Memory Interface(CFI)”的“Parameter Settings”的 Timing 设置页.严格按照如图3—29所示设置各参数。 设置完成后,
31、鼠标左键单击“Finish”按钮,将名字改为 “cfi_flash”. 此时,硬件添加栏里会出现如图3-30左图所示现象,需要手动将“cfi_flash"和三态桥“tristate_bridge_flash”连接上。(将光标移近“cfi_flash",会自动出现中图所示现象,鼠标左键单击小白圈,其变黑,移开鼠标即变成如右图所示.) 图3-30 手动将“cfi_flash”和三态桥“tristate_bridge_flash”连接后,提示框里的红色提示消失。 12。 添加input PIO 图3-31 在“SOPC Builder”工程页面,鼠标左键单击System Cont
32、ents‐〉Component Library‐>Peripherals ‐〉 Microcontroller Peripherals ‐> PIO(Parallel I/O) ‐> Add,弹出“PIO(Parallel I/O)”多项设置页面。默认进入“Parameter Settings”的“Basic Settings"设置页面,如图3—31所示。 在此页设置:“Width”为 18; “Direction” 为 input;其他为默认值,将该硬件的名称改为“pio_sw”。 13。 添加output PIO 在“SOPC Builder”工具页面,鼠标左键单击Sys
33、tem Contents‐>Component Library‐>Peripherals‐>Microcontroller Peripherals ‐> PIO(Parallel I/O) ‐> Add。弹出“PIO(Parallel I/O)”多项设置页面。 图3-32 在此页设置:“Width"为 18; “Direction” 为 output;其他为默认值,如图3-32所示。 将名称改为“pio_ledr”. 至此,已经完成了“nios0”硬件系统的搭建,结构如图3—33所示。鼠标左键单击各个元器件“Clock”,会出现下拉三角,左键点开下拉三角: “pll”没办法选择,
34、只能是“clk_50"; “sdram"选择“clk_c1_sdram”; 其他器件选择“clk_c0_cpu”。图3-33 (四)产生“.ptf”文件 在“SOPC Builder”工具页面,鼠标左键单击System-> Auto-Assign Base Addresses,菜单自动设置映射地址; 在“SOPC Builder”工具页面,鼠标左键单击System —〉 Auto-Assign IRQs,菜单自动设置中断号. 图3-34 “SOPC Builder”工具页面下部的红色警示会消失。鼠标左键单击“Generate",如果弹出问句,鼠标左键单击“Save"。
35、Generate”过程中,弹出的页面下面有进度提示,如图3—34所示。 当进度提示出现“info:system generation was successful”时“Generate”完成,鼠标左键单击“Exit”按钮退出,如果弹出与上面一样的问句,鼠标左键单击“Save”按钮. “Generate”生成的“.ptf”等文件都自动保存在路径“E:/demo/demo_ucosii”下。 (五)建立顶层文件 下面要在Quartus II里例化“nios0”硬件系统,并且连接芯片的输入输出管腿。这里,采用“Verilog HDL”来编写顶层文件例化“nios0”. 在“Quartus
36、 II—E:/demo/demo_ucosii/demo_ucos—demo_ucos"工程页面,鼠标左键单击File -〉 New -> Verilog HDL File,打开“。v”文件输入区,如图3—35所示。 图3-35 把下列篇幅提供的完整顶层文件拷贝到“。v"文件输入区,然后在“Quartus II-E:/demo/demo_ucosii/demo_ucos—demo_ucos"工程页面内,鼠标左键单击File -> Save As,文件名称设置为“demo_ucos.v",保存在路径“E:/demo/demo_ucosii/”下. 完整的顶层文件(demo_ucos。v
37、)的内容: module demo_ucos ( input iCLK_28, // 28.63636 MHz input iCLK_50, // 50 MHz input iCLK_50_2, // 50 MHz input iCLK_50_3, // 50 MHz input iCLK_50_4, // 50 MHz input iEXT_CLOCK, // External Clock
38、 ////////////////////////////// Push Button //////////////////////// input [3:0] iKEY, // Pushbutton[3:0] ////////////////////////////// DPDT Switch //////////////////////// input [17:0] iSW, // Toggle Switch[17:0] ////////////////////////////// 7—SEG Dispaly ///
39、///////////////////// output [6:0] oHEX0_D, // Seven Segment Digit 0 output oHEX0_DP, // Seven Segment Digit 0 decimal point output [6:0] oHEX1_D, // Seven Segment Digit 1 output oHEX1_DP, // Seven Segment Digit 1 decimal point output [6:0] o
40、HEX2_D, // Seven Segment Digit 2 output oHEX2_DP, // Seven Segment Digit 2 decimal point output [6:0] oHEX3_D, // Seven Segment Digit 3 output oHEX3_DP, // Seven Segment Digit 3 decimal point output [6:0] oHEX4_D, // Seven Segment Digit 4
41、 output oHEX4_DP, // Seven Segment Digit 4 decimal point output [6:0] oHEX5_D, // Seven Segment Digit 5 output oHEX5_DP, // Seven Segment Digit 5 decimal point output [6:0] oHEX6_D, // Seven Segment Digit 6 output oHEX6_DP, // Seve
42、n Segment Digit 6 decimal point output [6:0] oHEX7_D, // Seven Segment Digit 7 output oHEX7_DP, // Seven Segment Digit 7 decimal point //////////////////////////////// LED //////////////////////////// output [8:0] oLEDG, // LED Green[8:0] output [17:0] o
43、LEDR, // LED Red[17:0] //////////////////////////////// UART //////////////////////////// output oUART_TXD, // UART Transmitter input iUART_RXD, // UART Receiver output oUART_CTS, // UART Clear To Send input iUART_RTS, // UA
44、RT Requst To Send //////////////////////////////// IRDA //////////////////////////// output oIRDA_TXD, // IRDA Transmitter input iIRDA_RXD, // IRDA Receiver //////////////////////////////// SDRAM Interface //////////////////////// inout [31:0] DRAM_DQ,
45、 // SDRAM Data bus 32 Bits output [12:0] oDRAM0_A, // SDRAM0 Address bus 12 Bits output [12:0] oDRAM1_A, // SDRAM1 Address bus 12 Bits output oDRAM0_LDQM0, // SDRAM0 Low—byte Data Mask output oDRAM1_LDQM0, // SDRAM1 Low—byte Data Mask output
46、 oDRAM0_UDQM1, // SDRAM0 High-byte Data Mask output oDRAM1_UDQM1, // SDRAM1 High-byte Data Mask output oDRAM0_WE_N, // SDRAM0 Write Enable output oDRAM1_WE_N, // SDRAM1 Write Enable output oDRAM0_CAS_N, // SDRAM0 Column Address Strobe output
47、 oDRAM1_CAS_N, // SDRAM1 Column Address Strobe output oDRAM0_RAS_N, // SDRAM0 Row Address Strobe output oDRAM1_RAS_N, // SDRAM1 Row Address Strobe output oDRAM0_CS_N, // SDRAM0 Chip Select output oDRAM1_CS_N, // SDRAM1 Chip Select output [
48、1:0] oDRAM0_BA, // SDRAM0 Bank Address output [1:0] oDRAM1_BA, // SDRAM1 Bank Address output oDRAM0_CLK, // SDRAM0 Clock output oDRAM1_CLK, // SDRAM0 Clock output oDRAM0_CKE, // SDRAM0 Clock Enable output oDRAM1_CKE, // SDRAM
49、1 Clock Enable //////////////////////////////// Flash Interface //////////////////////// inout [14:0] FLASH_DQ, // FLASH Data bus 15 Bits (0 to 14) inout FLASH_DQ15_AM1, // FLASH Data bus Bit 15 or Address A-1 output [25:0] oFLASH_A, // FLASH Address bus 26 Bits
50、 output oFLASH_WE_N, // FLASH Write Enable output oFLASH_RST_N, // FLASH Reset output oFLASH_WP_N, // FLASH Write Protect /Programming Acceleration input iFLASH_RY_N, // FLASH Ready/Busy output output oFLASH_BYTE_N, // FLASH Byte/






