[學習這篇文章後記錄的]
實現方法: 在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中想要表示乙個二進位制,首先要給出二進位制的長度,其...