復(fù)位電路設(shè)計(jì)
前面在時(shí)序分析中提到過亞穩(wěn)態(tài)的概念,每天學(xué)習(xí)一點(diǎn)FPGA知識(shí)點(diǎn)(9)之時(shí)序分析并且在電路設(shè)計(jì)中如果不滿足Tsu(建立時(shí)間)和Th(保持時(shí)間),很容易就出現(xiàn)亞穩(wěn)態(tài);在跨時(shí)鐘域傳輸?shù)囊幌盗写胧┮彩菫榱私档蛠喎€(wěn)態(tài)發(fā)生的概率。
今天再說另一個(gè)可能會(huì)產(chǎn)生亞穩(wěn)態(tài)問題的電路;
復(fù)位電路;
1??recovery time和removal time
在正式開始復(fù)位電路設(shè)計(jì)之前,先說明兩個(gè)概念,恢復(fù)時(shí)間(recovery time)和移除時(shí)間(removal time)。[注,此處以低電平復(fù)位為例]
恢復(fù)時(shí)間:撤銷復(fù)位時(shí),復(fù)位信號(hào)無效到時(shí)鐘有效沿來臨之前需要維持的最小的時(shí)間,稱為恢復(fù)時(shí)間,類似于同步時(shí)鐘的建立時(shí)間setup time;
移除時(shí)間:撤銷復(fù)位時(shí),在時(shí)鐘有效沿來臨之后復(fù)位信號(hào)還需要保持復(fù)位狀態(tài)的時(shí)間為去除時(shí)間,類似于同步時(shí)鐘的保持時(shí)間hold time;
如下圖所示:
[注]:
①概念中所說的兩個(gè)時(shí)鐘沿并不是同一個(gè)時(shí)鐘沿,可以從另一個(gè)角度解釋:以復(fù)位結(jié)束的上升沿(低電平復(fù)位的情況下)為基準(zhǔn),復(fù)位結(jié)束前一個(gè)時(shí)鐘沿到復(fù)位結(jié)束之間為移除時(shí)間;復(fù)位結(jié)束后到下一個(gè)時(shí)鐘沿之間為恢復(fù)時(shí)間。
②兩個(gè)定義都是在復(fù)位結(jié)束的時(shí)候定義的,因?yàn)閺?fù)位結(jié)束,系統(tǒng)馬上處于工作狀態(tài),所以才需要考慮亞穩(wěn)態(tài)問題。
2??同步復(fù)位和異步復(fù)位
①同步復(fù)位
同步復(fù)位:指的是加到所有功能觸發(fā)器上的復(fù)位信號(hào)完全同步于時(shí)鐘信號(hào)源。復(fù)位信號(hào)只有在時(shí)鐘上升沿到來時(shí),才能有效,否則,無法完成對(duì)系統(tǒng)的復(fù)位工作。復(fù)位原理如下圖所示:
[圖源:CSDN@小汪的IC自習(xí)室]
其代碼如下:
module test(
input sys_clk,
input sys_rst_n,
input din,
output reg dout
);
always@(posedge sys_clk) begin
if(!sys_rst_n)
dout <= 1'b0;
else
dout <= din;
end
endmodule
綜合后的電路圖如下:
優(yōu)點(diǎn) :
*系統(tǒng)為同步時(shí)序,有利于時(shí)序分析;
*抗干擾性能好,能有效剔除信號(hào)中短于時(shí)鐘周期的毛刺;
缺點(diǎn) :
*復(fù)位信號(hào)的有效時(shí)長必須大于時(shí)鐘周期,才能真正被系統(tǒng)識(shí)別并完成復(fù)位。同時(shí)還要考慮如:時(shí)鐘偏移、組合邏輯路徑延時(shí)、復(fù)位延時(shí)等因素。
*由于大多數(shù)的廠商目標(biāo)庫內(nèi)的觸發(fā)器都只有異步復(fù)位端口,采用同步復(fù)位的話,就會(huì)耗費(fèi)較多的邏輯資源(如上圖中使用了一個(gè)2選1多路選擇器)。
②異步復(fù)位
復(fù)位信號(hào)直接接到功能觸發(fā)器的異步復(fù)位引腳,復(fù)位只與復(fù)位信號(hào)有關(guān),與時(shí)鐘無關(guān)。無論時(shí)鐘沿是否到來,只要復(fù)位信號(hào)有效,就對(duì)系統(tǒng)進(jìn)行復(fù)位。異步復(fù)位的工作原理如下圖所示:
其代碼如下:
module test(
input sys_clk,
input sys_rst_n,
input din,
output reg dout
);
always@(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
dout <= 1'b0;
else
dout <= din;
end
endmodule
綜合出的電路圖,如下圖所示:
通過這個(gè)圖能很明顯得看出來,比同步復(fù)位電路少用了一些資源。
優(yōu)點(diǎn) :
*異步復(fù)位信號(hào)識(shí)別方便,很容易應(yīng)用到全局復(fù)位;
*可以節(jié)省邏輯資源(對(duì)比兩個(gè)復(fù)位電路即可看出);
缺點(diǎn) :
*復(fù)位信號(hào)容易受到毛刺的影響,一點(diǎn)毛刺信號(hào)就有可能引發(fā)電路復(fù)位,造成系統(tǒng)運(yùn)行錯(cuò)誤。
*復(fù)位信號(hào)的釋放具有隨機(jī)性,如果復(fù)位信號(hào)釋放不滿足recovery或者removal,則會(huì)導(dǎo)致亞穩(wěn)態(tài)的產(chǎn)生。
當(dāng)然了,其實(shí)在同步復(fù)位情況下,也會(huì)有亞穩(wěn)態(tài)問題的產(chǎn)生,詳情參考文章《 FPGA中亞穩(wěn)態(tài)——讓你無處可逃 》,作者博客園:@屋檐下的龍卷風(fēng)。
3??異步復(fù)位同步釋放
對(duì)于復(fù)位情況下的亞穩(wěn)態(tài),常常是因?yàn)椴粷M足時(shí)序要求造成的(主要是recovery和removal),最常用的處理方式是異步復(fù)位,同步釋放。
通過異步復(fù)位和同步釋放,可以使復(fù)位信號(hào)到來時(shí),不受時(shí)鐘控制,可以立即復(fù)位;但是復(fù)位信號(hào)釋放時(shí),受同步時(shí)鐘控制。
其電路原理圖如下:
先通過兩級(jí)觸發(fā)器進(jìn)行異步復(fù)位信號(hào)的同步,輸出的信號(hào)作為后續(xù)整個(gè)系統(tǒng)的復(fù)位信號(hào);
其對(duì)應(yīng)的代碼如下:
module test(
input sys_clk, //系統(tǒng)時(shí)鐘信號(hào)
input async_rst_n, //外部輸入的復(fù)位信號(hào)
input din, //輸入的數(shù)據(jù)信號(hào)
output reg dout //輸出的數(shù)據(jù)信號(hào)
);
reg sync_rst_n1; //第一級(jí)觸發(fā)器輸出
reg sync_rst_n2; //第二級(jí)觸發(fā)器輸出,經(jīng)釋放同步后的復(fù)位信號(hào)
always@(posedge sys_clk or negedge async_rst_n)begin
if(!async_rst_n)begin
sync_rst_n1 <= 1'b0;
sync_rst_n2 <= 1'b0;
end
else begin
sync_rst_n1 <= 1'b1;
sync_rst_n2 <= sync_rst_n1;
end
end
always@(posedge sys_clk or negedge sync_rst_n2) begin
if(!sync_rst_n2)
dout <= 1'b0;
else
dout <= din;
end
endmodule
綜合后的電路圖如圖所示:
接下來,對(duì)該電路進(jìn)行仿真分析,看看是如何異步復(fù)位、同步釋放的。testbench文件如下:
`timescale 1ns/1ps
module test_tb;
reg sys_clk; //系統(tǒng)時(shí)鐘信號(hào)
reg async_rst_n; //外部輸入的復(fù)位信號(hào)
reg din; //輸入的數(shù)據(jù)信號(hào)
wire dout; //輸出的數(shù)據(jù)信號(hào)
test test_u1(
.sys_clk(sys_clk), //系統(tǒng)時(shí)鐘信號(hào)
.async_rst_n(async_rst_n), //外部輸入的復(fù)位信號(hào)
.din(din), //輸入的數(shù)據(jù)信號(hào)
.dout(dout) //輸出的數(shù)據(jù)信號(hào)
);
always #10 sys_clk = ~sys_clk;
initial begin
sys_clk = 0;
async_rst_n = 0;
din = 1;
#19;
async_rst_n = 1;
#99;
async_rst_n = 0;
#34;
async_rst_n = 1;
#97;
async_rst_n = 0;
#3;
async_rst_n = 1;
#71;
async_rst_n = 0;
#16;
async_rst_n = 1;
#200;
$stop;
end
endmodule
當(dāng)然了,我只是簡單的仿真一下,也許寫的testbench并不是很好,能說明問題即可,仿真圖如下圖所示:
上圖中,很明顯的可以看出,異步復(fù)位信號(hào)(低電平)到來時(shí),dout立馬變?yōu)?,但是在復(fù)位信號(hào)釋放后延遲兩個(gè)周期,到第三個(gè)周期才真正的恢復(fù)到工作狀態(tài);這跟我們一開始使用的兩級(jí)觸發(fā)器對(duì)釋放信號(hào)進(jìn)行同步有關(guān)系。
異步復(fù)位和同步釋放,其實(shí)可以分開來看,單純的理解為兩個(gè)信號(hào)來控制著整個(gè)系統(tǒng)。同步釋放信號(hào)相對(duì)于外部復(fù)位信號(hào)的釋放總是存在一定的延遲,不過延遲很小,也就兩個(gè)周期,實(shí)際中也是可以接受的。
關(guān)于復(fù)位電路的設(shè)計(jì)就暫時(shí)說到這里,不過好像沒有說完,還有關(guān)于配置PLL之后的系統(tǒng)復(fù)位電路怎么設(shè)計(jì)等等,以后再詳細(xì)討論
-
FPGA
+關(guān)注
關(guān)注
1629文章
21729瀏覽量
602986 -
亞穩(wěn)態(tài)
+關(guān)注
關(guān)注
0文章
46瀏覽量
13268 -
復(fù)位電路
+關(guān)注
關(guān)注
13文章
322瀏覽量
44586 -
時(shí)序分析
+關(guān)注
關(guān)注
2文章
127瀏覽量
22565
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論