中国领先的单片机及嵌入式资讯、教程、开发工具提供者!
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

分享一些FPGA学习的经验

作者:佚名   来源:本站原创   点击数:  更新时间:2012年01月19日   【字体:

     从开始学FPGA到现在粗略算来的话,已经有3个多月了,就目前而言,我并不确定自己算不算高手们所说的入门了。但是不管现在的水平如何,今天就总结一下自己学习它的感受或一些认识吧。

       首先,先说一下自己的在学习中所发现自己的不足之处:

1.      不会总结。

2.      学习的良好习惯没养成。

   在写FPGA的基本模块时,遇到的问题有许多,譬如,写代码时的警告,特别是一些不能忽视的警告,每次遇到时,总是还要检查一会儿才能改过来,或者有的警告已经出现了几次,但是就是解决不掉。每次在学一个模块时,只要是看懂了,它的一些重点就没有及时的记录在本子上,只有个别的想起来时,才会做笔记。每做完一个模块,没有及时记录下自己从这个模块中学到了什么。上面的不足,都是在写模块的过程中,自己逐渐暴露出来的。我很庆幸自己的一些问题能及时的被发现,虽然年前的学习将暂告一段落,但是,在年后的学习中,我一定会时刻记得自己以前在学习上出现了怎样的不足,避免类似的事情再次发生。像遇到警告时,都要记录下来,通过改正后,要注释,写下警告的原因,定期看一下。我上次写的一个代码就没有注释现在自己都看不懂了 http://www.51hei.com/mcu/967.html ,每次写模块的时候,都要记下重点知识,即使是自己懂得的,好记性都是比不过烂笔头的。

       其次,就谈一下自己在学习FPGA中,截止目前,学到了什么,认识到那些。

   FPGA简单的说,就是现场可编程逻辑阵列。它的内部是逻辑单元,它们之间可以用线连接,至于以怎样的形式相连,则可以根据应用者写入的逻辑决定。每次布线都会重新组合逻辑单元,从而可以任意的编写不同的逻辑。当然,前提是定义的逻辑块不超出它可读写的最大值。可能自己说的术语并不专业,又或者是理解或表达的不透彻,但随着学习的加深,一定会有更加透彻的理解吧。学习FPGA ,虽然资料很多,但是看的资料并不是很多,除了看夏宇闻编写的语法书外,看的最多的就是特权同学的,一个年轻的电子工程师,他就是通过自己的努力和坚持不懈有了现在的水平,虽然不能说是最好的工程师,但是,他在这条路上的成长历程,却代表着更广大的青年的奋斗轨迹。他的《深入浅出玩转FPGA》这本书,以前只听网友说不错,等到自己开始看后,发现里面的内容确实是值得学习,不仅是学习的层次性,同时里面的方法也是很不错的。通过看书和做模块,自己对FPGA中的几个学习重点或者说菜鸟必须清楚了解的知识,有了一些自己的看法,首先是阻塞与非阻塞赋值的区别,阻塞赋值是只要你给一个寄存器赋值了,它在此语句结束后,其值立马就改变,而非阻塞赋值却不同,赋值后,寄存器存储的值并没有改变,还是上次所赋得值,只有当此过程块结束后,下一次脉冲来时,输出才会改变,确切的说,某些情况下,可以将阻塞赋值理解为移位寄存器。它们的不同之处可以有下图看出:
 



图一:非阻塞赋值 

 

图二:阻塞赋值

       当想把a先赋给b,然后赋给c时,阻塞赋值是b和c在同一个脉冲下,一起等于a,而非阻塞赋值则是先把a赋给b,在下一个脉冲时,再将b赋给c,这才符合设计的初衷。所以,在运用时,要注意到它们的不同之处。在时序逻辑中,用非阻塞赋值,而在组合逻辑中用阻塞赋值。

       除了阻塞与非阻塞赋值的区别要理解清楚外,状态机又是一个重点,会运用状态机非常重要,这是在写可调时钟时,自己深刻意识到的,当时写可调时钟时,想要调节它的不同模式,但是又不能在不同的过程块中,对同一个变量赋值(和C51的不同之处),所以,当时写此代码的时候,走了弯路。这几次写的几个代码中也用到了状态机,如:矩阵键盘的扫描,串入并出和并入串出,AD0832。它让我越来越感觉到,要想控制好一个层次分明的工作流程,状态机不可少。而要想写好一个状态机,首先要做的就是要确定若干个状态,明确各个状态之间的逻辑关系,转移条件等等。虽然,到目前为止,自己还有几个模块没写完,但是,自己对状态机已经不再是不知道怎样用,而变为遇到一个问题时,总是想到状态机是否能解决这个问题。我想这也是自己在这方面踏出的第一步吧。除了这两点外,让我感触很大的就是除法器的编写,以前在单片机中,用到除法,只需要一个符号:“/”就能搞定,但是,现在让自己写一个除法器,要弄懂它的原理,这让我意识到,往往看起来很简单的一件事,在其背后,总有许多需要我们去挖掘或者说是去认识和学习的地方。除此之外,我感觉有几种编程技巧挺不错的,例如:“Wire    keysign=cnt[19]”这种置标志位的方法,只有当位宽为19的寄存器“cnt”计数计满时,keysign才变为1,同时只保留一个周期,而寄存器“cnt”计满后,自动清零,当下次计满时,keysign才再次被赋值为1;这在矩阵键盘的扫描中,是非常重要的。还有就是移位寄存器的应用,包括位拼接等等,都挺经典的。

       在学习的过程中,通过学习到的这几种相对较好的编程方法后,我也意识到了自己在学习中的一些不正确的思想,如:以前总感觉既然是写代码的,最好还是自己写,这样才比较好,照着别人写好的代码看,感觉好像少点什么似的,这可能是心理作用在做怪,而这几次模块写下来,自己体悟挺深的,刚开始总是自己想着写,进度不仅慢,效率也不是很高。这让我郁闷不已,后来看别人都是看着别人的代码改写的,我想了挺多的。看别人的代码,能看懂其实也是一种本事,作为初级者,首先就是一个学习的过程,不可能什么东西都是“自来熟”,只有先学习别人的长处,掌握了一定的基础,才能去创新。这一点,在我看了网上一些人写的代码后更加相信:大多数的基本模块代码,大家的编程思路都是非常一样。只有在编写一些大型的代码时,才会在原有的基础上去进行改进和融合。而这些技能离不开平时的积累。

       关于以上的总结,我相信在以后的学习中一定会对自己有莫大的帮助,它会时刻警醒自己,在以前的学习中,自己有哪些不足,以后千万不能再去犯同样的错误,不断地纠正,不断地进步,相信自己一定会学好FPGA的。

 

发表评论】【告诉好友】【收藏此文】【关闭窗口

文章评论

相关文章