文章摘要:
网上对于FPGA嵌入CPU的讨论颇多,硬核、固核、软核各有千秋,这里就不做具体分析优劣,也不太建议做过多的争执,只有先彻底的了解其相关技术,才能做出比较中肯的评价;

做为技术层面来说,不能太主观或者过于轻信某一种技术的好于坏,关键是看攻城狮用的场合不合适,多掌握一门手艺,毕竟不是坏事,软核的唯一好处就是,你如果觉得不想用,就可以不用,把节省下的逻辑单元用来干其他的事,想用的话,也很容易配置进去当然前提是你要知道怎么来做才行;

任何一种技术,如果掌握了其技能,你可以有选择不用的权利,但是如果没有掌握,在选择上就会比较局限,所以,个人认为,做为一个技术匠人,应该以包容的心态去学习每一种技术,也只有这样,在创作的时候,才更容易得心应手;


硬件平台:EP4CE6F17C8
开发环境:Quartus II 13.1


创建一个Quartus II的项目工程

工程名为:nios_test


通过Qsys向导来新建NIOS2;
通过Tools-->Qsys菜单启动Qsys软件;


配置系统时钟
打开Qsys软件时,系统会建立一个默认工程,并自动创建了一个clock组件(由此可见时钟的重要性);
双击时钟即可参数进行配置,时钟设计为50MHz,与外部晶振的频率一致,其他采用默认值;

右键-->Rename修改名称为clock

注意事项:
配置的时钟参数必须要和实际的一致,为了简单起见,暂不采用PLL时钟,而采用50MHz外部晶振;


添加cpu核

Library --> 
    Embedded Processors --> 
        Nios II Processor

Nios II Core: Nios II/s

其他项目先采用默认值(后边还需要修改)

点击Finish完成创建;

右键-->Rename修改名称为 cpu.

信号连接:
将时钟信号(clk)连接至clock模块的clk输出信号;
将复位信号(reset_n)连接至clock模块的clk_reset输出信号;


添加片内RAM

Library --> 
    Memories and Memory Controllers --> 
        On-Chip --> 
            On-Chip Menory(RAM or ROM)

Type选择 RAM(Writable)

Data width: 32.(数据宽度32位)
Total memory size: 20480 bytes(容量20K).
其他参数暂时选择默认;

信号连接:
将时钟信号(clk1)连接至clock模块的clk输出信号;
将复位信号(reset1)连接至clock模块的clk_reset输出信号;
将s1信号,连接分别连接至cpu的数据总线(data_master)和指令总线(instruction_master);

注意事项:
1.虽然根据数据手册显示EP4CE6一共有270Kb(33KB)RAM,但是在布线时会提示部分RAM无法布局,所以这里先用20KB;
2.由于程序在RAM中运行,所以指令总线也需要连接;


添加JTAG-UART

Library --> 
    Interface Protocols --> 
        Serial -->
            JTAG UART

Buffer depth(bytes): 16
不选 Construct using registers instead of memory blocks

信号连接:
将时钟信号(clk)连接至clock模块的clk输出信号;
将复位信号(reset)连接至clock模块的clk_reset输出信号;
将avalon_jtag_slave信号连接至cpu的数据总线(data_master);


添加LED外设

Library --> 
    Peripherals --> 
        Microcontroller Peripherals --> 
            PIO (Parallel I/O)

Width(1-32bits): 数据宽度,选择4,因为硬件只连接了4个LED端口;
Direction: 方向,选择Output(输出);
Output Port Reset Value: 复位值,选择全0;

其他值默认;

信号连接:
将时钟信号(clk)连接至clock模块的clk输出信号;
将复位信号(reset)连接至clock模块的clk_reset输出信号;
将s1信号连接至cpu的数据总线(data_master);

引脚导出:

双击external_connection的Export项目,导出引脚;


请输入图片描述


重新设置复位与异常向量
双击cpu项,打开配置界面,指定复位和异常向量们于ram区;

请输入图片描述


保存Qsys工程:
保存在项目工程目录下的core目录下,名称为nios_mini.qsys;

分配地址:
System --> Assign Base Addresses

生成
Generate
--> Generate...
会产生一些警告,暂时不用理;


获取例化代码

Generate --> HDL Example


生成顶层模块

  1. 关闭Qsys回到Quartus II

2.将core/nios_mini.qsys文件添加至工程

3.建立顶层文件,名称为nios_test.v,内容如下:

module nios_test(
    input  clk,
    input  rst_n,
    output leds
);

// 例化nios_mini
nios_mini u0 (
    .clock                      (clk), 
    .out_port_from_the_pio_leds (leds), 
    .reset_n                    (rst_n)   
);

endmodule

分析综合,分配引脚,全编译,下载