微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 哪位大神帮我看看这段程序问题出在哪里了

哪位大神帮我看看这段程序问题出在哪里了

时间: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就一直是复位值,不会变,这是怎么回事,问题出在哪里了呢?希望哪位大神帮帮忙。

时序逻辑以外的<=都没有时间轴的事务队列的概念,所以综合之后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内或外,不要内外都写。



    感谢,十分感谢,又学了点东西



    恩,运行正确了,十分感谢!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top