请大家帮我看看这个FPGA的频率计的程序

lincoln24 2010-05-04 11:40:35
接入信号发生器老不能正常显示频率,因此我把程序简化再简化。。。最后就让信号发生器来一个高脉冲,计数器就加1,但是即使如此数码管上的数还是乱跳。。。我都不知道是什么问题。。。数码管显示程序是无问题的,因为我在其他程序中用过。
我把程序简略的发上来大家帮我看看,多余的东西我都删了(包括输出)。。我感觉就是这部分有问题,不知道用什么进制来计数有限制吗?
input sw;
input clk;
input xinhao;
reg [15:0] cntt;
reg [15:0] sum;
always@(posedge clk)
if(xinhao)
begin
if(sw)
begin
sum<=0;
end
else
sum<=sum+16'b0000_0000_0000_0001;
end
...全文
167 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
lincoln24 2010-05-08
  • 打赏
  • 举报
回复
多谢楼上的解答
这里我知道了,不过正弦波无法正常测频的问题还是没有解决。。。不知道你们有什么高招?
LightBrighten 2010-05-08
  • 打赏
  • 举报
回复
至少两种方法:
1、加施密特触发器
2、以较低采样频率进行多点采样,缺点是采样频率要随信号频率调整
LightBrighten 2010-05-08
  • 打赏
  • 举报
回复
TTL电平规定输出输入高电平>=2.0V,输入低电平<=0.8V
所以在0.8V到2.0V之间,电平处于不稳状态,在不稳状态,读入的是高低未知,可能读入了无数个高低变化

因此,要加施密特触发器
lincoln24 2010-05-08
  • 打赏
  • 举报
回复
多谢楼上,这个方法我会考虑
不过我就是不明白为何方波行正弦波不行。。。不都是靠临界点来识别高低电平的么。。。
lincoln24 2010-05-07
  • 打赏
  • 举报
回复
恩,我知道楼上的意思,就是等他的上升沿是吧,我开始也是这么写的,就是用always@(posedge xinhao)判断,一来上升沿就计数加一,请问这么写和你的程序有什么不同么?不然怎么出不来?
lincoln24 2010-05-07
  • 打赏
  • 举报
回复
恩,我知道楼上的意思,就是等他的上升沿是吧,我开始也是这么写的,就是用always@(posedge xinhao)判断,一来上升沿就计数加一,请问这么写和你的程序有什么不同么?不然怎么出不来?
LightBrighten 2010-05-07
  • 打赏
  • 举报
回复
always@(posedge xinhao)是学院派的做法,而且实际应该是
always@(posedge xinhao or negedge rst)
if (!rst)
清零
else
开始计数
原理上是对的,不过,公司做产品是没人这么用的

fpga编程最忌讳时钟满天飞
也忌讳always@(posedge clk)和always@(negedge clk)同时出现
也就是除非万不得已,否则只能有一个全局时钟信号,且这个全局时钟信号硬件上是连在芯片的全局时钟脚上的

另外,捕获信号边沿的最健壮程序是
reg xinhao_buf[1:0];
always@(posedge clk)
xinhao_buf<={xinhao_buf[0],xinhao};

wire xinhao_edge;
assign xinhao_edge = (xinhao_buf==2'b10)?1:0;


benjaminweber 2010-05-07
  • 打赏
  • 举报
回复
没有想到这个,不过是对的
寄存信号,是用抓沿电路产生脉冲比直接用信号当时钟好
时钟信号是比较麻烦的,一般不可以在时钟信号上加逻辑或者使用非时钟信号当时钟
LightBrighten 2010-05-06
  • 打赏
  • 举报
回复
我的天啦,这哪是计数的程序啊,程序本来就有问题,怎么可能成功。应该这样写
input sw;
input clk;
input xinhao;
reg [15:0] cntt;
reg [15:0] sum;


reg xinhao_buf;
always@(posedge clk)
xinhao_buf<=xinhao;

wire xinhao_edge;
assign xinhao_edge = ({xinhao_buf,xinhao}==2'b10)?1:0;

always@(posedge clk)
if(sw)
begin
sum<=0;
end
else
begin
if (xinhao_edge)
sum<=sum+16'b0000_0000_0000_0001;
end
benjaminweber 2010-05-06
  • 打赏
  • 举报
回复
对数字电路来说,接近0和0以下都是低
lincoln24 2010-05-06
  • 打赏
  • 举报
回复
我也这么认为,可是不知道为什么一测正弦波他的数字就特别大,比如4HZ他就测到9000多,而方波就不会
话说波形的-5V是算高电平还是低电平?
老人参 2010-05-05
  • 打赏
  • 举报
回复
帮你顶
benjaminweber 2010-05-05
  • 打赏
  • 举报
回复
从原理上来说,方波和正弦波对数字电路来说是一样的。
lincoln24 2010-05-05
  • 打赏
  • 举报
回复
2L仁兄帮我仿真了?我现在就是无法仿真啊,modelsim老不出波行,所以我只能一步步调程序……
现在状况就是一取消复位,后三位数码管就数字乱跳,最高位倒是从一到九计数了…但是不应该是低位先变化再高位么…我输入的是2hz正弦波频率,有没有可能是和下面的数码管程序起冲突了还是怎么回事?
lincoln24 2010-05-05
  • 打赏
  • 举报
回复
谢谢各位
现在频率计算是能测出来了,但是只能测方波的,不知道正弦波的能测吗?我一测正弦波数会很大。。。不知道是代码的问题?
benjaminweber 2010-05-05
  • 打赏
  • 举报
回复
你的这段代码是没有问题的
确认你的时序通过了,没有timing violation

6,163

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 硬件设计
社区管理员
  • 硬件设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧