很多人看到這個(gè)標(biāo)題的時(shí)候,都會(huì)想邊沿檢測不是很簡單的嗎?有什么需要注意的?它是很簡單,只要對輸入信號進(jìn)行兩級緩存,然后通過判斷前后兩級的邏輯來決定信號的上升沿或下降沿。但你們有沒有想過當(dāng)系統(tǒng)復(fù)位時(shí)應(yīng)該給寄存器賦什么值?估計(jì)很多人都沒有想過吧,管它三七二十一,一律賦0(或1)。那恭喜你,你已經(jīng)掉進(jìn)陷阱了。什么陷阱?誤判的陷阱。舉個(gè)例子,檢測一個(gè)信號的上升沿,見如程序清單1所示:
程序清單1
/******************************************Copyright******************************************** **----------------------------------------File Infomation-------------------------------------- ** FileName : edge_detection.v ** Author : CrazyBird ** Data : 2015-10-25 ** Version : v1.0 ** Description : the rising edge detection of signal ** ************************************************************************************************/ // synopsys translate_off `timescale 1 ns / 1 ps // synopsys translate_on module edge_detection ( input clk, input rst_n, input din, output pos_flag ); //------------------------------------ // Two levels of cache on the signal reg din_r1; reg din_r2; always @(posedge clk or negedge rst_n) begin if(rst_n == 1'b0) begin din_r1 <= 1'b0; din_r2 <= 1'b0; end else begin din_r1 <= din; din_r2 <= din_r1; end end
//------------------------------------ // rising edge detect assign pos_flag = din_r1 & ~din_r2;
endmodule //*****************************************End File********************************************** 這是一個(gè)超級簡單的信號上升沿檢測,相信很多人也是這樣寫。但你這樣設(shè)計(jì)出來的東西是不穩(wěn)定的。為什么?從理論上分析,當(dāng)復(fù)位后,din_r1和din_r2d的值都為1'b0。如果輸入信號din為1'b1,在時(shí)鐘上升沿到來時(shí),din的值會(huì)被鎖進(jìn)din_r1即din_r1=1'b1,而din_r1前一時(shí)刻的值被鎖進(jìn)din_r2即din_r2=1'b0。此時(shí),并沒有信號的上升沿到來,而pos_flag的值為1'b1,從而導(dǎo)致第一次上升沿是誤判的。也可以從仿真波形中體現(xiàn)出來,如圖1所示。
0.jpg (9.84 KB, 下載次數(shù): 105)
下載附件
2015-10-29 00:52 上傳
圖1 導(dǎo)致第一次上升沿誤判
為了避免誤判情況的出現(xiàn),我們采取措施:對于信號上升沿檢測,復(fù)位后寄存器應(yīng)都賦值為1'b1。修改后的代碼如程序清單2所示:
程序清單2
/******************************************Copyright******************************************** **----------------------------------------File Infomation-------------------------------------- ** FileName : edge_detection.v ** Author : CrazyBird ** Data : 2015-10-25 ** Version : v1.0 ** Description : the rising edge detection of signal ** ************************************************************************************************/ // synopsys translate_off `timescale 1 ns / 1 ps // synopsys translate_on module edge_detection ( input clk, input rst_n, input din, output pos_flag ); //------------------------------------ // Two levels of cache on the signal reg din_r1; reg din_r2; always @(posedge clk or negedge rst_n) begin if(rst_n == 1'b0) begin din_r1 <= 1'b1; din_r2 <= 1'b1; end else begin din_r1 <= din; din_r2 <= din_r1; end end //------------------------------------ // rising edge detect assign pos_flag = din_r1 & ~din_r2; endmodule //*****************************************End File********************************************** 仿真結(jié)果如圖2所示:
38dbb6fd5266d0165317d567922bd40735fa3576.jpg (7.44 KB, 下載次數(shù): 84)
下載附件
2015-10-29 00:52 上傳
圖2 上升沿正確檢測
同樣,對于下降沿檢測,復(fù)位時(shí)應(yīng)將寄存器都賦值為1'b0,大家可自行驗(yàn)證。
總結(jié)一下,上升沿檢測,復(fù)位時(shí)寄存器應(yīng)賦值為1'b1;下降沿檢測,復(fù)位時(shí)寄存器應(yīng)賦值為1'b0
|