御龙归字谣 发表于 2015-8-3 19:49:57

FPGA学习---------计算器篇

本帖最后由 御龙归字谣 于 2015-8-3 20:28 编辑

大家好,{:3_48:} 我是一名刚毕业不久的大学生,由于种种原因,我和至芯科技结缘,来到了北京至芯科技就业培训班学习,到现在为止来了将近有半个月的时间,在这半个月的时间了,我收获很多,从最初只是单纯的为了找工作而学习,到现在渐渐对FPGA有了些许的想法。在这半个多月的时间里,在经过李老师的带我入门,到后来王老师带我们的第一个小项目直到收工,我渐渐的对一系列操作有了一个新的认识。在这里我将这几天的学习心得和大家分享一下如有不对的地方,还请大家多多指正{:3_52:} :
1、在学习的过程中,大家一定要按照最初的操作步骤来做,比如说,在开始学习的时候,在没有学会下载到开发板上时,都是在让我们编写完电路模块以后,分析和综合查找语法错误,然后写testbench文件,再进行nativelink相关设置,前仿真,全编译,后仿真这样的一套,而我在学习的过程发现,在学会下板以后,大家有时候在做一些复杂程序编写的时候,就不再去写测试文件,而是直接全编译通过之后,就下板,然后发现运行不正常,就盯着自己的模块代码{:2_36:} ,其实盯一下午都未必解决得了问题。换个角度想一下,在你的MODELSIM波形图不正确的情况下,你的硬件测试是一定不正确的,而当你的波形图是正确的时候,你的硬件测试才有可能正确,所以大家一定不要偷懒不写测试文件{:2_30:} ,不然调试程序的时候很浪费时间。
2、在波形图正确的情况下,有时硬件测试依然不正确,这时有singletap就可以帮大忙了,但只可惜我现在还没有学会{:2_34:} ,大家得和我一样加油了。
下面的一些小经验就和我本次的标题有关,我之所以会写这篇文档来总结一下,主要是在今天我的至芯学习之旅中的第一个小项目基本快完工了。现在就来总结一下吧{:2_31:} :
1、在设计之初我们不要心急,我们要分清层次,分清模块,先做什么再做什么,不要什么都想,不然就会让你产生压力,一块一块来做,功能一步一步来实现,比如先实现一位数的运算,再实现多位数的运算,再实现小数的运算等等。当然有些大神头脑反应比较快,想要一次性完成,一次写很长一段代码再调代码再调试,一次画一个很大很大的状态图你要是觉得调试起来不麻烦的话,你也可以这样做{:2_38:}
2、在计算机设计中我觉得最基础的是键盘扫描,原理要搞清,你可以有很多种思路,不停地列扫描还是有控制的
3、前面的整数的运算我在这里不再赘述原理了,而对于小数的运算,我想分享一下,其实很简单,单独记录小数的位数,并在做运算时,做加法减法时,结果取小数位数较多的,乘法取小数点相加等等,显示时,将BCD码统统扩充一位变成五位,最高位显示是否有小数点即可
4、有必要在这里重申一下我的代码最终实现的功能{:2_27:} :可以实现整数以及小数的加减乘除,并可以实现连续的运算操作,小数的运算结果取精度较高的一项,缺陷是没有加载小数点后的灭0 操作,而且小数点在按下后再按下一个数时才会出现,而且只能做加减乘除。
5、我的按键分布:矩阵键盘中的A为加操作,B为减操作,C为乘操作,D为除操作,E为小数点输入操作,F为等于号操作。
下面是我在调试过程以及老师在课上分享的一些调试中遇到小问题,也和大家分享一下吧{:2_31:} :
1、col没有清零,导致只能检测一列
2、注意产生尖峰脉冲的时钟速度
3、移位模块要连接慢时钟(flag消除很慢导致移位很多次)
4、每次扫描完毕后,col马上清零(当按键按着不放时候,每次都会检测到row不等于15,马上就会开始下一次的扫描),要么就让扫描暂停,并存储列信息,检测按键松开的时候用
5、在检测到有按键按下的时候,flag变为高电平,此时number已经发生变化,也就是说flag变化比number慢一个时钟周期,解决办法,可以读flag的上升沿,或者number数据经过D触发器慢一个时钟周期变化
6、二进制转为BCD码时,用的是移位加3法,这样会节省很多的资源,不要用除10取余法,那样很占用资源
7、按下等号按键时,运算后,再转为BCD码,再输出,这样会遇到这一次的运算结果在下一次按下等号时显示,解决办法还是加D触发器
8、关灯码产生的时候,尽量不要用状态机,因为我们需要的是产生一组关灯码的时候,就不再在状态中运行,所以不要用
9、在这一次的设计过程当中,遇到了很多时序的不同步,解决办法大多是加D触发器将快的时钟往后移一个时钟周期
10、注意采样时钟的快慢匹配问题
11、测试文件很重要,开始时不会写测试文件,调试代码很困难,后来考试分享了测试文件,测试起来就方便多了。
由于我本人精力有限,所以详细的状态转移图什么的东西在这里就不画了,下面会把我的一系列文件分享给大家,希望对FPGA有兴趣的同学可以有点启发,或许我的思路有点简单,代码有点乱,我接受一切批评,希望大家共同进步。

ccs 发表于 2015-8-3 21:47:02

太牛了 膜拜大侠

小梅哥 发表于 2015-8-3 22:08:55

请楼主解释下关灯码是个啥子,怎么没听过

御龙归字谣 发表于 2015-8-9 19:05:35

关灯码是确定数码管哪一个点亮,哪一个关闭,假如说6个数码管,我让第一个关掉就是011111
页: [1]
查看完整版本: FPGA学习---------计算器篇