邊沿檢測原理
邊沿檢測大致分為:上升沿檢測,下降沿檢測和,雙沿檢測。原理都是通過比輸入信號快很多的時鐘去采集信號,當出現兩個連續的采集值不等的時候就是邊沿產生處。
圖1為邊沿采集圖,clk為采集時鐘,sig為被采集信號,現在需要知道什么時候sig的跳邊沿到來,于是有了一個sig_buf的2bit信號用來存儲被采集的sig信號,當前值被放在低位,高位時是上一個時刻的值。也就是
sig_buf[1:0] <= {sig_buf[0],sig};
從圖中可以看出,sig_buf為2'01的時候正好是上升沿出現之后,2'b10正是下降沿出現之后。所以正好可以利用這兩個信號的出現來判斷上升沿還是下降沿。這樣也就實現了邊沿檢測。
重點
這種邊沿檢測方法一定要有clk周期小于sig高電平脈寬的條件,不然無法保證能夠每次采集到sig的邊沿。
圖1. 邊沿采集示意圖
邊沿采集代碼講解
此代碼可以修改sig_buf的長度,也就是 不用一個0和一個1判斷,而是多個0和多個1,但是寬度變了以后對sig的脈寬要求也就更寬,這點一定要牢記,不然很可能出現檢測邊沿無法實現。
很多人反映tb寫不來,不知道tb要寫什么,要怎么寫。這里順便說下怎么寫,就以邊沿檢測tb為例。
仿真目的 :產生符合自己要求的激勵信號,測試此時的輸出是否和預想一致,一致則通過,否則失敗。
仿真步驟 :根據仿真目的也很容易可以抽象出來仿真的步驟分為2步,第一步,產生激勵,第二步,查看被測試模塊輸出。
激勵產生 :
周期信號產生always begin #5 clk=0; #5 clk=1; end //時鐘信號
只在最開始產生某種特殊波形:initial begin rst = 1 ; #10 rst = 0; end
上述兩種信號都是關于時間的函數f(t),這種函數特點決定了可以用延時命令#xx去產生。
需要結合當前狀態的信號:這種波形不僅僅時間的函數,還和某個信號相關,比如分頻模塊,分頻值在不停變,那么這個時候不如直接調用一個已經寫好的分頻模塊,分頻系數可以外部狀態機控制,這樣就可以解決。換句話說,tb只是產生理想激勵,所以需要你不擇手段的去產生自己想要的東西,不管是可綜合還是不可綜合語句。
tb文件的一般代碼結構 :
1.module定義
2.reg和wire定義,需要被你主動控制的信號定義為reg,有賦值來源的信號定義為wire,比如模塊輸入定義為reg,方便自己產生各種波形,輸出定義為wire。
3.initial begin end語句,產生初始化激勵,比如復位,使能。initial語句可以寫多個,效果上兩個initial都是同時執行的,仿真的時候你感受不出差別。
4.特殊激勵產生,比如時鐘,狀態機等
5.被測試模塊調用
6.被測試模塊輸出結果合格檢測,這一步如果不會可以忽略,自己看波形。對于復雜設計看波形會非常累,所以建議慢慢養成習慣
仿真結果展示
上升沿檢測波形,mode=0,當輸入信號被檢測到上升沿的時候,信號the_edge就會有一個高脈沖:
圖2. 上升沿檢測
下降沿檢測波形,mode=1,當輸入信號被檢測到下降沿的時候,信號the_edge就會有一個高脈沖:
圖3. 下降沿檢測
雙沿檢測波形,mode=2,當輸入信號被檢測到上升沿或者下降沿的時候,信號the_edge就會有一個高脈沖:
圖4. 雙沿檢測
-
仿真器
+關注
關注
14文章
1019瀏覽量
83878 -
狀態機
+關注
關注
2文章
492瀏覽量
27615 -
CLK
+關注
關注
0文章
127瀏覽量
17201 -
Verilog語言
+關注
關注
0文章
113瀏覽量
8288
發布評論請先 登錄
相關推薦
評論