当前位置:   article > 正文

fpga一个按键控制跑马灯启停_低成本的FPGA上实现SoC之六跑马灯和Hello world

fpga按键控制灯的启动和暂停

 跑马灯和Hello World是很多学习硬件或软件的朋友的第一个设计实例。这两个例子的共同特点是没有输入,只有最简单的输出。这样可以在最短的时间里搭建出一个看上去可以工作的硬件或者能够运行的软件,帮助大家初步了了解硬件或软件的开发流程。今天我们就以跑马灯和Hello World为例,做一个最简单的SoC系统。在熟悉了流程的基础上,你就可以真正的开发出适合你的应用的真实的SoC了。

首先,我们通过下面的图来了解一下Mico8的开发步骤:

6184927cca2643878d96b0248fa46a37.png

第一步:搭建我们的系统平台,添加Mico8和相应的外围模块,比如UART,GPIO等。生成平台的RTL代码和用于软件设计的相关文件。

第二步:在软件开发视图中设计你的软件程序。

第三步:编译软件代码,生成二进制文件,通过工具转换成放在EBR中的格式。

第四步:把生成的RTL代码导入到FPGA/CPLD的开发软件中,按正常的FPGA/CPLD开发流程设计。

完成这四步,你的SoC的设计就基本完成了。这里需要提醒一下的是,在完成第三步以后,要回到第一步重新生成RTL代码才能进入第四步。这样做的目的是为了把软件导入到Mico8的程序空间。当然,软件工具也提供的EBR的初始化工具,可以不用每次都重新生成RTL代码,只需要更新EBR的初始化内容就可以了。所以,这个流程还可以改为:

4ff522901b378a5e207aed922646fd4e.png

下面我们Step by Step的介绍一下这个最简单的SoC的设计过程。这一部分要感谢硬核Rock的支持。

系统框图:我们要设计的这个简单系统是这样的

2155ff1296b6f3e923773e9698d8c2b2.png

上位机通过UART给UART发命令和接收数据,Mico8收到命令后给PC返回开关状态,同时通过LED显示开关的状态。为了简化,我们第一步的设计让Mico8向PC发送一个HelloWorld,同时让LED以跑马灯的方式闪烁。在搭建系统平台的时候,我们还是要把相应的模块添加进来,为我们下一步的学习做准备。

新建一个SoC的过程我们在前面介绍过,这里就不赘述了。建好一个平台后,我们第一步要添加的就是Mico8的Core。

70db923f259040b62bfb44c2f57204ef.png

f8ff6e8a0a123eb054b1fe9e3668190b.png

在器件(component)列表中双击LatticeMico8,配置Mico8的基本参数如图所示。在这一步,不需要指定初始化文件。

添加完Mico8之后,我们在添加一个LED模块,在component list里,这是GPIO类模块。

482d37f00fdd6f90039fcd40d318800b.png

和Mico8有些不一样的地方,这里要指定Instance name,这也是你在软件里要访问的对象的名字。因为LED是个单纯的输出控制,所以port type设置为“output port only”。数据位宽要根据实际的板子上控制的LED数量来定。要注意的是,你不需要在这里设置基地址,开发软件会自动分配(expert 除外)。

添加完输出的LED模块,我们现在添加输入的switch模块,同样是GPIO类。

3925f380edf443d1e6960e34cb5eb1ed.png

Wishbone的总线宽度我们设置为8,因为Mico8的wishbone是8位的总线接口,本身也是8位的CPU,如果你把component的wishbone总线设置成32位的话,意味着每一个操作将会转化成4个8位的wishbone指令。程序的长度和运行时间都会是原来的4倍。

下面我们添加UART模块:

a17b5752abf0c40c0b579ba2a3c03fad.png

这里没有特别要说明的。注意的是uart的波特率是固定的,不是动态可调的。在应用中,要保证供给Mico8的系统时钟要和GUI中的设置一致。

完成上面的工作以后,我们看到的应该是这样的效果:

823ddb313352eb4cd5391eb345b11116.png

在第二列中,实心的原点表示component与Mico8的wishbone总线连接上了,也就是可以通过Mico8的程序访问这个component。你可以点击这个圆点,当这个圆点变成空心的时候,表示这个component没有和Mico8挂接在一起。有些时候,你需要搭建一个平台,但不是每次都要用某一个component的时候可以这样操作。这样就不需要频繁的添加和删除component了。通过这个图我们也看到,3个component的基地址,结束地址都是一样的。这个你不用担心,在生成RTL和相关文件的时候,这些地址会自动重新分配以保证不会发生地址冲突。你需要做的就是不要把最后一列的lock选中就好了。

下一步的操作,就是click-click:

05d4b6862910d50e2b9c4c0175e5acbe.png

依次点击A-address generation,I-Interrupt generation,D-DRC check和G-generate platform。我们就完成的平台的搭建工作。

下面我们开始软件的设计。将GUI的设计视图切换到C/C++。选择micromanaged make C project。

6034e32e6e02426392c0084f5e1b395c.png

这时会弹出配置的窗口:

3818a991647fb87e56799f19e7a7e341.png

要注意在这里要确定msb文件就是我们在前面生成的,不要弄错。

然后我们就可以进行软件的设计了。这个设计比较简单,你可以添加一个.c的文件,如下:

/**************************************************************

 * This example exercises LEDson LatticeMico8 Development   *

 * board.                                                    *

 *------------------------------------------------------------*

 * PREREQUISITES:                                             *

 *                                                           *                                                                                                   

 * - GPIO with 4-bit outputnamed LED connected to the        *

 *   board's LED pins.                                        *

 *                                                           *                                                           *

 **************************************************************/

#include "MicoUtils.h"

#include "MicoGPIO.h"

#include "DDStructs.h"

#include "MicoUART.h"

#include "GPIO_demo.h"

/***************************************************************

 * TEMPLATE SPECIFICPARAMETERS ARE HERE, CHANGE AS NEEDED.   *

 ***************************************************************/

char *WELCOME_MSG_1 = "Hello World\r\n";

/***************************************************************

 * Send String to the Uart                                     *

 ***************************************************************/

void sendstring (MicoUartCtx_t *pUart, char *str)

{

    char *ptr = str;

    do {

        MicoUart_putC (pUart,*ptr);

        ptr++;

    } while (*ptr != '\0');

}

/***************************************************************

 * Print the main menu on thehyperterminal                    *

 ***************************************************************/

void send_welcome (MicoUartCtx_t *pUart)

{

    // Print Main menu

    sendstring (pUart,WELCOME_MSG_1);

}

int main(void)

{

    int iValue = 0x01;

    MicoGPIOCtx_t *leds =&gpio_LED;

    MicoGPIOCtx_t *switches =&gpio_switch;

    MicoUartCtx_t *uart =&uart_core_uart;

    send_welcome(uart);

    while(1){

     MICO_GPIO_WRITE_DATA_BYTE0(leds ->base, ~iValue);

     MicoSleepMilliSecs(200);

     if (iValue < 0x01)

         iValue = 0x80;

     else

         iValue = iValue >>1;

    }

    return(0);

}

  编译软件代码,生成EBR的初始化文件,放在PROM中。在diamond中运行综合,MAP,PAR,最终生成JED文件。下载到硬件中,运行以后,你就可以看到你的SoC运行在CPLD之中了。

我们下一次讲讲如何生成EBR的初始化文件这件事。

b0edfbf5a62adb1042579ab973c0e0e1.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/634141
推荐阅读
相关标签
  

闽ICP备14008679号