irde2接口详解_XilinxFPGALVDS应用

更新时间:2023-06-24 02:20:08 阅读: 评论:0

irde2接⼝详解_XilinxFPGALVDS应⽤
最近项⽬需要⽤到差分信号传输,于是看了⼀下FPGA上差分信号的使⽤。Xilinx FPGA中,主要通过原语实现差分信号的收发:
OBUFDS(差分输出BUF),IBUFDS(差分输⼊BUF)。
注意在分配引脚时,只需要分配SIGNAL_P的引脚,SIGNAL_N会⾃动连接到相应差分对引脚上;若没有使⽤差分信号原语,则在引脚电平
上没有LVDS的选项(IO Planning PlanAhead)。
测试代码:
//
modulelvds_test( sys_clk,
sys_rst,
signal_in_p,
signal_in_n,
signal_out_p,
signal_out_n,
led_signal
);inputsys_clk,sys_rst;inputsignal_in_p,signal_in_n;outputsignal_out_p,signal_out_n;outputled_signal;wiresignal_out_temp;reg[31 clk_cnt;always @ (podge sys_clk) begin
if(!sys_rst) clk_cnt <= 32'd0;
el begin
if(clk_cnt == 32'd10_000_000) clk_cnt <= 32'd0;el clk_cnt <= clk_cnt+1'b1;
end
end
assign signal_out=(clk_cnt >= 32'd5_000_000) ? 1 : 0;
OBUFDS signal_out_diff( .O(signal_out_p),
.OB(signal_out_n),
.I(signal_out)
);
IBUFDS signal_in_diff( .O(led_signal),
.I(signal_in_p),
.IB(signal_in_n)
右眼下方有痣
);endmodule
约束⽂件:
NET "signal_out_p" IOSTANDARD =LVDS_33;
NET"signal_out_p" LOC =U16;
周三英语NET"sys_clk" IOSTANDARD =LVCMOS33;
NET"sys_rst" IOSTANDARD =LVCMOS33;
NET"led_signal" LOC =D18;
NET"led_signal" IOSTANDARD =LVCMOS33;
#Created by Constraints Editor (xc6slx45t-csg324-3) - 2016/06/06NET"sys_clk" TNM_NET = "sys_clk";
TIMESPEC TS_sys_clk= PERIOD "sys_clk" 50 MHz HIGH 50 %;
NET"signal_in_p" LOC =T12;
NET"signal_in_n" LOC =V12;
NET"sys_clk" LOC =G8;
NET"sys_rst" LOC =U3;
# PlanAhead Generated IO constraints
NET"signal_in_p" IOSTANDARD = LVDS_33;
约束⽂件IO Planning PlanAhead产⽣,原语的使⽤可参考:E:\Xilinx\ISE\14.7\ISE_DS\ISE\doc\unglish\ihelp\spartan6⾥⾯提供了所⽤器件的原语。同时,Xilinx器件内部信号内部还提供了100欧姆电阻匹配,可参考Spartan-6 FPGA SelectIO
Resources(UG381)
补充:
若要实现⾼速通信的场合,可以利⽤FPGA内部⾃带的SelectIO资源,利⽤ISERDESE2、 OSERDESE2,实现串-并,并-串的转换,理论速度可达到750Mbs,参考资料:Spartan-6 FPGA Data Sheet: DC and Switching Characteristics(UG162)
通信框图:
因为串⾏转成并⾏的时候,输出的数据⽆法判断哪个 Bit 是⾼位,哪个 bit 是低位,因此,对于 ISERDESE2 可以利⽤bitslip 信号来重新对齐串⾏数据以获得正确的字节数据;代码实现时,也需要先进⾏数据对齐,才能进⾏数据的正常接收。
`timescale 1ns /1ps
modulelvds_test(input clk_50m,//全局时钟
input rstn, //复位
艾灸方法大班家访记录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 clk_div_out_1; //低速时钟1,串⾏发送时钟的8分频
wire clk_div_out_2; //低速时钟2,串⾏接收时钟的8分频
wire [7:0] datain; //LVDS输⼊的8位并⾏数据//产⽣LVDS发送的测试数据,0~FF
reg [7:0] dataout;always @(podge clk_div_out_1) begin
if (~rstn)
dataout<= 0;el if (dataout == 8'hff)
dataout <= 0;eldataout<= dataout + 1'b1;
end
//产⽣BITSLIP信号,⽤于修改串转并的Bit的起始位置
wire [7:0] data_delay;reg BITSLIP=1'b0;
regslip_check;reg equal=1'b0;
assign data_delay=datain;always @(podgeclk_div_out_2)begin
if (~rstn)低风险投资
slip_check<= 1'b0;
el if(data_delay==8'h80) //当串转并的输⼊的数据为0x80的时候,检测开始
slip_check <= 1'b1;
elslip_check<= 1'b0;
end
always @(podgeclk_div_out_2)begin
if (~rstn) beginBITSLIP<= 1'b0;
equal<=1'b0;
end
el if((slip_check==1'b1) && (equal==1'b0))if (data_delay ==8'h81) begin //如果检测到数据0x80后⾯的下⼀个时钟的数据为0x81时
BITSLIP <= 1'b0; //BITSLIP不为⾼
equal<=1'b1; //数据正确信号为⾼
end
el beginBITSLIP<= 1'b1; //BITSLIP产⽣⼀个⾼脉冲,改变串转并的数据排列
equal<=1'b0; //数据正确信号为低
end
el beginBITSLIP<= 1'b0;
equal<=equal;end
end
//并转串,8位数据dataout转换成串⾏数据,并通过lvds差分信号输出
p_to_s p_to_s_inst
(//From the device out to the system
.DATA_OUT_FROM_DEVICE(dataout), //Input pins
.DATA_OUT_TO_PINS_P(data_out_to_pin_p), //Output pins
.DATA_OUT_TO_PINS_N(data_out_to_pin_n), //Output pins
钱学森传读后感.CLK_TO_PINS_P(clk_out_to_pin_p), //Output pins
.CLK_TO_PINS_N(clk_out_to_pin_n), //Output pins
.CLK_IN(clk_50m),//Single ended clock from IOB
.CLK_DIV_OUT(clk_div_out_1), //Slow clock output
.IO_RESET(~rstn) //system ret
);//串转并,LVDS差分信号转换成单端信号再通过串转并,转换为8位数据datain
s_to_p s_to_p_inst
(//From the system into the device
.DATA_IN_FROM_PINS_P(data_in_from_pin_p), //Input pins
.DATA_IN_FROM_PINS_N(data_in_from_pin_n), //Input pins
.DATA_IN_TO_DEVICE(datain), //Output pins
.BITSLIP(BITSLIP),//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(clk_div_out_2), //Slow clock output
.IO_RESET(~rstn) //system ret
);endmodule
其中,clk_div_out_1和clk_div_out_2是8分频得到的(ISERDESE2、 OSERDESE2核实现),OSERDESE2输出的LVDS 差分时钟可作为ISERDESE2的接收时钟。

本文发布于:2023-06-24 02:20:08,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1025521.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   信号   差分   时钟
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图