1.同步和異步
-
數(shù)字電路根據(jù)邏輯功能的不同特點(diǎn),可以分成兩大類:一類叫做組合邏輯電路,簡(jiǎn)稱組合電路或組合邏輯;另一類叫做時(shí)序邏輯電路,簡(jiǎn)稱時(shí)序電路或時(shí)序邏輯。
- 如果數(shù)字電路滿足任意時(shí)刻的輸出僅僅取決于該時(shí)刻的輸入,那么該數(shù)字電路為組合邏輯電路。
- 相反,如果數(shù)字電路任意時(shí)刻的輸出不僅取決于當(dāng)前時(shí)刻的輸入,而且還取決于數(shù)字電路原來(lái)的狀態(tài),那么該數(shù)字電路為時(shí)序邏輯電路
-
這里和狀態(tài)機(jī)分類有點(diǎn)像,Moore型的輸出只與當(dāng)前狀態(tài)有關(guān),而Mealy型的輸出還與輸入相關(guān)
在Verilog中根據(jù)是否受同一個(gè)時(shí)鐘控制把電路分為兩類:同步時(shí)序電路和異步時(shí)序電路
-
同步電路:
- 電路中所有信號(hào)都受同一個(gè)時(shí)鐘控制的
- 電路中有多個(gè)時(shí)鐘,但是其相位差是恒定的,也認(rèn)為是同步電路
- 所有觸發(fā)器都在同一個(gè)時(shí)鐘控制下完成、所有觸發(fā)器的觸發(fā)方式(沿觸發(fā)/電平觸發(fā))和種類完全一致
-
異步電路
- 電路中有不受時(shí)鐘控制的信號(hào)
- 電路中有多個(gè)時(shí)鐘,但是其相位差不是恒定的,是異步電路
-
同步動(dòng)作:所有的信號(hào)都在一個(gè)時(shí)鐘下控制
-
異步動(dòng)作:敏感信號(hào)列表中有不受時(shí)鐘控制的其他信號(hào),要遍歷clock信號(hào)和
(reset)異步
信號(hào),并且(reset)異步
信號(hào)級(jí)別比clock信號(hào)高
2. 同步復(fù)位、異步復(fù)位、同步釋放
2.1 同步復(fù)位
- 復(fù)位信號(hào)只在時(shí)鐘上升沿到來(lái)時(shí)才有效;
- 能夠有效濾除高于時(shí)鐘頻率的毛刺;
- 同步復(fù)位的優(yōu)點(diǎn)在于它只在時(shí)鐘信號(hào)clk的上升沿觸發(fā)進(jìn)行系統(tǒng)是否復(fù)位的判斷,這降低了亞穩(wěn)態(tài)出現(xiàn)的概率
- 復(fù)位信號(hào)的有效時(shí)間必須大于時(shí)鐘周期才可以檢測(cè)到復(fù)位
- 與異步復(fù)位相比,電路多使用一個(gè)
選擇器
,需要消耗更多的器件資源
2.1.1 Verilog code
module sync_reset(
input i_clk,
input i_rst_n,
input i_data,
output reg o_data
);
always @(posedge i_clk)
if(!i_rst_n)
o_data <= 1'b0;
else
o_data <= i_data;
endmodule
2.1.2 Verdi waveform
2.1.3 DC Synthesis
2.2 異步復(fù)位
- 無(wú)論時(shí)鐘有效沿是否有效,只要復(fù)位信號(hào)到來(lái),立即執(zhí)行復(fù)位操作
- 復(fù)位信號(hào)釋放時(shí),如果不滿足時(shí)序要求,可能由復(fù)位引入亞穩(wěn)態(tài)
- 采用異步復(fù)位的端口無(wú)需額外增加器件資源的消耗,直接利用觸發(fā)器的異步復(fù)位端,節(jié)省資源
2.2.1 Verilog code
module async_reset(
input i_clk,
input i_rst_n,
input i_data,
output reg o_data
);
always @(posedge i_clk or negedge i_rst_n)
if(!i_rst_n)
o_data <= 1'b0;
else
o_data <= i_data;
endmodule
2.3 同步釋放(異步信號(hào)和CLK信號(hào)存在時(shí)序檢查、Recover time&Removel time)
- 如果復(fù)位信號(hào)正好在時(shí)鐘信號(hào)的有效沿撤銷,這時(shí)候的輸出就是亞穩(wěn)態(tài)
- 使用兩級(jí)觸發(fā)器同步釋放(留一個(gè)周期的裕量),大大減小亞穩(wěn)態(tài)出現(xiàn)的概率,萬(wàn)一出現(xiàn)亞穩(wěn)態(tài)只要在(周期T-Tsetup)這個(gè)時(shí)間恢復(fù)穩(wěn)定即可
- 兩級(jí)觸發(fā)器同步后,第二級(jí)觸發(fā)器的輸出基本上是穩(wěn)定值。后續(xù)邏輯根據(jù)穩(wěn)定值,會(huì)有穩(wěn)定的行為。這就是追求的系統(tǒng)穩(wěn)定性。
- 異步復(fù)位、同步釋放其最顯著特征是既保留了異步復(fù)位的功能,又避免了異步復(fù)位釋放時(shí)所面臨的recovery或者removal違例問(wèn)題
2.4 異步復(fù)位、同步釋放
2.4.1 Verilog code
module reset_gen (
output rst_sync_n,
input clk, rst_async_n);
reg rst_s1, rst_s2;
always @(posedge clk, negedge rst_async_n)
if (!rst_async_n) begin
rst_s1 <= 1'b0;
rst_s2 <= 1'b0;
end
else begin
rst_s1 <= 1'b1;
rst_s2 <= rst_s1;
end
assign rst_sync_n = rst_s2;
endmodule
2.4.2 Verdi waveform
- 如上圖所示,低電平有效的異步復(fù)位信號(hào)
rst_async_n
變?yōu)榈碗娖綍r(shí),將導(dǎo)致觸發(fā)器清零,使得連接至rst_sync_n
的系統(tǒng)觸發(fā)器清零
- 然后,當(dāng)
rst_async_n
解除復(fù)位(變?yōu)楦唠娖剑r(shí),第一個(gè)觸發(fā)器對(duì)輸入的VCC
信號(hào)進(jìn)行同步輸出rst_s1為VCC
,再經(jīng)過(guò)第二個(gè)觸發(fā)器同步后移除復(fù)位信號(hào)rst_sync_n
-
我們?cè)贕vim中更改了代碼,VCS編譯后,Verdi中還是舊的代碼,這時(shí)候在Verdi中進(jìn)行刷新
(shift+L)
,新的代碼以及波形圖都會(huì)在Veridi中更新 -
假設(shè)
rst_async_n
在clk
的上升沿時(shí)撤除,那么第一級(jí)觸發(fā)器處于亞穩(wěn)態(tài),但是由于兩級(jí)觸發(fā)器的緩沖作用,第二級(jí)觸發(fā)器的輸入為clk到來(lái)前第一級(jí)觸發(fā)器的輸出,即為低電平。因此,此時(shí)第二級(jí)觸發(fā)器的輸出一定是穩(wěn)定的低電平,方框左中觸發(fā)器仍然處于復(fù)位狀態(tài)。在下一個(gè)clk到來(lái)時(shí),第一級(jí)觸發(fā)器的輸出已經(jīng)是穩(wěn)定的高電平了,故rst_sync_n
已經(jīng)是穩(wěn)定的高電平,此時(shí)復(fù)位釋放,也就是同步釋放。
2.4.3 DC Synthesis
# DC tcl cmd
start_gui
set top_module_name "async_rst_syns_clr"
read_file -format verilog "./rtl/$top_module_name.v"
link
write -hier -f ddc -out "unmapped/$top_module_name.ddc"
#Constraints are not considered
compile_ultra
write -hier -f ddc -out "mapped/$top_module_name.ddc"
write_file -hier -f verilog -out "mapped/$top_module_name.gv"
#Makefile
dc:
dc_shell-t -64bit -topo -f test.tcl
clean:
rm -rf MY_DESIGN_LIB *.log *.svf *.swp ./mapped/* ./unmapped/*
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-513509.html
2.5 典型的異步復(fù)位同步釋放的verilog電路設(shè)計(jì)
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-513509.html
- 保證輸出
s_rst_d1
時(shí)穩(wěn)定的
module async_reset_sync_done(
input i_clk,
input i_rst_n,
input i_data,
output reg o_data
);
reg s_rst_d0;
reg s_rst_d1;
always @(posedge i_clk or negedge i_rst_n)
if(!i_rst_n)
begin
s_rst_d0 <= 1'b0;
s_rst_d1 <= 1'b0;
end
else
begin
s_rst_d0 <= 1'b1;
s_rst_d1 <= s_rst_d0;
end
always @(posedge i_clk or negedge s_rst_d1)
if(!s_rst_d1)
o_data <= 1'b0;
else
o_data <= i_data;
endmodule
到了這里,關(guān)于同步和異步、同步復(fù)位、異步復(fù)位、同步釋放(Verilog、Verdi、DC綜合)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!