
OpenOFDM_RX
通过研究github上openofdm项目,学习实践ofdm的接收机制,实现对wifi信号的接收和解调。
mcupro
这个作者很懒,什么都没留下…
展开
-
2022年新版openwifi学习试验之1:编译基于zedboard+fmcomms3的HDL项目生成BIT文件
2022年四月左右,openwifi进行了大的改版,发布了新的版本。这篇BLOG我根据openwifi官方的步骤,实现一下zedboard_fmcomms3平台下的软件编译。本BLOG就是我学习试验https://github.com/open-sdr/openwifi-hw这个页面中讲述的步骤,也是笔记,边做边记录,给大家分享可以让大家少走弯路。步骤1 :需要的软件: Pre-conditions: Xilinx Vivado (with SDK and HLS) 20.原创 2022-05-10 12:21:13 · 6190 阅读 · 7 评论 -
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 · 1272 阅读 · 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 · 1167 阅读 · 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 · 684 阅读 · 1 评论 -
一个同步FIFO的实现
代码如下:在读信号的下一个周期,数据出现。// ----------------------------------------------------------------------// Copyright (c) 2016, The Regents of the University of California All// rights reserved.// // Redistribution and use in source and binary forms...原创 2022-01-31 17:58:59 · 590 阅读 · 0 评论 -
关于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 · 1821 阅读 · 0 评论 -
GNURADIO中USRP组件的介绍
GNURADIO中USRP组件的介绍1,搜索组件USRP,可以看到SOURCE 和SINK组件。我们放置source和sink,之后数据段口链接起来。双击USRP_SOURCE看设置:这里我们看到有很多参数可以设置,这些参数都是传递给UHD的。一个一个看:OUTPUT TYPE : 输出类型,COMPLEX 是复数的意思,实际包含实部和虚部。我们一般选的是COMPLEX FLAOT32。...原创 2022-01-26 07:15:17 · 5650 阅读 · 3 评论 -
无中频软件无线电芯片AD9361的基本介绍
AD9361在咱们产品中的很多,这也是一个很典型软件无线电芯片架构。我们在这里从软件角度简单介绍一下:抛弃硬件细节,对于我们软件程序员来说面对的只有两个通路:数据通路和控制通路。先说控制通路,通过SPI读写AD9361的寄存器实现对芯片的控制,在实际实现时候官方给出了C函数直接调用,比如设置射频频率为2.4G我们之需要调用函数set_rf_frqunce(2.4E9),之后函数根据2.4E9计算出所需要的各个寄存器的数值,之后通过SPI口打下去给AD9361。这样下来就咱们虽然可以通过.原创 2022-01-26 07:07:46 · 11277 阅读 · 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 · 1900 阅读 · 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 · 1823 阅读 · 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 · 1736 阅读 · 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 · 1480 阅读 · 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 · 972 阅读 · 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 · 6666 阅读 · 0 评论 -
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 · 968 阅读 · 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 · 580 阅读 · 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 · 1213 阅读 · 0 评论 -
用C语言写的合并BOM和坐标文件的小工具
ALLEGRO画PCB的软件生成的坐标文件里面没有原件的参数数值,比如没有电容容量,电阻阻值。如下图:焊接厂生产的时候希望我在里面加上原件参数。我这边反复看了ALLEGRO设置,都无法在同一个文件输出左边文件和原件参数。要想可口,自己动手。我琢磨自己合并一下。打算和BOM单合并一下就可以了。基本思路就是从BOM单只提取原件标号和参数,保存成一个bom文件。之后程序遍历坐标文件每一行,处理每一行时候,找到标号之后从bom里面根据标号找到参数,之后将见参数加到这一行就OK。我们将BOM文件精简.原创 2021-12-15 10:35:31 · 2111 阅读 · 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 · 1453 阅读 · 0 评论 -
在UDP应用层面测试实现丢包的检测
我们已经已经做好在FPGA上的UDP的用户接口,也在PC上做好了UDP的收发函数,这里可以加上一些逻辑和代码实现UDP是否丢包以及是否错报的实验。首先来看开UDP接收的用户层面的接口:这里给出了udp长度,包头包尾分别用 sof和eof指示,还有我方以及对方的IP和端口。所有这些信号都在valid=1是有效。这很简洁的接口,写起测试模块很容易-------------为了实行包内数据数据校验我们就是设置每一包内的所有字节递加,为了判断出包是否丢失我们让每包第一个字节的数字也依次递加。原创 2021-12-14 07:30:47 · 4728 阅读 · 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 · 2095 阅读 · 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 · 394 阅读 · 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 · 3734 阅读 · 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 · 3607 阅读 · 1 评论 -
为何电脑发送的IP包和UDP的校验和都是错的
给WIRESHARP开启了校验之后发现电脑发出的UDP包其中IP包部分校验和和UDP部分校验和都是错的。如图:图中FPGA板子的IP地址是192.168.3.22电脑的IP是192.168.3.11. 我们看到FPGA 板子发出的UDP包中IP和UDP的CHECK SUM都通过了校验,而电脑发出的UDP包是黑色的,没用通过UDP校验。对我们实际指导意义是咱们FPGA的接受部分要有忽略CHECK SUM的开关,以兼容这些check sum不好好算的网络节点。我觉得可能电脑上有某个设置,可.原创 2021-12-12 14:39:35 · 1905 阅读 · 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 · 522 阅读 · 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 · 4382 阅读 · 1 评论 -
一个去尾不掐头的模块实现思路以及实例
在做实验用verilog编写RTL8211EG的接口代码时候我们遇到一个问题就是最后8个字节是多余的,这里我们就考虑去掉这8个字节。如上图,就是希望DV信号在蓝箭头处拉低。同时满足下图DV在第一个数据到来处依然为1.这实际是头部不变化,尾部去掉最后8个字节,记得有“掐头去尾”一词,咱们这是“去尾不掐头”这里所说的去掉实际就是控制一下DV(Data Valid)信号,使得在尾部多余8个字节出现的时候,作为DV=0将这8个字节忽略。单纯考虑尾部,将数据延迟8周期,DV不延迟就..原创 2021-12-12 05:41:05 · 505 阅读 · 0 评论 -
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 · 412 阅读 · 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 · 427 阅读 · 0 评论 -
使用DC FIFO来实现不同时钟区域的数据传递
FIFO我们一般的理解是缓存,也就是收发不能完全周期同步,先放在里面保存一下,保存的逻辑是先进来的先出去,这种缓冲队列的思路尤其适合于数据流特征的数字系统。在双时钟使用的FIFO不但具有上述缓冲功能,并且还可以实现数据的时钟区域穿越,这就比较厉害了~~~。实现数据在不同时钟区域的穿越是异步设计中比较关键的问题,而FIFO就这样轻易解决了(当然具体实现时候还要配合必要的约束),所以就有了以异步时钟区域数据传递为目的的应用。这其实是弱化了DC_FIFO的FIFO缓冲功能,发挥了DC_FIFO的双时钟数据穿越原创 2021-12-11 05:32:48 · 670 阅读 · 0 评论 -
双时钟先入先出队列DC_FIFO的时钟基本思路
数据实现时钟时钟区域穿越,也就是从一个时钟区域传递到另外一个时钟区域,要使用寄存器穿越(暂且用穿越,我词穷了~),必须注意两点:1,每次变化只有一位,这样是为了尽量减少另外一个时钟采样误差;2,要打两个以上拍子,这样防止到了目标时钟域后产生亚稳态(就是寄存器被不同的区域所采样得到的结果不一致)。以上两个条件中打两个拍子不是问题,主要是问题是传递寄存器一次只变化一位的规定(大家都遵守的最小出错率约定,尤其是在芯片设计中)。因为我们要传递的寄存器位数无法预知,内容更无法预知。在FPGA可以实现一种双时钟原创 2021-12-11 04:42:06 · 500 阅读 · 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 · 892 阅读 · 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 · 617 阅读 · 0 评论 -
LINUX下实现软件看门狗的思路
LINUX下软件模拟实现看门狗定时器 如果两次调用WDG的时间超过参数S秒,返回0,否则为1。#include<netinet/in.h> // for sockaddr_in #include<sys/types.h> // for socket #include<sys/socket.h> // for.原创 2021-11-28 06:45:47 · 802 阅读 · 0 评论 -
LINUX下TCP/IP客户端使用多线程的例子
#include<netinet/in.h> // for sockaddr_in #include<sys/types.h> // for socket #include<sys/socket.h> // for socket #include<stdio.h> ...原创 2021-11-28 06:35:26 · 1301 阅读 · 0 评论 -
OPENOFDM仿真:将FFT输入输出保存为文件
在openofdm的sync_long.v文件里面有FFT 模块,实现时域向频域的转换。每次给FFT模块输入16位(IQ各位1位)64组复数,得到IQ各为23位的64组复数。我们这里写点代码,将FFT模块的每此64组输入和64组输出记录下来保存在单独命名的文件并实现驶入输出的对应。首先我们要实现文件名的可以动态生成。这里思路是修改文件名称的后2个字节。1,动态生成文件名reg [40*8-1:0] lw_fft_in_name = "./sim_out/lw/lw_fft_inXX" ;...原创 2021-11-28 06:21:05 · 714 阅读 · 0 评论 -
同步以太网SyncE的初探
1,实现原理:以太网物理层编码采用FE(百兆)和GE(千兆)技术,平均每4个比特就插入一个附加比特,这样在其所传输的数据码流中不会出现超过4个1 或者4个0的连续码流,可有效地包含时钟信息。在以太网源端接口上使用高精度的时钟发送数据,在接收端恢复并提取这个时钟,可以保持高精度的时钟性能。从这个原理上讲,其他高速接口,serdes,等都可以从码流里面会恢复(校准)时钟。但是这个时钟提取工作应该是在底层芯片进行的。有的芯片支持这个时钟提取,有的芯片不支持。2,具体芯片的支持图中这个PHY芯.原创 2021-11-26 06:57:19 · 5124 阅读 · 0 评论 -
RIFFA之LINUX驱动学习之三:riffa_driver.c文件
上面分析到基本的读写操作通过ioctrl来调用对应的driver驱动的实现。riffa_driver.c比较大,52K,这里补贴全部源码,分析哪一段就截图哪一段。里面内容比较多,很多是linux套路化的代码,我们通过ioctrl传递的参数来搜索,直奔主题.我们搜索IOCTL_SEND,找到处理ioctrl的分支程序段:在处理IOCTL_SEND的时候我们看到实现用户数据拷贝到内核空间之后调用了chnl_send_wrapcheck,将riffa.c打包过来的参数一一传递过去。好的,那就跟进.原创 2021-11-24 23:13:10 · 2403 阅读 · 1 评论 -
openofdm的complex_to_mag_sq分析
module complex_to_mag_sq ( input clock, input enable, input reset, input signed [15:0] i, input signed [15:0] q, input input_strobe, output [31:0] mag_sq, output mag_sq_strobe);reg valid_in;reg [15:0] input_i;reg [...原创 2021-11-23 19:51:38 · 287 阅读 · 0 评论