上面的数码管线束并不是通过取余取模运算来实现的。刚开始我是在频率计数部分直接把频率数进行相加,最后通过取余取模得到十位个位进行显示,最后发现取模(/)运算得到的值不是实际得到的值,取余(%)运算后是正确的值。之后找资料发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;这样比较方便。