
USRP
mcupro
这个作者很懒,什么都没留下…
展开
-
USRP B210之FPAG分析6:确定硬件没有实际连接的端口
TOP层外接到FPGA的引脚有几个不需要,首先再次列出来接口代码。/*********************************************************** * B200 Module Declaration **********************************************************/module b200 ( // SPI Interfaces output cat_ce, input cat_原创 2022-05-23 00:07:59 · 495 阅读 · 0 评论 -
USRP_B210之FPGA分析5:编译生成BIT流下替换试验
这里用的是UHD的B210代码,我们编译过了之后在替换掉UHD里面提供的B210 IMAGE,看运行FPGA功能是否正常,如果正常,以后的试验和改进就在这个些代码上进行了。使用的UHD版本是3.15,没有替换固件之前,我运行了一下UHD_USRP_PORBE 显示如下a@z:~/uhd-3.15.0.0/host/build/examples$ uhd_usrp_probe [INFO] [UHD] linux; GNU C++ version 7.5.0; Boost_106501;原创 2022-05-20 20:09:40 · 1408 阅读 · 1 评论 -
USRP_B210之FPGA分析4:三个模块的互联
三大模块gpif2_slave_fifo32是USB接口模块,b200_core是核心模块,B200_IO是AD9361的数据接口模块。上图中绿色部分接了USB3014的接口,可以看到几乎所有的USB的信号接口都接在了这个模块上。箭头处接了AD9361的接口,所以可见B200_CORE是最中心的。B200_IO和gpif2_slave_fifo32很显然只是桥接模块,负责实现CYUSB3014芯片和AD9361连接FPGA的数据转换。而真正干活的是B20...原创 2022-05-18 22:37:10 · 1148 阅读 · 0 评论 -
USRP_B210之FPGA分析3:b200_io模块的简单分析
先上接口代码://// Copyright 2013 Ettus Research LLC// Copyright 2017 Ettus Research, a National Instruments Company//// SPDX-License-Identifier: LGPL-3.0-or-later//////------------------------------------------------------------------//// In SISO m原创 2022-05-18 19:23:28 · 841 阅读 · 0 评论 -
USRP_B210之FPGA分析2:顶层以及各个模块的互联
上一篇看了顶层图,这里我们要看一下顶层有几个模块以及怎么样的连接关系以及各自功能。首先看层次图:这里我们也截图一下b200_core这个模块:这里又一个关键的radio模块:这里面看到隐藏着两个模块,数字上变频DUC模块和数字下变频DDC模块。这两个能实现8MHZ的数字变频,当然消耗资源也是巨大的。...原创 2022-05-17 23:27:30 · 1434 阅读 · 0 评论 -
USRP_B210的FPGA代码分析之:B210顶层接口分析
接下来我要研究USRP B210的FPGA驱动,用来移植到自己的软件无线电产品上。看顶层接口代码:/*********************************************************** * B200 Module Declaration **********************************************************/module b200 ( // SPI Interfaces output cat_...原创 2022-05-17 22:27:10 · 1906 阅读 · 0 评论 -
12位符号数转归一化float的实现
AD9361输出基带的12位数,表示范围是【-2048,2047】,我们现在要转成【-1,1】范围的浮点数。最简答的实现方式就是用查表的方法。我们先用以下代码做一个表格数组:int main (){int i , j = 0;float f ;for(i=-2048;i<=2047;++i) {f = (float )i/2048 ;printf("%f," , f);j++;if (j==16) { j=0;printf("\n");}} }从上面代码看我...原创 2022-03-30 00:37:45 · 652 阅读 · 0 评论 -
支持多线程的FIFO实现
支持多线程的FIFO实现#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <unistd.h>#include <pthread.h> #include "thread_safe_fifo.h"#define MAX_BIT 8#define MAX_SIZE (1<<MAX_BIT) #define CH_SIZE 4..原创 2022-03-23 07:26:13 · 441 阅读 · 0 评论 -
LINUX 下通过UDP端口发送命令以及接收反馈的代码
#include <stdio.h>#include <sys/types.h> #include <sys/socket.h>#include <string.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <stdl...原创 2022-03-22 23:30:37 · 1263 阅读 · 0 评论 -
LINUX 下进行UDP收发的C代码
#include <stdio.h>#include <sys/types.h> #include <sys/socket.h>#include <string.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <stdl...原创 2022-03-22 22:32:10 · 1158 阅读 · 0 评论 -
仿真测试一个2路、4路IQ数据转成字节流的模块
代码前几天写好的,今天打算上VIVADO实际试验了,觉得没仿真不踏实,就仿真一把。模块代码如下:将4路(可以通过使能控制是使用2路)的12位从AD9361采集到的原始数据转换成字节流(用以发送给后续的FPGA实现的千兆以太网)。module IQ2FIFO(input clk,rst,input en,a_valid,b_valid,input [11:0] d0,d1,d2,d3,output reg rd_ab_io,input wr_full, // when first f原创 2022-03-22 12:11:50 · 674 阅读 · 1 评论 -
关于K7中是否每一组MGT接口都可以接10G SFP的试验
在做新的一版SDR平台时候有一个疑问就是,就是关于K7高速口的分配,要用到6组高速口接SFP,其中QSFP占用4对,单路SFP两个占用两对。这些高速对是否可以任意分配到高速口上呢,这就是接下来试验要解决的问题。首先从已经有的经验,之前做PCIEX4时候那高速线是可以任意成组分配的。一成组分配我们说的意思是,比如tx1_p,tx1_n,rx1_p,rx1_n这四根信号线可以对应的跟tx2_p,tx2_n,rx2_p,rx2_n一一交换,并且一交换就要交换四根(交换四根肯定可以,但不太确定只交换tx或者rx原创 2022-01-26 18:04:09 · 1809 阅读 · 0 评论 -
无中频软件无线电芯片AD9361的基本介绍
AD9361在咱们产品中的很多,这也是一个很典型软件无线电芯片架构。我们在这里从软件角度简单介绍一下:抛弃硬件细节,对于我们软件程序员来说面对的只有两个通路:数据通路和控制通路。先说控制通路,通过SPI读写AD9361的寄存器实现对芯片的控制,在实际实现时候官方给出了C函数直接调用,比如设置射频频率为2.4G我们之需要调用函数set_rf_frqunce(2.4E9),之后函数根据2.4E9计算出所需要的各个寄存器的数值,之后通过SPI口打下去给AD9361。这样下来就咱们虽然可以通过.原创 2022-01-26 07:07:46 · 11063 阅读 · 3 评论 -
TPS7A8300画了一个简单的转接板
TPS7A8300有5X5MM和3.5X3.5MM两个封装,我囤了一些5X5MM封装的,但是做一个12层射频板子时候PCB封装化成了3.5X3.5MM的。3.5X3.5MM封装的价格已经涨到天上去了,并且样板要用20多个,所以打算自己做一个小板子,飞线到电路上替代3.5X3.5MM的芯片,想试验通过,正式量产再改封装。这里20K电阻数值实际是0R,通过焊和不焊确定电压数值,另外R1 R3数值也不是实际数值,要根据所需要电压进行计算。详细可以看TPS7A8300的数据手册。...原创 2022-01-11 20:59:01 · 1806 阅读 · 3 评论 -
10G光口UDP协议实现之UDP_IP打包实现代码
这里主要是加上了UDP和IP和HEADER。为了简化设计提高运行效率,这里UDP没有实现CHECK SUM。代码编译通过,接下来要进行仿真,死磕时序,可能今晚有时间搞搞。module pack_udp_ip_tb ;reg clk = 0 , rst = 1 ;always #5 clk = ~clk ; initial begin $dumpfile("v.vcd");$dumpvars(0);#100000;$finish ;end wire [31:0原创 2022-01-05 15:00:47 · 1810 阅读 · 0 评论 -
10G光口UDP协议的实现
这里根据千兆以太网的arp模块修改而成。逻辑比较简单,这里不多啰嗦,写好了代码直接上代码:module tb_arp_gen ;reg clk = 0 , rst = 1 ;always #5 clk = ~clk ; initial begin $dumpfile("v.vcd");$dumpvars(0); end wire [31:0] my_ip = {8'd192,8'd168,8'd1,8'd3} ;wire [31:0] dst_ip..原创 2022-01-04 22:04:59 · 1720 阅读 · 0 评论 -
用在XGMII的UDP协议实现一个字节序列处理模块
10G光口数据宽度是8字节,我们在实现UDP协议时候,每一层的头部不是正好的8字节,比如IP头部是20字节,这样就要求我们在IP层上PLAYLOAD要处理一下:图中阴影部分可以是UDP,以及ICMP报文等。我们看到8字节对齐的内容要加上20字节的IP包头要先输出一个4字节补齐之前IP报头缺少的。为了更加通用,我写了下面这个模块。/*module bit_ff_tb ; reg clk = 0 , rst = 1 ;always #5 clk = ~clk ; ini...原创 2022-01-04 16:42:56 · 1468 阅读 · 0 评论 -
10G光口关于以太网数据包物理接口的分析
fmadio | 10G Ethernet Layer1 Frame XGMIIz上面连接有介绍,但是实际用ILA抓波形发现对应不上。还是比较郁闷。1,我试验环境使用移植好的verilog-thernet,用网络调试助手进行回环测试,在WIRESHARK 抓包也看到没问题:ARP协议有,UDP协议也有,完整的对话。但是看ILA抓物理总线上的包:就摸不到头脑了,根据本文开头那个篇文档,收到数据时候rxc对应的bit是0,而我发送16字节数据,在...原创 2022-01-01 13:31:15 · 966 阅读 · 0 评论 -
在VIVADO项目插入ILA逻辑分析仪实现信号抓取的技巧
在QUARTUSII环境下有很好用的SIGAL TAPII ,在VIVADO下实现内部信号抓取可以使用所谓的DEBUG,其实就是设置DEBUG后,项目使用XDC命令自动加入了逻辑分析仪,我们这里讲讲的是主动实例化加入ILA的技巧。可以随便插入到代码的任何位置。1,新建一个BOLCK DESIGN ,设置成为NATIVE 类型并设置好端口数量以及位宽,深度等等细节不多说。2,端口扩展出来。3,生成HDL_WRAPPER。后看代码:module ILA_1_1_8_64_w.原创 2022-01-01 09:25:51 · 6606 阅读 · 0 评论 -
关于XILINX FPGA上的DDR_VRP和VRN引脚
Xilinx Customer CommunityThese signals have been defined this way since Xilinx introduced DCI (with Virtex II if I remember correctly). VRN is aNFET that drives low against a pull-up (open drain) and VRP is aPFET that drives high against a pull-down...原创 2021-12-31 10:36:22 · 3975 阅读 · 2 评论 -
ADF5355的C设置代码
#include "config.h" //26MHZ 0.5PPM 本振源#define R00 0X201050#define R01 0X89D89D1#define R02 0X1180822#define R03 0x3#define R04 0X30008B84 //差分时钟输入(目前芯片有问题)#define R04_EN 0X30008B94#define R05 0X800025 #define R06 0X35A08076#define R07 0...原创 2021-12-27 15:22:50 · 941 阅读 · 0 评论 -
ADF5355的VERILOG接口代码
参照这个图就可以写出VERILOG代码:这里用的简单直接的列举所有时序边缘的写法,非常简单,根本不用动脑。代码看上去是多了点但是执行效率没有影响。module tb ;reg clk = 0 , rst = 1 ;always#5 clk <= ~clk;reg write= 0 ;reg [31:0] din =0;wire busy ;task wr_adf5355 ;input [31:0] v ;begin din = v;@(...原创 2021-12-27 15:15:39 · 567 阅读 · 0 评论 -
UDP的用户接口
此模块由用户指定IP,PORT以及对方的IP(可选),符合上述条件的内容被放在FIFO里,供上层用户执行读取操作。module fifo_ether2user_if #( parameter AW = 12 , // NOT LESS THAN 10 parameter DW = 16 // 16 FOR SIMULATION ,8 FOR REAL USE )(input clk,rst,input [31:0] cfg_my_ip,input [..原创 2021-12-26 22:25:36 · 1206 阅读 · 0 评论 -
用户发送UDP的接口设计
已经写好了并调试好了代码,直接上代码:module tb_axis_user2ether_if ;reg clk = 0 ,rst = 0 ;always#5 clk =~clk ; initial begin $dumpfile("tb_axis_user2ether_if.vcd");$dumpvars;end reg [31:0] c = 0 ;always @(posedge clk) c<=c+1; reg[15:0] r=0; reg s_va原创 2021-12-26 21:41:02 · 1123 阅读 · 0 评论 -
用C语言写的合并BOM和坐标文件的小工具
ALLEGRO画PCB的软件生成的坐标文件里面没有原件的参数数值,比如没有电容容量,电阻阻值。如下图:焊接厂生产的时候希望我在里面加上原件参数。我这边反复看了ALLEGRO设置,都无法在同一个文件输出左边文件和原件参数。要想可口,自己动手。我琢磨自己合并一下。打算和BOM单合并一下就可以了。基本思路就是从BOM单只提取原件标号和参数,保存成一个bom文件。之后程序遍历坐标文件每一行,处理每一行时候,找到标号之后从bom里面根据标号找到参数,之后将见参数加到这一行就OK。我们将BOM文件精简.原创 2021-12-15 10:35:31 · 2075 阅读 · 0 评论 -
ICMP协议中ping请求的解析和响应的发送
这里PING请求解析部分的代码在mac_rx文件里,其中相关代码如下: wire [15:0] icmp_chksum ; always @ (posedge clk) case (st4)//write to bram 21:begin wr_addr <= 0; wr_en = 1 ; wr_data<=0; end //0: reply 8:request 22:begin wr_addr <= 1; wr_en = 1 ; wr_data<=0; en原创 2021-12-14 12:39:53 · 1438 阅读 · 0 评论 -
在UDP应用层面测试实现丢包的检测
我们已经已经做好在FPGA上的UDP的用户接口,也在PC上做好了UDP的收发函数,这里可以加上一些逻辑和代码实现UDP是否丢包以及是否错报的实验。首先来看开UDP接收的用户层面的接口:这里给出了udp长度,包头包尾分别用 sof和eof指示,还有我方以及对方的IP和端口。所有这些信号都在valid=1是有效。这很简洁的接口,写起测试模块很容易-------------为了实行包内数据数据校验我们就是设置每一包内的所有字节递加,为了判断出包是否丢失我们让每包第一个字节的数字也依次递加。原创 2021-12-14 07:30:47 · 4696 阅读 · 1 评论 -
DEV_CPP下的UDP接收实现
这代码不能直接运行,需要在DEV_CPP下建立项目之后加入静态库libwsock32.a。程序代码如下:#include <stdio.h>#include <stdlib.h>#include<winsock2.h>#include<stdio.h>//创建新的套接字之前需要调用一个引入Ws2_32.dll库的函数,否则服务器和客户端连接不上#pragma comment(lib,"ws2_32.lib") #include ..原创 2021-12-13 22:44:12 · 2088 阅读 · 0 评论 -
DEV-CPP下发送UDP数据包
新建项目,语言选择C,按照上篇博文设置给项目添加静态链接文件libwsock32.a.之后写代码:#include <stdio.h>#include <stdlib.h>#include<winsock2.h>#include<stdio.h>//创建新的套接字之前需要调用一个引入Ws2_32.dll库的函数,否则服务器和客户端连接不上#pragma comment(lib,"ws2_32.lib") #define TEST_L原创 2021-12-13 07:28:10 · 383 阅读 · 0 评论 -
设置DEV-CPP加入链接库libwsock32.a以支持socket编程
先新建一个DEV_CPP项目,使用的语言选择C语言。之后设置一下静态链接库:步骤如下:Step 1: [项目] ->[项目属性]Step2:在项目选项标签栏里点[参数]->[加入库或者对象]step3:选择DEV_CPP安装目录下某个lib目录下的libwsock32.a。注意可能因为版本不同,libwsock32.a这个文件所在文件夹名称也不尽相同,但是只有一个此文件,我是现在安装目录下面搜索libwsock32.a找到这个目录。step4: 之后我们看..原创 2021-12-13 07:03:12 · 3706 阅读 · 1 评论 -
ping命令中ICMP协议包的分析
UDP收发以及所需要的ARP协议已经全部实现,接下来让咱们的协议栈支持ping,俗称能ping通。ping的请求和发送实际是ICMP协议的一个子集,ICMP可以参考ICMP数据包结构_Focus_新浪博客在IP头中ICMP协议的标识是01,其ICMP头结构是用C语言表示为:// ICMP headertypedef struct _tagX_icmphdr{ unsigned char i_type; //类型 unsigned char i_code; //代码 uns原创 2021-12-12 18:00:20 · 3567 阅读 · 1 评论 -
UDP CHECK SUM实现中有奇数字节的实现方式
CHECK SUM校验和CRC校验相比简单之处就是每相加的16个BIT的字可以不论先后顺序。在UDP的CHECK SUM计算实现中,这地点就允许我们想算出来UDP报文内容的SUM,之后再加上UDP头部的各个16位字算出来最红CHECK SUM.无论IP还是UDP的字节个数都是偶数,也就是有整数个16位字。但是UDP的报文可以是奇数个字节,我们这里在算到最后一个报文的时候要做一下处理,之后得到结果才能去和UDP头部的其他16位字相加求和。module cal_byte_sum (input clk原创 2021-12-12 07:52:05 · 517 阅读 · 0 评论 -
wireshark中开启UDP的check sum校验的方法
在我的verilog写的UDP协议栈中实现udp的check sum的生成,因为要便利所有udp报文生成后加在udp的头部,所以要设置一个RAM进行此UDP包的缓存,这样消耗更多硬件资源并且加大了延迟,可以说这是唯一部分使用到了ram块的操作,其他的实现比如ip和mac以及ether都是zero copy。默认的wireshark对udp的check sum是不检查的,这让我很觉得出力不讨好。我搜索了一下,原来wireshark也可以校验udp的check sum,需要做如下设置才检查。.原创 2021-12-12 06:21:51 · 4287 阅读 · 1 评论 -
UDP实现的下板子运行之2
书接上篇。这篇我们主要抓图一下,展示整个上篇开头所描述的过程。写这篇文字的时候代码已经全部调试通过了,这里只是抓图分析和展示。上图,红色框内第一条:板子要给192.168.3.11发送UDP包,但是不知道其物理地址(MAC地址),就在发送物理地址48个1的局域网ARP广播请求。红色框内第2条,电脑主机收到这个广播,对比IP是自己的IP,就回复了你要找的192.168.3.11的物理地址是 00.1b...58.红色框内第3条,板子将32个字节组装成UDP包发给PC。从时间上看..原创 2021-12-12 03:53:38 · 401 阅读 · 0 评论 -
UDP实现的下板子运行之1
已经在昨天下午实验通过UDP包传输给PC。使用的是一块ALTERA的板子,芯片是RTL8211EG:上图用的是一块我自己设计的开发板的一个打样板。上图是设置PC电脑的连接网口IP为.11,咱们FPGA板的IP地址是.22 .实现的大体过程如下:我们再回顾一下一个UDP包从FPGA板子发到电脑的过程。1,UDP发送请求到IP层,IP层传递到MAC管理层。2,MAC管理层从ARP_CACHE里面找IP对应的UDP,没有找到进入3,如果找到进入X3,设置ARP_GE..原创 2021-12-11 06:21:59 · 415 阅读 · 0 评论 -
使用DC FIFO来实现不同时钟区域的数据传递
FIFO我们一般的理解是缓存,也就是收发不能完全周期同步,先放在里面保存一下,保存的逻辑是先进来的先出去,这种缓冲队列的思路尤其适合于数据流特征的数字系统。在双时钟使用的FIFO不但具有上述缓冲功能,并且还可以实现数据的时钟区域穿越,这就比较厉害了~~~。实现数据在不同时钟区域的穿越是异步设计中比较关键的问题,而FIFO就这样轻易解决了(当然具体实现时候还要配合必要的约束),所以就有了以异步时钟区域数据传递为目的的应用。这其实是弱化了DC_FIFO的FIFO缓冲功能,发挥了DC_FIFO的双时钟数据穿越原创 2021-12-11 05:32:48 · 662 阅读 · 0 评论 -
一个DC FIFO的仿真实验
咱们FPGA里面开发遇到FIFO一般分单时钟和双时钟FIFO,双时钟FIFO是读写各自不同的时钟。由于时钟相位频率关系不可预知,所有也有人叫做异步FIFO。真正的异步FIFO不是这样,是没有时钟的,写入信号通过写信号的上升边缘实现,类似早期的asram。双时钟FIFO的实现有两大重点:使用格雷码,跨域时钟域要打两个拍子。这其实不就是CDC的基本原则嘛。格雷码能保证多位中每次只有一个BIT发生变化,打两个拍子能防止亚稳态。这样能将跨越时钟的数据出错概率降到最低。这两个重点主要是用在信号传递部分,而具体的数原创 2021-12-10 10:35:18 · 1169 阅读 · 0 评论 -
在仿真环境使用两个UDP实体实现全栈仿真的方法:实例分析
书接上篇。有了上篇分析,这篇主要上图,实现以下这个过程。仿真运行后,我们要找个起点来观察,一般是从后往前,也就是看结果是否正确,不正确再往前推理找源头。另外一种起点是中最关键的控制部分,分析他的状态转换。这里我们找到mac_hub这个mac管理层的状态机,wire arp_in_sending = (s_udp_ip == sending_arp_ip ) && ( sending_time_cntr != ARP_TIMEOUT ) ;always@(posedge原创 2021-12-09 09:46:55 · 882 阅读 · 0 评论 -
在仿真环境使用两个UDP实体实现全栈仿真的方法:情景分析
书接上篇。我们进行仿真的情景是不断发送数据包给B。在仿真前我们先想想具体经历的情景。1,上层用户发送接口只提供以下几个数值给实体A:接收方的IP和UDP端口号以及我的UDP端口号。(具体这个我的端口好的用途大家可以灵活定义,比如希望对方收到我这个报文后的返回内容发给我这个端口号)。2,上层用户将UDP报文和对方IP以及双方端口号发给UDP层进行打包,因为要生成UDP的check sum,并且蹩脚的是这个checksum在udp报文内容的前面,所以要先换成你报文计算出结果再将check sum的数原创 2021-12-09 07:21:58 · 612 阅读 · 0 评论 -
在仿真环境使用两个UDP实体实现全栈仿真的方法:实验设置
书接上篇。这个仿真第一个实验就是要做实体A发送数据给实体B,顶层的verilog代码如下:module tb_top ; wire [31:0]my_a_ip ={8'd192,8'd168,8'd0,8'HAA} ;wire [47:0]my_a_mac =48'HA1A2A3A4A5A6;wire [31:0]my_a_udp_port = 'h1234 ;wire [31:0]my_b_ip ={8'd192,8'd168,8'd0,8'HBB} ;wire [47:0]my原创 2021-12-09 07:06:10 · 768 阅读 · 0 评论