微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 对两个关联信号进行复位时产生的问题

对两个关联信号进行复位时产生的问题

时间:10-02 整理:3721RD 点击:
假设en是已经同步好且宽度为一个时钟(clk)的信号,现要用它对计数值cnt和分频信号co_reg进行复位。如果用同步复位,则代码通常如下:
process(clk,en)
begin
    if (clk'event and clk='1') then
        if (en='1') then
           countx<="00000";
           co_reg<='1';
        elsif countx="11111" then
               countx<="00000";
               co_reg<='1';
        else
               countx<=countx+'1';
               co_reg<='0';      
        end if;   
   end if;
end process;
      但这会使co_reg比en晚一拍,在我的系统里面不允许这一点。如果换成异步复位倒是可以让en和co_reg同时产生,但又会带来不稳定因素。想请教各位前辈能否不用异步复位来做到en和co_reg同时产生?

不可能,除非用组合逻辑

谢谢你的回复!
关键是怎么用。

问题的症结在于不使用异步复位就不能让en和co_reg同时产生;而换成组合实现,则需要另外开辟一个进程,那么co_reg又无法在两个进程中被驱动。真是很有趣啊。



    co-reg可以是计数器各位的组合逻辑。


    谢谢你的回复。
    关键是en既然对co_reg置位,也要对countx进行复位。如果单独用一个进程对countx计数,再在另一个进程中用组合逻辑去控制co_reg和countx,会造成countx的多驱动。

从你的代码来看,实际co_reg的值可以通过countx来控制的,根本不需要en来进行复位。所以只需要在另一个process中对co_reg进行控制即可。
不知道我的理解对不对。还有,最好能够说明一下外部的控制情况具体怎样,比如,en是周期出现还是偶尔出现,不然,可能你本身的出发点已经错了,那么别人回答问题也是南辕北撤

小编,首先你要清楚你的代码中co_reg是寄存器,肯定是要在延迟1拍输出的。如果你需要当前周期输出,那你需要使用组合逻辑输出。如果你不知道如何用组合逻辑输出,还请你好好看看书,这是最基础的设计知识,这些都不清楚,何来设计系统?

呵呵。谢谢alenww的教导。
谢谢hahalucky的回复。外界的en是周期(=32)出现的。系统上电后要求用第一次出现的en立即复位countx,并将co_reg置1。此后co_reg就可以在en与countx的联合控制下输出了。关键在于第一次en既要让countx复位,又要让co_reg同时置1,如果用组合进程,那么该组合进程中的countx和co_reg都要被驱动;而另外的那个计数并产生co_reg的进程中countx、co_reg还要被驱动,这造成错误。

首先,co_reg这个东东到底要用来干什么呢?看你的代码的思想,我觉得直接将co_reg = en 不就可以了?
我觉得你可能对到底要干什么还有些糊涂,en的周期刚好是countx自己计数的循环周期,就是说,en来一次,后面每32个周期来不来对countx来说已经无所谓了,因为countx到那个时候自己就清零了。

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

网站地图

Top