FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)

博主最近开始学习NIOS II,在以往的教程中,往往使用On Chip RAM/ROM存放程序,对于Memory比较稀缺的FPGA来说这个简直是个噩梦,因为很可能放不下一段Hello World代码T^T更别希望能跑一个OS或者GUI、LWIP之类的。不过解决方法倒也挺简单,把代码扔到SDRAM里跑就是了。
现在能买到的FPGA开发板通常都会带有一片SDRAM,容量在8Mbit~256Mbit不等,取决于客官的荷包是否充裕。博主手中的小板子包含一块32Mbit的SDRAM,这足够跑一个小型的操作系统加上一个轻量级的GUI程序了,博主希望做的就是能够让NIOS处理器从SDRAM启动运行代码,以下是实现。

博主使用的是EP4CE15F23C8N这款FPGA,开发环境选择了Quartus Prime 18.0 Standard版本。

首先:双击Quartus图标打开软件^ _ ^
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第1张图片
新建一个工程
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第2张图片设置工程路径和名称
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第3张图片
选择FPGA器件型号,在这一步可以看到该器件的逻辑单元数量和Memory数量,以及可用IO数
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第4张图片
点击箭头所指图标,打开platform designer(原sopc builder

FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第5张图片
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第6张图片
打开后的界面如图所示
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第7张图片
按CTRL+S保存,写上您心仪的名字
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第8张图片
在左侧栏中搜索nios,加入nios软核
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第9张图片
博主自认为手上的FPGA芯片还是蛮不错的,自信的选择了/f版本,也就是最高兴性能的版本,当然占用的LEs相对也是比较多的。手头拮据的客观也可以选择第一个精简版的,性能也是可以的。
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第10张图片
在这里我们需要将Data Cache关闭。
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第11张图片
搜索sdram,添加一个sdram控制器
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第12张图片
注意这一步非常关键!请客观查阅自己开发板上的SDRAM数据手册以后填写!否则很有可能您的NIOS II SOPC会出现ELF文件下载失败的现象!
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第13张图片
这个保持默认即可。
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第14张图片
搜索uart,添加jtag uart模块,这个模块将负责sopc的通信,参数保持默认即可。
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第15张图片
这里博主想要调用开发板上的几个按键和led,因此选择了一个pio,相当于单片机的io口。这里添加的pio都可以引出映射到真实的物理管脚上,让FPGA像一块真实的单片机一样使用。
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第16张图片
这里博主选择了Bidir,这个是一个双向io。
注意Bidir和inout的区别!选择inout将生成两个io,一个是in一个是out哦!
这里还可以给这些io添加边沿触发或者是中断功能,第一次使用不需要这么复杂,按需要添加即可。
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第17张图片
完成以后给各个模块重命名一下方便代码编写。
双击clk_0
注意右侧的框内需要如实输入提供给SOPC的时钟频率,例如时钟由一个50MHz的晶振提供,这里应该写50M,当然使用PLL倍频或分频以后再提供给SOPC的,应当写上经过分频或倍频以后的时钟,否则您的NIOS软核将无法被识别,或出现无法下载ELF文件的情况!
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第18张图片
为了简单起见全连上吧…
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第19张图片
注意双击引出sdram与pio的输出,因为这些将被映射到真实的物理管脚上,这些脚将在SOPC外部被访问
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第20张图片
这一步将是代码在SDRAM中运行的关键!将Vector指向SDRAM的总线!
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第21张图片
分配基地址
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第22张图片
按CTRL+S保存,若没有提升错误恭喜您的SOPC应该可以正常使用。
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第23张图片
生成HDL文件
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第24张图片
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第25张图片
不出意外也可以正常生成。
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第26张图片
关闭platform designer以后弹出如下提示,大概意思是说添加qip和sip文件进入工程。
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第27张图片
那就照做咯,选择添加或移除文件
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第28张图片
simula中添加sip文件,在synthesis中添加qip文件
注意选择文件类型为all files,否则您是看花了眼也找不到的。
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第29张图片
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第30张图片
OK!
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第31张图片
新建一个Verilog HDL文件,编写代码例化模块
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第32张图片
为了保证SDRAM可以正常运行,我们需要添加一个PLL时钟,时钟按如下进行配置:
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第33张图片
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第34张图片
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第35张图片
这里不引出reset,locked等这些引脚
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第36张图片

这一步非常非常关键,为了SDRAM能够正常工作我们需要将时钟移相-63°,当然这个也不绝对,如果您的SOPC无法正常运行,或者下载不了ELF文件请检查这个设置是否正确!!!!

FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第37张图片
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第38张图片
大家可以吧pll_inst.v选中,因为在这个文件里放置了一个例化模板,到时候copy过来直接使用就可以了。
finish以后会弹出一个框框,提示吧刚刚生成的pll模块加入工程
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第39张图片
不放心可以检查一下是否正确添加
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第40张图片
下面编写代码和例化程序。首先顶一个module,写上输入输出
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第41张图片
在文件夹下找到刚刚勾选则pll_inst.v,拷贝里面的内容到程序中
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第42张图片
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第43张图片
修改一下。
注意虽然在SOPC设置里面,我们直接将SDRAM的CLK与CLK_0相连,但是实际上SDRAM的时钟是需要外部输入的,因此我们额外添加一个DRAM_CLK,给SDRAM提供时钟。

如法炮制,找到nios_inst.v,拷贝代码
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第44张图片
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第45张图片
修改。
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第46张图片
CTRL+S保存,取个名字,并且设置其为顶层
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第47张图片
选择分析并综合代码
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第48张图片
如果您的代码没有问题很快就可以综合完成
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第49张图片
点击配置管脚
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第50张图片
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第51张图片

在这里填入管脚名称,管脚名称需要与开发板上的一一对应!!
注意SDRAM的管脚多且复杂,名字也类似一定不能看花眼,否则会出现ELF文件无法下载的错误!!!!

FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第52张图片
完毕以后点击小三角
在这里插入图片描述
不出意外应该是没问题的,这里我们可以查看一下资源占用情况,比起使用On chip memory,这点占用应该是小得多了。
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第53张图片
FPGA学习[1]——在SDRAM中运行NIOS II 超详细教程(一)_第54张图片
下载费尽千辛万苦生成的sof文件,到此可以休息一会了。

总结

  1. 添加NIOS II核与SDRAM控制器,正确设置Vector(SDRAM的总线),正确设置SDRAM的相关参数(位数,容量等),设置不正确NIOS II将跑不起来,或者在软件编写运行C语言代码的时候出现ELF文件下载错误。
  2. 引出SDRAM和PIO,不引出咋玩啊?
  3. 设置PLL移相-63°,否则SDRAM无法正常运行,出现ELF下载错误
  4. 将PLL出来的时钟接到SDRAM的时钟管脚上
  5. 细致分配管脚,不允许出错,否则将出现ELF文件下载错误
  6. !耐心,出现ELF文件下载错误以后一定要仔细回顾上述几个点,确保万无一失。
  7. 没了

博主看到这类教程网上是有的,但是不是非常详细,给初学NIOS的朋友一点小帮助吧。

你可能感兴趣的:(FPGA)