1回答

0收藏

【小脚丫***-MXO2】学习4 —频率计数器

#其他 #其他 3102 人阅读 | 1 人回复 | 2016-12-23

在测量某些信号时有时候需要测频率,例如单光子计数器等,输出频率大概在几百MHz,本次实验就是用小脚丫做一个简单的频率计。测量频率范围为10Hz~10MHz。LCMXO2-4000HC-4MG132芯片最高工作频率为400MHz,所以测200MHz频率也是可以的。本次实验我只是测了几个低的频率。在测量高频时代码下不进去了,就没进行测试。
        实现功能:测量频率在10Hz~1MHz,并通过板子上的两个数码管显示最低两位数字。频率超量程led1点亮。也可以把数据通过模拟串口发送到电脑端,因为一些原因没有测试。可以参考:小脚丫***-MXO2 —Verilog HDL模拟串口通信    通过实验可以发现测出的频率还是很精确的。在下面的GIF中用示波器里自带的频率发生器输出一定频率的方波,把方波信号接入到小脚丫的GPIO0(E3)脚,可以看到随着频率的改变数码管上会显示出最后的测量频率。示波器左下角方波右边那个是频率显示,刚开始时12Hz,然后***旋钮分别调到15,19HZ,数码管上显示的就是相应的频率。

上面的数码管线束并不是通过取余取模运算来实现的。刚开始我是在频率计数部分直接把频率数进行相加,最后通过取余取模得到十位个位进行显示,最后发现取模(/)运算得到的值不是实际得到的值,取余(%)运算后是正确的值。之后找资料发Lattice Diamond里没有除法模块,所以综合下载后导致数据不对。实际上FPGA硬件里是不能做除法的,不过可以通过一些算法或者软件自带的模块可以达到同样的效果。因为想用数码管显示这个频率,所以在计数部分我也参考了网上的一些例程。
测量原理:首先通过分频器产生0.5Hz的方波,即1S正,1S地。通过在1S之内测量输入信号的上升沿来确定频率。如果要测量频率高的话可以修改分频频率,测量0.1s或者0.01s时上升沿次数,也可以再加几个计数器。
always@(posedge clk or negedge key)        begin                if(!key)                        begin                                cnt_clk <=0;                                clk_1s <= 0;                        end                else if(cnt_clk >= (12000000 - 1))                        begin                                cnt_clk <= 0;                                clk_1s <= ~clk_1s;                        end                else                        begin                                cnt_clk <= cnt_clk + 25'b1;                        end        end频率计数部分:计1S内上升沿个数,在1S结束后把数据保存下来。计数方法采用每计到10就进一位,就是做6个级联十进制计数器。这样方面数码管显示。如果是直接要得到频率数还是把频率数累加frequence<=frequence+1'b1;这样比较方便。

直接贴代码由于太宽格式乱,不好看,所以只上了图,源码请最后列出。在上面图中就是做了6个十进制计数器。最后两行是把保存的频率数据的个位和十位显示出来,对应段码。
参考资料及Verilog源码:https://pan.baidu.com/s/1pLB8oIZ  密码:eiwq   
在资料盘里的源码里有详细的解释和pdf文档以及芯片的参考手册。
关注下面的标签,发现更多相似文章
分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

hansiriver

发表于 2020-6-17 13:11:59 | 只看该作者

你这个引脚怎么连的啊wc,发的文件里面是xilinx的引脚约束,nmd
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条