概述
先上接口代码:
//
// Copyright 2013 Ettus Research LLC
// Copyright 2017 Ettus Research, a National Instruments Company
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//
//
//------------------------------------------------------------------
//
// In SISO mode, we output a clock thats 1x the frequency of the Catalina
// source-synchronous bus clock to be used as the radio_clk.
// In MIMO mode, we output a clock thats 1/2 the frequency of the Catalina
// source-synchronous bus clock to be used as the radio_clk.
//
//------------------------------------------------------------------
/*
https://blog.csdn.net/weixin_39789553/article/details/114385676
*/
module b200_io
(
input reset,
input mimo,
// Baseband sample interface
output radio_clk,
output [11:0] rx_i0,
output [11:0] rx_q0,
output [11:0] rx_i1,
output [11:0] rx_q1,
input [11:0] tx_i0,
input [11:0] tx_q0,
input [11:0] tx_i1,
input [11:0] tx_q1,
// Catalina interface
input rx_clk,
input rx_frame,
input [11:0] rx_data,
output tx_clk,
output tx_frame,
output [11:0] tx_data
);
这个模块就是接AD9361的模块,除了AD9361给过来的rx_clk,没有别的时钟给FPGA,相反还产生了一个时钟radio_clk供给模块外部用以CDC同步和作为基带时钟。
我们继续看下面的实现代码,这里看到代码主要用到了以下几个模块:
IDDR2实现差分信号的接入。
ODDR2实现差分信号输出。
BUFGMUX实现局域时钟的多路选择。
BUFG实现输入时钟的缓冲。
BUFIO2实现时钟分频。
我看这代码写得有不太正规,我尝试了做了修改,使用generate语句进行了规整。
genvar y ;
generate
for(y = 0; y < 12;y = y + 1)
begin : get_pins
IDDR2 #(
.DDR_ALIGNMENT("C0"))
iddr2_i0 (
.Q0(rx_q[y]),
.Q1(rx_i[y]),
.C0(io_clk_lb),
.C1(io_clk_lb_b),
.CE(1'b1),
.D(rx_data[y]),
.R(1'b0),
.S(1'b0));
end
endgenerate
将12段RX的IDDR2都用这个语句规整起来了,实际编译通过,生成BIT流还没有下板子验证,应该没有问题,将在之后进行实际下板子验证。
这里如果大家要深入研究时序,可以参考AD9361的接口时序,以及XILINX官方对应器件的时钟以及接口部分的数据手册。这里不再展开。
{{aAx8MOMTX8HOvmxOoxmwMHHoviVIx8IOiWOmTUIUUixiwiWXI8UIU8MowM8oWHoMVoXXXXVTUTOHUTT8VXToVMwXivMHV8iWTwIiOiiVivwIOOIVxU8o8UVHxUvIVm8OVXomXwomiIM8vOxOHHIVZz}}
最后
以上就是纯真砖头为你收集整理的USRP_B210之FPGA分析3:b200_io模块的简单分析的全部内容,希望文章能够帮你解决USRP_B210之FPGA分析3:b200_io模块的简单分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复