FPGA学习心得------------计数器的显示
本帖最后由 735953120@qq.co 于 2015-8-17 20:04 编辑这是昨天刚刚做完的一个,小项目主要是为了练习按键消抖、数码管显示、二进制转bcd码的练习。刚开始学习FPGA,所以没事就总结一下自己的学习过程,如有不对的地方恳请大家指出来,楼主一定改正,互相学习{:lol:} 。项目要求:将按键的次数显示到数码管上面。本项目中的方法是我通过看李凡李老师的授课视频,还有就是自己在实践中遇到的问题,写的。在这给老师赞一个{:loveliness:} 。
拿到这个小项目的时候,我首先是哪出了笔和纸对,对我要实现的功能进行分析。该项目的总体框图如下:
图中的key_scan模块为按键扫描与消抖模块,count_key模块主要是计数按键次数的模块,bin_BCD模块实现二进制转BCD码,seg模块实现按键次数的显示(本次有6个数码管)。接下来我首先做的是设计并分析key_scan模块,这个模块使用的按键就是我们常见的机械按键,工业上的是20ms~200ms之间,为按键按下,我的也是采用的是20ms的消抖。当按键按下的时间小于20ms为抖动,大于则表示按键按下,按键抬起的抖动时间也为20ms。接下来我画出了这个模块的状态转移图如下图:
状态转移图中的temp是用来寄存按键状态的寄存器,cunt_n则是一个计数器计数按键按下的时间。接下来我跟据所画的状态图编写代码如下:
接下来就是计数按键按下次数的模块,我是这样做的每当按键的被按下会产生一段的低电平,而我则是采集其松开时会产生一个由低到高跳变的过程,每当这个上升沿到来的时候计数器计一次数,说白了就是用key_out的充当时钟。这个模块比较简单大家就看上面的系统框图中的count_key模块的框图。接下来是这个模块的代码如下:
接下来就是进制转换模块了。说到这个模块的话,我要好好说说了{:lol:},由系统框图我们也可以看出来,这个模块的输入就是计数模块的输出,而计数模块输出的数据是的二进制数,为啥位宽是20,原因是数码管显示的最大数是999999,其对应的二进制数就是二十位的。数码管输入的数据则是BCD码,所以我们在进行数码管显示之前必须先将二进制数转换为BCD码。进制转换我是看李老师的讲的逐步移位法。给大家来个例子说明一下{:lol:} 例如输入的二进制数是8’b1111_1111,经过逐步移位的方法最终得到的BCD码为:12’b1_0101_0101,其对应的十进制百位,十位,个位,分别是:2,5,5.这种移位的方法首先设计者必须清楚的是被转换的二进制数的位宽,和最终转换为BCD码的位宽,由于中间用到一个移位寄存器此移位寄存器的位宽等于被转的二进制数位宽加上最终转换的BCD码的位宽。所以本例中的移位寄存器位宽为20,采用这种方法移位的此处比位修正的次数多一次,即就是最后一次只进行移位操作,而不进行位修正计数(每位所对应的4位BCD码如果大于四必须进行加三操作)。应用这种方法移完即可得到对应的BCD码。本例子的以为过程及修正如下表所示:
通过这个例子大家应该对二进制转BCD有一定的了解,下来进入我们的正题,我输入的是20位的二进制数,6个数码管显示的话要24为BCD码,所以我需要的移位寄存器的位宽为44.整个的转换过程是先进行移位操作最后进行位修正操作。这个模块我将他们独立出来:移位为一个模块bcd_modify,未修正为一个模块bcd_sigle_modify。下面是我的这两个模块的框图:
下面是我这个模块的程序:
接下来设计最后一个模块的设计数码管显示模块的设计。本次设计采用的是共阳极数码管,故当有低电平时对应的数码管的段会点亮。数码管分位选和片选,位选顾名思义就是控制那个数码管进行显示,而片选则是存有显示数据。数码管显示部分,我采用的是1khz的时钟,如果时钟过快,数码管会显示常亮状态。数码管显示的数据要进行数码管译码操作。故可以总结为:此模块要做分频,位选的控制,还有数据的译码这几部分。我用的是以前做数码管显示是的一个现成的程序,所以这部分的程序是在一个模块下写的,程序如下:
接下来这个是我总体的顶层模块程序:
下来是是我的测试部分的代码:
作者:会飞的小鸟
测试波形图如下 本帖最后由 735953120@qq.co 于 2015-8-17 19:40 编辑
希望看了的发现错误的能指出来,第一次发这种学习贴,指出错误和不足楼主改正,切记测试的时候将key_scan模块中的按键检测时间1000000改成10,下板的时候改回来 同初学,请教楼主问题:
1,楼主用的什么代码编辑器啊?
2,怎么检查自己写的代码语法问题 quzhanguang3 发表于 2015-8-17 21:06
同初学,请教楼主问题:
1,楼主用的什么代码编辑器啊?
2,怎么检查自己写的代码语法问题 ...
编辑器我用的是Notepad++,至于你说的语法,我也没系统的学过语法,我是边学习东西边从设计中学语法,我觉得如果单纯的学语法,不练习就忘了。检查错误我一般还是通过编译软件检查的{:lol:} 这年头用VHDL不多了,计数器+显示如果数据不用于其他目的,建议用十进制.二进制转BCD我以前也贴过 我怎么觉得VHDL要比Verilog好理解得多呢?我当初就是学Verilog不会才学的VHDL....... lans0625 发表于 2015-8-18 16:33
我怎么觉得VHDL要比Verilog好理解得多呢?我当初就是学Verilog不会才学的VHDL....... ...
怎麽说呢,一个比较严谨,一个比较好理解;人各有异,这个不做论述。我已开始就是学的Verilog,所以觉得还行,但是VHDL看上去比较复杂,但是习惯了还行 735953120@qq.co 发表于 2015-8-18 19:51
怎麽说呢,一个比较严谨,一个比较好理解;人各有异,这个不做论述。我已开始就是学的Verilog,所以觉得还 ...
也许真是习惯的问题吧。 背景设置不错,LZ有配置文件吗 lans0625 发表于 2015-8-18 19:53
也许真是习惯的问题吧。
恩恩,习惯了就觉得用起来顺手{:lol:} ,你学习FPGA几年了 3DA502 发表于 2015-8-18 20:11
背景设置不错,LZ有配置文件吗
你是说程序包吗?主要是黑色不伤眼见{:lol:} 735953120@qq.co 发表于 2015-8-18 22:24
恩恩,习惯了就觉得用起来顺手 ,你学习FPGA几年了
差不多十年前\学的,近几年都不怎么搞便硬件了。。。。。 lans0625 发表于 2015-8-18 22:28
差不多十年前\学的,近几年都不怎么搞便硬件了。。。。。
小白膜拜大神,请问你学过同步电路的节拍分析没,特别是TP图,之类的东西,求教{:shy:} 735953120@qq.co 发表于 2015-8-18 22:31
小白膜拜大神,请问你学过同步电路的节拍分析没,特别是TP图,之类的东西,求教...
都丢光了。论坛卧虎藏龙,高手如云,你发帖问肯定有人回答的。。。。 lans0625 发表于 2015-8-18 22:34
都丢光了。论坛卧虎藏龙,高手如云,你发帖问肯定有人回答的。。。。
恩恩,好吧。最近在这块比较然,不理解真心太难{:cry:} 除了算法,在FPGA上状态机几乎是万能的。。。。{:tongue:} lans0625 发表于 2015-8-18 22:39
除了算法,在FPGA上状态机几乎是万能的。。。。
恩恩,不知大神对状态机有没有,特别的见解求交流。请问代码中摩尔机与米利机如何区别 735953120@qq.co 发表于 2015-8-18 22:41
恩恩,不知大神对状态机有没有,特别的见解求交流。请问代码中摩尔机与米利机如何区别 ...
这个还是看书吧。有谈到状态机的书都有说的。。。。 我只说一个小问题吧,你在写case语句的时候我建议你额外写一个default,否则综合之后会显示产生了一些latch,你应该会在编译的警告里面看到相关的提示。在低速设计里面可能完全没有问题,但是在高速时钟下面,这样做可能会产生一些难以预料的问题。 辰星和月 发表于 2015-8-19 09:08
我只说一个小问题吧,你在写case语句的时候我建议你额外写一个default,否则综合之后会显示产生了一些latch ...
恩恩,谢谢了;下次注意,一定修改{:lol:} lans0625 发表于 2015-8-18 22:43
这个还是看书吧。有谈到状态机的书都有说的。。。。
恩恩,可是书里面加的基本是大同小异。基本上讲的太浅,你懂线性序列机吗? 线性序列机?笫一次听说。做时间序列预测用的? lans0625 发表于 2015-8-19 19:45
线性序列机?笫一次听说。做时间序列预测用的?
恩恩,只要你会节拍分析,代码写起来很简单;就iic的写操作代码,不到一百行;等周末有时间把自己上次做的串口的心得发上去, 用状态机来做也简单的。 lans0625 发表于 2015-8-19 20:04
用状态机来做也简单的。
但是和他相比的话,就差得远了。听老师说经过优化的线性序列机要比状态机快好多呢 735953120@qq.co 发表于 2015-8-19 20:13
但是和他相比的话,就差得远了。听老师说经过优化的线性序列机要比状态机快好多呢 ...
你有线性序列机的书籍资料吗?发到论坛来参考参考。。。 恩恩,好的我找找{:lol:} 我觉得状态机已经是最牛逼的了。。。。。 同感。FPGA除了算法,掌握状态机基本就可以搞定一切了。 lans0625 发表于 2015-8-19 20:17
你有线性序列机的书籍资料吗?发到论坛来参考参考。。。
不好意思最近被iic的单字节读写和多字节读写给虐成狗了,这是一篇用到序列机做的DA芯片的例子,序列机的资料我找到了发给你http://bbs.elecfans.com/jishu_459623_1_1.html。不好意思了 flyfox8 发表于 2015-8-25 09:01
同感。FPGA除了算法,掌握状态机基本就可以搞定一切了。
是可以搞定一切没错,但是你想没想过速度的问题 735953120@qq.co 发表于 2015-8-25 20:14
是可以搞定一切没错,但是你想没想过速度的问题
哈哈。FPGA对我来说是外行,也只能理解到这个程度了。 735953120@qq.co 发表于 2015-8-25 20:14
是可以搞定一切没错,但是你想没想过速度的问题
状态机复杂确实影响速度 NJ8888 发表于 2015-8-25 20:57
状态机复杂确实影响速度
嗯嗯,也不能这样说,每种东西都有自己的优缺点,状态机状态可以随意跳,而序列机则只会按照原来设定的步骤一步一步的走,遇到要跳转的问题它就不行了 flyfox8 发表于 2015-8-25 20:47
哈哈。FPGA对我来说是外行,也只能理解到这个程度了。
都一样我还是小白,一个iic通信搞了好几天最后是调好了不过还有bug 同学,看了您的模块图、时序图、以及代码,感觉您已经掌握了入门的办法。。。可是我徘徊了很久,还是不能入门,在公司也总是看别人的代码,看的很伤神。
自己没写过,也不会,不知道从哪里入手来写。
希望你帮帮我,给我一点意见,谢谢了。就是入不了门,蛋疼死了。
黑金的教程看得我云里雾里的,我们公司用的是VHDL语言,不是Verilog,哎。。。
另外请问至芯李凡老师的视频您有吗,可否发我一份,不胜感激啊!
变量名字起的真费劲,总感觉习惯了Java和C的canmel命名之后看到一堆下划线就无爱了
页:
[1]