马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 laokai 于 2012-6-21 00:42 编辑
1.整体逻辑构架
在FPGA内搭建N PLL,FFT一级简易MAC层。
在FPGA虚拟一个sdram接口与sdram 存储器进行交互。
简易的MAC与MII接口交互。
通过MII接口与PC机进行交互。
整体功能概括
PC机可以通过UDP包配置FPGA内部的 N PLL产生不同频率的正弦波,产生的正弦波送入1024点FFT运算器,得到1024点的数据经过MAC层被打包成UDP包丢给PC去显示。 PC机接到UDP包解析并把频谱绘制到软件窗口内。目的学习数字PLL实现方法,以及整体系统设计。
系统状态机 三个状态: IDLE 初始状态。 CONFIG_STATE 配置寄存器状态。 WORK_STATE
正常工作状态。 模块名称:State_ctrl 接口: Input Rst_n Input Sclk 是50M时钟, Input config_end, 配置寄存器全部配置完成标志。来自config_ctrl Output Init_end 初始化完成进入work状态 共享代码
系统时钟配置 2.1.
系统时钟内部逻辑使用50M 2.2.
PHY时钟25M分为两个1个是内部读buf用另外一个是给receiver的参考时钟,90-180相位差,根据PHY的要求来。 2.3.
Sdram 数据参考时钟50M。 3.
MII接口模块 3.1.
MII_trans_io Input rst_n Input sclk 50M作为数据交换用 Input tclk 25M MII接口发送数据参考参考时钟 Input clk_25M 读buf时钟。 Input tx_data_i 8bit 待发送的数据 Input tx_en_i 发送数据有效使能 Output tx_clk 发送数据参考时钟 Output tx_data_o 发送的数据4bit Output tx_en_o 发送数据有效使能。 使用1个1Kx8的buf进行时钟域转换和位宽转换 共享代码 3.2. MII_rec_io Input rst_n Input sclk 50M Input rx_clk Input rx_data[3:0] Input rx_data_en Output rx_d [7:0] Output rx_dv 接收使用1个1Kx8的buf进行时钟域转换和位宽转换 共享代码 4.
简易MAC模块 4.1.
MAC层把数据打包成UDP帧,UDP协议这里就不详细介绍了.想深入了解的可以看802.3协议,或者找个TCP/IP协议看下就明白了。 用一个case 语句就可以把udp包搞定。这里代码不共享,有兴趣的照着协议写下。 4.2.
协议里的checksum计算方法。 IP头部里checksum 计算例子 例如 随便取20byte IP头,以下是16进制数据 45 00 00 30 80 4c 40 00 80 06 00 00 d3 43 11 ac cb 11 12 32 第一步
按2byte一组把20byte数据求和 4500+0030+804c+4000+8006+0000+d343+11ac+cb11+1232=0003 47b4 这里结果有一个进位3 那么做加法直到结果为2byte数为止。 所以0003+47b4=47b7 取反此结果就得到checksum =~47b7=b848 共享代码 4.3. 802.3协议定义的8bit CRC32位校验并行算法实现 先把生成多项式列下 G(x) = x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 对应写成bit序列为
MSB 100000100110000010001110110110111 LSB,顺序就是根据x的幂的高低排的。 然后再用移位寄存器实现此生成多项式。
以上0-31是表示寄存器。 下面就好开始推导并行算法的实现了。 并行的推导其实就是把数据灌入此移位寄存器中,灌入8个数据bit后得到的异或方程就是此生成多项式8bit并行计算32bit循环校验位的方法。 下边只举例 解释C0-C31指的是移位寄存器初始化的数据,D0-D7是shift 8次shift到移位寄存器中的数据,下面只推导了2次移位还有6此没推大家推推看。 此模块不共享代码,首先如果共享出来大家就不会推导直接拿过来用,推导后再稍微看下802.3就可以把crc encoder decoder代码写出来。
推导过程的表格贴上来乱码,大家可以下载附件有详细的doc.
5.
自定义通信协议以及寻址空间 5.1.
简单定义两种通信包类型,通信数据包和通信配置包。这两个包只是定义在UDP包的基础上的,也就是UDP数据的格式。
Byte序号 | 数据包 | 通信包 | 备注 | 0 | 0xAA | 0xBB | 包标示 | 1~2 | 数据长度从第8字节算起,目前定义为0x3FF | 配置数据长度从第8字节算起 | 1字节addr[7:0] 2字节addr[15:8] | 3 | 数据帧编号 | 0x01 写 | 通信包:0x01表示读通信包0x10表示写通信包 | 0x10 读 | 4 | 保留 | 读写页起始地址见读写配置说明 | 可以读写配置数据数据包:如果是读配置的的反馈包,则地址为配置数据的页起始地址。如果是FFT数据那么此值保留。 | 5 | 6 | 保留字节 | 标志 | 标志00:配置数据,01:请求配置,02:配置结束,03:状态数据。 | 7 | 保留字节 | 保留字节 | 8-1031 | 数据 | 数据 | 1024byte 数据 |
数据帧编号 例如:FFT1024 有1024点的数据,可能需要2个数据帧才能发送完,那么此编号是标志帧数据是否属于同一组1024点数据。此编号根据产生1024数据组数递增。 读写配置说明 读写页地址是以页为基础的,每个page有256个byte数据。 系统寻址划分
Pageaddr | | | 0x0000~0x01FF | 16位宽开根号查找表数据0~65535的开方结果。 | 整数8bit小数8bit共16bit位宽w/r | 0x0200~0x0200 | 见配置PLL | | 0x0201~0xFFFF | 保留 | | | | |
配置PLL 第0x0200页的256byte是配置PLL数据
Byteaddr | | | 0x020000~0x020001 | 2byte配置R | w/r | 0x020002~0x020003 | 2byte配置 N | w/r | 0x020004~0x020005 | 2byte 配置LPF 参数K1 | w/r | 0x020006~0x020007 | 2byte配置LPF 参数 K2 | w/r | 0x020008~0x0200FF | 保留 | | Send_data_ctrl 模块功能
给PC发送FTT数据包
反馈状态寄存器数据给PC
给PC发送请求配置命令,以及发送配置结束命令。
现在实现了UDP协议 与简易MAC层 与PC通信
见视频视频还是不看了好..什么也看不清。晚上拍的太模糊..其实是手机太垃圾。
附件中有整体工程但是不包括CRC 编解码模块,在上边已经讲了推导方法,高手略过不用看了,想学习的可以看看802.3把crc写出来。加入CRC 模块后整体就可以与PC通信了。
dis_fft_v01.rar
(3.32 MB, 下载次数: 62 )
DOC
数字NPLL频谱显示器设计spec.pdf
(418.98 KB, 下载次数: 48 )
感兴趣的顶兄弟下,我会陆续把后边PLL以及FFT模块和上位机显示频谱软件写出来并共享出来。
有了xilinx的FPGA 无所不能其乐无穷啊! |