在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 11371|回复: 11

同步复位与异步复位的区别

[复制链接]
发表于 2003-10-24 09:54:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
写了一个程序,采用异步复位的形式来写,会出现数据不稳定的情况,但是改为同步复位时,就不会出现不稳定的情况!在我的理解范围里,同步复位与异步复位的区别:只是在复位时才有的区别的啊,但是我程序在运行时就没有复位的情况。为什么有这种情况呢!
发表于 2003-10-24 10:20:34 | 显示全部楼层

同步复位与异步复位的区别

(1)同步复位和异步复位在FPGA的实现与所选的器件有关。有些器件里的触发器本身就具有同步/异步复位端,在这样的器件中,异步复位和同步复位在走线上是没有区别的。区别只在于是否与时钟有关。在这样的器件中,只要不是在复位一结束信号(例如多位的计数器)的值就发生跳变,应该是没有影响的。
(2)如果器件只能完成异步复位,那同步复位实际上是由逻辑完成的。在这种情况下,有可能增加你的逻辑资源。
(3)如果想采用异步复位,又想避免复位结束时,有些触发器处于复位状态,有些触发器处于工作状态的情况(由于skew造成),可以在复位输入的起始路径上加入一级D触发器。并限制同步后复位信号的max_delay。
总之,需要根据你的应用情况选用不同的复位形式。
建议你分析一下综合后的电路结构,希望对你有所帮助。
发表于 2003-10-24 12:09:25 | 显示全部楼层

同步复位与异步复位的区别

你有没有想过引脚输入的reset信号上可能有毛刺?同步复位的时候是被忽略的,异步的时候可能就要起作用了。
所以用异步复位的时候建议先用时钟把这个reset打一拍。
发表于 2003-10-24 12:18:24 | 显示全部楼层

同步复位与异步复位的区别

最好采用reset 同步器来实现,这样可以消除recover violation
建议看一下:
http://www.eetop.cn/cgi-bin/topic.cgi?forum=5&topic=511&show=25
里面讲的非常清楚
 楼主| 发表于 2003-10-24 15:48:03 | 显示全部楼层

同步复位与异步复位的区别

    程序综合并布线后进行仿真(后仿真)时,在复位信号有效时,输出与各寄存器的值都是确定的,这时转换复位信号无效时,但是还没有输入控制信号时,则输出与各个寄存器的值都是不确定的!!复位的形式是以锁存器的形式来做的(if  elsif 的结构)!
发表于 2003-10-24 16:26:46 | 显示全部楼层

同步复位与异步复位的区别

不知道楼主用的什么芯片,FPGA还是CPLD;
在可编程芯片的内部,信号传输时需要时间的,即异步复位信号rst到达寄存器A和寄存器B的时间存在诧异,而时钟信号因为有专用的线路不受影响;
寄存器A B受到同步复位信号rst_syn时必须在时钟沿处采发生变化,这样对系统不会造成危害;而受到异步复位rst时,寄存器A B的输出马上发生改变,因为异步复位信号rst到达寄存器A和寄存器B的时间存在诧异所以A B的输出也不是同时变化的,更重要的是他们不再时钟沿上变化,这样后续逻辑可能会收到错误的结果,从而造成系统不稳定;
总之,在同步设计中尽量不要使用异步逻辑;
 楼主| 发表于 2003-10-27 17:20:24 | 显示全部楼层

同步复位与异步复位的区别

谢谢各位的解答,现在程序还是有点不稳定!现在贴出来,希望给点建议!
程序是在altera MAX7128上运行的!!
其功能是I2C的拦截程序!!
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
--use ieee.std_logic_arith.all;
entity  monitor  is
  port(   RESET  :in      std_logic;
     CLK16x  :in      std_logic;
           SCL   :in      std_logic;---I2C clock signal
           SDA   :in      std_logic;---I2C data  signal
DACK  ut     std_logic;---IOSELA0  monitor the  data condition
STACK ut     std_logic;---IOSELA1  monitor the start or stop condition
   DATA  ut     std_logic_vector(7 downto 0));---data BUS
end  monitor;
architecture  rtl of  monitor  is
signal   REG        :std_logic_vector(7 downto 0);
signal   SHIFT      :std_logic_vector(7 downto 0);
signal   COUNT      :std_logic_vector(3 downto 0);
signal   SDA1       :std_logic;
signal   DATAOUT    :std_logic_vector(7 downto 0);
signal   SCL1       :std_logic;
signal   startb     :std_logic;
signal   stopb      :std_logic;
signal   datab      :std_logic;
signal   sbit       :std_logic;     ---the bit of  starting receive data  
signal   dbit       :std_logic;       ---the bit of  stop signal
signal   cnt        :std_logic_vector(3 downto 0);
signal   RIDE       :std_logic;       ---the signal of SDA rising
signal   FIDE       :std_logic;       ---the signal of SDA falling
signal   DRIDE      :std_logic;       ---the signal of SCL rising
signal   DFIDE      :std_logic;       ---the signal of SCL falling
signal   DISPLAY    :std_logic;
signal   FLAG       :std_logic;
begin
process(CLK16x,RESET,COUNT)
  begin
  if   CLK16x'event and CLK16x='1' then
    if  RESET='0'  then
     COUNT<="0001";
REG<=(others=>'0');
SHIFT<=(others=>'0');
startb<='0';
stopb<='0';
datab<='0';
sbit<='0';
dbit<='0';
STACK<='1';
     DACK<='1';
DISPLAY<='0';
cnt<="0010";
FLAG<='0';     
    elsif  SCL1='1' and FIDE='1' then           --monitor start bit  ( 80)
        stopb<='0';
startb<='1';
DATAB<='0';
REG<="10000000";
COUNT<="0000";
STACK<='1';
DACK<='1';
sbit<='1';
dbit<='0';
DISPLAY<='1';
    elsif  SCL1='1' and RIDE='1' and  dbit='1' then --monitor stop bit(FF)
        startb<='0';
        stopb<='1';
DATAB<='0';
        REG<=(others=>'1');
COUNT<="0000";
STACK<='0';
DACK<='1';
sbit<='0';
dbit<='0';
DISPLAY<='1';
    elsif  SCL1='1' and DRIDE='1' and sbit='1' then  --monitor  data      
         COUNT<=COUNT+"0001";
startb<='0';
         stopb<='0';
--STACK<='1';
DACK<='1';
         dbit<='1';
DISPLAY<='0';
FLAG<='1';
    else
         FLAG<='0';
    end if;
         
    if COUNT<="1000" and FLAG='1' then       ---COUNT<"1000" and FLAG='1'
    SHIFT<=SHIFT(6 downto 0)&SDA;
    DATAB<='0';--//
    elsif COUNT="1000" and DFIDE='1' then
        REG<=SHIFT;
    DACK<='0';
    DATAB<='1';
    elsif   COUNT="1001" and DFIDE='1' then
        COUNT<=(others=>'0');
    end if;
    if   DISPLAY='1'  then
        cnt<=cnt+1;   
    else
        cnt<=(others=>'0');
    end  if;
    if  cnt="0100"  then ----reversion or DFIDE='1'
    STACK<='0';   
elsif cnt="1111" or DFIDE='1' then
    STACK<='1';
    DISPLAY<='0';
    end if;

-- end if;
  end  if;

end process;
   
process(CLK16x,RESET)
  begin
  if  CLK16x'event and CLK16x='1' then
SDA1<=SDA;
    SCL1<=SCL;
   --if  RESET='0'  then
   --  SDA1<='0';
   --  SCL1<='0';
   --  RIDE<='0';
   -- FIDE<='0';
   -- DRIDE<='0';
    --  DFIDE<='0';
  -- else
if  (SDA1='1' and SDA='0')  then
  FIDE<='1';
  RIDE<='0';
elsif (SDA1='0' and SDA='1')  then
         RIDE<='1';
   FIDE<='0';
    else
            RIDE<='0';
FIDE<='0';
    end if;
if  SCL1='0'  and SCL='1' then
       DRIDE<='1';
   DFIDE<='0';
elsif  SCL1='1' and SCL='0' then
       DRIDE<='0';
           DFIDE<='1';
else
       DRIDE<='0';  
   DFIDE<='0';
end if;   
-- end if;
  end  if;
end process;
process(RESET,CLK16x,DATAOUT)
  begin
   if  CLK16x'event and CLK16x='1' then
     -- if RESET='0' then
      --   DATAOUT<=(others=>'0');
      --   DATA<=(others=>'0');
  --else
  if  startb='1'   then
      DATAOUT<=REG;  
  elsif  datab='1'  then
      DATAOUT<=REG;
  elsif stopb='1'  then
      DATAOUT<=REG;
  end if;
           
DATA<=DATAOUT;
  end if;
  --end  if;  
end process;
end rtl;
发表于 2003-10-28 17:23:58 | 显示全部楼层

同步复位与异步复位的区别

从逻辑上看,你这已经是一个全同步的方程,已经没有异步的复位,所以不稳定的问题可能处在布线以后的结构上;很可能是你的写法造成了计算的错误;我没用过altera的片子,不过是怀疑而已,以下意见仅供参考:
1.既然所有的逻辑只在时钟沿变化,建议在敏感信号中删去其他的东西,即Process(clk) 在Xilinx中不这样的话会影响仿真;
2.在process中信号改变的条件太多,而且写在不同的if-elsif-end if中,为什么不写在一个里面,这样会结构会清晰很多,而且更接近实际生成的RTL结构,同时也能最大程度的减小逻辑错误;
还有一种方法来判断问题就是通过RTL结构图来查找,看看是否存在与设想的结构不一样的地方;
发表于 2003-10-28 17:51:12 | 显示全部楼层

同步复位与异步复位的区别

楼上说的有理
我觉的一个process最好只完成一个任务比较好一些
发表于 2006-12-14 15:39:09 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-22 11:53 , Processed in 0.029112 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表