仿真环境 QUARTUS13.1
仿真ip:altlvds_rx。
为了接收LVDS信号,FPGA可以使用自己的IP核,当然也可以直接用LVDS接收芯片。但是,往往为了节约成本,减小PCB面积等因素,可以使用IP核来处理。
IP核设置界面如下
这里factor最大为10.据说赛灵思的最大可到12,没有试过。
这里数据速率要和输入频率成一定的比例,这个比例就是上边Factor的数值,我们这里是10,所以data rate 是500mhz,输入clk是50mhz。之所以这样设置的原因是,为了数据对齐。这可以在官方的指导手册中看到详细的介绍。
关于数据对齐问题要注意
就是说,要保证串行数据的MSB和外部clk上升沿对齐,并且,要保证一个有效word中只有一个外部clk上升沿,那这就要求data rate/外部input clk =Factor。
verilog及testbench如下
testbench
`timescale 1ns/1ps
module LVDS_RX_tb;
reg clk;
reg lvds_sig;
wire [9:0] parallel_sig;
wire rx_locked;
wire rx_outclock;
initial
begin
clk = 1'b0;
lvds_sig = 1'b0;
#100
lvds_sig = 1'b1;
repeat(10)
begin
#2
lvds_sig = 1'b0;
#2
lvds_sig = 1'b1;
end
lvds_sig = 1'b0;
repeat(10)
begin
#2
lvds_sig = 1'b1;
#2
lvds_sig = 1'b0;
end
end
always #10 clk = ~clk; //50MHz inclk
LVDS_RX u1(
.clk(clk),
.lvds_sig(lvds_sig),
.rx_locked(rx_locked),
.parallel_sig(parallel_sig),
.rx_outclock(rx_outclock)
);
endmodule
仿真波形:
当rx_locked拉高后,ip核内部的pll会锁存时钟,也就是说这时候才会解串,将接收到的串行数据并行化,在一个外部clk周期内,会将10bit串行数据并行化,并行输出的数据会在rx_outlock的上升沿变化,下降沿锁存。
具体要自己分析ip核的用户指导手册。
文章评论(0条评论)
登录后参与讨论