FPGA学习之路——一路走来
既然选择了远方,便不顾风雨兼程,一路走下去。 —韩彬
在看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(宁河川)
个人微信订阅号:NingHeChuan
如果你想及时收到个人撰写的博文推送,可以扫描左边二维码(或者长按识别二维码)关注个人微信订阅号
知乎ID:NingHeChuan
微博ID:NingHeChuan
原文地址:http://www.cnblogs.com/ninghechuan/p/6238392.html
FPGA学习之路——一路走来的更多相关文章
- FPGA学习之路——PLL的使用
锁相环(PLL)主要用于频率综合,使用一个 PLL 可以从一个输入时钟信号生成多个时钟信号. PLL 内部的功能框图如下图所示: 在ISE中新建一个PLL的IP核,设置四个输出时钟,分别为25MHz. ...
- 《跟唐老师学习云网络》 -第4篇 router路咋走啊【华为云技术分享】
[摘要] 好了,到这里至少你应该能看懂路由表信息了.给你一个目的IP,你也应该知道它会使用哪一条路由了. 路怎么走就看骚年你了~ 一.路由 其实关于网络大家遇到最多的问题就是:卧 槽,为什么不通啊! ...
- Webwork 学习之路【06】Action 调用
一路走来,终于要开始 webwork 核心业务类的总结,webwork 通过对客户端传递的 web 参数重新包装,进行执行业务 Action 类,并反馈执行结果,本篇源码分析对应下图 WebWork ...
- 我的Linux学习之路的感悟
首先要跟大家说声抱歉,这么久一直没有更新,有负大家对我的期望. 半年的Linux运维的学习到目前已工作一个月零9天,这一路走来的艰辛和挣扎只有自己最清楚. 首先要感谢公司的同事的宽容接纳和耐心指点.感 ...
- 纪录我的iOS学习之路
学习资料的网址 田伟宇(Casa Taloyum)有几篇介绍iOS架构的文章,一级棒!原博客链接. iOS应用架构谈 开篇 iOS应用架构谈 view层的组织和调用方案 iOS应用架构谈 网络层设计方 ...
- (转)如何学习Java技术?谈Java学习之路
51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领 ...
- C++学习之路——1.linux下环境搭建
学习之路,可说各有各的看法和方法.对于我来说,完全是兴趣一下子来了,脑壳发热吧.就想有个干净的环境,只想着与程序有关的东西练一练. 目前想学习C++,可是打开VC++6,再安了VS2010.VS201 ...
- ANDROID学习之路 转
版权声明:本文为 stormzhang 原创文章,可以随意转载,但必须在明确位置注明出处!!! 这篇博客背后的故事 一路走来很不容易,刚好知乎上被人邀请回答如何自学android编程, 就借这个机会在 ...
- Java学习之路:不走弯路,就是捷径
1.如何学习程序设计? JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用.有编程高手认为,JAVA也好C也好没什么分别,拿来就用.为 ...
随机推荐
- TP3.2.3 接入支付宝
TP3.2.3 接入支付宝 项目接入支付宝支付了,在做这个给我的感觉是,方便 ,毕竟是老马的产品是吧, 话不多说 , 首先我们先找到官方的SDK ,不想去找的小伙伴复制此链接 https://doc ...
- Java二维数组的概念和使用方法
二维数组 数组的数组---二维数组的每一个元素是一个一维数组 定义格式 数据类型[][] 数组名 = new 数据类型[二维数组的长度/包含的一维数组的个数][每个一维数组的长度]; int[][] ...
- Spring官方文档翻译
随笔:有人曾这样评价spring,说它是Java语言的一个巅峰之作,称呼它为Java之美,今天,小编就领大家一起来领略一下spring之美! Spring官方文档:http://docs.spring ...
- JavaSe:Comparator
今天,公司里有一个萌萌的妹子问我java 中的comparator是怎么回事.参数分别是什么,返回值又是什么,为此,我写了一个简单的程序告诉了她: public static void main (S ...
- Django项目创建02
Django项目创建(ubuntu环境) 1. 创建项目目录,我是在root下创建了一个workspace文件夹:mkdir workspace 然后cd到该目录下 命令:django-adm ...
- VMware安装Linux,系统分区。
系统分区: 主分区<=4 扩展分区<=1 主分区+扩展分区<=4 扩展分区不能直接使用,必须再分成若干逻辑分区才能读写数据. 逻辑分区编号从5开始,1-4给主分区和扩展分区使用的,不 ...
- HTTP服务及状态码
第一章 HTTP 1.1 HTTP协议的概念 HTTP协议,全称HyperText Transfer Protocol,中文名为超文本传输协议,是互联网上常用的通信协议之一,它有很多的应用.但是流行的 ...
- iOS 图片的拉伸,取固定区域显示
1.图片拉伸合适的尺寸 以及清晰度 UIButton * but =[[UIButton alloc]initWithFrame:CGRectMake(, , , )]; //拉伸 /*UIImage ...
- Python2/3的中、英文字符编码与解码输出: UnicodeDecodeError: 'ascii' codec can't decode/encode
摘要:Python中文虐我千百遍,我待Python如初恋.本文主要介绍在Python2/3交互模式下,通过对中文.英文的处理输出,理解Python的字符编码与解码问题(以点破面). 前言:字符串的编码 ...
- 【NOIP模拟】【USACO】 Bovine Genomics
Description 给定两个字符串集合A,B,均包含N个字符串,长度均为M,求一个最短的区间[l,r],使得不存在字符串\(a\in A,b\in B,\)且\(a[l,r]=b[l,r]\) , ...