前言:
兩個不同時鐘域需要進行跨時鐘同步處理, 不同情況下的處理方式不同,可分為
慢時鐘域到快時鐘域:
? ? ? ??單比特
? ? ? ? 多比特
快時鐘域到慢時鐘域:
? ? ? ? 單比特
? ? ? ? 多比特
多bit的跨時鐘域處理,無論是快時鐘域到慢時鐘域,還是慢時鐘域到快時鐘域,都可采用異步FIFO的方式:異步FIFO
?本文主要介紹單bit的跨時鐘域方法
無論兩個時鐘域情況如何,再確保能夠采樣到數(shù)據(jù)的情況下,從A時鐘域到B時鐘域的信號都需要首先消除亞穩(wěn)態(tài),最后將A時鐘域一個周期的信號恢復至B時鐘域一個周期
消除亞穩(wěn)態(tài)
? ? ? ? 消除亞穩(wěn)態(tài)通常的做法是”打兩拍“-兩級同步,根據(jù)工程經驗,打兩拍后,能夠消除99%以上的亞穩(wěn)態(tài)
實現(xiàn)代碼如下,需要注意,由DATA_IN到輸出,中間不能有任何組合邏輯
always@(posedge clk_a or negedge rst_n)
if(!rst_n)
Q1 <= 1'b0;
else
Q1 <= data_in;
always@(posedge clk_b or negedge rst_n) //b時鐘域同步兩拍
if(!rst_n) begin
Q2 <= 1'b0;
out <= 1'b0;
end
else begin
Q2 <= Q1;
out <= Q2;
end
慢時鐘域到快時鐘域-單bit:? ? ? ??
????????慢時鐘域到快時鐘域,可能會存在重復采樣的問題,因此需要使用邊沿檢測將慢時鐘域一個周期的數(shù)據(jù)同步至快時鐘域的一個周期
? ? ? ? 邊沿檢測的原理:輸出的信號打一拍,當打拍前信號為高電平,打拍后信號為低電平,表示信號由高電平變化為低電平,此時為下降沿;上升沿同理
???????
always@(posedge clk_a or negedge rst_n)
if(!rst_n)
q1 <= 1'b0;
else
q1 <= data_in;
always@(posedge clk_b or negedge rst_n)
if(!rst_n) begin
q2 <= 1'b0;
q3 <= 1'b0;
out <= 1'b0;
end
else begin
q2 <= q1;
q3 <= q2;
out <= q3;
end
assign out_data_pos = ~q3 && out ; //上升沿,前為低,后為高
assign out_data_ndg = q3 && ~out ; //下降沿,前為高,后為低
快時鐘域到慢時鐘域-單bit:
? ? ? ? 快時鐘域到慢時鐘域,可能出現(xiàn)漏采,導致數(shù)據(jù)丟失的問題,使用脈沖同步器將快時鐘域的一個脈沖信號轉換為電平信號。
? ? ? ?
always@(posedge clk_fast or negedge rst_n)
if(!rst_n)
q1 <= 1'b0;
else
q1 <= data_in? ~q1:q1; //將脈沖信號轉換為電平信號,每來一個脈沖,電平進行翻轉
always@(posedge clk_slow or negedge rst_n)
if(!rst_n)begin
q2 <= 1'b0;
q3 <= 1'b0;
out <= 1'b0;
end
else begin
q2 <= q1;
q3 <= q2;
out <= q3;
end
assign dataout = out ^ q3; //得到慢時鐘域的一個周期脈沖信號
總結
? ? ? ? ?跨時鐘與處理:
? ? ? ? 多比特:異步FIFO
? ? ? ? 單比特:
? ? ? ? 快到慢——脈沖同步器文章來源:http://www.zghlxwxcb.cn/news/detail-621480.html
? ? ? ? 慢到快——邊沿檢測器文章來源地址http://www.zghlxwxcb.cn/news/detail-621480.html
到了這里,關于【從零開始のIC學習筆記】-跨時鐘域處理的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!