電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 113|回復(fù): 0
收起左側(cè)

【芯片設(shè)計(jì)】異步電路碎碎念(六)手撕打拍同步器

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
匿名  發(fā)表于 2024-9-11 12:06:00 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
從這篇開(kāi)始和知乎專(zhuān)欄里的文章順序有所差異,在專(zhuān)欄里第六到第十篇是關(guān)于異步隨機(jī)驗(yàn)證的內(nèi)容,而在推送里為了內(nèi)容的前后銜接就放到最后再說(shuō)。在前面的文章里,我們熟悉了異步邏輯的處理方法:
【芯片設(shè)計(jì)】異步電路碎碎念(四) 異步邏輯的處理方法
而后一個(gè)順理成章的事情就是練習(xí)寫(xiě)寫(xiě)代碼啦。再次匯總下之前提到的異步邏輯同步器結(jié)構(gòu):
1.單比特電平打拍同步器;
2.單比特脈沖打拍同步器;
3.多比特?cái)?shù)據(jù)打拍同步器;
4.多比特電平使能DMUX同步器;
5.多比特脈沖使能握手同步器;
6.異步FIFO;
其中異步FIFO已經(jīng)在前面的專(zhuān)欄中詳細(xì)的寫(xiě)過(guò)代碼了,因此就不在這里重復(fù)。這部分涉及到的代碼位于:
【芯片設(shè)計(jì)】FIFO漫談(七)異步FIFO從格雷碼說(shuō)起
單比特電平打拍同步器單比特打拍同步器的代碼很簡(jiǎn)單,不過(guò)其中有兩點(diǎn)需要注意:
1.可配置性,主要包括打拍級(jí)數(shù)和在源時(shí)鐘域是否需要打拍后輸出;
2.專(zhuān)用同步打拍寄存器,實(shí)際交付的工程中同步器中的打拍寄存器可能會(huì)例化專(zhuān)用的模塊,這是避免被工具優(yōu)化或者做multi-bit,以及在設(shè)置sdc/cdc時(shí)方便統(tǒng)一匹配。

不過(guò)因?yàn)槲覀冎皇鞘炙捍a練習(xí),就不考慮專(zhuān)用打拍寄存器的事了。那么基于上述,手撕代碼如下:
module async_1bit_delay #(
  parameter DL = 2,
  parameter FF = 1
)( /*AUTOARG*/
   // Inputs
   i_clk, i_rst_n, i_data, o_clk, o_rst_n, o_data
   );
// ----------------------------------------------------------------
// Interface declare
// ----------------------------------------------------------------
input  i_clk;
input  i_rst_n;
input  i_data;
input  o_clk;
input  o_rst_n;
output o_data;
// ----------------------------------------------------------------
// i_clk pipe
// ----------------------------------------------------------------
wire i_data_in;
generate
  if(FF == 0)begin: NO_IN_DFF
    assign i_data_in = i_data;
  end //if(FF == 0)begin: NO_IN_DFF
  else begin: IN_DFF
    reg i_data_ff;
    always @(posedge i_clk or negedge i_rst_n) begin
      if(!i_rst_n)
        i_data_ff endgenerate

// ----------------------------------------------------------------
// o_clk pipe
// ----------------------------------------------------------------
reg [DL -1:0]o_data_ff;
integer i;
always @(posedge o_clk or negedge o_rst_n) begin
  if(!o_rst_n) begin
    o_data_ff 代碼比較簡(jiǎn)單所以就不仿真了,反正后面還會(huì)反復(fù)調(diào)用這個(gè)模塊的。
單比特脈沖打拍同步器
單比特脈沖打拍,核心的功能點(diǎn)就是脈沖展寬,一般需要覆蓋接收域兩拍時(shí)鐘(或者三沿原則)。

所以就把時(shí)鐘展寬的代碼寫(xiě)一寫(xiě)好啦,下面是一種相對(duì)比較簡(jiǎn)單的脈沖拓展方式:
module async_pulse_widen #(
  parameter TIMES = 2
)( /*AUTOARG*/
   // Outputs
   o_data,
   // Inputs
   clk, rst_n, i_data
   );
// ----------------------------------------------------------------
// Interface declare
// ----------------------------------------------------------------
input  clk;
input  rst_n;
input  i_data;
output o_data;
// ----------------------------------------------------------------
// Wire declare
// ----------------------------------------------------------------
localparam TIMES_W = 8;
// ----------------------------------------------------------------
// AUTO declare
// ----------------------------------------------------------------
/*AUTOOUTPUT*/
/*AUTOINPUT*/
/*AUTOWIRE*/
reg  [TIMES_W -1:0]widen_cnt;
wire [TIMES_W -1:0]widen_cnt_d;
wire               widen_cnt_en;
assign widen_cnt_en = (i_data && widen_cnt == {TIMES_W{1'b0}}) ||
                      (widen_cnt == TIMES) ||
                      (widen_cnt != {TIMES_W{1'b0}}) ;
assign widen_cnt_d  = (i_data && widen_cnt == {TIMES_W{1'b0}}) ? widen_cnt + 1'b1 :
                      (widen_cnt == TIMES)                   ? 1'b0 :
                                                               widen_cnt + 1'b1;

always @(posedge clk or negedge rst_n) begin
  if(!rst_n) begin
    widen_cnt 這里面的TIMES就是要展寬的倍數(shù),這個(gè)代碼的展寬結(jié)果輸出是在脈沖使能的下一拍開(kāi)始的,如展寬5倍:

同時(shí)如果在展寬過(guò)程中有下一個(gè)脈沖到達(dá),那么是不響應(yīng)的:

多比特?cái)?shù)據(jù)打拍同步器如果多比特?cái)?shù)據(jù)沒(méi)有使能信號(hào),也就是說(shuō)不關(guān)心正確數(shù)值同步過(guò)去的時(shí)間,只要同步過(guò)去就行,或者格雷碼跨異步這種場(chǎng)景,那么可以選擇多比特?cái)?shù)據(jù)打拍同步器。多比特?cái)?shù)據(jù)打拍同步器只需要例化若干單比特打拍同步器就可以了:
module async_nbit_delay #(
  parameter DL = 2,
  parameter WD = 1,
  parameter FF = 1
)( /*AUTOARG*/
   // Outputs
   o_data,
   // Inputs
   i_clk, i_rst_n, i_data, o_clk, o_rst_n
   );
// ----------------------------------------------------------------
// Interface declare
// ----------------------------------------------------------------
input          i_clk;
input          i_rst_n;
input [WD -1:0]i_data;
input          o_clk;
input          o_rst_n;
output[WD -1:0]o_data;
genvar i;
generate
  for(i=0; i

系列文章入口——
【芯片設(shè)計(jì)】SoC 101(一):緒論
【芯片設(shè)計(jì)】FIFO漫談(零)從無(wú)處不在的FIFO開(kāi)始說(shuō)起
【芯片設(shè)計(jì)】計(jì)算機(jī)體系結(jié)構(gòu)(一)虛擬內(nèi)存
【芯片設(shè)計(jì)】深入理解AMBA總線(零)緒論
【芯片設(shè)計(jì)】握手協(xié)議的介紹與時(shí)序說(shuō)明
【芯片設(shè)計(jì)】復(fù)位那些小事 —— 復(fù)位消抖
【芯片設(shè)計(jì)】快速入門(mén)數(shù)字芯片設(shè)計(jì)(一)Introduction
【芯片驗(yàn)證】UVM源碼計(jì)劃(零)下定決心讀源碼前的自測(cè)環(huán)節(jié)
【芯片設(shè)計(jì)】異步電路碎碎念(一) 到底什么是異步電路
【芯片設(shè)計(jì)】從RTL到GDS(一):Introduction
其他文章鏈接——
【芯片驗(yàn)證】sva_assertion: 15道助力飛升的斷言練習(xí)
【芯片驗(yàn)證】可能是RTL定向驗(yàn)證的巔峰之作
【芯片驗(yàn)證】RTL仿真中X態(tài)行為的傳播 —— 從xprop說(shuō)起
【芯片驗(yàn)證】年輕人的第一個(gè)systemVerilog驗(yàn)證環(huán)境全工程與解析
【芯片設(shè)計(jì)】verilog中有符號(hào)數(shù)和無(wú)符號(hào)數(shù)的本質(zhì)探究
【芯片設(shè)計(jì)】論RTL中always語(yǔ)法的消失術(shù)
【芯片設(shè)計(jì)】代碼即注釋?zhuān)⑨尲创a
【芯片設(shè)計(jì)】700行代碼的risc處理器你確實(shí)不能要求太多了
入職芯片開(kāi)發(fā)部門(mén)后,每天摸魚(yú)之外的時(shí)間我們要做些什么呢
如何計(jì)算系統(tǒng)的outstanding 和 burst length?
芯片搬磚日!け扑缽(qiáng)迫癥的關(guān)鍵詞不對(duì)齊事件
熟人社會(huì)里,一群沒(méi)有社會(huì)價(jià)值的局外人

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒(méi)有賬號(hào)?立即注冊(cè)

x
回復(fù)

使用道具

發(fā)表回復(fù)

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表