本次PI设计的是增量式PI
遇见问题 :
- 输出被直接限幅
可以看出输出一直被限制为416
原因分析
Code
// 对比1, 被限幅
always@(posedge clk or posedge rstp) begin
if(rstp)
cnt_freq <= DEFAULT_CNT;
else if(cnt_freq >= CNT_MAX)
cnt_freq <= CNT_MAX;
else if(cnt_freq <= CNT_MIN)
cnt_freq <= CNT_MIN;
else
cnt_freq <= cnt_freq_last + cnt_freq_deta;
end
// 对比2, 正常工作
always@(posedge clk or posedge rstp) begin
if(rstp)
cnt_freq <= DEFAULT_CNT;
else if(cnt_freq_last + cnt_freq_deta >= CNT_MAX)
cnt_freq <= CNT_MAX;
else if(cnt_freq_last + cnt_freq_deta <= CNT_MIN)
cnt_freq <= CNT_MIN;
else
cnt_freq <= cnt_freq_last + cnt_freq_deta;
end
从不正常工作代码中可以看出, 当只要输出一次被限幅, 那么这段代码就会进入被限幅的死循环,
else if(cnt_freq >= CNT_MAX)
cnt_freq <= CNT_MAX;
以这句为例, 如果输出cnt_freq = CNT_MAX后,他就会一直等于CNT_MAX, 一是因为代码本身的设计, 还有就是else if的优先级会使得代码一直先判断if条件
修改
- 修改后的代码为第二段,不使用cnt_freq去进行判断比较, 而是使用我们当前希望得到的输出进行比较
- 将第一段代码中的等号去掉
效果
作出修改后,PI正常工作,就是参数还需要调整
Code Here... : https://github.com/tiruoQing/fpgas/blob/main/PID/PI.v
合集:
问题分析
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体