下降沿采樣寄存器
01
在設(shè)計(jì)雙邊沿采樣電路(Dual-edge triggered flip-flop)之前,先從單邊沿采樣電路設(shè)計(jì)(Edge capture register)開(kāi)始。
題目:對(duì)于32位向量中的每個(gè)位,當(dāng)輸入信號(hào)從一個(gè)時(shí)鐘周期的1變?yōu)橄乱粋€(gè)時(shí)鐘周期的0時(shí)捕獲?!安东@”表示在寄存器復(fù)位(同步復(fù)位)之前,輸出將保持為1。
每個(gè)輸出位的行為都類(lèi)似于SR觸發(fā)器:應(yīng)在從1到0的跳變發(fā)生后的周期內(nèi)將輸出位設(shè)置(設(shè)置為1)。復(fù)位為高電平時(shí),應(yīng)在時(shí)鐘的上升沿將輸出位復(fù)位(清零)。如果以上兩個(gè)事件同時(shí)發(fā)生,則復(fù)位優(yōu)先。
在下面的示例波形中,為清楚起見(jiàn),分別顯示了reset,in [1]和out [1]。
這里要注意的是,這題與專題十的邊緣檢測(cè)不一樣,本題是邊緣“捕獲”,即捕獲到下降沿之后要一直保持1,直到復(fù)位信號(hào)為1才變位0。
module top_module (
input clk,
input reset,
input [31:0] in,
output [31:0] out
);
reg[31:0] p1,in_last;
always@(posedge clk) begin
in_last <= in;
if(reset)
out <= 0;
else begin
p1 = in_last&~in;
if(p1!=0)
out <= p1|out;
else
out <= out;
end
end
endmodule
第9行 in_last <= in ; 記錄信號(hào)in上一個(gè)cycle的狀態(tài);
第13行 p1 = in_last&~ in ;檢測(cè)下降沿,簡(jiǎn)答來(lái)說(shuō)就是檢測(cè)輸入信號(hào)in由1變0。
第14-17行的mux是保持“捕獲”or“未捕獲”狀態(tài),**if(p1!=0)**表示有下降沿信號(hào)發(fā)生,**out <= p1|out; **表示繼續(xù)更新置1的位數(shù);else p1==0,則out保持原來(lái)的狀態(tài),即已經(jīng)被捕獲的位保持“1”狀態(tài)、還未被捕獲的位保持“0”狀態(tài)。
正確的仿真波形如下圖所示:
這里有一個(gè)很重要的細(xì)節(jié): 第十三行用的是阻塞賦值p1 = in_last&~in; 。即要等p1信號(hào)更新完畢之后才能進(jìn)行if的判斷,假如用非阻塞語(yǔ)句會(huì)導(dǎo)致out會(huì)晚一個(gè)周期才有反應(yīng),錯(cuò)誤波形如下:
雙邊沿采樣觸發(fā)器
02
題目:您熟悉在時(shí)鐘的上升沿或時(shí)鐘的下降沿觸發(fā)的觸發(fā)器。雙沿觸發(fā)觸發(fā)器在時(shí)鐘的兩個(gè)邊沿觸發(fā)。但是,FPGA沒(méi)有雙沿觸發(fā)觸發(fā)器,因此始終不接受@(posedge clk或negedge clk)作為合法敏感性列表。
構(gòu)建功能上類(lèi)似于雙沿觸發(fā)觸發(fā)器的電路:
module top_module (
input clk,
input d,
output q
);
reg q1,q2;
always@(posedge clk)begin
q1 <= d;
end
always@(negedge clk)begin
q2 <= d;
end
assign q = clk?q1:q2;
endmodule
還有一種可行的方案:
module top_module(
input clk,
input d,
output q);
reg p, n;
// A positive-edge triggered flip-flop
always @(posedge clk)
p <= d ^ n;
// A negative-edge triggered flip-flop
always @(negedge clk)
n <= d ^ p;
// Why does this work?
// After posedge clk, p changes to d^n. Thus q = (p^n) = (d^n^n) = d.
// After negedge clk, n changes to p^n. Thus q = (p^n) = (p^p^n) = d.
// At each (positive or negative) clock edge, p and n FFs alternately
// load a value that will cancel out the other and cause the new value of d to remain.
assign q = p ^ n;
endmodule
-
FPGA設(shè)計(jì)
+關(guān)注
關(guān)注
9文章
428瀏覽量
26517 -
寄存器
+關(guān)注
關(guān)注
31文章
5343瀏覽量
120365 -
采樣電路
+關(guān)注
關(guān)注
10文章
65瀏覽量
28304 -
SR觸發(fā)器
+關(guān)注
關(guān)注
0文章
13瀏覽量
12631 -
狀態(tài)機(jī)
+關(guān)注
關(guān)注
2文章
492瀏覽量
27541
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論