下降沿采樣寄存器
01
在設計雙邊沿采樣電路(Dual-edge triggered flip-flop)之前,先從單邊沿采樣電路設計(Edge capture register)開始。
題目:對于32位向量中的每個位,當輸入信號從一個時鐘周期的1變為下一個時鐘周期的0時捕獲。“捕獲”表示在寄存器復位(同步復位)之前,輸出將保持為1。
每個輸出位的行為都類似于SR觸發器:應在從1到0的跳變發生后的周期內將輸出位設置(設置為1)。復位為高電平時,應在時鐘的上升沿將輸出位復位(清零)。如果以上兩個事件同時發生,則復位優先。
在下面的示例波形中,為清楚起見,分別顯示了reset,in [1]和out [1]。
這里要注意的是,這題與專題十的邊緣檢測不一樣,本題是邊緣“捕獲”,即捕獲到下降沿之后要一直保持1,直到復位信號為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 ; 記錄信號in上一個cycle的狀態;
第13行 p1 = in_last&~ in ;檢測下降沿,簡答來說就是檢測輸入信號in由1變0。
第14-17行的mux是保持“捕獲”or“未捕獲”狀態,**if(p1!=0)**表示有下降沿信號發生,**out <= p1|out; **表示繼續更新置1的位數;else p1==0,則out保持原來的狀態,即已經被捕獲的位保持“1”狀態、還未被捕獲的位保持“0”狀態。
正確的仿真波形如下圖所示:
這里有一個很重要的細節: 第十三行用的是阻塞賦值p1 = in_last&~in; 。即要等p1信號更新完畢之后才能進行if的判斷,假如用非阻塞語句會導致out會晚一個周期才有反應,錯誤波形如下:
雙邊沿采樣觸發器
02
題目:您熟悉在時鐘的上升沿或時鐘的下降沿觸發的觸發器。雙沿觸發觸發器在時鐘的兩個邊沿觸發。但是,FPGA沒有雙沿觸發觸發器,因此始終不接受@(posedge clk或negedge clk)作為合法敏感性列表。
構建功能上類似于雙沿觸發觸發器的電路:
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設計
+關注
關注
9文章
428瀏覽量
26512 -
寄存器
+關注
關注
31文章
5336瀏覽量
120232 -
采樣電路
+關注
關注
10文章
65瀏覽量
28297 -
SR觸發器
+關注
關注
0文章
13瀏覽量
12631 -
狀態機
+關注
關注
2文章
492瀏覽量
27529
發布評論請先 登錄
相關推薦
評論