verilog中沿提取電路意義和實現

2021-10-01 15:29:21 字數 2484 閱讀 9538

[學習這篇文章後記錄的]

實現方法: 在always塊的敏感訊號列表中可以使用posedge和negedge來檢測上公升沿和下降沿,但是在always塊內部就無法使用posedge和negedge了(因為這兩個只能用在always敏感訊號列表和testbench中)。

實現邊沿檢測需要採用兩級暫存器,第二級暫存器鎖存住某個時鐘上公升沿到來時輸入訊號的電平,一級暫存器鎖存住下乙個時鐘上公升沿到來時輸入訊號的電平,如果兩個暫存器鎖存住的電平訊號不同,就說明檢測到了邊沿,具體是上公升沿還是下降沿可以通過組合邏輯來實現。 **和綜合出的rtl圖如下:

module catchedge

( input clk,

//時鐘

input rst_n,

//復位

input ori_signal,

//輸入訊號

output pos_edge,

//提取的上公升沿

output neg_edge//提取的下降沿);

reg delay1;

//一級暫存器

reg delay2;

//二級暫存器

always @(posedge clk or negedge rst_n )

begin

if(rst_n==

1'b0)

//復位操作

begin

delay1<=

1'b0;

delay2<=

1'b0;

endelse

begin

delay1<=ori_signal;

//第乙個時鐘上公升沿,輸入訊號電平鎖存到一級暫存器中

delay2<=delay1;

//第二個時鐘上公升沿,鎖存在一級暫存器中的訊號進入二級暫存器中,一級暫存器讀取新的輸入電平,也就是說第二個時鐘上公升沿,二級暫存器中鎖存的是第乙個時鐘上公升沿的輸入訊號電平,一級暫存器中鎖存的是第二個時鐘上公升沿的輸入訊號電平

endendassign pos_edge = delay1 &

~delay2;

//如果二級暫存器中的電平為低,一級暫存器電平為高,說明電平由低到高,提取上公升沿

assign neg_edge = delay2 &

~delay1;

//下降沿提取電路

具體問題如下:當輸入訊號為非同步訊號時,如果輸入訊號的變化剛好發生在clk時鐘建立時間和保持時間以內,那麼第一級暫存器的輸出就會進入亞穩態(指觸發器無法**該單元的輸出電平,也無法**何時輸出才能穩定在某個正確的電平上,在這個期間,觸發器輸出一些中間級電平,或者可能處於振盪狀態)。第一級暫存器的亞穩態會穿遞給pos_edge和neg_edge訊號,從而導致整個電路崩潰。

為了避免這種狀態的發生,在進行非同步訊號邊沿提取時應該先將非同步訊號同步化,一般採用多加一級暫存器的方法來先鎖存住輸入訊號電平,等待下乙個時鐘沿再開始進行邊沿提取,從而減小亞穩態發生的概率。

參考:圖中pulse訊號的改變剛好發生在clk建立時間和保持時間之內,因而第一級暫存器的輸出pulse_r1可能會進入亞穩態,圖中tco為第一級暫存器pulse_r1的狀態建立時間,一般情況下,亞穩態的決斷時間不會超過乙個時鐘週期,因而在下乙個時鐘上公升沿到來前,pulse_r1已經穩定下來(可能穩定到0也可能穩定到1),這樣第二級暫存器就會採集到乙個穩定的狀態,從而把亞穩態限制在第二級暫存器之前。

module edge_cap

( input clk, rst_n,

input pulse,

output pos_edge,

output neg_edge

);reg pulse_r1, pulse_r2, pulse_r3;

always @ (posedge clk or negedge rst_n)if(

!rst_n)

begin

pulse_r1 <=

1'b0;

pulse_r2 <=

1'b0;

pulse_r3 <=

1'b0;

endelse

begin

pulse_r1 <= pulse;

pulse_r2 <= pulse_r1;

pulse_r3 <= pulse_r2;

endassign pos_edge =

(pulse_r2 &&

~pulse_r3)?1

:0;assign neg_edge =

(~pulse_r2 && pulse_r3)?1

:0; endmodule

Verilog任意整數分頻電路

define n 5module div n input clk,基準時鐘output clk div n,n分頻後得到的時鐘input rst wire 31 0 n 5 n為分頻係數,n 2即可,n的值為clk除以clk div n後取整 四捨五入 產生備用時鐘1 reg 31 0 cnt1 r...

數字 04 verilog 時鐘無縫切換電路

基本原理是依靠兩級緩衝完成時鐘的切換 上圖就是時鐘無縫切換的一種電路圖,通過兩級dff級聯加上反饋電路形成,分析它的工作過程,可以看到,當select由0 1時,q1在下圖的clk0的這一時刻,會有1 0 緊接著 q2在下圖的clk0的這一時刻,會有1 0 所以q2n就有0 1 在這之後,同樣在cl...

數位電路的基礎知識(結合Verilog)

1.數制與編碼 1.1格雷碼 1.2二進位製碼和格雷碼的相互轉換 1.2.1二進位製碼轉換為格雷碼 1.2.2格雷碼轉換為二進位製碼 2.邏輯代數 3.硬體描述語言 verilog 關於reg和wire的使用以及alway a,b 在verilog中想要表示乙個二進位制,首先要給出二進位制的長度,其...