61010108袁晓娇
幼儿练琴师
这一次的数字系统课程设计,我感觉是我大二下学期众多实验课程里面的一次宝贵的体验。上学期的大系统设计,因为准备不充分,时间安排不合理等问题,最终只是把原理图设计出来了,实际程序调试成果一点都不好,这次的数字系统设计准备时间更充分,而且因为每个人都是不同的题目,所以更有挑战性。
在刚刚开始的一段时间里,首先做的是自学并熟悉硬件描述语言。尽管很多人推荐使用Verilog语言,写起来简洁方便,但我还是选择了VHDL语言。我感觉VHDL语言比verilog语言更有调理性,结构清晰,和C++语言很相似,相对简单易懂。虽然可能编程的时候比较啰嗦,但是随着后来进一步的了解两种语言,我发现VHDL的“啰嗦”还是有好处的,因为它比较严谨,很小的错都能指出来,这样就不容易出错,很多时候往往能够一遍编译仿真通过。
然后是选题,万事开头难嘛,我觉得选题这一块,我是费了很大力气的。想要做出来的东西有很好的感官效果,我基本打消了做管理系统之类的想法。这类题目比较泛滥,而且难度在状态控制方面,整体做出来的效果不是很明显。然后,要体现好的视觉效果,必须对点阵、VGA有很好的应用,而这两样应用还是比较麻烦的,如果不投入较多精力,做出的显示效果就会很粗陋,这就没有意义了。除了视觉,还可以从听觉方面着手。我想到利用FPGA的硬件条件做一个电子琴。硬件方面没有太多要求,只要一个扬声器就可以了,这样我就可以把重点放到编写代码上。查找了很多书籍资料,发现电子琴这类的资料还是挺多的。但如果仅仅做一个普通的电子琴,则显得简单而没有新意了。查找的资料中电子琴只有播放和弹奏两种基本功能,我就想在这基础上再增加一些功能,做一个针对幼儿练习的电子琴陪练系统,加上密码锁,录音、时间管理、练习比对等功能,使电子琴更加智能,更加人性化,这是我设计的亮点所在。由此,项目题目就确定为“幼儿练琴师”。
基础部分进行较顺利,在中期检查时已经完成弹奏和播放音乐的功能。完成后面部分,显然要比前面部分费力的多。录音需要用到RAM, 以前从没用过,需要自己一步步摸索着学习去用。在编写VHDL代码方面,我最大的体会就是基础必须扎实,对常用语句的用法特性要足够熟悉。很多时候,自己认为逻辑完全没有错,可是仿真出来结果就是不正确,原因就是不够细致严谨,程序中常常存在细微的漏洞,容易使程序陷入死循环。比如说,在VHDL中常用的信号定义与变量定义是我最常出错的地方。信号总是在进程结束后才赋值的,所以在进程中间信号是一个不确定值或上一次进程结束时的值,而变量是在进程中间立即赋值的,但有效范围只在进程之内。我一开始不注意这些细小差别,结果出现了很多差错。
到了调试部分,因为模块较多,状态机涉及输入输出变量较复杂,所以调试过程并不是一帆风顺,有时候一个模块里面的信号变量处理不好,便会影响状态的跳变,就像上面说的,使状态机陷入死循环。经过不断调试,不断检查错误,终于能够排除各种问题,基本实现了预期功能。
经历了完整的设计调试过程,我感觉我的收获还是挺多的。只要认真对待,就一定能够得到有价值的体验,这是最值得高兴的。