打印

用verilog 写 u(k)=u(k-1)+error 怎么写

[复制链接]
1366|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
module pidt1(error,uk,clk,rst);
input [16:0]error;
input clk,rst;
output reg[16:0]uk;
reg [16:0]uk1;
wire [16:0]uk_wire;
always@(posedge clk or negedge rst)
if(!rst)
begin
uk1<=0;
end
else
begin
uk<=uk_wire;
uk1<=uk;
end
assign uk_wire=uk1+error;
endmodule

捕获.PNG (19.02 KB )

UK结果仿真出来了 但不是连续的 中间有一段段红色的为什么啊

UK结果仿真出来了  但不是连续的 中间有一段段红色的为什么啊

相关帖子

沙发
nethopper| | 2017-1-12 13:07 | 只看该作者
uk没有初始化,在!rst时,把uk也清零一下。

使用特权

评论回复
板凳
18910748101|  楼主 | 2017-1-12 13:22 | 只看该作者
nethopper 发表于 2017-1-12 13:07
uk没有初始化,在!rst时,把uk也清零一下。

UK的值对了 但是结果不对啊

捕获.PNG (55.74 KB )

捕获.PNG

使用特权

评论回复
地板
nethopper| | 2017-1-12 13:59 | 只看该作者
18910748101 发表于 2017-1-12 13:22
UK的值对了 但是结果不对啊

结果按你目前的程序是对的:
初始状态:  uk1=0, uk=0
第一个CLK上升沿, uk=error+uk1=100+0=100,  uk1 = 旧的uk =0;
第二个CLK上升沿, uk=error+uk1=30+0=30,    uk1 = 旧的uk =100;
第三个CLK上升沿, uk=error+uk1=-20+100=80, uk1 = 旧的uk =30;
第四个CLK上升沿, uk=error+uk1=-20+30=10,  uk1 = 旧的uk =80;
....

使用特权

评论回复
5
18910748101|  楼主 | 2017-1-12 17:25 | 只看该作者
nethopper 发表于 2017-1-12 13:59
结果按你目前的程序是对的:
初始状态:  uk1=0, uk=0
第一个CLK上升沿, uk=error+uk1=100+0=100,  uk1  ...

明白了 十分感谢  把error输入值延迟久一点就不会出现这种问题了

使用特权

评论回复
6
18910748101|  楼主 | 2017-1-12 17:39 | 只看该作者
nethopper 发表于 2017-1-12 13:59
结果按你目前的程序是对的:
初始状态:  uk1=0, uk=0
第一个CLK上升沿, uk=error+uk1=100+0=100,  uk1  ...

把   uk<=uk_wire;
    uk1<=uk;倒过来写  
uk1<=uk
uk<=uk_wire就好了

使用特权

评论回复
7
nethopper| | 2017-1-12 18:36 | 只看该作者

FPGA程序上下排是并行处理的,倒过来是一样的

使用特权

评论回复
8
18910748101|  楼主 | 2017-1-13 11:52 | 只看该作者
nethopper 发表于 2017-1-12 18:36
FPGA程序上下排是并行处理的,倒过来是一样的

嗯  我搞错了,  感觉我这程序不太对啊 ,并不能计算U(K)=U(k-1)+ERROR啊   error值给快了给慢了  结果都不对,给慢了 他就自己一直累加,有什么好办法吗。。

使用特权

评论回复
9
18910748101|  楼主 | 2017-1-13 12:10 | 只看该作者
nethopper 发表于 2017-1-12 18:36
FPGA程序上下排是并行处理的,倒过来是一样的

BEGIN 里的是阻塞赋值, uk_wire在第一个时钟上升沿计算得出100时是会直接给UK,还是在第二个时钟上升沿给到UK。

使用特权

评论回复
10
nethopper| | 2017-1-13 15:07 | 只看该作者
18910748101 发表于 2017-1-13 11:52
嗯  我搞错了,  感觉我这程序不太对啊 ,并不能计算U(K)=U(k-1)+ERROR啊   error值给快了给慢了  结果 ...

我不了解你究竟要做什么,简单的u(k)=u(k-1)+error 直接这样写:
if(!rst)
    begin
          uk<=0;
    end
else
    begin
          uk<=uk+error;
    end

使用特权

评论回复
11
nethopper| | 2017-1-13 15:20 | 只看该作者
18910748101 发表于 2017-1-13 12:10
BEGIN 里的是阻塞赋值, uk_wire在第一个时钟上升沿计算得出100时是会直接给UK,还是在第二个时钟上升沿 ...

uk_wire在第一个时钟上升沿计算得出100会直接给UK,  不过这时uk1却得到了uk在第一个时钟上升沿之前的数值,而非最新的uk的数值。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

13

帖子

0

粉丝