是不是再fiber或者gt设计中经常遇到接收数据没有对齐?
是的。很多协议需要手动对齐设计。这不,它来了。下面是手动对齐代码设计,本人在很多工程和项目中应用过,现在共享出来,给大家使用。
module gt_k_char
(
input gt_clk,
input gt_rst_n,
input[3:0] b_gt_rxcharisk,
input[31:0] b_gt_rxdata,
output[3:0] a_gt_rxcharisk,
output[31:0] a_gt_rxdata
);
reg[3:0] gt_rxcharisk_r;
reg[31:0] gt_rxdata_r;
reg[3:0] mux_code;
reg[3:0] a_gt_rxcharisk_r;
reg[31:0] a_gt_rxdata_r;
always@(posedge gt_clk)begin
gt_rxcharisk_r <= b_gt_rxcharisk;
gt_rxdata_r <= b_gt_rxdata;
a_gt_rxcharisk_r <= gt_rxcharisk_r;
end
always@(posedge gt_clk or negedge gt_rst_n)begin
if(gt_rst_n==1'b0)begin
mux_code <= 4'd0;
end
else begin
if(b_gt_rxcharisk==4'd8)begin
mux_code <= 4'd8;
end
else if(b_gt_rxcharisk==4'd4)begin
mux_code <= 4'd4;
end
else if(b_gt_rxcharisk==4'd2)begin
mux_code <= 4'd2;
end
else if(b_gt_rxcharisk==4'd1)begin
mux_code <= 4'd1;
end
end
end
always@(posedge gt0_rxusrclk2_out)begin
if(mux_code==4'd8)begin
a_gt_rxdata_r <= {b_gt_rxdata[23:0],gt_rxdata_r[31:24]};
end
else if(mux_code==4'd4)begin
a_gt_rxdata_r <= {b_gt_rxdata[15:0],gt_rxdata_r[31:16]};
end
else if(mux_code==4'd2)begin
a_gt_rxdata_r <= {b_gt_rxdata[7:0],gt_rxdata_r[31:8]};
end
else if(mux_code==4'd1) begin
a_gt_rxdata_r <= gt_rxdata_r[31:0];
end
end
assign a_gt_rxcharisk = a_gt_rxcharisk_r;
assign a_gt_rxdata = a_gt_rxdata_r;
endmodule