转一个来自FPGA前辈的blog文,向前辈看齐!

虽然现在很忙,忙着考研,但是在空闲之余,不要去玩游戏,自己敲敲verilog代码也是极好的。

 既然选择了远方,便不顾风雨兼程,一路走下去。  —韩彬

  在看bingo的书时,看到这样写到。做什么事情都不容易,学习也是,所以一个词很重要不忘初心。作为一名大二的学生,我很高兴能够将自己学习FPGA的过程记录下来,一是方便自己以后回头看的时候能够有所感触,而是想分享自己初学入门是的一些经验给予初学者,能尽量少走弯路。

  我是大一暑假开始学习FPGA的,我是微电子专业,学校大三才开数电,大一的时候受老师推荐进了一个实验室,但是没有好好珍惜机会。最后便不退自出。大二学校FPGA创新实验室纳新,我非常想加入所以利用暑假的时间来学习。刚开始学习的时候没有一上来就摸代码,而是先从数电书开始看起,这是我第一次自学一门课,对着数电电子书看没感觉,后来就看ppt,遇到很多第一次接触的概念,但是没有办法没人去问,只能自己硬着头皮硬啃下来,现在回想起来真是非常感谢自己当时能静心去学,在刚开学那么忙的时候能顺利进去实验室去学习。附上数电电子书、ppt以及Verilog基本语法链接链接:http://pan.baidu.com/s/1dFywrpZ 密码:hh1f

  数电PPT和数电书要对应着看PPT上哪里看不懂了就看书上的详解,实在不行就百度,如果是自己自学的话这个过程是很慢的,所以在学校有老师教,这样的学习时间是很宝贵的,去外面学也不是不可,确实花了钱还是能学到东西的。但是我还是选择自学,毕竟囊中羞涩。基本上数电看上俩章的内容后你就会对组合逻辑有简单的理解,然后就可以看Verilog HDL语法了,我博客里有写赛思灵公司的开发工具ISE14.7安装包以及安装教程,使用详解。ISE使用方便适合着,主要是因为仿真激励不用自己写。只要有C语言编程基础,看一些简单的Verilog语法就可以上手操作编译了。

  一路走来,在实验室里做了一些小任务,碰到一些我以为不可解决的难题,最后也都慢慢化解。所以就将自己大一上学期的一些心得体会总结出来,未来的学习之路会更加坎坷曲折,愿我能不忘初心。

心得与体会

  1.FPGA设计思想。记得该开始学习FPGA的时候,总是以读完题目就开始写代码,只是刚开始的工程比较小,只需要一两个always块,输入输出一写,基本也能写出来。但是随着工程逐渐变大,这样一拿到题目就直接敲代码的方法就难免有很多弊端。比如我在编写多功能数字表的时候想加入闹钟,时钟,秒表的功能,但是一上来就敲代码,最后写完了时钟的功能后发现闹钟秒表加进去很麻烦,最后费了很大的力气加进去但是加了一个有十二个输入的模块,这样从布线上讲太繁琐,从利用资源上讲浪费资源,总的来说是没有一个好的的设计思想。

  首先在创建工程之前应该至少画出它的原理图,每个模块想要起什么作用在刚开始设计的时候就应该要考虑到,更细致的话画出它的模块内部连线图,各个always块之间的相互作用要理清楚。然后再照图施工,中间的细节再经过后期编译过程中的在调节修改。

  2.模块化设计。模块化设计在编译的过程中可以提供很多便利。比如串口通信发送模块和接受模块我前面写过,那我在编译发送接收模块的时候就可以直接把整个.v文件拿来用,还有时钟消抖,led流水灯等。另一个便利就是在做比较的工程中避免一个module太大,修改查看代码不方便等,从原理图(RTL)上看起来也简单明了。

我在学习过程中还发现了身边同学有一点,他们在使用模块化设计分过多模块。串口通信发送工程,将分频波特率分出来,将发送接收计数器也分了出来。我认为没有必要分出来很多模块,波特率分频器可以分出来但发送接收计数器是没必要的。模块太多有时候例化连线时也会造成不便。所以我还戏称说咱这不能叫模块化设计了,应该叫always块化设计。

  3.代码书写、命名规范、注释。我觉得这一点也是是十分重要的,比如在使用模块化设计想要将以前的代码拿来复用,但是你的名字起得五花八门,有时候时间长了自己也不知道写的是啥。代码书写也应该要有规范,比如begin end 要成对的打不会丢,多用复制粘贴可以减少书写错误等。对于一些比较难理解的地方应当表明注释,这样自己在阅读和修改的时候很方便,别人看的时候也会比较容易明白。隔一段时间回去看自己的代码也不至于会忘了自己写的意思。总结来说要打得一手漂亮的代码。

  4.学会利用软件小技巧,仿真,编写激励技巧以及观察仿真波形图。以前没有仔细看仿真图的习惯,现在工程大了之后发现看仿真图真的可是省去好多时间。看着波形图去推代码满足条件,这样比直接下板子会节省好多时间。我在仿真串口通信接受模块时,将发送模块和接收块例化一起然后仿真,这样就避免了直接仿真接收模块时激励编写的麻烦,很多人这样做的时候会感到麻烦,我可以直接用我以前写的模块.v文件复制过来,很方便,这就体现了代码书写规范和模块化设计复用的优点。光针对串口通信而言,巧妙的利用他里面的一些信号,会十分方便,忙信号、发送结束信号等等,合理分配资源,最后事半功倍。

  5.多讨论,请教他人。自己一个人单独编写代码的时候难免会碰到这样那样的bug,也容易会陷入思想的死循坏,所以也要多和别人讨论,请教他人。但不是直接要别人的代码,可以请教一下设计思想,想想自己有什么不足,为什么没有想到,多总结,多思考。

  6.要有艰苦奋斗的精神。这学期以来,我为了完成任务,经常是周末一坐就是一整天。一个问题我也会几天连续的调试。最终往往都会找到解决办法。所以我觉得不会就去请教别人是好的,最后最好是自己能将它琢磨出来。

转载请注明作者出处:NingHeChuan(宁河川)

原文地址:http://www.cnblogs.com/ninghechuan/p/6238392.html

我非常喜欢这个图片,考研加油,但愿早日成就一身本领。

时间: 2024-10-24 23:08:39

转一个来自FPGA前辈的blog文,向前辈看齐!的相关文章

C++求一个字符串中的所有回文字符串并且输出结果(字符串操作)

#include <iostream> #include <string.h> using namespace std; bool check(char *str)//判断这是不是一个回文字符串. { int i = 0; int j = strlen(str)-1; while(i<j) { if(*(str+i)!=*(str+j)) return false; i++; j--; } return true; } void get_str(char *str) { in

如何快速访问MSDN某一个类或方法的帮助文档

如何快速访问MSDN某一个类或方法的帮助文档? 我一般都是在Google上搜索的如"string msdn",而不是在Msdn上直接查找(你不可能知道所有的类或方法的完整命名空间) 从Google上搜索到的MSDN地址通常都是英文语言的,所以只需要将地址中的语言更改为"zh-cn"即可显示中文的帮助文档(如果没有中文对应的文档则还是会显示英文) 如果只看对应的版本的话,直接更改链接中的vs.XX即可 MSDN地址格式: http://MSDN.MICROSOFT.C

Reveal常用技巧(翻译来自Reveal官网blog)

翻译来自官网:http://revealapp.com/blog/reveal-common-tips-cn.html 以下基于Reveal 1.6. 用于快速上手的内置应用 刚刚下载Reveal,啥都还没配置呢,想先随便玩玩看,怎么办? 我们花了不少时间开发这个复杂程度类似与实际场景的Sample应用──Soundstagram(音频分享版的Instagram, ¯\_(ツ)_/¯),就是为了让大家能最快速地上手Reveal,尝试它的各种强大功能. 在 Help 菜单项中,点击 Inspect

如何判断一个单向链表是否为回文链表(Palindrome Linked List)

题目:给定一个单向链表,判断它是不是回文链表(即从前往后读和从后往前读是一样的).原题见下图,还要求了O(n)的时间复杂度O(1)的空间复杂度. 我的思考: 1,一看到这个题目,大脑马上想到的解决方案就是数组.遍历链表,用数组把数据存下来,然后再进行一次遍历,同时用数组反向地与之比较,这样就可以判断是否回文.这个方法时间复杂度是O(n),达到了要求,然而空间复杂度显然不满足要求.所以,开数组这一类的方法显然不是最佳的. 2,既然要满足O(1)的空间复杂度,我就想到了用一个变量来存储这些数据,恰好

一个来自Afinal断点下载BUG的解决方案

欢迎各位加入我的Android开发群[257053751] 作为国内第一个Android开发框架Afinal,相信有很多开发者都知道的.虽然随着Android版本的迭代,其中有一些方法有了更好的解决办法作者也不再维护,但从来没有人怀疑Afinal的价值. 最近在重构KJFrameForAndroid框架的一个断点下载的功能,参考了比较多的例子,无意间发现了FinalHttp.download()方法中的一个BUG. 首先跟大家介绍一下afinal中download下载的实现原理.与其他众多下载方

给定一个字符串,问是否能通过添加一个字母将其变为回文串。

输入描述:一行一个由小写字母构成的字符串,字符串长度小于等于10.*///好的思路,减去一个字母,判断是否为回文 public class addCharhuiwen { public static boolean isHuiWen(String s) { int n = s.length(); for (int i = 0; i < n / 2; i++) { if (s.charAt(i) != s.charAt(n - i - 1)) { return false; } } return

iOS开发UI篇—使用picker View控件完成一个简单的选餐应用 - 文顶顶

原文  http://www.cnblogs.com/wendingding/p/3771047.html iOS开发UI篇—使用picker View控件完成一个简单的选餐应用 一.实现效果 说明: 点击随机按钮,能够自动选取,下方数据自动刷新. 二.实现思路 1.picker view的有默认高度为162,不可修改. 2.显示数据,需要设置数据源,也有两种方式(成为数据源,遵守协议) 3.实现数据源里面的两个方法 1)返回一共有多少列 2)在这一列中一共有多少行 4.通过代理告诉它那一列的哪

hdu3068 求一个字符串中最长回文字符串的长度 Manacher算法

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 31611    Accepted Submission(s): 11618 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

你是否适合当一个Java程序员?一文看清

在全栈开发者 Adam Leffert 看来,最重要的是态度: 我认为编程要想成功最重要的是态度.当然,最低水平的智力还是要的.以我这么久的经验来看,还没见过蠢到不会做的. 但是好坏程序员之间的差别几乎永远 是态度. 1.耐心: 对我来说这是最重要的一条.写代码和调试极其令人沮丧.要想做好,你得保持冷静,至少冷静到能够保持清晰的头脑. 2.精力: 处理棘手问题,编写大量代码容易使得身心俱疲.最重要的是要有我朋友 Joshua Wachs 所谓的 "坐能量(tushie power)".