请选择 进入手机版 | 继续访问电脑版
搜索
专业IC版图外包服务 微信:drclvs
广告位:SY02 广告业务联系QQ:3173974412
无锡芯满微电子有限公司---专业研发电机驱动芯片
IC设计论坛----ictown.com
广告位:SY05 广告业务联系QQ:3173974412
查看: 49|回复: 7

[咨询求助] 同步复位与异步复位的区别

[复制链接]

6

主题

10

帖子

35

E币

技术员

Rank: 2

积分
16
发表于 2019-10-30 13:36:07 | 显示全部楼层 |阅读模式

写了一个程序,采用异步复位的形式来写,会出现数据不稳定的情况,但是改为同步复位时,就不会出现不稳定的情况!在我的理解范围里,同步复位与异步复位的区别:只是在复位时才有的区别的啊,但是我程序在运行时就没有复位的情况。为什么有这种情况呢!
积分规则
回复

使用道具 举报

38

主题

47

帖子

171

E币

技术员

Rank: 2

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

使用道具 举报

14

主题

32

帖子

96

E币

技术员

Rank: 2

积分
46
发表于 2019-10-30 16:00:04 | 显示全部楼层
你有没有想过引脚输入的reset信号上可能有毛刺?同步复位的时候是被忽略的,异步的时候可能就要起作用了。
所以用异步复位的时候建议先用时钟把这个reset打一拍。
回复 支持 反对

使用道具 举报

6

主题

10

帖子

35

E币

技术员

Rank: 2

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

使用道具 举报

38

主题

47

帖子

171

E币

技术员

Rank: 2

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

使用道具 举报

6

主题

10

帖子

35

E币

技术员

Rank: 2

积分
16
 楼主| 发表于 2019-10-30 16:01:47 | 显示全部楼层
谢谢各位的解答,现在程序还是有点不稳定!现在贴出来,希望给点建议!
程序是在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  :out     std_logic;---IOSELA0  monitor the  data condition
STACK :out     std_logic;---IOSELA1  monitor the start or stop condition
   DATA  :out     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;
回复 支持 反对

使用道具 举报

38

主题

47

帖子

171

E币

技术员

Rank: 2

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

使用道具 举报

83

主题

102

帖子

275

E币

技术员

Rank: 2

积分
185
发表于 2019-10-30 16:02:22 | 显示全部楼层
楼上说的有理
我觉的一个process最好只完成一个任务比较好一些
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|EDABOSS电子论坛

GMT+8, 2019-11-19 04:58 , Processed in 0.060930 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表