哪位大神帮我看看这段程序问题出在哪里了
时间:10-02
整理:3721RD
点击:
PROCESS(CLK,RESET)
BEGIN
IF RESET='1' THEN
OLD<="0000000000000000";
SPD<="0000000000000001";
ELSIF CLK'EVENT AND CLK='1' THEN
IF CE1='1' THEN OLD<=IP;IP<=CNT;
END IF;
END IF;
END PROCESS;
CE1<=CLKA;
SPD<=IP-OLD;
SPD_OUT<=SPD;
其中cnt为一个递增计数器,clka的频率为1khz。我的理解:经过ce1的延时,得到old,ip两个值,old是1khz之前的ip的值,两者相减输出给spd_out,即spd为这1ms时间内cnt递增了多少的数值。我把这段程序下载之后,ip,old,cnt都成递增,但spd的输出一直为0,若把spd的复位值改为0000000000000001,则输出0000000000000001,就是spd就一直是复位值,不会变,这是怎么回事,问题出在哪里了呢?希望哪位大神帮帮忙。
BEGIN
IF RESET='1' THEN
OLD<="0000000000000000";
SPD<="0000000000000001";
ELSIF CLK'EVENT AND CLK='1' THEN
IF CE1='1' THEN OLD<=IP;IP<=CNT;
END IF;
END IF;
END PROCESS;
CE1<=CLKA;
SPD<=IP-OLD;
SPD_OUT<=SPD;
其中cnt为一个递增计数器,clka的频率为1khz。我的理解:经过ce1的延时,得到old,ip两个值,old是1khz之前的ip的值,两者相减输出给spd_out,即spd为这1ms时间内cnt递增了多少的数值。我把这段程序下载之后,ip,old,cnt都成递增,但spd的输出一直为0,若把spd的复位值改为0000000000000001,则输出0000000000000001,就是spd就一直是复位值,不会变,这是怎么回事,问题出在哪里了呢?希望哪位大神帮帮忙。
时序逻辑以外的<=都没有时间轴的事务队列的概念,所以综合之后spd<=ip-old; spd_out<=spd;就成了spd_out<=ip-old了。你看到的结果可能就是这个。
2楼说的对。要区别清时序逻辑和组合逻辑的区别。
应该是SPD被优化成了一个常数值!你去掉spd_out.直接输出spd,应该就没有问题!
PROCESS(CLK,RESET)
BEGIN
IF RESET='1' THEN
OLD<="0000000000000000";
SPD<="0000000000000001";
ELSIF CLK'EVENT AND CLK='1' THEN
IF CE1='1' THEN
OLD<=IP;
IP<=CNT;
SPD<=IP-OLD;
END IF;
END IF;
END PROCESS;
CE1<=CLKA;
SPD_OUT<=SPD;
你这样写应该就没有问题了
SPD 在Process中有复位,而process外对SPD又赋值,肯定是工具把process外的语句优化掉落。SPD要只写在process内或外,不要内外都写。
感谢,十分感谢,又学了点东西
恩,运行正确了,十分感谢!
