FPAG xilinux 板子用ISE工具写的LVDS收发测试程序,怎么改变其时钟50MHZ为其他值?
如题,没有找到方法改变这个LVDS 50MHZ输入时钟设置值,但理论上可以的,只是我不会,怎么解,谢谢指教
module lvds_tx_rx (
input sys_clk , //系统时钟
input sys_rst_n , //系统复位
input clk_in_from_pin_p, //lvds 时钟输出 P
input clk_in_from_pin_n, //lvds 时钟输入 N
input data_in_from_pin_p, //lvds 输入数据 P
input data_in_from_pin_n, //lvds 输入数据 N
output clk_out_to_pin_p, //lvds 时钟输出 P
output clk_out_to_pin_n, //lvds 时钟输出 N
output data_out_to_pin_p, //lvds 输出数据 P
output data_out_to_pin_n //lvds 输出数据 N
);
wire p2s_div_8_clk; //串行发送时钟的 8 分频
wire s2p_div_8_clk; //串行接收时钟的 8 分频
reg [7:0] tx_data;
wire [7:0] rx_data ; //LVDS 输入的 8 位并行数据
reg [7:0] rx_data_dly1 ;
reg bitslip_en ;
reg data_equal;
//产生 LVDS 发送的测试数据,0~FF,循环累加计数
always @(posedge p2s_div_8_clk or negedge sys_rst_n) begin
if (~sys_rst_n)
tx_data <= 8'h0;
else
tx_data <= tx_data + 1'b1;
end
//产生 BITSLIP 信号,用于修改串转并的 Bit 的起始位置
// 数据打一拍,延迟一个周期
always @(posedge s2p_div_8_clk or negedge sys_rst_n) begin
if (~sys_rst_n)
rx_data_dly1 <= 8'h0;
else
rx_data_dly1 <= rx_data ;
end
always @(posedge s2p_div_8_clk or negedge sys_rst_n ) begin
if (~sys_rst_n) begin
bitslip_en <= 1'b0;
data_equal <=1'b0;
end
else if ( data_equal == 1'b0 ) begin
if( rx_data != 8'h81 && rx_data_dly1 == 8'h80 ) begin // 如果上次数据位 80
当前数据不等于 81,认为数据没有同步
bitslip_en <= 1'b1; // BITSLIP 产生一个高脉冲,改变
串转并的数据排列
data_equal <= 1'b0; // 数据正确信号为 0
end
else begin
bitslip_en <= 1'b0; //BITSLIP 不为高
data_equal <= 1'b1; //数据正确信号为 1
end
end
else begin
bitslip_en <= 1'b0 ; //
data_equal <= data_equal ; // 保持
end
end
//并转串,8 位数据 tx_data 转换成串行数据,并通过 lvds 差分信号输出,数据从 FPGA
送出管脚
p2s p2s_u0
(
.DATA_OUT_FROM_DEVICE(tx_data ), //Input
.DATA_OUT_TO_PINS_P (data_out_to_pin_p), //Output
.DATA_OUT_TO_PINS_N (data_out_to_pin_n), //Output
.CLK_TO_PINS_P (clk_out_to_pin_p ), //Output
.CLK_TO_PINS_N (clk_out_to_pin_n ), //Output
.CLK_IN (sys_clk ), //Single ended clock from IOB
.CLK_DIV_OUT (p2s_div_8_clk ), //Slow clock output
.IO_RESET (~sys_rst_n ) //system reset
);
//串转并,LVDS 差分信号转换成单端信号再通过串转并,转换为 8 位数据 rx_data,数
据从 FPGA 输入管脚
s2p s2p_u0
(
.DATA_IN_FROM_PINS_P(data_in_from_pin_p), // Input
.DATA_IN_FROM_PINS_N(data_in_from_pin_n), // Input
.DATA_IN_TO_DEVICE (rx_data ), // Output
.BITSLIP (bitslip_en ), // Input pin
.CLK_IN_P (clk_in_from_pin_p ), // Differential clock from IOB
.CLK_IN_N (clk_in_from_pin_n ), // Differential clock from IOB
.CLK_DIV_OUT (s2p_div_8_clk ), // Slow clock output
.IO_RESET (~sys_rst_n ) // system reset
);
// 添加 ILA 触发信号
wire [35:0] CONTROL0 ;
wire [63:0] TRIG0_DATA ;
chipscope_icon chipscope_icon_u0 (
.CONTROL0(CONTROL0)
);
chipscope_ila chipscope_ila_u0 (
.CONTROL(CONTROL0 ),
.CLK (s2p_div_8_clk ), // TRIG CLK
.TRIG0 (TRIG0_DATA ) // TRIG0 [63:0]
);
assign TRIG0_DATA[7:0] = tx_data ;
assign TRIG0_DATA[15:8] = rx_data ;
assign TRIG0_DATA[23:16] = rx_data_dly1 ;
assign TRIG0_DATA[24] = bitslip_en ;
assign TRIG0_DATA[25] = data_equal ;
endmodule
如题,没有找到方法改变这个LVDS 50MHZ输入时钟设置值,但理论上可以的,只是我不会,怎么解,谢谢指教
module lvds_tx_rx (
input sys_clk , //系统时钟
input sys_rst_n , //系统复位
input clk_in_from_pin_p, //lvds 时钟输出 P
input clk_in_from_pin_n, //lvds 时钟输入 N
input data_in_from_pin_p, //lvds 输入数据 P
input data_in_from_pin_n, //lvds 输入数据 N
output clk_out_to_pin_p, //lvds 时钟输出 P
output clk_out_to_pin_n, //lvds 时钟输出 N
output data_out_to_pin_p, //lvds 输出数据 P
output data_out_to_pin_n //lvds 输出数据 N
);
wire p2s_div_8_clk; //串行发送时钟的 8 分频
wire s2p_div_8_clk; //串行接收时钟的 8 分频
reg [7:0] tx_data;
wire [7:0] rx_data ; //LVDS 输入的 8 位并行数据
reg [7:0] rx_data_dly1 ;
reg bitslip_en ;
reg data_equal;
//产生 LVDS 发送的测试数据,0~FF,循环累加计数
always @(posedge p2s_div_8_clk or negedge sys_rst_n) begin
if (~sys_rst_n)
tx_data <= 8'h0;
else
tx_data <= tx_data + 1'b1;
end
//产生 BITSLIP 信号,用于修改串转并的 Bit 的起始位置
// 数据打一拍,延迟一个周期
always @(posedge s2p_div_8_clk or negedge sys_rst_n) begin
if (~sys_rst_n)
rx_data_dly1 <= 8'h0;
else
rx_data_dly1 <= rx_data ;
end
always @(posedge s2p_div_8_clk or negedge sys_rst_n ) begin
if (~sys_rst_n) begin
bitslip_en <= 1'b0;
data_equal <=1'b0;
end
else if ( data_equal == 1'b0 ) begin
if( rx_data != 8'h81 && rx_data_dly1 == 8'h80 ) begin // 如果上次数据位 80
当前数据不等于 81,认为数据没有同步
bitslip_en <= 1'b1; // BITSLIP 产生一个高脉冲,改变
串转并的数据排列
data_equal <= 1'b0; // 数据正确信号为 0
end
else begin
bitslip_en <= 1'b0; //BITSLIP 不为高
data_equal <= 1'b1; //数据正确信号为 1
end
end
else begin
bitslip_en <= 1'b0 ; //
data_equal <= data_equal ; // 保持
end
end
//并转串,8 位数据 tx_data 转换成串行数据,并通过 lvds 差分信号输出,数据从 FPGA
送出管脚
p2s p2s_u0
(
.DATA_OUT_FROM_DEVICE(tx_data ), //Input
.DATA_OUT_TO_PINS_P (data_out_to_pin_p), //Output
.DATA_OUT_TO_PINS_N (data_out_to_pin_n), //Output
.CLK_TO_PINS_P (clk_out_to_pin_p ), //Output
.CLK_TO_PINS_N (clk_out_to_pin_n ), //Output
.CLK_IN (sys_clk ), //Single ended clock from IOB
.CLK_DIV_OUT (p2s_div_8_clk ), //Slow clock output
.IO_RESET (~sys_rst_n ) //system reset
);
//串转并,LVDS 差分信号转换成单端信号再通过串转并,转换为 8 位数据 rx_data,数
据从 FPGA 输入管脚
s2p s2p_u0
(
.DATA_IN_FROM_PINS_P(data_in_from_pin_p), // Input
.DATA_IN_FROM_PINS_N(data_in_from_pin_n), // Input
.DATA_IN_TO_DEVICE (rx_data ), // Output
.BITSLIP (bitslip_en ), // Input pin
.CLK_IN_P (clk_in_from_pin_p ), // Differential clock from IOB
.CLK_IN_N (clk_in_from_pin_n ), // Differential clock from IOB
.CLK_DIV_OUT (s2p_div_8_clk ), // Slow clock output
.IO_RESET (~sys_rst_n ) // system reset
);
// 添加 ILA 触发信号
wire [35:0] CONTROL0 ;
wire [63:0] TRIG0_DATA ;
chipscope_icon chipscope_icon_u0 (
.CONTROL0(CONTROL0)
);
chipscope_ila chipscope_ila_u0 (
.CONTROL(CONTROL0 ),
.CLK (s2p_div_8_clk ), // TRIG CLK
.TRIG0 (TRIG0_DATA ) // TRIG0 [63:0]
);
assign TRIG0_DATA[7:0] = tx_data ;
assign TRIG0_DATA[15:8] = rx_data ;
assign TRIG0_DATA[23:16] = rx_data_dly1 ;
assign TRIG0_DATA[24] = bitslip_en ;
assign TRIG0_DATA[25] = data_equal ;
endmodule