nios2之LCD硬件设计

        最近手边有了DE2-115开发板,就用来玩玩nios2,顺便学习一个altera的开发流程,因为之前都是在用xilinx的。
        玩了之后,确实nios2的功能很强大,但是这开发的软件很不好用,有时候会出莫名其妙的问题,让人莫名其妙。
        以下实现一个流水灯和LCD1602显示。流水灯通过按键来控制,按键通过外部中断检测。
        新建工程:

        第一个是工程的路径,该路径不能有中文和空格。
        第二个是工程的名字,也是不能有中文和空格,
        第三个是顶层设计的名字,也不能有中文和空格。

        下面一页选项是选择添加的文件,这里不需要添加文件。如果需要在工程中加入文件,可以在这里加入。

        下面这一页是选择器件,如果你是要把设计下到altera FPGA芯片中的话,这里的器件不能随便选择,要选择你对应的器件,否则是下载不成功的。
        这里我用的是de2-115,用的器件是EP4CE115F29C7。看这芯片,就知道这芯片挺好的。表中还有对芯片的一些性能描述。可以看到merory有3981312bit,也就是486kb。还是挺大的。

        这里是选择EDA功能。Quartus可以使用第三方工具,但是使用的时候,是需要配置的,这里就是配置的。我们不需要,直接跳过。

        最后一个就是功能的信息。直接finish,就建立工程了。

        这样,功能就建好了,首先是新建一个原理图。用原理图开发nios是比较方便的,而且不容易出错。

        在将原理图保存为lcd。这里注意要将原理图保存为lcd,因为之前设置的顶层是lcd,而顶层的名字要和顶层文件的名字要一样,才能被综合和布局布线的。如果这里保存的名字不是lcd的话,那么就要在工程中将原理图设置为顶层。
        然后,打开qsys,进行nios2硬件开发。对于quartus后面出的版本,已经用qsys替代了sopc builder。

        首先,还是保存qsys。保存是个好习惯。
        然后就开始我们的qsys硬件设计了。
        首先,我们要先改下时钟。可以看到在界面中有一个clk_0,这个是默认的50M时钟,我们知道一个嵌入式系统肯定是需要一个时钟的,这个时钟就可以当系统时钟用,但是有时候,一个系统需要的不止一个时钟,那么就可以添加时钟。

        在clock setting中设置。这里只用到一个时钟,把时钟名字改为clk,频率改为100M。如果需要其他时钟,可以点击Add按钮,添加时钟。
        时钟设置好后,就要添加CPU了。因为一个嵌入式系统,是需要一个处理器的。

        选择左边的nios2。这个nios2是altera的32位处理器软核。大家可以理解为一个32位的单片机。

        出现配置界面,这里是对nios2的配置。Nios2有三种核,关于这三种核可自行百度,这里选择的是第二个。其他的默认。直接finish。

        然后就可以看到nios2添加进去了,但是连线没有连接,qsys中的IP之间的互联线是需要自己手动连接的。这里先不用管。
        然后是添加ram。Ram是一个嵌入式处理器必须的东西,可以存储程序,可以存储数据。这里简单起见,使用的是芯片内部的ram,没有用外部的SDRAM和SRAM。

        选择左边的on-chip memory。

        在配置界面把大小改为102400,即100K。这个大小够我们写一些简单的程序了,这里注意,这大小不能随便设置的,要小于芯片提供的ram大小。之前选择芯片的时候看过,该芯片的ram大小为486k,所以大小要选择比这个小。

        这个时候,就多了一个onchip-ram。我们这里会把这个ram当做数据和指令存储器。
        然后添加system id。这个system id是一个nios2系统中必须的,用来标识该设计的CPU,因为可能一个nios2系统中个,有多个nios2软核。这里就直接添加就好了

        在配置界面,可以给ID改个其他数字。只要不和其他的system id一致就行。

        添加后,界面就变成下面这个样子了。

        然后添加jtag-uart。这个jtag-uart是用来向PC机传送信息的。只是用的是jtag,而不是串口。

        JTAG UART ip界面。

        直接默认配置,finish。

        界面就变成上面这个样子了。
        这下,一个nios2最小系统就构建好了。不过这个最小系统能干的事就比较少了,就只能发送数据和接收数据。
        接下来,就要添加我们需要用的外设了。
        首先是添加输出IO。因为我们要控制led。在nios2中,对于输入输出IO,都是用PIO的IP核。

        PIO IP界面。

        在配置界面,需要配置PIO的输入输出。这里IO是用来控制16个led,所以输出宽度设置为16,方向设置为输出,复位值设置为0。下面的不选择。Output register是表示能单独的对每一位清零或置位,就相当于stm32的IO位操作。这里不选择。因为是输出,所以中断和边缘检测是不能选择的。

        这样界面就多了一个PIO。
        然后添加按键的PIO。还是添加PIO,不过配置要改一改。

        因为是一个按键输入,所以宽度设置为1。方向设置为输入。当设置为输入,可以看到下面边缘检测和中断可以选择了。因为用中断方式检测按键,所以中断要打开,方式设置为电平。如果中断方式要设置为边沿的话,那么要打开边缘检测。
        设置好后,直接finish。

        界面就又多了一个PIO。
        其实就是你添加一个IP,界面就多一个IP。
        剩下就添加lcd了。以前我们驱动lcd的时候,都是自己写代码,去驱动lcd。但是altera比较人性化,把驱动的部分做成一个IP,我们直接调用使用就行了。

        LCD IP界面

        这个IP,没有配置信息,就是不用配置。直接finish,
        这样,就完成了模块的添加。接下来,就对模块重命名和连线了。

        重命名后,可以看到,从名字就可以看出该模块的功能是什么了。
        然后就开始连线了。连线这个,第一次连的时候,不知道怎么连,但是多连几次,就知道怎么连了。
        首先clk,每个模块都有一个clk,因为这里只有一个时钟,所以模块的时钟都和clk的时钟连在一起。但是如果有多个时钟,就要注意,每个模块要连相对应的时钟。

        然后是连数据总线和指令总线。这个的一般连法是,如果是ram,那么数据总线和指令总线都要和nios2相连。对于其他的,只要连数据总线就行了。

        然后是将模块的输出信号导出。有些模块的输出信号是需要导出的,比如led,key,lcd,因为这些模块需要将管脚导出,然后连接到外部的外设对应管脚,这样软核才能控制外设。
        这个直接在模块的external那一行的export那一列,双击就行了,然后改名字就导出了。时钟和复位是默认导出的。

        最后就是复位的连线了。
        如果整个系统只有一个复位的话,那就简单了,直接选择

        这样,就将所有的复位都连起来了,但是如果系统不是只有一个复位,那么就要自己连了,模块连对应的复位管脚。

        这样,就完成了整个的硬件设计了。接下来在做一些设置就行了。
        其实可以看出,qsys完成的功能就相当于我们自己去设计一个嵌入式系统,首先,系统需要什么外设和CPU,然后进行添加,添加完毕后开始连线,实现CPU和外设的相连。只不过在qsys中这个过程就简化了,只需要去调用IP,然后连接就可以了。
        接下来,要给每个外设分配地址。可能很多人有疑问,这个外设的地址到底是用来干什么的。
        其实在嵌入式系统中,外设是通过寄存器来进行访问的,比如说对于IO,IO可以作为输入也可以作为输出,那么就需要有一个寄存器来控制IO的方向,那么这个寄存器就需要一个地址,这样CPU才能通过这个地址访问到这个寄存器,从而设置IO的方向。于是IO有了一个方向寄存器的地址。我们要IO输出的时候,怎么输出啊,就是向IO数据寄存器写数据,这样IO就输出我们想要的值,而这个数据寄存器也需要有一个地址。这样我们的IO就有两个寄存器地址了。把IO的功能寄存器集合起来,就有一个地址范围了。为了方便管理,这些寄存器的地址都是在一个连续的区域,方便我们控制。在软件我们就可以用指针去操作这些寄存器,就相当于操作IO了。
        所以需要给外设分配地址,当然这分配地址我们交给qysy软件来分配。直接:


        这样,就分配好了地址了。
        然后,还要设置下nios2的复位地址和异常地址。这样当复位的时候,nios2软核才知道去什么位置执行程序,当异常产生的时候,nios2软核才知道去什么位置执行程序。


        在nios2软核中设置复位向量和异常向量都指向onchip_ram。
        最后是分配下中断号就行了。


        在有中断的地方的IRQ列双击就行了,这样就为需要中断的外设分配一个中断号。有了中断号,才能写程序的时候注册中断号,中断才能用。
        以上完成后,就完成了硬件设计了。然后:


        Generate就行了。这样就完成了qsys设计了。
        剩下,就将生成的qsys设计导入到quartus。


        在原理图顶层中导入qsys,另外导入一个pll,pll的输出时钟频率是100M,这个时钟就是我们的nios2的系统时钟。然后对管脚进行分配。然后把kernal的.qip文件加入到工程中,不然编译的时候会报错。
        这里要注意的是,按键的输入要接一个非门,因为中断对高电平敏感,而按键的输入平时就是高电平,按下才是低电平,所以这里要取反,不然就一直进入到中断里面去了。


        然后就是漫长的编译过程了。


        编译完成后,将生成的sof文件下到芯片就行了,这样,就完成了硬件设计了。剩下就要进行软件设计了。

        网页上图片比较模糊,可以下载pdf,查看高清图片。

nios2之LCD硬件设计.pdf

 

 

此条目发表在FPGA分类目录,贴了, 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。