我正在進行驗證。我目前面臨的問題是將數據轉換爲2x時鐘的單元。在Verilog或systemverilog中將2倍數據轉換爲1x時鐘
對於行進在2X時鐘66位總線132點的比特的信號。
在再次接收所有的時鐘轉換是從2×完成爲1x取回的信號的所有132個比特。
有人可以幫我如何做到這一點?
非常感謝。
我正在進行驗證。我目前面臨的問題是將數據轉換爲2x時鐘的單元。在Verilog或systemverilog中將2倍數據轉換爲1x時鐘
對於行進在2X時鐘66位總線132點的比特的信號。
在再次接收所有的時鐘轉換是從2×完成爲1x取回的信號的所有132個比特。
有人可以幫我如何做到這一點?
非常感謝。
通常的方法是,你有一個132位的雙端口寄存器。在1x時鐘域中有一個端口,在另一個時鐘域中有另一個端口。由於一個是隻讀的,一個只能寫,所以你可以像正常的寄存器那樣描述它。但是,在不同時鐘域之間遷移非常棘手,尤其是。由於亞穩態。解決方法是你必須添加另一個觸發器級(即另一個寄存器)。
我的回答是不是很具體和詳細,但由於這樣的事實,你的問題是非常特異性/廣闊。
只要生成並分配1x和2x時鐘以保持同步(我期望它們是),則在這種情況下,您不必擔心亞穩態性 – Andy 2011-04-12 14:33:53
Here's上時鐘域交叉技術的優秀論文。
由於問題被標記爲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
。
在2x時鐘域中是否有信號表示1x時鐘的狀態? – Andy 2011-04-12 14:34:46