硬件描述语言学习之我见

学习VHDL心得体会

Posted by Florian on January 21, 2019

前言

在学习硬件描述语言之初,曾有过不少困惑,现将入门心得记录下来,感激这段思考的过程。

根据2018-2019-1学期一门课的时间顺序来阐述我的入门之路。

数电课程带来的疑惑

早在上数电课的时候,我便接触到了硬件描述语言这个东西。由于自己学C语言的时候比较喜欢动手写代码,所以在看到硬件描述语言这个东西的时候便想去学习。然而,这门课的重心是中规模器件实现这一块,至于硬件描述语言,考试也仅仅涉及一点语法修改。在这种背景下,老师基本就不会讲到硬件描述语言,但我一直觉得掌握硬件描述语言对我而言更重要。说来惭愧,出于应试和时间上的某些原因,我当时没能把verilog学好,并且有一些思想上的错误,具体如下:

  1. 硬件描述语言无非就是写点代码,我多看点代码就学会了
  2. 由于当时课程老师给每人发了一块FPGA开发板(Basys3)让我们自己学verilog(不过全班应该就我一个人拿出来玩过),但写的东西太简单,以至于当时没能发现最本质的东西。我以为就像打算法竞赛时,针对输入输出编写一段代码,测试时类似“黑盒测试”,对就是对,错就是错。“黑盒”里面是怎么回事,我当时根本没认真想过
  3. 阅读HDL代码时,就仅仅是在阅读HDL代码

由于以上错误的想法,导致在那个学期我看似是花了不少的时间学习verilog,但实际上效果并不好。

初识EDA课程,被老师感动

在数电课程结束后的下一个学期,我又要上一门名为“电子设计自动化技术”的课程,这门课的老师是一个很可爱的老师,以下简称H老师。在这门课上有很多令我难忘的事,且待我慢慢道来。

由于每学期第一周听课后可以根据个人需要退补选课程,所以第一节课H老师便进行了他的“劝退”式介绍:这门课任务比其他老师的同课程繁重,最后大家的分数还不一定有别人高。就这样,原本80个人的班只剩下了36人,劝退成功。

我为什么没有退呢?

原因只有一个:我实在是太喜欢H老师了!

事实证明我没有错,后面的时间我与H老师有不少的交流,他不仅仅是可爱的,更是一位负责的老师。

H老师带给我力量

EDA课程是主要是一门教授VHDL语言以及数字设计的课程,用H老师的原话讲,“这门课不应该叫电子设计自动化技术,而应该叫如何使用电子设计自动化技术去进行数字设计”。

从第一节课开始,一直快到半期,我们都在学习数字电路中的基本器件,如译码器、优先编码器,对于这些在数电课程中已经学得比较熟的东西,我还有点不屑一顾,想着怎么不讲语言呢,这门课不是教VHDL的吗?直到开始做上机作业的时候,我才体会到H老师这样安排的目的。

第一次我抽到的上机作业要求我用VHDL语言实现一个浮点数加法器,这可难倒了当时VHDL一点都不会写的我。一开始,我很有自信 ,因为以前经常编写C/C++的代码,再加上之前提到的错误思想,觉得这东西也不过如此,反正就是打代码嘛。直到我真正把软件下载安装好,开始做以后,才发现,这个上机作业跟我以前在OJ上做的算法竞赛题目完全就不是一个概念。

它们有相似的地方,同样是给你功能,输入输出,让你编写代码实现。但最根本的不同是,上机作业实际上是需要我去设计一个电路完成这个功能,而算法竞赛题目是需要我在时间复杂度足够优的条件下给出算法并用代码实现。上机作业看似是写代码,但实际上根本不是写代码。

由于当时很多问题没考虑清楚,我就开始思考、做、思考、做、思考,在这样的循环中我绝望了,我觉得我做不出来了。

这时候,H老师的鼓励,让我在某一天午睡的时候突然产生灵感,然后衣服都没穿就下床开始画图、然后考虑代码编写的问题,两小时之后,我解决了这个问题,并在当天晚饭后提交通过。绝境中的灵光一闪,让我豁然开朗。若不是H老师在我绝望的抱怨声中依然选择鼓励我并给我讲一些做硬件设计的思想,或许我就没有灵光一闪的机会,更不会在现在有这些心得写出来了。

从这个时候开始,我渐渐开始悟到H老师每页课件的最后一句话的深意——”If you truly understand the principle of hardware, VHDL is very easy to learn”。

然后就是顺利地完成第二次上机作业,一个稍复杂一点的交通灯的设计,主要学习了状态机如何写(三段式 or 两段式),在做这个的过程中发现一个比较不错的网站,All About Circuits。当时写状态机学习了一篇文章,站内搜索FSM VHDL关键词即可。

第三次作业是一个小组合作完成的作业,这次作业让我学到了很多,不仅仅是做设计上的,还有团队合作的真理。

这次作业具体是要做一个arcsin函数的计算,三人一组,但是是随机分的,所以队友水平咋样我也不用多说了。这个题目怎么做是我想的,整个大的框架是我想的,最后编码,大部分是我打的,只有中间一点暴力计算的部分留给了某一个队友打。你问我还有一个队友呢?对不起,我连他关心进度的声音都没听到过,最后做出结果不分享也不能怪我。团队合作就是这样,我不指望大家水平一样,也有可能我比其他队友都弱呢,但是我希望一个团队的人都是齐心协力地在做一件事,虽然这不太可能,总是有人想划水,现实很残酷。所以当有人划水的时候,不要抱怨,靠自己的力量,能carry则carry,不能carry但尽力了,锅是不可能甩到你头上的。

至于这次作业学到的东西,大概就是用状态机来控制计算过程,最终达到精度误差以内的结果。状态机用作控制是工程中经常用到的方法,H老师上课也提到过了。

回顾这三次作业,第一次是组合逻辑的,第二次是时序逻辑的,第三次是二者的综合,在三次作业以后,我从一个完全不会VHDL的菜鸟,变成了一个会把硬件用硬件描述语言描述出来、会把设计下载到开发板上调试的不那么菜的鸟。其实我加起来也没花多少时间,但仔细想想这个过程中最重要的两点,一是遇到问题,我会尽力去解决,而不是坐以待毙;二是我思想上的转变,对硬件描述语言的理解纠正以后,掌握它就像是在做作业中顺便学会了一样。

三次作业结束后,这门课也就结束了。H老师在群里发的一大段话让我又想起了这学期和H老师相处的点滴,竟然有一丝想哭,没过多久QQ群解散了。这门课结束了,但我的征途,才刚刚开始。

感谢H老师对我的帮助和指导。