http://www.wiqitech.com/jpwz/NiosStandard/NiosStandard.htm
Step By Step创建标准(Standard)niosII系统
在此之前,我曾经过介绍过如何建立最小(small)的nios系统(见文章nios无痛入门)。在这儿,我将要介绍如何建立一个常用的标准(Standard)Nios系统。如果本文能对您有一点点帮助,我都会感到非常高兴。
在本文中,我只挑要点讲一下,关于软件的详细使用指南,请您参考官方提供的help文档。我使用本站设计的ezNiosDK C6B开发板来示范这个实验;如果您采用自己的开发板,请您适当得修改,以适应您的开发板。
第一节:创建并初步配置项目。1。创建项目。
创建一个空项目,我将他命名为ezC6Be_StdF50(请参考文章“nios无痛入门”,在此不再赘述),器件(Device)设置为EP1C6T144C8。
如果采用的是ezNiosDKC3系列,请选择EP1C3T144C8,如下图:
2。执行如下script,主要目的是一次性映射PIN脚。# Setup.tcl
# Setup pin setting
set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED"
set_global_assignment -name ENABLE_INIT_DONE_OUTPUT ON
set_global_assignment -name CYCLONE_CONFIGURATION_DEVICE EPCS1
set_location_assignment PIN_16 -to OSC0
set_location_assignment PIN_125 -to RESET_
set_location_assignment PIN_28 -to LED\[0\]
set_location_assignment PIN_85 -to LED\[1\]
set_location_assignment PIN_96 -to LED\[2\]
set_location_assignment PIN_97 -to LED\[3\]
set_location_assignment PIN_27 -to KEY\[1\]
set_location_assignment PIN_17 -to KEY\[2\]
set_location_assignment PIN_92 -to KEY\[3\]
set_location_assignment PIN_93 -to KEY\[4\]
set_location_assignment PIN_51 -to SDRAM_CS_
set_location_assignment PIN_52 -to SDRAM_RAS_
set_location_assignment PIN_53 -to SDRAM_CAS_
set_location_assignment PIN_56 -to SDRAM_WE_
set_location_assignment PIN_39 -to SDRAM_CKE
set_location_assignment PIN_26 -to SDRAM_CLK
set_location_assignment PIN_50 -to SDRAM_BA\[0\]
set_location_assignment PIN_49 -to SDRAM_BA\[1\]
set_location_assignment PIN_47 -to SDRAM_A\[0\]
set_location_assignment PIN_42 -to SDRAM_A\[1\]
set_location_assignment PIN_41 -to SDRAM_A\[2\]
set_location_assignment PIN_40 -to SDRAM_A\[3\]
set_location_assignment PIN_34 -to SDRAM_A\[4\]
set_location_assignment PIN_33 -to SDRAM_A\[5\]
set_location_assignment PIN_32 -to SDRAM_A\[6\]
set_location_assignment PIN_31 -to SDRAM_A\[7\]
set_location_assignment PIN_35 -to SDRAM_A\[8\]
set_location_assignment PIN_36 -to SDRAM_A\[9\]
set_location_assignment PIN_48 -to SDRAM_A\[10\]
set_location_assignment PIN_37 -to SDRAM_A\[11\]
set_location_assignment PIN_38 -to SDRAM_A\[12\]
set_location_assignment PIN_69 -to SDRAM_DQ\[0\]
set_location_assignment PIN_68 -to SDRAM_DQ\[1\]
set_location_assignment PIN_67 -to SDRAM_DQ\[2\]
set_location_assignment PIN_62 -to SDRAM_DQ\[3\]
set_location_assignment PIN_61 -to SDRAM_DQ\[4\]
set_location_assignment PIN_60 -to SDRAM_DQ\[5\]
set_location_assignment PIN_59 -to SDRAM_DQ\[6\]
set_location_assignment PIN_58 -to SDRAM_DQ\[7\]
set_location_assignment PIN_71 -to SDRAM_DQ\[8\]
set_location_assignment PIN_72 -to SDRAM_DQ\[9\]
set_location_assignment PIN_73 -to SDRAM_DQ\[10\]
set_location_assignment PIN_74 -to SDRAM_DQ\[11\]
set_location_assignment PIN_78 -to SDRAM_DQ\[12\]
set_location_assignment PIN_77 -to SDRAM_DQ\[13\]
set_location_assignment PIN_76 -to SDRAM_DQ\[14\]
set_location_assignment PIN_75 -to SDRAM_DQ\[15\]
set_location_assignment PIN_57 -to SDRAM_DQM\[0\]
set_location_assignment PIN_70 -to SDRAM_DQM\[1\]
set_location_assignment PIN_99 -to FLASH_CE_
set_location_assignment PIN_100 -to FLASH_OE_
set_location_assignment PIN_128 -to FLASH_WE_
set_location_assignment PIN_98 -to EA\[1\]
set_location_assignment PIN_110 -to EA\[2\]
set_location_assignment PIN_111 -to EA\[3\]
set_location_assignment PIN_112 -to EA\[4\]
set_location_assignment PIN_113 -to EA\[5\]
set_location_assignment PIN_114 -to EA\[6\]
set_location_assignment PIN_119 -to EA\[7\]
set_location_assignment PIN_120 -to EA\[8\]
set_location_assignment PIN_131 -to EA\[9\]
set_location_assignment PIN_132 -to EA\[10\]
set_location_assignment PIN_133 -to EA\[11\]
set_location_assignment PIN_134 -to EA\[12\]
set_location_assignment PIN_139 -to EA\[13\]
set_location_assignment PIN_140 -to EA\[14\]
set_location_assignment PIN_141 -to EA\[15\]
set_location_assignment PIN_142 -to EA\[16\]
set_location_assignment PIN_11 -to EA\[17\]
set_location_assignment PIN_121 -to EA\[18\]
set_location_assignment PIN_122 -to EA\[19\]
set_location_assignment PIN_123 -to RYBY_
set_location_assignment PIN_130 -to EA\[20\]
set_location_assignment PIN_103 -to EDQ\[0\]
set_location_assignment PIN_105 -to EDQ\[1\]
set_location_assignment PIN_107 -to EDQ\[2\]
set_location_assignment PIN_109 -to EDQ\[3\]
set_location_assignment PIN_144 -to EDQ\[4\]
set_location_assignment PIN_3 -to EDQ\[5\]
set_location_assignment PIN_5 -to EDQ\[6\]
set_location_assignment PIN_7 -to EDQ\[7\]
set_location_assignment PIN_104 -to EDQ\[8\]
set_location_assignment PIN_106 -to EDQ\[9\]
set_location_assignment PIN_108 -to EDQ\[10\]
set_location_assignment PIN_143 -to EDQ\[11\]
set_location_assignment PIN_2 -to EDQ\[12\]
set_location_assignment PIN_4 -to EDQ\[13\]
set_location_assignment PIN_6 -to EDQ\[14\]
set_location_assignment PIN_10 -to EDQ\[15\]
set_location_assignment PIN_79 -to RXD1
set_location_assignment PIN_82 -to TXD1
set_location_assignment PIN_83 -to USBDN
set_location_assignment PIN_84 -to USBDP
第二节:创建NiosII系统。
1.选择Tools -> SOPC Builder,我将这个系统命名为sopc_ezC6Be_StdF50,就是在项目名前加上sopc_,您可以依据需要,为他命名。
2。配置Component/Kit Library Search Path。
目的是在系统中增加本站设计的Flash编程器目录,请把光盘CD1上的/Example/ezNiosC6 拷贝到您的电脑的硬盘上。比如,我把他放在h:/DB2005/project/niosDK/CD/CD1/Example/中,然后在Altera SOPC Builder中,选择File -> SOPC Builder Setup,增加如下搜索路径:+h:/DB2005/project/niosDK/CD/CD1/Example/ezNiosC6
ezNiosC3的用户如下操作:请把光盘CD1上的/Example/ezNiosC3 拷贝到您的电脑的硬盘上。比如,我把他放在h:/DB2005/project/niosDK/CD/CD1/Example/中,然后在Altera SOPC Builder中,选择File -> SOPC Builder Setup,增加如下搜索路径:+h:/DB2005/project/niosDK/CD/CD1/Example/ezNiosC3
并顺便检察Modelsim Directory是否正确:比如,我的是 g:/w2k/eda/fpga/altera/modeltech_6.0/win32
然后,你需要关闭Altera SOPC Builder,然后再重新通过QuartusII的Tools ->SOPC Builder来开启SOPC Builder,这样上述修改才能生效。
3常见错误:有许多朋友往往在设置路径的时候,犯与下图类似的错误。错误在于第一个路径前面是不需要 + 号的!要去掉第一个路径前面的 + 号
3。Board Target 选择:
ezC6_Programmer,clk选择 50.0
ezNiosC3的用户如下操作:Board Target 选择:ezC3_Programmer,clk选择 64.0
ezNiosC3的用户如下操作:Board Target 选择:ezC3_Programmer,clk选择 64.0
4。为系统添加Nios II处理器。
在Nios II core选项卡中,选择Nios II /e
。 JTAG Debug Module选项卡中,选择Debug Level 1
Custom Instructions选项卡中空着即可。
最后选择Finish确认! 我把这个处理器改名(rename)为cpu_ezC6Be_StdF50,您可以依据需要,为其命名。
5.为系统添加onchip_ram。
双击左边的Memory -> On-Chip Memory,为系统添加2K byte onchip RAM,按照如下配置。我把它改名为onchip_ram_0,您可以依据需要,为其命名。
6。为系统添加DRAM控制器。
双击左边的Memory -> SDRAM Crontroller,为系统添加8M byte DRAM,请按照如下图片配置。
7。 为系统添加Tri-State Bridge。
双击左边的Bridge -> Avalon Tri-State Bridge,为系统添加Tri-State Bridge,请按照如下图片配置。
8。为系统添加Flash接口。
双击左边的Memory -> Flash Memory(Common Flash Interface),为系统添加Flash,请按照如下图片配置。我把它改名(rename)为ext_flash,您可以依据需要,为其命名,但最好还是取名为ext_flash。ezNiosC3A,ezNiosC3B,ezNiosC6A的用户由于开发板上不带Flash,可以跳过此步。
9。为系统添加EPCS Serial Flash Controller。
双击左边的Memory -> EPCS Serial Flash Controller,为系统添加EPCS Serial Flash Controller,请按照如下图片配置。ezNiosC3A,ezNiosC6A的用户由于开发板上不带该器件,可以跳过此步。
10.为系统添加sys_clk_timer。
双击左边的Other -> interval timer,为系统添加timer,请按照如下图片配置。我把它改名(rename)为sys_clk_timer,
11.为系统添加high_res_timer。
双击左边的Other -> interval timer,为系统添加timer,请按照如下图片配置。我把它改名(rename)为high_res_timer.
12.为系统添加JTAG_UART。
双击左边的Communication -> JTAG_UART,为系统添加JTAG_UART,请按照如下图片配置。
13.为系统添加RS232_UART。
双击左边的Communication -> UART(RS-232 serial port),为系统添加UART,请按照如下图片配置。ezNiosC3A,ezNiosC3b,ezNiosC6A的用户由于开发板上不带该器件,可以跳过此步。
14.为系统添加LED_PIO。
双击左边的Other -> PIO(Parallel
I/O),为系统添加PIO,请按照如下图片配置。我把它改名(rename)为led_pio。
15.为系统添加button_pio。
双击左边的Other -> PIO(Parallel I/O),为系统添加PIO,请按照如下图片配置。我把它改名(rename)为button_pio。
16.为系统添加sysid。
双击左边的Other -> System ID Peripheral,为系统添加sysid,请按照如下图片配置。
17.然后,选择System -> Auto-Assign Base Address,自动分配基地址。
18.选择System -> Auto-Assign IRQs,自动分配中断向量。
最后,得到如下结果:
19.点击Nios II More "cpu_NiosSmall" settings选项卡,进行处理器设定。Reset Address 设为onchip_ram_0,Exception Address 设为onchip_ram_0 .
20.点击System Generation选项卡,进行最后的设定并生成系统。
选中HDL.Generate system module logic in Verilog,
如果需要仿真,也请选中Simulation.Create ModelSim(tm) project files
然后点击Generate,进行系统生成的任务。如下图:
然后,就是漫长的等待,你可以忙里偷闲,喝一小杯咖啡。一般没有问题的话,可以看到系统提示:SUCCESS: SYSTEM GENERATION COMPLETED.如果看到此信息,恭喜恭喜,系统被正确生成了。如果失败,请返回并检查、修改!
第三节:初始化onchip_ram_0.hex。
接下来是初始化onchip_ram_0.hex,这样,系统一上电,就会开始跑流水灯,看着舒服一点啦。
1.点击Run Nios II IDE,启动Nios II IDE
2.选择File -> New -> Project,然后选择:Altera Nios II --- C/C++ Application,然后选择Next
3.Name空栏中,您可以您可以依据需要,为其命名。
比如,我为其取名为ezC6Be_StdF50_hello_led_1,
完成后,选择Next。(注意,要在Select Project Template 中,选中Hello LED)
4.选中Create a new system library named: ......,最后选择Finish,系统会自动生成该项目。
如下,是hello_led.c文件,一般情况下,无需作任何修改
5.选择Project -> Build Project,编译整个项目。
常见问题:有的朋友常常会遇到如下错误:
提示LED_PIO_BASE没有声明,这是因为名字不一致引起的比如,在生成SOPC系统时,双击PIO(Parallel I/O)(在Avalon Modules -> Other 下),为系统添加输出接口,你没有把该组件改名成LED_PIO,而是保留了原始的名字:PIO_0;但你又通过IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led);来向该组件写入数据,就会导致上述错误:解决方法:使两者名字一致。1。可以修改hello_led.c,通过IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, led) 通过来操作该PIO。2。或者可以修改sopc系统,为该PIO改名为LED_PIO
第三节:在QuartusII中使用上述niosII系统
1。在编译完成后。首先在QuartusII中,打开SOPC Builder生成的sopc_ezC6Be_StdF50.bsf,检查一下引脚,看看跟你的设想是否有误,如下图:
2。你可以使用上述的sopc_ezC6Be_StdF50.bsf,来构造你自己的系统。
如下图,我创建了ezC6Be_StdF50.bdf,来使用它。
3。其中,sdram_pll按照如下图配置,input clk是50M,
请ezNiosC3A,ezNiosC3B,ezNiosC6A的用户按照如下操作 input clk是16M :
4。如下是delay_reset_block.
它的作用主要是延迟reset,以等待PLL稳定,如果要求不严格,也可以不加。
5。完成后,选中Processing -> Start Compilation,开始编译。
6。编译成功后,可以看一下Compilation Report.
其中,Total logic elements使用了45%,还剩余55%可以作为其他用途。
第四节:下载与测试。
最后,选择Tools ->Programmer,下载整个配置到FPGA中,如下图。
下载成功后,可以看到LED的有规律的变化(流水灯)。
第五节:运行Hello_World程序。
Hello_World程序似乎经常是许多高级入门教材的第一个范例,我们也来运行一下它。 类似于在第三节中的操作,首先回到Nios IDE中,
1.选择File -> New -> Project,然后选择:Altera Nios II --- C/C++ Application,然后选择Next
2.Name空栏中,您可以您可以依据需要,为其命名。比如,我为其取名为ezC6Be_StdF50_hello_world_1,
完成后,选择Next。(注意,要在Select Project Template 中,选中Hello World)
3.选中Create a new system library named: ......,最后选择Finish,系统会自动生成该项目。
4.并不用对hello_world.c进行任何修改。
5.首先选中Project:ezC6Be_StdF50_hello_world_1,然后点击右键,在弹出的窗口中选择System Library Properties,如图:
系统会弹出System Library Properties设置对话框,请按照如下图片设置,完成后,选择Apply确认,然后就可以关掉这个对话框了。
6.选择Project -> Build Project,编译整个项目。
7.编译成功后,为开发板(插上USB取电电缆),并将ByteBlasterII下载电缆插在JTAG口,然后选择Run -> Run As -> 1 Nios II Hardware,在实际的硬件上运行上述C程序。
7.可以看到nios2-terminal窗口如下显示:Hello from Nios II!
到这里就大功告成了,整个试验是比较消耗时间与脑力的,成功后,真的可以好好休息一下了!本文仍在修订中,请网友们多提意见,我会继续更正该文!
本文仍在修订中,请网友们多提意见,我会继续更正该文!
如果引用该文,请注明出处!www.wiqitech.com
copyright@ 2004-2005 版权所有 微奇工作室 www.wiqitech.com
用户1053025 2006-9-8 17:33