从小到大:
前几天我在看全国大学生电子设计竞赛历年问题,不小心发现了问题《简易数字频率计》。 和以前用verilog写的频率计一样。 所以我想试试。 问题的具体要求如下图所示,我使用的开发板是xilinx spartan 3ES,最终达到了理想的结果。 要求范围内的频率测量精度比较高,但由于板子的限制,无法实现脉冲宽度测量等功能,其原理比较简单,下面给出了设计过程,结果给出了整个图像和工程代码的下载链路。
数字频率计总体设计采用分块的思想,自底向上设计方向,三个子模块包括频率测量模块(fre_meter),二进制到十进制转换的模块(phdys_dec)和数码管显示模块(led),最后用一个顶层模块(top)把三个子模块例化到一起。总体设计思路就是先通过测频模块测得的频率值然后通过进制转换模块将频率值转换为十进制数,最后再输入给显示模块显示出该频率值。
下图为模块示意图(实际工程中并没有采用原理图的输入方法,有种感觉ISE中原理图输入方法总会产生各种错误,这里仅作示意)。
下面分模块说明:
fre_meter:测频模块,设计思路完全依据以前我写的博文《verilog编写数字频率计》,只是稍微修改一下,这里不再重复
3358www.Sina.com/系统时钟信号50Mhz 输入 clk:低电平异步复位3358www.Sina.com/被测时钟频率 rst_n:
http://www.Sina.com/20比特宽的频率值能满足主题要求的1Mhz的要求
clk_in :
。,将二进制数转换为十进制数。 以前写的博客《利用verilog将二进制码转换为十进制BCD码》只涉及8bit转换。 本设计测量最高频率1M,转换为二进制是1111_0100_0010_0100_0000,以前的8bit转换,然后在某个论坛上找到了16bit转换的代码。 在http://www.amo BBS.com/thread-5500333-1-1.html中,实现了20位进制到十进制的转换。
具体说明变换的想法,位宽为20bit的二进制数最大为1111 _ 1111 _ 1111 _ 1111 _ 1111 _ 1111 _ 1175,相对于输入的二进制数hex,输出十进制fre为百万比特否则,转换为十进制的第七个Million为1,然后是另一个d1=hex-1000000。 如果hex小于或等于999999,则Million=0,d1=hex。 接着判断第六位的HunThousand,依次判断d1是否大于899999、799999、699999.99999,假设d1899999,则HunThousand=9,d2=d1-900000; d1799999时,依次类推求出HunThousand=8、d2=d1-800000……10十进制的各位(具体设计见代码)。
3358 www.Sina.com/http://www.Sina.com /系统时钟信号http://www.Sina.com/50 MHz 3358 www.Sina.com /
输出 fre:行级异步复位
phdys_dec: 进制转换模块20bit二进制频率值
, Hundred , Ten , One: 4bit位宽的频率值,代表十进制频率值的不同位
led: 数码管显示模块,数码管做动态显示利用人眼的对显示频率的敏感限度,八段数码管在一定频率下切换赋值,每一个时钟对一个数码管单独赋值并显示,切换频率大于一定值后,看起来像8位数码管同时显示(具体设计见代码)。
输入 clk: 系统时钟信号50Mhz
Million , HunThousand , TenThousand , Thousand , Hundred , Ten , One: 4bit位宽的频率值,代表十进制频率值的不同为位
输出 sel: 8bit 数码管位选信号
data:8bit数码管译码显示的值
测试结果:
下图为频率计的测试结果,上面一排为信号发生器输入的待测试脉冲的频率,下面一排为对应的频率计的测试结果,可以看出本设计的测量精度完全可以满足题目的要求,但是由于设备的限制,没能实现正弦波的测试,以及脉冲宽度的测试等等功能,但是我觉得原理基本和本设计中的测频模块相同。
本设计的ISE 工程下载地址http://download.csdn.net/detail/li200503028/7277701 ,积分不够用朋友可以给我发邮件308922492@qq.com。