lvds在FPGA中的使用5 - ALTLVDS_TX核外部pll模式调试

我的开发环境:quartus13.1

 

lvds连载4博文中,使用的是lvds核调用PLL的方式,这样一组lvds发送端口需要一个PLL,比较浪费资源。其实在使用ALTLVDS核时,还可以使用External PLL(外部pll),使用外部pll,不仅可以节省一个PLL,还可以减少逻辑资源的使用。

下面来说说调用ALTLVDS_TX核时,怎么使用外部PLL。与转载4相同,还是5个通道,每个通道对应7个解串因子,勾上Use external PLL框,后面Frequency/PLL settings不需要设置,从下图资源消耗可以看出,使用外部PLL,相对于调用PLL来说,使用更少的reg(198个)。

 

上面的设置看着很方便,其实不然,对于cyclone4器件,在使用外部PLL时,需要外部提供两个时钟:tx_inclock和tx_syncclock,并且需要手动设置好相移,这部分需要参考手册LVDS SERDES Transmitter/Receiver IP Cores User Guide中ALTLVDS IP Core in External PLL Mode部分进行设置,下表给出了详细的时钟及相移计算方法。

从手册中可以知道,tx_clock为c0,我的系统中,像素时钟为25MHz,计算得到c0为175MHz,相移-180°,tx_syncclock为c2(我也不是很确定,手册中没有提到),时钟为25MHz,相移-25.7°。

时钟设置好,开始编译,编译通过。程序设计思路是:FPGA内部产生图像源数据,每行数据依次递增,如果电脑采集到的数据与FPGA内部预设一致,就说明lvds发送数据ok。采到的图像及数据(matlab打开采集的图片)如下,相邻两个像素数据一样,郁闷了,看着像是使用高倍时钟对每个数采了两次。

第一感觉是可能需要将时钟二分频,不过想来也没道理了,毕竟Altera手册里面说的清清楚楚的,上网找了一番,看到一篇文章,日文,好在咱有Google Translate。网址如下:

http://www.hdl.co.jp/UTL/UTL-023/rei_1/

发现里面的快时钟使用的是像素时钟*解串因子/2,修改程序后,果然数据就正确了,似乎是cyclone4和cyclone5器件设置不太一样,cyclone4的器件对应的c0为像素时钟*解串因子/2,cyclone5的器件对应的c0为像素时钟*解串因子。不管了,数据正确了就行,对咱们器件级开发者而言,硬件底层的东西还是不要搞了。

至此,ALTLVDS_TX算是调完了,内部调用PLL、外部PLL两种模式都调试ok。需要注意的是,在使用LVDS核时,需要根据外部器件(显示器件、采集卡)的属性进行位分配。

### FPGA Sub-LVDS接口使用教程 #### 接口概述 Sub-LVDS(低压差分信号)是一种用于高速数据传输的技术,在FPGA应用中广泛应用于视频和图像处理领域。这种技术通过一对差分线路来传送每一位的数据,具有抗干扰能力强、功耗低等特点。 #### 设计流程与配置要点 对于基于XC7K325TFFG676-2这样的器件进行Sub-LVDS的设计时,需注意以下几点: - **硬件准备**:确保所使用的开发板具备支持Sub-LVDS输入/输出功能的物理连接器,并确认其电气特性满足标准要求[^1]。 - **软件工具**:建议使用Vivado 2019.1作为主要IDE来进行项目创建、综合及时序分析等工作。如果遇到不同版本之间的兼容性问题,则应按照官方文档指导调整设置参数以适应目标平台的需求。 #### Verilog代码实例 下面给出一段简单的Verilog模块示例,展示了如何利用内部逻辑生成符合Sub-LVDS电平规格的数据流并将其发送出去: ```verilog module sub_lvds_tx #( parameter DATA_WIDTH = 8, CLK_FREQ_MHZ = 100 )( input wire clk, // System clock input wire rst_n, // Active low reset input wire [DATA_WIDTH-1:0] data_in,// Data to be transmitted over LVDS link output reg lvds_p, // Positive differential signal of the LVDS pair output reg lvds_n // Negative differential signal of the LVDS pair ); always @(posedge clk or negedge rst_n) begin : proc_sublvds_out if (!rst_n) {lvds_p, lvds_n} <= 2'b0; else case (data_in[DATA_WIDTH-1]) 1'b0 : {lvds_p, lvds_n} <= 2'b01; // Low level on positive side default: {lvds_p, lvds_n} <= 2'b10; // High level on positive side endcase end // Add your own timing constraints here... endmodule ``` 此段代码仅作为一个基础框架供参考,实际应用还需根据具体的协议定义以及接收端的要求做进一步优化和完善。 #### 常见问题解答 当面对Sub-LVDS接口相关的挑战时,可能会碰到一些典型的问题及其对应的解决办法如下所示: - **同步丢失**:检查双方设备间是否存在足够的握手机制来维持稳定的帧率;必要时可引入额外的状态机控制状态转换过程[^2]。 - **噪声过大影响质量**:审查布线布局是否合理,尽量缩短走线长度减少反射效应;同时考虑增加终端匹配电阻改善阻抗匹配状况[^3]。 - **无法识别特定模式下的像素格式**:查阅资料手册实当前设定能否覆盖所需色彩空间范围;适当调节PLL倍频系数使得采样频率更加贴近理想值[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值