请大家帮我看看这个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
...全文
222 16 打赏 收藏 转发到动态 举报
写回复
用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
内容概要:本文围绕“多主体综合能源系统+分布式ADMM研究”展开,系统阐述了交替方向乘子法(ADMM)在多主体综合能源系统中的分布式优化应用,提供了完整的Matlab代码实现。研究聚焦于多利益主体之间的协同优化问题,通过建立合理的数学模型,采用ADMM算法实现去中心化的求解架构,有效保障各主体的数据隐私性与决策自主性,同时提升整体系统的计算效率与优化性能。内容涵盖系统建模、优化问题分解、ADMM迭代求解流程、收敛性验证及结果分析,具有较强的理论深度与工程实践价值,适用于能源互联网、微电网群、园区综合能源系统等复杂场景的能量管理与协调调度。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的研究生、高校科研人员,以及从事综合能源系统规划、微电网优化、分布式能源管理等方向的工程技术人员。; 使用场景及目标:①应用于多主体参与的综合能源系统能量管理与协同优化调度;②助读者深入理解ADMM算法的分解-协调机制及其在分布式优化中的具体实现,支撑高水平学术论文复现、科研课题攻关或实际工程项目开发;③推动智能电网与能源互联网中去中心化、隐私保护型优化调度技术的发展与落地; 阅读建议:建议读者结合文中提供的Matlab代码进行动手实践,逐行调试并可视化关键变量的迭代过程,深入掌握ADMM算法的参数设置、收敛判据及数值稳定性处理技巧,并尝试将其拓展至电动汽车集群调度、多微电网互动、可再生能源消纳等其他分布式优化应用场景中进行仿真验证。

6,172

社区成员

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

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