微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 同步复位与异步复位的区别

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

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

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

同步复位与异步复位的区别
你有没有想过引脚输入的reset信号上可能有毛刺?同步复位的时候是被忽略的,异步的时候可能就要起作用了。
所以用异步复位的时候建议先用时钟把这个reset打一拍。

同步复位与异步复位的区别
最好采用reset 同步器来实现,这样可以消除recover violation
建议看一下:
http://www.eetop.cn/cgi-bin/topic.cgi?forum=5&topic=511&show=25
里面讲的非常清楚

同步复位与异步复位的区别
程序综合并布线后进行仿真(后仿真)时,在复位信号有效时,输出与各寄存器的值都是确定的,这时转换复位信号无效时,但是还没有输入控制信号时,则输出与各个寄存器的值都是不确定的!复位的形式是以锁存器的形式来做的(ifelsif 的结构)!

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

同步复位与异步复位的区别
谢谢各位的解答,现在程序还是有点不稳定!现在贴出来,希望给点建议!
程序是在altera MAX7128上运行的!
其功能是I2C的拦截程序!
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
--use ieee.std_logic_arith.all;
entitymonitoris
port(RESET:instd_logic;
CLK16x:instd_logic;
SCL:instd_logic;---I2C clock signal
SDA:instd_logic;---I2C datasignal
DACKutstd_logic;---IOSELA0monitor thedata condition
STACK utstd_logic;---IOSELA1monitor the start or stop condition
DATAutstd_logic_vector(7 downto 0));---data BUS
endmonitor;
architecturertl ofmonitoris
signalREG:std_logic_vector(7 downto 0);
signalSHIFT:std_logic_vector(7 downto 0);
signalCOUNT:std_logic_vector(3 downto 0);
signalSDA1:std_logic;
signalDATAOUT:std_logic_vector(7 downto 0);
signalSCL1:std_logic;
signalstartb:std_logic;
signalstopb:std_logic;
signaldatab:std_logic;
signalsbit:std_logic;---the bit ofstarting receive data
signaldbit:std_logic;---the bit ofstop signal
signalcnt:std_logic_vector(3 downto 0);
signalRIDE:std_logic;---the signal of SDA rising
signalFIDE:std_logic;---the signal of SDA falling
signalDRIDE:std_logic;---the signal of SCL rising
signalDFIDE:std_logic;---the signal of SCL falling
signalDISPLAY:std_logic;
signalFLAG:std_logic;
begin
process(CLK16x,RESET,COUNT)
begin
ifCLK16x'event and CLK16x='1' then
ifRESET='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';
elsifSCL1='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';
elsifSCL1='1' and RIDE='1' anddbit='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';
elsifSCL1='1' and DRIDE='1' and sbit='1' then--monitordata
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';
elsifCOUNT="1001" and DFIDE='1' then
COUNT<=(others=>'0');
end if;
ifDISPLAY='1'then
cnt<=cnt+1;
else
cnt<=(others=>'0');
endif;
ifcnt="0100"then ----reversion or DFIDE='1'
STACK<='0';
elsif cnt="1111" or DFIDE='1' then
STACK<='1';
DISPLAY<='0';
end if;

-- end if;
endif;

end process;

process(CLK16x,RESET)
begin
ifCLK16x'event and CLK16x='1' then
SDA1<=SDA;
SCL1<=SCL;
--ifRESET='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;
ifSCL1='0'and SCL='1' then
DRIDE<='1';
DFIDE<='0';
elsifSCL1='1' and SCL='0' then
DRIDE<='0';
DFIDE<='1';
else
DRIDE<='0';
DFIDE<='0';
end if;
-- end if;
endif;
end process;
process(RESET,CLK16x,DATAOUT)
begin
ifCLK16x'event and CLK16x='1' then
-- if RESET='0' then
--DATAOUT<=(others=>'0');
--DATA<=(others=>'0');
--else
ifstartb='1'then
DATAOUT<=REG;
elsifdatab='1'then
DATAOUT<=REG;
elsif stopb='1'then
DATAOUT<=REG;
end if;

DATA<=DATAOUT;
end if;
--endif;
end process;
end rtl;

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

同步复位与异步复位的区别
楼上说的有理
我觉的一个process最好只完成一个任务比较好一些

www.sunburst-design.com/papers

同步复位是指reset信号仅仅在时钟的有效沿处影响或者复位触发器的状态。在复位信号有效的时候,电路并不立即复位,而是等到下一个有效时钟沿到来的时候复位才实现。同样同步信号的撤销也是一样,必须等到有效时钟沿。
异步复位是指reset信号有效时电路就立即复位而无须等待时钟沿。异步复位触发器的复位引脚通常是低有效,当复位引脚的信号变低时就会将进入复位状态异步复位不需要时钟是其最突出的优点。无论何时,只需要复位信号变得有效,设计者就可以确保电路进入到复位的状态。

xue xi zhong

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

网站地图

Top