我正在进行验证。我目前面临的问题是将数据转换为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