参考教程:
其他遇到的问题,网上可以继续查询
基于设备:
Altera FPGA Cyclone IV E: EP4CE6E22C8, JTAG下载器:USB Blaster, 串口线
Quartus II工程建立
1、新建 New Quartus II Project, 选取工作目录,工程名字,FPGA设备信息,点击Finish完成
2、新建Block Diagram/Schematic File,添加锁相环,点击BDF文件空白处,点击MegaWizard Plug-In Manager。点击Next,左边框中选择I/O--ALTPLL,右边命名为../PLL,点击Next。进入ALTPLL配置,DEVICE SPEED选择8,INCLK0输入选择50MHz,点击Next。取消勾选areset,勾选Create'locked'。NEXT一直到配置C0页面。C0输出50MHz,0相位偏移,点击NEXT。C1点击USE THIS CLOCK,输出50MHZ,-75相位偏移。一直点击NEXT,最后FINISH。点击OK,将PLL核放置在BDF文件中。(这里的C0时钟待会输入SOPC BUILD核,给NIOS CORE,SDRAM CORE,JTAGUART CORE,UART CORE提供时钟。C1时钟通过管脚给外部的SDRAM芯片提供时钟,这里需要和SDRAM CORE保持同样的时钟频率,不同的相位偏移)
3、新建SOPC BUILDER SYSTEM,给系统命名IIC_NIOS。添加NIOS II PROCESSOR,选择NIOS II/F,点击NEXT。DATA CACHE选择NONE,点击NEXT。一直到JTAG,选择LEVEL2,然后FINISH。改名为CPU,把_0去掉。
添加SDRAM CONTROLLER,PRESETS选择CUSTOM,DATA WIDTH选择16BIT,CHIPSELECT=1,BANKS=4,ROW=13,COLUMN=8。NEXT,TIMING不用改动,点击FINISH。改名,去掉_0。
添加EPCS SERIAL FLASH CONTROLLER。直接FINISH。改名。添加SYSTEM ID。直接FINISH,改名。添加JTAG UART,直接FINISH,改名。添加UART RS232,直接FINISH,改名。
这个工程需要实现IIC通信的目的,所以我们需要引出SCL和SDA两个管脚。添加PIO,WIDTH选择1,DIRECTION选择BIDIR,点击FINISH,改名为SCL。同样添加一个PIO,改名为SDA。
为了给代码加入LED灯指示,再添加一个PIO,WIDTH选择4,DIRECTION选择OUTPUT,RESET VALUE选择0X03,点击ENABLE INDIVIDUAL BIT SETTING,点击FINISH。改名LED。(位宽为4是因为我板上有4个LED,0X03复位值使LED0和LED1灭,LED2和LED3亮,板上的LED是低有效)
至此我们的SOPC SYSTEM IP核添加完成。设置EPCS FLASH的基地址为0X00000000,锁住。点击SYSTEM--ASSIGN BASE ADDRESSES, ASSIGN INTERRUPT NUMBERS。点击CPU,进去后设置RESET VECTOR为EPCS FLASH,EXCEPTION VECTOR为SDRAM。将CLOCK SET中时钟改名为CLK50。保存SOPC文件,命名IIC_NIOS。点击GENERATE,成功后再保存。退出
4、双击保存后的BDF文件的空白处,点击Project--IIC_NIOS,放置在BDF中合适位置,点击。右键PLL和IIC_NIOS点击GENERATE PINS FOR SYMBOL PORTS,会有很多引脚引出来。这里我们主要关注:PLL的C0,C1,LOCKED,IIC_NIOS的CLK50,RESETN,LED,SDA,SCL,CKE(名字对不上大家意会一下)
将端口C0,CLK50删除(把连接线也删掉)然后从PLL的C0拉线直接到IIC_NIOS的CLK50。端口C1可以拉到空白处放着,改名为SDRAM_CLK。IIC_NIOS上的OUT PORT...LED改名为LED,BIDIR PORT TO...SCL改名为SCL,BIDIR PORT TO...SDA改名为SDA。ZS_CKE_FROM...的端口删掉,因为我的FPGA底板把SDRAM的CKE信号直接接到VCC,因此不需要再次配置。双击BDF文件空白处,点击PRIMITIVES--LOGIC--AND2,加入一个与门。把PLL的LOCKED和RESETN端口接到与门的输入,与门的输出接到IIC_NIOS的RESETN。(作用是,PLL没锁住时,NIOS核一直处于复位)连接好后,右键UPDATE SYMBOL,点击ALL SYMBOL,然后保存BDF。最后连接的图是
注意连线的时候,互相的线直接不能有连接点,一定连地干净利落。端口与核要确认连接在了一起。
5、配置编译运行。点击ASSIGNMENTS--DEVICE--DEVICE AND PIN OPTIONS,CONFIGURATION中勾选USE CONFIGURATION DEVICE。UNUSED PIN 选择AS INPUT TRI-STATED。DUAL-PURPOSE PINS全选为USE AS REGULAR I/O。VOLTAGE选择3.3-V LVTTL。
6、点击TASKS框的ANALYSIS&SYNTHESIS,右键点击START。成功后打开PIN PLANNER配置管脚。按照手册一个一个配置。SDRAM和EPCS FLASH的管脚较多,需要耐心配置。如果有错误,仔细检查手册和已配置的管脚。配置好后,直接编译。
PIN PLANNER中的I/OStandard中选择其他电平没用,因为硬件固定了IO的输出电平为3V3。
7、编译成功后,会生成.SOF文件和.POF文件。如果想验证,可以连接FPGA。点击TOOLS--PROGRAMMER,ADD FILE添加刚才生成的.SOF,HARDWARE SETUP选择USB BLASTER。勾选PROGRAM/CONFIGURATION,点击START,提示100%成功。可以看到FPGA上的LED灯按设置的RESET值亮起来。
NIOS II 软件工程建立
1、打开NIOS II IDE,切换工作区到QUARTUS工程目录。点击FILE--NEW--NIOS II C/C++ APPLICATION,填写名字,选取硬件工程的.PTF文件,选择BLANK PROJECT,点击NEXT,FINISH。新建一个C程序,编写我们的代码。这里我简要说一下LED灯如何控制。在system.h文件中,找到LED的基地址,LED_BASE。在主程序中添加头文件,和如下代码
#define LED (*((unsigned long int*)(LED_BASE+0)))
这时对LED进行赋值操作,就可以改变LED灯的亮灭状态。(system.h文件包含了我们底层生成的IP核的配置信息,不要对程序进行改动。在我们主程序的开始,就控制LED灯状态改变,这样可以帮助我们知道程序是否跑起来,或者卡在了什么地方。尤其是在FLASH调试时)
2、程序写好后。配置系统库参数。点击工程,右键点击SYSTEM LIBRARY PROPERTIES,在C/C++ BUILD--GENERAL,选取OPTIMIZATION LEVEL=-OS,DEBUG LEVEL=-G3。SYSTEM LIBRARY配置如下。
这里如果想在线调试,选择JTAG_UART,如果想烧写到FLASH,用串口助手抓取信息,选择UART。点击PROJECT--BUILD ALL。生成.ELF文件就可以运行调试了。在线调试,点击工程右键RUN AS--NIOS II HARDWARE,可以看到程序开始跑,LED按编程闪烁,CONSOLE打印出了PRINTF内容。
如何把程序烧写到FLASH,并通过串口助手抓取信息?首先将系统库中的JTAG_UART都换为UART。重新BUILD ALL。成功后,点击TOOLS-QUARTUS PROGRAMMER,按第七步的操作再来一遍。再点击TOOLS-FLASH PROGRAMMER,双击FLASH PROGRAMMER,生成新的配置页。
按照上图的配置,点击APPLY,PROGRAM FLASH。等待烧写完毕后。拔掉串口线和JTAG下载线。打开串口助手,FPGA上电,可以看到程序跑了起来,串口助手有打印信息。我们的整个工程就建立完毕了。
第一次写博客,是为了记录自己的实习工作。慢慢克服困难,你会发现自己能解决很多事情,慢慢进步。