1复位方式

FPGA复位分为:同步复位和异步复位

1.1同步复位

复位信号在时钟有效沿到来时候有效,复位操作是“瞬间的”。

优点
一、可以滤除高于时钟频率的毛刺,提高复位操作的可操作性。
二、同步复位系统可以被设计为纯粹的同步时序电路,有利于时序分析。

缺点
必须保证复位信号的有效持续时间大于一个时钟周期,否则复位信号有可能被当做毛刺滤除掉,系统将漏掉一次本来应有的复位操作。

1.2异步复位

不管时钟信号的有效沿是否到来,只要复位信号的有效沿到来,就执行一次复位操作,故异步复位操作是“持续的”。

存在的问题
一、异步信号释放的时刻和时钟有效沿比较接近的时候,容易导致寄存器的输出呈现亚稳态,
二、复位信号管理的寄存器比较多时,这些寄存器分布在芯片上的不同地方,故而复位信号到达各个寄存器的路径延迟参差不齐,故如果异步复位信号释放的时刻和时钟信号的有效沿很接近的时候,可能会导致一部分寄存器在该时钟有效沿之前完成复位,而另一部分寄存器在该时钟有效沿之后才完成复位操作,此时会出现时钟周期的偏差,从而可能导致后续的逻辑功能混乱。
三、复位信号容易受到毛刺等干扰的影响。

2 复位的设计方法
同步复位一般比异步复位耗费额外的资源,故资源比较少的时候采用低电平有效的异步复位、同步释放机制。

2.1 同步信号同步复位

所谓同步信号指的是复位信号和时钟信号处于用一个时钟域下。
//verilog example
always @(posedge clk)begin
	if(!rst)begin
		<此处描述复位状态>;
	end
	else begin
		<statements>;
	end
end

2.2 同步信号异步复位

//verilog example
always @(posedge clk or negedge)begin
	if(!rst)begin
		<此处描述复位状态>;
	end
	else begin
		<statements>;
	end
end

2.3 异步信号同步复位

异步信号:复位信号和当前的时钟信号处于不同的时钟域。此时无论采取的是异步复位还是同步复位,都有可能会造成系统的逻辑出现混乱(**跨时钟域问题**)。
一般先将该异步信号同步化,同步化采取采样法。
//verilog example
//先将异步复位信号采样
always @(posedge clk)
begin
	tmp <= arst;
	rst <= tmp;
end

always @(posedge clk)begin
	if(!rst)
	begin
		<statements>;
	end
	else begin
		<statements>;
	end
end

2.4 异步信号异步复位

//verilog example
//先将异步复位信号采样
always @(posedge clk)
begin
	tmp <= arst;
	rst <= tmp;
end

always @(posedge clk or negedge rst)begin
	if(!rst)
	begin
		<statements>;
	end
	else begin
		<statements>;
	end
end

2.5 复位信号的扇出问题

由于复位信号的高扇出原因(同时钟信号一样,复位信号几乎作用于设计中的所有寄存器),必须设法使得扇出系数减小。
采取的方法:寄存器复制   正确利用全局时钟树(BUFG)

2.6 全局复位和局部复位

​ 一般fpga芯片在上电的时候都会被先重置为一个预先设定好的状态,相应的使得FPGA芯片的局部复位到某个指定的状态时候,采用局部复位的方式。

两级复位体系:FPGA芯片必须设计一个全局复位信号,当设计中不止包含一个时钟域的时候,此全局复位信号经过不同的时钟域同步化之后,转化为每个时钟域的全局复位信号,与此同时,每个时钟域划分为若干局部子时钟域,这样为每个子域提供一个复位信号。全局复位采用异步复位的方式,局部信号采用同步复位的方式。

//verilog example
always @(posedge clk or negedge globalRst)begin	//area1
    if(!globalRst)begin
		<statements>;
    end
	else begin
		if(!localRst1)begin
			<statements>;
		end
		else begin
			<statements>;
		end
	end
end

always @(posedge clk or negedge globalRst)begin	//area2
    if(!globalRst)begin
		<statements>;
    end
	else begin
		if(!localRst2)begin
			<statements>;
		end
		else begin
			<statements>;
		end
	end
end