標題: 邊沿檢測中需要注意的細節 [打印本頁]
作者: piaolin 時間: 2015-10-28 20:44
標題: 邊沿檢測中需要注意的細節
很多人看到這個標題的時候,都會想邊沿檢測不是很簡單的嗎?有什么需要注意的?它是很簡單,只要對輸入信號進行兩級緩存,然后通過判斷前后兩級的邏輯來決定信號的上升沿或下降沿。但你們有沒有想過當系統復位時應該給寄存器賦什么值?估計很多人都沒有想過吧,管它三七二十一,一律賦0(或1)。那恭喜你,你已經掉進陷阱了。什么陷阱?誤判的陷阱。舉個例子,檢測一個信號的上升沿,見如程序清單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**********************************************
這是一個超級簡單的信號上升沿檢測,相信很多人也是這樣寫。但你這樣設計出來的東西是不穩定的。為什么?從理論上分析,當復位后,din_r1和din_r2d的值都為1'b0。如果輸入信號din為1'b1,在時鐘上升沿到來時,din的值會被鎖進din_r1即din_r1=1'b1,而din_r1前一時刻的值被鎖進din_r2即din_r2=1'b0。此時,并沒有信號的上升沿到來,而pos_flag的值為1'b1,從而導致第一次上升沿是誤判的。也可以從仿真波形中體現出來,如圖1所示。
0.jpg (9.84 KB, 下載次數: 105)
下載附件
2015-10-29 00:52 上傳
圖1 導致第一次上升沿誤判
為了避免誤判情況的出現,我們采取措施:對于信號上升沿檢測,復位后寄存器應都賦值為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**********************************************
仿真結果如圖2所示:
38dbb6fd5266d0165317d567922bd40735fa3576.jpg (7.44 KB, 下載次數: 84)
下載附件
2015-10-29 00:52 上傳
圖2 上升沿正確檢測
同樣,對于下降沿檢測,復位時應將寄存器都賦值為1'b0,大家可自行驗證。
總結一下,上升沿檢測,復位時寄存器應賦值為1'b1;下降沿檢測,復位時寄存器應賦值為1'b0
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
国产精品区二区三区日本
|
www.com国产|
五月婷在线|
国产日产精品一区二区三区的介绍
|
少妇高潮av久久久久久
|
99一区二区三区
|
国产www视频
|
亚洲精品久久久久久久久久久
|
亚洲成人一区二区三区
|
久草国产视频
|
欧美在线亚洲
|
亚洲理论片
|
国产视频一区二
|
一区二区水蜜桃
|
色午夜
|
天天操夜夜摸
|
岛国在线视频
|
成人在线小视频
|
日韩二三区
|
97色在线
|
久草福利在线观看
|
久久久久久黄色
|
久久久久久久久国产精品
|
欧美国产精品一区二区
|
天堂在线免费观看
|
成人av一区二区三区在线观看
|
国产午夜av
|
91精品福利|
亚洲黄色一级
|
伊人网综合
|
日韩欧美中文在线
|
久草国产视频
|
久久精品欧美一区二区三区不卡
|
一区二区三区中文字幕
|
久久精品在线视频
|
黄色录像免费观看
|
毛片导航
|
黄色一级片视频
|
中文字幕三级
|
国产精品成人一区二区网站软件
|
中文字幕第三页
|