在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 28079|回复: 96

[原创] 数字频率计的设计(verilog)

[复制链接]
发表于 2010-2-26 21:38:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
该频率计有三个输入信号fre_in,clk_50k,rstn
其中clk_50k脚输入标准的50KHz方波信号,作为参考时钟
fre_in为信号输入端,被测信号频率从这里送入
rstn为系统复位端,上电时该引脚需要保持一端时间低电平

该系统输出脚为,a,b,c,d,e,f,g,    unit,     led_sel
a,b,c,d,e,f,g为数码管译码输出
unit表示当前显示数值的单位,可为Hz,10Hz,100Hz,1kHz,10kHz.
led_sel为数码管位选信号。

该频率计测量范围为1Hz~99.99MHz,   可根据输入信号频率自动调整显示数值的单位为合适的数值,并通过unit端口告知用户读数的单位。

附件为modelsim工程,包含各个模块源文件和测试文件。

fre_counter.rar

54.81 KB, 下载次数: 580 , 下载积分: 资产 -2 信元, 下载支出 2 信元

发表于 2010-2-27 16:42:22 | 显示全部楼层
学习了,想问一下:count.v这个文件的作用是什么?在count.v中有15行到35行没看明白。
reg[3:0] count;
always@(posedge rst or posedge clk)
begin
  if(rst)//a reset
    begin
      count<=4'b0000;
    end
  else if(ena)//one mux
    begin
      if(count==4'b1001) count<=4'b0000;//second mux
      else                count<=count+4'b0001;
    end
  else
    begin
      count<=count;
    end
end
//
assign qout=count;
assign full=(count==4'b1001);
endmodule
这段代码是什么作用?请不吝赐教?谢谢楼主!
 楼主| 发表于 2010-2-27 17:11:45 | 显示全部楼层
你好,谢谢你和我交流。这个模块是一个十进制计数器,计数范围为0~9,reg[3:0] count对输入的clk进行加法计数,当计数到9及4'b1001时,下一个clk脉冲来时count值归零。把4个这样的模块级连起来,就构成了一个范围更大的计数器:0000~9999
发表于 2010-3-1 12:54:01 | 显示全部楼层
不好意思,上次我看代码的时候看错了
发表于 2010-3-1 13:37:24 | 显示全部楼层
我其实想问的是:clk_gen模块中的div_10,这个信号的产生的那段代码。
reg[2:0] count1;
always@(posedge clk or negedge rstn)
begin
  if(!rstn) count1<=3'd0;
  else if(count1==3'd4) count1<=3'd0;
  else             count1<=count1+3'd1;
end

reg  d1;
always@(posedge count1[2] or negedge rstn)
begin
  if(!rstn) d1<=1'd0;
  else d1<=~d1;
end
assign div_10=d1;

这里的always@(posedge clk or negedge rstn)
begin
  if(!rstn) count1<=3'd0;
  else if(count1==3'd4) count1<=3'd0;
  else             count1<=count1+3'd1;
end
我没看懂的是为什么要判断count1==3‘d4?谢谢!
 楼主| 发表于 2010-3-1 22:17:43 | 显示全部楼层
是这样的,div_10是把输入的clk10分频,
为了得到占空比50%的方波,我先把它5分频,再2分频。
count1==3'd4,是因为count1有0 1 2 3 4 这5个状态,
d1用于2分频。

count2和d2按照同样的方法把div_10分频,得到div_100为原输入clk信号的100分频
以此类推得出div_1000, div_10000, div_100000

若输入的clk信号为50k,  则div_100000的高电平持续时间为1S,用这个作为计数器的gate信号,计数器在1S内对fre_in脚信号的脉冲进行计数,所以输出的值单位为Hz.

div_10000信号的高电平持续时间为0.1S,用这个用为计数器的gate信号,计数器在0.1S对fre_in脚信号计数,所以输出的值单位为10Hz.

……以此类推。

通过检测计数器有无溢出,来控制选择不同的div_?信号,
例如若当前是用div_100000信号(高电平1S),检测到计数器溢出,说明输入频率大于9999Hz,显示的数据并不准确,于是选择div_10000(高电平0.1S),显示计数单位为10Hz, 若仍然检测到溢出,就选择div_1000(高电平0.01S)  以此类推……

若现在gate信号为div_10,则显示读数的单位为10kHz,若检测到4位十进制计数器的千,百,十位均为0,则说明档位设得过高,这样也是测不准的,于是降低一档,选择div_100,以此类推……
发表于 2010-3-4 16:19:14 | 显示全部楼层
谢谢楼主!
发表于 2010-3-5 12:22:52 | 显示全部楼层


学习了,想问一下:count.v这个文件的作用是什么?在count.v中有15行到35行没看明白。
reg[3:0] count;
always@(posedge rst or posedge clk)
begin
&#160;&#160;if(rst)//a reset
&#160; &#160; begin
&#160; &#160;&#160; &#160;count
大小大 发表于 2010-2-27 16:42


就一个简单的计数器嘛!!
发表于 2010-4-14 18:50:12 | 显示全部楼层
挺好的
发表于 2010-4-20 00:29:19 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-17 11:36 , Processed in 0.033695 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表