寒假一起练(3)项目演示(万毅豪)
通过寒假在家练活动,充分利用寒假在家时间来学习,通过FPGA的学习,来壮大自己的硬实力。
标签
FPGA
wandashuai
更新2021-02-24
978

   这是第一次接触FPGA,面对陌生的开发环境,不熟悉的语法,开发的困难很大,问题也接踵而来,在刚刚开始的时候,面对这个类C语言,以为它的编程会和以往的C语言编程差不多,但是,FPGA和我们原来学的C语言编程有了一个很大的转变就是,C语言的语句是顺序的,只有执行了上面的语句才会执行下面的语句,但是FPAG不一样,FPGA的逻辑是并行的,如果不能把以往的思维转变,我们在编程的过程中就会出现无数的问题。

   我们这次参加的寒假在家练活动,这个项目有着5个要求,分别是:

  1. 实现一个可定时时钟的功能,用小脚丫FPGA核心模块的4个按键设置
    当前的时间,OLED显示数字钟的当前时间,精确到分钟即可,到整点的
    时候比如8:00,蜂鸣器报警,播放音频信号,最长可持续30秒;
  2. 实现温度计的功能,小脚丫通过板上的温度传感器实时测量环境温度,
    并同时间一起显示在OLED的屏幕上;
  3. 定时时钟整点报警的同时,将温度信息通过UART传递到电脑上,
    电脑上能够显示当前板子上的温度信息(任何显示形式都可以),
    要与OLED显示的温度值一致;
  4. PC收到报警的温度信号以后,将一段音频文件(自己制作,持续10秒钟左右)
    通过UART发送给小脚丫FPGA,蜂鸣器播放收到的这段音频文件,
    OLED屏幕上显示的时间信息和温度信息都停住不再更新;
  5. 音频文件播放完毕,OLED开始更新时间信息和当前的温度信息

   在刚开始时,看见这几个任务,完全一头雾水,但是,既然参加了这个活动,我们就要做下去。于是乎,我就开始了FPGA的学习之路,在学习初期,我认为我们最大的困难就是,没有明确的学习途径,完全不知道该怎么学习FPGA,在学习初期,我光是寻找学习的途径、方法等,就花费了很多的时间。

   然后,我们在学习的过程中,也遇见了很多的问题,比如reg和wire的区别,always和assign的区别等等,这些东西可以做什么,有什么用,我们都不知道,然后找到的资料的介绍也过于的官方,对应我们这样的完全没接触过FPGA的理解起来也有很大的困难,然后又花了会为你多时间来了解这些东西后,就开始了编程的任务。

   在刚开始编程的时候,我最开始的打算是,将单个模块先做出来,最后再放在一起,这样来完成这个项目,但是当我第一次将单个模块做出来再组合的时候,问题就是出来了,我最开始的模块的接口和输出口,完全不能支持我进行模块化的组装,然后就是反思自己的问题,发现了我对每个模块间的联系并没有考虑到,就是说,我并没有将这个项目看做一个整体,而是一个个单独的模块,然而,我现在的能力不足以进行这样的开发,于是,我就开始了方案2的开发。

   首先要理清大体的开发过程和所需要的外设支持,

  1. FPGA项目的中,我们的人机交互主要是oled,所以,我们应该围绕oled来编写程序,先编写好DS18B20的相关代码后,修改oled代码,让其在oled的最下面显示实时的温度,精确值到个位,然后,我做了个1分钟的时钟,用于制作时钟功能。
  2. 在我们项目里,有一个很重要的就是串口功能,我们就要建立相应的串口模块,大体目标就是实现将温度数据发送到pc端,再由上位机发送相应的音频数据回FPGA,再此期间,我们oled将不会更新数据。
  3. 我们再实现功能时,我们还会用到按键功能,然而,我们的时间模块是镶嵌再oled模块里,所以我们的按键模块也会镶嵌再oled模块里,于是乎,我们就要实现相应的按键模块,再通过拨动开关,使得我们能调整初始时间,再次改变拨动开关的状态后,就能进入计时模式。


   大体的构思如上,然后我们就可以将需要的模块组装起来,在相应的模块代码加入完成后,我们构建一个project的工程,在工程内部,将相应模块例化后,就可以连线,做出我们项目的大体框架,然后,就到了我做项目最困难的时候,将所有的功能实现,但是每个模块之间的联系,相应参数的改变都出现了不同的问题,例如,一个参数只能在一个语句里赋值,例如,reg[1:0] num;我们只能在同一个always@里面改变这个值,在其他的模块或语句里,我们只能判断或者引用这个数值。

   所以,只有再深入研究,FPGA的语句结构,或者再修改我们代码的结构,使得我们的数值可以不被多个always@语句修改其值。

   于是乎,我们就要再继续修改我们程序的代码,我们就可以尽可能的在同一块always@语句块里完成我们需要改变的数据的变化,而在其他的always@语句块里只对相应的数据来直进行判断和其他不改变其值。我们就不仅只是对模块进行简单的拼接了,还应该对多个always@语句块进行符合逻辑的融合,这样就可以使得我们的整个代码之间变得更加整体。

   最后就是,对我们的代码进行整体的调试,在调试的过程中,我发现,我们在停止oled更新的时候,我们oled是有一定时间的滞后的,就是当我们到达设定的时间时,我们的数据还没来得及更新就已经停止了更新。所以,就找到一个解决方法,就是达到设定时间的时候,我们的状态要延迟一会儿再停止更新,这样的话,就可以达到我们需要的要求了。

   然后就是,我们这个项目的话,还需要自行编译一个上位机,通过这个上位机辅助完成我们项目的播放音频文件的功能,在实现这个功能的过程中也更加的熟悉FPGA的串口模块,使得我编写后面的相关代码的时候更加的得心应手。

   然后再谈谈这次的感悟吧,在这次的活动中,让我开始接触了FPGA,并且对这个FPGA也产生了浓厚的兴趣,并且在学习FPGA的过程中,我也逐渐掌握住了,在互联网时代,通过网络的方式,通过各个平台来寻找我需要的资料,从而解决我的问题,这个对于我而言是十分重要的一项技能,总而言之,这次寒假在家练活动,让我不仅接触学习了FPGA这个开发平台,也让我了解到了更多的学习平台,也学习掌握了更多的获取资源的方法,在这个学习的过程中,思维的转换是比我们掌握它的语法结构更为重要的,所以,我们要学习FPGA就一定要转换我们的思维模式。

   最后看看我们的整体框架和资源占用:

FglfinNeeWomBT32cTbma4RrFptL

FoNGwsmkn3nFK-Y3QPJuDShYWcqh

附件下载
Project.sof
团队介绍
成都信息工程大学,电子工程学院
团队成员
万毅豪
成都信息工程大学,电子工程学院,电子信息科学与技术19级学生
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号