2011-04-12 143 views
1

我正在進行驗證。我目前面臨的問題是將數據轉換爲2x時鐘的單元。在Verilog或systemverilog中將2倍數據轉換爲1x時鐘

對於行進在2X時鐘66位總線132點的比特的信號。

在再次接收所有的時鐘轉換是從2×完成爲1x取回的信號的所有132個比特。

有人可以幫我如何做到這一點?

非常感謝。

+0

在2x時鐘域中是否有信號表示1x時鐘的狀態? – Andy 2011-04-12 14:34:46

回答

1

通常的方法是,你有一個132位的雙端口寄存器。在1x時鐘域中有一個端口,在另一個時鐘域中有另一個端口。由於一個是隻讀的,一個只能寫,所以你可以像正常的寄存器那樣描述它。但是,在不同時鐘域之間遷移非常棘手,尤其是。由於亞穩態。解決方法是你必須添加另一個觸發器級(即另一個寄存器)。

我的回答是不是很具體和詳細,但由於這樣的事實,你的問題是非常特異性/廣闊。

+1

只要生成並分配1x和2x時鐘以保持同步(我期望它們是),則在這種情況下,您不必擔心亞穩態性 – Andy 2011-04-12 14:33:53

1

Here's上時鐘域交叉技術的優秀論文。

1

由於問題被標記爲verilog & system-verilog我假設需要一個Verilog模塊來完成轉換。

假設輸入&輸出時鐘是同步的,這裏是代碼(未經過充分測試,可能需要一些調整):

module test; 

reg rst; 
reg [1:0] clk; 
reg [65:0] data_in; 
wire [131:0] data_out; 

conv_2x_to_1x conv_2x_to_1x (rst, clk[0], data_in, clk[1], data_out); 

always #5 clk = clk + 2'b01; 

initial begin 
    $monitor ("%3t: %1b, %2b, %66h, %66h %66h", $time, rst, clk, data_in, 
      data_out [131:66], data_out [65:0]); 
    clk = 2'b00; 
    #2 rst = 1'b1; 
    @ (negedge clk [0]) #2 begin 
    rst = 1'b0; 
    data_in = 66'h2d_eadbe_efcaf_ebabe; 
    end 
    @ (negedge clk [0]) #2 data_in = 66'h1b_adc0f_fedea_dc0de; 
    @ (negedge clk [0]) #2 data_in = 66'h3c_afeba_bedea_dbeef; 
    @ (negedge clk [0]) #2 data_in = 66'h0d_eadc0_debad_c0ffe; 
    #12 $finish; 
end 

endmodule 

:我與此刺激測試此

module conv_2x_to_1x (rst, clk_in, data_in, clk_out, data_out); 

parameter IN_WIDTH = 66; 
input wire rst, clk_in, clk_out; 
input wire [IN_WIDTH-1:0] data_in; 
output reg [2*IN_WIDTH-1:0] data_out; 

localparam LOWER_HALF = 0, UPPER_HALF = 1; 
reg [2*IN_WIDTH-1:0] data_tmp; 
reg half; 

always @(posedge clk_in or posedge rst) 
    if (rst) begin 
    data_tmp <= {2*IN_WIDTH {1'b0}}; 
    half <= LOWER_HALF; 
    end else if (half == LOWER_HALF) begin 
    data_tmp [IN_WIDTH-1:0] <= data_in; 
    half <= UPPER_HALF; 
    end else begin 
    data_tmp [2*IN_WIDTH-1:IN_WIDTH] <= data_in; 
    half <= LOWER_HALF; 
    end 

always @(posedge clk_out or posedge rst) 
    data_out <= rst ? {2*IN_WIDTH {1'b0}} : data_tmp; 

endmodule 

如果輸入時鐘不同步,我認爲您需要在輸入時鐘域中切換一個標誌信號,該信號必須雙時鐘同步到輸出時鐘域並傳遞到輸出邏輯。當輸出端邏輯檢測到切換時,它可以讀取data_out,並且必須設置另一個標誌信號,該標誌信號必須被雙同步,並傳遞到輸入端邏輯。直到輸入邏輯看到這第二個標誌切換,我認爲它不應該改變data_in

相關問題