【E討論】關(guān)于邊沿檢測簡單理解
1、所謂邊沿檢測,就是檢測輸入信號(hào)或FPGA內(nèi)部邏輯信號(hào)電平的跳變,即實(shí)現(xiàn)上升沿或下降沿的檢測,捕獲到以后以此用作使能信號(hào)(簡單可理解為:一旦檢測到這個(gè)信號(hào),則發(fā)生什么什么),來作為時(shí)序邏輯的觸發(fā)信號(hào)??傊?,在基礎(chǔ)中,這個(gè)還是很重要的,在后面的串口和SPI接口中都要用到。
本文引用地址:http://2s4d.com/article/201605/290591.htm(一)、一級(jí)寄存器
從一級(jí)寄存器中很好理解下降沿和上升沿的檢測:a和b都是從trigger來的(三者一樣),只是b比a在時(shí)間上遲了一個(gè)寄存器的時(shí)間。現(xiàn)在假設(shè)0時(shí)刻到了,trigger到a了,但是還沒有到b,到了寄存器,被寄存了;等待下一個(gè)時(shí)刻1到來,a走了(不用管了),來了一個(gè)新的叫c,同時(shí),b從寄存器得到了之前寄存的,那個(gè)現(xiàn)在的1時(shí)刻,有了兩個(gè)信號(hào),b和c,而且b是前一個(gè)時(shí)刻的,而c是現(xiàn)在時(shí)刻的(誰先誰后這點(diǎn)很重要)。所以:
下降沿 neg_edge = b & ~c;
由上圖可以看出,當(dāng)下降沿來的時(shí)候,c取反再與上b,得出輸出為1;反過來想,輸出neg_edge為1的時(shí)候就表示檢測到下降沿了。
上升沿 pos_edge = ~b & c;
同理。當(dāng)pos_edge為1,表示檢測到上升沿。
(二)兩級(jí)寄存器
moduleedge_tech_design
(
clk,
rst_n,
s,
neg_edge,
pos_edge
);
inputclk;
inputrst_n;
inputs;
outputneg_edge;
outputpos_edge;
regc,d;
always@(posedgeclkornegedgerst_n)
if(!rst_n)begin
c<=1'b0;
d<=1'b0;
end
elsebegin
c<=s;
d<=c;
end
assignneg_edge=d&!c;
assignpos_edge=!d&c;
endmodule
為了在波形圖中能看到c、d寄存器,把程序修改為
moduleedge_tech_design
(
clk,
rst_n,
s,
neg_edge,
pos_edge,
c,//為了觀察c和d的波形而添加的
d//為了觀察c和d的波形而添加的
);
inputclk;
inputrst_n;
inputs;
outputneg_edge;
outputpos_edge;
outputc,d;//為了觀察c和d的波形而添加的
regc,d;
always@(posedgeclkornegedgerst_n)
if(!rst_n)begin
c<=1'b0;
d<=1'b0;
end
elsebegin
c<=s;
d<=c;
end
assignneg_edge=d&!c;
assignpos_edge=!d&c;
endmodule
測試文件如下:
`timescale1ns/1ns
`defineclk_period20
moduleedge_tech_design_tb;
regclk;
regrst_n;
regs;
wireneg_edge;
wirepos_edge;
wirec,d;//為了觀察c和d的波形而添加的
edge_tech_designedge_tech_design
(
.clk(clk),
.rst_n(rst_n),
.s(s),
.neg_edge(neg_edge),
.pos_edge(pos_edge),
.c(c),//為了觀察c和d的波形而添加的
.d(d)//為了觀察c和d的波形而添加的
);
initialclk=1;
always#(`clk_period/2)clk=~clk;
initialbegin
rst_n=1'b0;
s=1'b0;
#(`clk_period/4)
#(`clk_period)
rst_n=1'b1;
s=1'b1;
#(`clk_period*5)
s=1'b0;
#(`clk_period)
s=1'b1;
#(`clk_period)
s=1'b0;
#(`clk_period*3)
s=1'b1;
#(`clk_period)
s=1'b0;
#(`clk_period*5)
s=1'b1;
#(`clk_period)
s=1'b0;
#(`clk_period*3)
s=1'b1;
#(`clk_period)
s=1'b0;
#(`clk_period)
s=1'b1;
#(`clk_period*3)
s=1'b0;
#(`clk_period)
s=1'b1;
#(`clk_period)
s=1'b0;
#(`clk_period)
$stop;
end
endmodule
在仿真圖中可以看到這樣的圖形(街區(qū)圖中下降沿部分一小段)
輸入信號(hào)s從高變成低的時(shí)候,出現(xiàn)下降沿,然后等到時(shí)鐘clk的上升沿到來,s傳輸?shù)絚,d還沒傳輸?shù)?,被寄存在d之前的寄存器內(nèi),等待第二個(gè)時(shí)鐘上升沿到來,寄存器中的信號(hào)傳輸?shù)絛了,此時(shí)根據(jù)
neg_edge = d & ~c;
可以得到neg_edge的波形。
評(píng)論