FPGA实验总结

这学期的课看似挺多,到了考试的时候才明白原来考试内容是大水特水。所以我觉得我们不是在学知识,我们是在走形式。给谁看我不知道。

  • 10月24日,周一。第一次FPGA实验,在E楼五层,人多机子少,凳子都没有。老师讲解了FPGA的现状,教我们怎么控制发光二极管。
  • 组成小组,确定实验题目,我们最终准备做一个“欢乐五子棋”。问了下老师,如果是人机对弈的话会很困难,而且这个我也没有把握,就确定了是两个人下。其它课其实很紧,每次上完实验都没时间自习。最开始控制VGA显示屏的时候我怎么也不能让条形动起来。有点沮丧。
  • 有一次去晚了机位被占,于是回去拿自己电脑,发现没装,临时装了一个,装完了发现不知道怎么启动。查了一堆,原来还要用命令行。回到实验室插上板子发现不能识别,驱动没装。很麻烦。最后又是查了一堆,而且最后又是不知道怎么就好了。在Ubuntu上装Xilinx ISE花了我很多时间。
  • 11月4号,周五,实验结束,最后确定题目。老师大概讲了一下PS/2鼠标,给发了份文档,里面有别人实现的PS/2协议的代码。但是我其实一点都不理解。许已经把棋盘画出来了,看起来很漂亮,而且当时已经有人把鼠标显示出来了,我想也应该很简单,就没有改题目。因为刚好在邮件列表里看到有人重发了一篇清华学生写的文章,他们是大二学的Verilog,一周,然后要交一个8086上去。我就想我们一定要把这个做出来。
  • 我们准备用鼠标在VGA显示器上下五子棋,按左键放子,根据奇偶分别玩家A和玩家B,下一个子就画个圆。而且鼠标滑过的时候要有个方框,最后能检测到五子相连。总的来说很简单。然后实验结束,交作业是在12月1号。时间还早,但是一直没有思路,最要命的是没有实验板了。有时跟同学讨论方案总觉得是在纸上谈兵。老师说给安排调试但一直到了月底也没通知。
  • 我纠结了很久,期间还准备学一下仿真,然后先把代码框架写出来。随着12月的临近最后还是放弃了。我觉得自己真的很失败。
  • 然而12月1号,周四,那天老师出差了,作业延期,我不知道是好是坏,因为当时我已经想放弃了。第二天想了很久还是问同学借了板子,他们是申请的国创所以很霸气地买了块。下午我又把PS/2协议研究了很久,大家自习,因为下周就有ASIC的开卷考试(大多数人没去听过课,我都去了,但是最后一节老师划重点我没去,大家都去了)。我弄了很久才熟悉了这块板子,它跟实验室的板子还是有点区别。想看到鼠标有点反应,它就是不给面子。我知道这是最后的机会了,必须做出来。晚上睡觉都没睡好。
  • 周六早上九点就起来了,到了中午,我终于看到LED灯随着鼠标的移动在闪。这总算有了个希望了。然而到此为止,再也没有发生任何奇迹。下午索性去上自习了。晚上回来,终于又有了突破。两点多的时候我们看到鼠标能在显示器上有反应了!当时真的好激动,特别兴奋。其实鼠标那块的代码还是借用别人的,直接用就行了,问题就是开始不会用。

后面的事情就很简单了,许祝登给鼠标画了个箭头,而且已经可以依次显示两种不同颜色的棋子了,只是有时候会有bug,但都是小问题。然后我们放松了很多,就剩下判断五子相连了。当时问过老师,for循环是不能综合的,所以搜索的话我不知道怎么实现。那天发现其实12*16的棋格只有四百多种五子相连的情况,而且都是有规律的,于是就想用枚举的办法,事先把所有情况都算出来,然后每放一个棋子检测一次。这里我们用了位运算的技巧,不是挨着检测464中情况,而是把它们当作一个464位的数,只要判断它是不是保持0就行了。

还是说一下主要思路。定义reg [191:0] stat_a,stat_b,每位代表相应的玩家是否在该位放置棋子。reg [463:0] chk_a,chk_b,把每种五子相连的情况,比如stat_a[0…4]相与之后赋给chk_a中的一位,一旦出现五子相连,chk_a就不为0了。

写了一段C程序输出了所有464条赋值语句,然后用Vim替换什么的,太合适了。

12月22日,延期了三周之后,终于该交作业了。其实老师只检查了不到五分钟。自己买板子的那组是做的电话什么的,可能比较高级,但貌似就是他们申请国创的东西。当老师听到我们是算出了所有方案来判断的时候笑了。

总之最后我们实现了最初的想法。这个学期总算除了自习还有点收获。尽管谁也不会在意,但至少落实了我最开始的决心:一定做出来。