国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Verilog HDL-同步技術你了解多少

OpenFPGA ? 來源:OpenFPGA ? 作者:碎碎思 ? 2021-09-18 10:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

同步技術

在芯片設計中,數據同步和在不同時鐘域之間進行數據傳輸會經常出現。為避免任何差錯、系統故障和數據破壞,正確的同步和數據傳輸就顯得格外重要。這些問題的出現往往比較隱蔽,不易被發現,因此正確進行跨時鐘域處理就顯得極為重要。實現數據同步有許多種方式,在不同的情況下進行恰當的同步方式選擇非常重要。以計算機中的南橋芯片為例,它通過不同的接口(如PCIe USB 吉比特以太網等)與外部設備相連。南橋通過不同的接口與外圍設備相連,它與北橋之間是一個通用數據接口。南橋芯片中需要使用數據同步技術,目前,常用的同步技術主要分為以下幾類:

  • 在不同的時鐘域之間使用FIFO
  • 在不同的時鐘域之間使用握手信號
  • 相位差固定的同步域內部的數據傳輸
  • 準同步域之間的數據傳輸

使用FIFO進行的數據同步

當存在兩個異步時鐘域并且二者之間進行數據包傳輸時,雙端口FIFO最為適合。FIFO有兩個端口,一個端口寫入輸入數據,另一個端口讀出數據,如圖6.34所示。兩個端口工作在相互獨立的時鐘域內,通過各自的指針(地址)來讀寫數據。由于每個端口工作在相互獨立的時鐘域內,因此讀寫操作可以獨立實現并且不會出現任何差錯。當FIFO變滿時,應停止寫操作,直到FIFO中出現空閑空間。同樣,當FIFO為空時,應停止讀操作,直到有新的數據被寫入FIFO中。

握手同步方式

FIFO可用于在不同的時鐘域之間進行數據包的傳輸,但是在一些應用中需要在不同時鐘域之間進行少量數據傳輸。FIFO占用的硬件資源較大,此時可以考慮使用握手同步機制.

所謂握手,即通信雙方使用了專用控制信號進行狀態指示,這個控制信號既有發送域給接受域的也有接收域給控制域的,有別于單向控制信號方式。

使用握手協議方式處理跨時鐘域數據傳輸時,只需要對雙方的握手信號(req 和 ack)分別使用脈沖檢測方法進行同步,在具體實現中,假設req ,ack, data,總線在初始化時都處于無效狀態,發送域先把數據放入總線,隨后發送有效的req信號給接收域;接收域在檢測到有效的req信號后鎖存數據總線,然后會送一個有效的ack信號表示讀取完成應答;發送域在檢測到有效ack信號后撤銷當前的req信號,接收域在檢測到req撤銷后也相應撤銷ack信號,此時完成一次正常握手通信,此后,發送域可以繼續開始下一次握手通信,如此循環,該方式能夠使接收到的數據穩定可靠,有效的避免了亞穩態的出現,但是控制信號握手檢測會消耗通信雙方較多的時間。

a30b850e-1498-11ec-8fb8-12bb97331649.png

以下是握手同步機制的工作步驟:

  • 用后綴_t表示發送端,用后綴_r表示接收端。發送時鐘用tclk表示,接收時鐘用rclk表示。數據從tclk域向rclk域傳輸;

  • 當需要發送的數據準備好后,發送端將t_rdy信號置為有效,該信號必須在tclk下降沿時釆樣輸出;

  • 在t_rdy有效期間,t_data必須保持穩定;

  • 接收端在rclk域中采用雙同步器同步t_rdy控制信號,并把同步后的信號命名為t_rdy_rclk;

  • 接收端在發現t_rdy_rclk信號有效時,tdata已經安全地進入了rclk域,使用rclk對其進行采樣,可以得到t_data_rclk。由于由于數據已經在rclk域進行了正確采樣,所以此后在rclk域使用該數據是安全的;

  • 接收端將r_ack信號置位1,信號必須在rclk下降沿輸出;

  • 發送端通過雙同步器在tclk域內同步r_ack信號,同步后的信號稱為r_ack_tclk;

  • 以上所有步驟稱為半握手。tclk1,這是因為發送端在輸出下一數據之前,不會等r_ack_tclk被置為0;

  • 半握手機制工作速度快,但是,使用半握手機制時需要謹慎,一旦使用不當,會導致操作錯誤;

  • 從低頻時鐘域向高頻時鐘域傳輸數據時,半握手機制較為適用,這是由于接收端可以更快地完成操作。然而,如果從高頻時鐘域向低頻時鐘域傳輸數據,則需要采用全握手機制;

  • 當r_ack_tclk為高電平時,發送端將t_rdy置為0;

  • 當t_rdy_rclk為低電平時,接收端將r_ack置為0;

  • 當發送端發現r_ack_tclk為低電平后,全握手過程結束,傳輸端可以發送新的數據;

  • 顯然,全握手過程耗時較長,數據傳輸速度較慢。然而,全握手機制穩定可靠,可以在兩個任意頻率的時鐘域內安全地進行數據傳輸。如圖6.35所示為全握手機制工作波形。

上面過程比較繞口,因此我制作了一張流程圖,如下所示:

a3294bc0-1498-11ec-8fb8-12bb97331649.png

全握手機制代碼及仿真結果如下。

發送端:使用三個狀態的狀態機,其跳轉關系如下:

a33ef6dc-1498-11ec-8fb8-12bb97331649.png

moduletransmit(tclk,reset_tclk,t_rdy,data_avail,transmit_data,t_data,r_ack);
inputtclk;
inputreset_tclk;
inputdata_avail;
input[31:0]transmit_data;
inputr_ack;
outputt_rdy;
outputt_data;

localparamIDLE_T=2'd0,
ASSERT_T_RDY=2'd1,
DEASSERT_T_RDY=2'd2;

reg[1:0]t_hndshk_state,t_hndshk_state_nxt;
regt_rdy,t_rdy_nxt;
reg[31:0]t_data,t_data_nxt;
regr_ack_tclk;

always@(*)begin

t_hndshk_state_nxt=t_hndshk_state;
t_rdy_nxt=1'b0;
t_data_nxt=t_data;

case(t_hndshk_state)
IDLE_T:begin
if(data_avail)begin
t_rdy_nxt=1'b1;
t_hndshk_state_nxt=ASSERT_T_RDY;
t_data_nxt=transmit_data;
end
end

ASSERT_T_RDY:begin
if(r_ack_tclk)begin
t_rdy_nxt=1'b0;
t_hndshk_state_nxt=DEASSERT_T_RDY;
t_data_nxt='d0;
end
elsebegin
t_rdy_nxt=1'b1;
t_data_nxt=transmit_data;
end
end

DEASSERT_T_RDY:begin
if(!r_ack_tclk)begin
if(data_avail)begin
t_rdy_nxt=1'b1;
t_hndshk_state_nxt=ASSERT_T_RDY;
t_data_nxt=transmit_data;
end
elsebegin
t_hndshk_state_nxt=IDLE_T;
end
end
end

endcase
end
always@(posedgetclkornegedgereset_tclk)begin
if(!reset_tclk)begin
t_rdy<=?1'b0;
t_hndshk_state<=?IDLE_T;
??t_data?<=?32'h00000000;
r_ack_tclk<=?1'b0;
end

elsebegin
t_rdy<=?t_rdy_nxt;
??t_hndshk_state?<=?t_hndshk_state_nxt;
??t_data?<=?t_data_nxt;
??r_ack_tclk?<=?r_ack;
?end
?
end
endmodule?

接收端:使用兩個狀態的狀態機,跳轉關系如下:

a35318ba-1498-11ec-8fb8-12bb97331649.png

modulereceiver(rclk,reset_rclk,t_rdy,t_data,r_ack);
inputrclk,reset_rclk;
inputt_rdy;
input[31:0]t_data;
outputr_ack;

regr_hndshk_state,r_hndshk_state_nxt;
regt_rdy_rclk;
reg[31:0]t_data_rclk,t_data_rclk_nxt;
regr_ack,r_ack_nxt;

localparamIDLE_R=1'b0,
ASSERT_ACK=1'b1;

always@(*)begin
r_hndshk_state_nxt=r_hndshk_state;
r_ack_nxt=1'b0;
t_data_rclk_nxt=t_data_rclk;
case(r_hndshk_state)
IDLE_R:begin
if(t_rdy_rclk)begin
r_hndshk_state_nxt=ASSERT_ACK;
t_data_rclk_nxt=t_data;
r_ack_nxt=1'b1;
end
end

ASSERT_ACK:begin
if(!t_rdy_rclk)begin
r_hndshk_state_nxt=IDLE_R;
r_ack_nxt=1'b0;
end
elsebegin
r_ack_nxt=1'b1;
end
end

endcase
end

always@(posedgerclkornegedgereset_rclk)begin
if(!reset_rclk)begin
r_hndshk_state<=?IDLE_R;
??t_data_rclk?<=?1'b0;
t_rdy_rclk<=?1'b0;
r_ack<=?1'b0;
end

elsebegin
r_hndshk_state<=?r_hndshk_state_nxt;
??t_data_rclk?<=?t_data_rclk_nxt;
??t_rdy_rclk?<=?t_rdy;
??r_ack?<=?r_ack_nxt;
?end
end

endmodule

測試代碼

`timescale1ns/1ns
moduletestbench;
regtclk_tb,rclk_tb;
reg[31:0]transmit_data_tb;
regreset_tclk_tb,reset_rclk_tb;
regdata_avail_tb;
wiret_rdy_tb;
wire[31:0]t_data_tb;
wirer_ack_tb;

parameterCLK_HALF_PERIOD1=5;
parameterCLK_HALF_PERIOD2=8;
parameterRESET_DELAY=100;

initialbegin
tclk_tb=0;
rclk_tb=0;
end

always#CLK_HALF_PERIOD1tclk_tb=~tclk_tb;
always#CLK_HALF_PERIOD2rclk_tb=~rclk_tb;

initialbegin
reset_rclk_tb=0;
reset_tclk_tb=0;
#RESET_DELAYreset_rclk_tb=1;
reset_tclk_tb=1;
end

initialbegin
#500;
data_avail_tb=1;
transmit_data_tb=32'h96431346;
end

transmittransmit_test
(.tclk(tclk_tb),
.reset_tclk(reset_tclk_tb),
.t_rdy(t_rdy_tb),
.data_avail(data_avail_tb),
.transmit_data(transmit_data_tb),
.t_data(t_data_tb),
.r_ack(r_ack_tb));

receiverreceiver_test
(.rclk(rclk_tb),
.reset_rclk(reset_rclk_tb),
.t_rdy(t_rdy_tb),
.t_data(t_data_tb),
.r_ack(r_ack_tb));
endmodule

仿真結果

a3699504-1498-11ec-8fb8-12bb97331649.png

脈沖同步器

脈沖同步器在源時鐘域內接收一個脈沖,在目的時鐘域內產生一個脈沖。脈沖同步器內部通常采用全握手機制來產生輸出脈沖。在討論脈沖同步器工作原理之前,我們先討論它的用途。有時狀態機希望更新不同時鐘域內寄存器的數值,它可以采用全握手同步機制來達到這一目的,但全握手同步機制存在同步延遲大的問題,在全握手完成之前,狀態機都將處于等待對方響應的狀態。

為了解決這一問題,可以引入脈沖同步器電路。引入脈沖同步器后,狀態機在源時鐘域內產生更新脈沖,此后繼續執行其他操作。脈沖同步器可以接收脈沖并完成剩余的同步和輸出脈沖產生工作。需要注意的是,脈沖同步器完成全握手操作需要消耗多個時鐘周期,因此狀態機發出的兩個脈沖之間需要足夠的時間間隔,否則就會出現邏輯錯誤。下面是脈沖同步器的工作步驟、Verilog代碼及仿真結果。

步驟:

  • 當源脈沖(pulse_src)有效時,在源時鐘域中生成一個信號,并且保持有效(該信號稱為sig_stretched);

  • 使用同步器在目的時鐘域中對sig_stretched信號進行同步,稱為sig_stretched_dest;

  • sig_stretched_dest信號被送回到源時鐘域并進行同步稱為sig_stretched_ack;

  • 如果sig_stretched_ack=1,則產生一個脈沖,根據這一反饋脈沖來將sig_stretched置為0(完成全握手);

  • 基于sig_stretched_dest,在目的時鐘域中產生一個脈沖稱為pulse_dest。

modulepulse_synchronizer
(clksrc,
resetb_clksrc,
clkdest,
resetb_clkdest,
pulse_src,
pulse_dest);

//*******************************************************
inputclksrc;
inputresetb_clksrc;
inputclkdest;
inputresetb_clkdest;
inputpulse_src;//pulseinsourceclockdomain
outputpulse_dest;//pulseindestinationclockdomain


regsig_stretched;
wiresig_stretched_nxt;
regsig_stretched_syncl,sig_stretched_dest;
regsig_stretched_dest_dl;
regsig_stxetched_ack_pre,sig_stretched_ack,
regsig_stretched_ack_d1;
wiresig_stretched_ack_edge;
wirepulse_dest;


assignsig_stretched_nxt=sig_stretched_ack_edge?1'b0:(pulse_src?l'bl:sig_stretched);


always@(posedgeclksrcornegedgeresetb_clksrc)
begin
if(!resetb_clksrc)

sig_stretched<=?1'bO;

else
sig_stretched<=?sig_stretched_nxt;
end

//First?two?flops?for?synchronizing?and?the?third?one?for?pulse?generation
always?@(posedge?clkdest?or?negedge?resetb_clkdcst)
begin
if?(!resetb_clkdest)
begin
?sig_stretched_sync?<=?1'b0;
sig_stretchcd_dest<=?1'b0;
sig_stretched_dest_d1<=?1'b0;
end
else
begin
sig_stretchcd_sync1<=?sig_stretched;
sig_stretched_dest??<=?sig_stretched_sync1;
sig_stretched_dest_d1?<=?sig_stretched_dest;
end
end

//?First?two?flops?are?forsynchronizingbacktosourceclockdomain.
//thirdflopisforedgedetection
always@(posedgeclksrcornegedgeresetb_clksrc)
begin
if(!resetb_clksrc)
begin
sig_strctched_ack_pre<=?1'b0;
sig_stretchecl_ack<=?1'b0;
sig_stretched_ack_d1<=?1'b0;
end
else
begin
sig_stretched_ack_pre<=?sig_stretched_dest;
sig_stretched_ack?????<=?sig_stretched_ack_pre;
sig_stretchcd_ack_d1??<=?sig_strctched_ack;
end
end
assign?sig_stretched_ack_edge?=?sig_stretched_ack?&?!sig_stretched_ack_d1;

//?Pulse?generation?in?destination?clock?domain

assign?pulse_dest?=?sig_stretched_dest?&?!sig_stxctched_dest_d1;

endmodule

a37a8d64-1498-11ec-8fb8-12bb97331649.png

相位、頻率關系固定時的跨時鐘域數據傳輸

如果兩個時鐘具有相同或者整數倍的頻率關系,上升沿之間有固定、明確的相位關系,那么在不使用FIFO或者握手協議的情況下,可以進行數據傳輸。此時固定明確的相位關系非常重要,數據傳遞時的建立時間和保持時間必須滿足要求,如果相位關系不固定、不明確,則無法采用這種機制進行跨時鐘域數據傳遞。在系統復位之后,需要調整數據延遲值(使用延遲鏈電路),從而確保跨時鐘域數據傳遞時可以進行正確采樣。

這種機制與使用FIFO或者握手機制相比具有更小的延遲。例如,DDR數據總線上可以使用單倍的時鐘實現雙倍的數據傳輸。前面講過的數據位寬調整電路,也要求雙方的時鐘頻率和相位具有間定、明確的關系。

準同步時鐘域

如果兩個時鐘具有相同的標稱頻率和指定范圍內的時鐘精度誤差,那么我們說這兩個時鐘源是準同步的。在實際應用中,通常數據發送端的本地時鐘和接收端的本地時鐘是獨立產生的,通常都使用晶體振蕩器這類高精度時鐘源,二者往往具有相同的標稱值和規定范圍內的精度誤差。

例如,PCIe要求發送和接收時鐘誤差在300ppm以內。這就意味著在一個相對較長的時間里(例如,對PCIe來說,超過1300個時鐘周期),兩個時鐘將產生1個時鐘周期的偏差。下面我們將討論此時如何進行數據傳輸同步。

PCIe,SATA等串行通信協議中廣泛使用了準同步通信機制。在數據收發電路中,彈性緩沖區(FIFO)被用于進行跨時鐘域數據傳輸。此時FIFO不僅用于跨時鐘域的同步,還需要與一定的外部電路配合,解決長時間通信時,由于時鐘偏差造成的FIFO內部數據上溢或下溢的問題。PCIe和SATA要求發送端周期性地將null字符插入傳輸數據流中;在接收端,根據FIFO內部的數據深度,這些null字符會被丟棄或添加到FIFO中。

編輯:jq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • usb
    usb
    +關注

    關注

    60

    文章

    8441

    瀏覽量

    284625
  • fifo
    +關注

    關注

    3

    文章

    407

    瀏覽量

    45760
  • Verilog
    +關注

    關注

    30

    文章

    1374

    瀏覽量

    114535
  • HDL
    HDL
    +關注

    關注

    8

    文章

    332

    瀏覽量

    48980

原文標題:Verilog HDL-同步技術

文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Verilog HDL語法學習筆記

    Verilog HDL 語 言 最 初 是 作為 Gateway Design Automation 公 司 ( Gateway DesignAutomation 公司后來被著名的 Cadence Design Systems 公司收購)模擬器產品開發的硬件建模語言。
    的頭像 發表于 03-04 15:04 ?5301次閱讀
    <b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>語法學習筆記

    使用Vivado ILA進行復雜時序分析的完整流程

    HDL 代碼中標記待觀測信號,添加 (* mark_debug = "true" *) 屬性(Verilog)或 keep 屬性(VHDL)
    的頭像 發表于 02-04 11:28 ?284次閱讀

    FPGA 入門必看:Verilog 與 VHDL 編程基礎解析!

    很多開發者第一次接觸FPGA,都會有同樣的疑問:FPGA是硬件,不是軟件,怎么寫程序?答案就是用硬件描述語言(HDL),最常用的就是Verilog和VHDL。今天,我們就帶你入門,搞清楚FPGA編程
    的頭像 發表于 01-19 09:05 ?469次閱讀
    FPGA 入門必看:<b class='flag-5'>Verilog</b> 與 VHDL 編程基礎解析!

    網絡接口:數字世界的“門鈴”,了解多少?

    ,還能為選擇適合的網絡解決方案奠定基礎。在萬物互聯的時代,這些基礎知識顯得愈發重要。 希望這篇簡單的介紹能幫助大家對網絡接口有基本的了解。我始終相信,了解技術細節能讓客戶做出更明智的選擇。如果
    發表于 11-26 18:53

    【產品介紹】Modelsim:HDL語言仿真軟件

    概述ModelSim是業界最優秀的HDL語言仿真軟件,它能提供友好的仿真環境,是業界唯一的單內核支持VHDL和Verilog混合仿真的仿真器。它采用直接優化的編譯技術、Tcl/Tk技術
    的頭像 發表于 11-13 11:41 ?511次閱讀
    【產品介紹】Modelsim:<b class='flag-5'>HDL</b>語言仿真軟件

    覺得哪個軟件寫verilog體驗最好?有什么優勢?

    覺得哪個軟件寫verilog體驗最好?有什么優勢?請在評論區留言跟大家分享一下吧。
    發表于 11-10 07:47

    如何利用Verilog HDL在FPGA上實現SRAM的讀寫測試

    本篇將詳細介紹如何利用Verilog HDL在FPGA上實現SRAM的讀寫測試。SRAM是一種非易失性存儲器,具有高速讀取和寫入的特點。在FPGA中實現SRAM讀寫測試,包括設計SRAM接口模塊
    的頭像 發表于 10-22 17:21 ?4358次閱讀
    如何利用<b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>在FPGA上實現SRAM的讀寫測試

    使用Simulink自動生成浮點運算HDL代碼(Part 1)

    引言 想要實現浮點運算功能,如果自己寫Verilog代碼,需要花費較多的時間和精力。好在Simulink HDL Coder工具箱提供了自動代碼生成技術。下圖展示了HDL Coder如
    發表于 10-22 06:48

    NTP時間同步技術:保證網絡時間精確無比

    NTP是一種用于計算機和網絡設備之間進行時間同步的協議,它能夠確保所有設備都使用同一個時間源,從而實現全球范圍內的時間精確同步。本文將詳細介紹NTP時間同步技術的原理、應用以及優勢。首
    的頭像 發表于 10-21 14:45 ?546次閱讀
    NTP時間<b class='flag-5'>同步</b><b class='flag-5'>技術</b>:保證網絡時間精確無比

    科普|關于GPS和GNSS,了解多少?

    定位(Positioning)為萬物互聯提供了最基礎信息;當今以GPS、GLONASS、Galileo和Beidou為代表的全球定位系統為人們帶來了極大便利;而對于它們是不是真正的了解,回答完以下
    的頭像 發表于 06-28 07:06 ?2902次閱讀
    科普|關于GPS和GNSS,<b class='flag-5'>你</b><b class='flag-5'>了解</b>多少?

    充電接口真的了解嗎?

    USB(Universal Serial Bus,通用串行總線)自1994年誕生以來,已成為我們日常生活中不可或缺的接口標準。從鍵盤、鼠標到手機、充電寶,USB接口無處不在。但知道USB接口也有
    的頭像 發表于 05-18 17:39 ?4594次閱讀

    TSN時鐘同步精度技術解析:TSN網絡的基石與保障

    一、引言 在現代網絡通信領域,時鐘同步精度至關重要,時間敏感網絡(TSN)作為新一代工業通信的核心技術,其時鐘同步精度直接影響數據傳輸的實時性與系統協同效率。尤其在工業自動化、車載網絡等高精度場景中
    的頭像 發表于 04-25 09:56 ?1307次閱讀
    TSN時鐘<b class='flag-5'>同步</b>精度<b class='flag-5'>技術</b>解析:TSN網絡的基石與保障

    FPGA Verilog HDL語法之編譯預處理

    Verilog HDL語言和C語言一樣也提供了編譯預處理的功能?!熬幾g預處理”是Verilog HDL編譯系統的一個組成部分。Verilog
    的頭像 發表于 03-27 13:30 ?1443次閱讀
    FPGA <b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>語法之編譯預處理

    采購GUTOR UPS備品備件,隱藏的“雷區” 了解嗎?

    在GUTOR UPS備品備件采購之路上,困難重重,選型、渠道甄別、成本把控、安裝部署、售后保障,樁樁件件都是棘手難題。隱藏的“雷區” 了解嗎?
    發表于 03-21 16:08

    一文詳解Verilog HDL

    Verilog HDL(Hardware Description Language)是一種硬件描述語言,用于從算法級、門級到開關級的多種抽象設計層次的數字系統建模。現實生活中多用于專用集成電路
    的頭像 發表于 03-17 15:17 ?4308次閱讀
    一文詳解<b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>