2011-04-12 140 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

相关问题