杂记:逆向一块FPGA核心板

  最近太热了,实在无心看书。阵列书丢一边看不进去,还买了几本统计信号的甚至都没开始看(笑),躺在床上玩玩手机摆烂,看到某黄色APP上有老板卖拆机的板子,价格美丽,美中不足的是没有资料。大致跟老板确认了一下板子成色、来源就拍下来了,昨天正好到手里,今天寻思看看有没有可以折腾的可能。由于缺少相关资料,别说原理图了,连个管脚约束都没有,老老实实跑个逆向吧。

  其实买的时候很担心这个芯片是带锁的,但是我几乎没用听过有谁给Cyclone iv的芯片写fuse,这里小赌一把,焊了个牛角座浅试一把发现可以正常使用,赌博成功。由于我没有大功率的低压电源,这里从另一个FPGA板子上取电,测试发现FPGA功耗非常高,猜测应该把Transceiver全部用起来了,估计资源也起来了大半。


板载资源介绍

  板子正面的主要器件已经框出来了。

在这里插入图片描述

  红色框的是FPGA芯片,intel家里的,型号是EP4CGX110DF27I7。这个芯片资源可以,有109k个LE,5Mbit的memory bits,带8个锁相环。这个芯片带了8对收发器可以完成一些高速设计,不过我暂时应该用不到。其实这几年A家的芯片用的比较多,资料相当完善,但是I家的似乎没有那么丰富。

  橙色框的是美光的DDR SDRAM,这是一个第二代SDRAM,2.5V电源供电。而绿色框的芯片是LP2998,一个比较常见的VTT芯片,这个VTT芯片也可以为DDR3提供VTT电源。

在这里插入图片描述

  一般来说VTT芯片需要比较快速的瞬态响应以满足数据传输中电荷的Charge/Discharge,关于DDR的端接技术和相关设计可能以后会写点博文吧。目前我用的比较多的型号是TPS51200,这个VTT芯片在很多设计中都能看到。

在这里插入图片描述

  这张图是板上的46V32M16的内部框图,这是一个512Mbit的芯片,有4个bank,每个bank是8192x512的,对应行地址线是13条,列地址线10条(COL0是实现双边沿的),这个非常关键,后面使用DDR控制器的时候需要设置。这个板子上一共只有1个DDR非常遗憾,如果多点就好了。这个板子做做简单的图像处理,跑跑RISCV还是不成问题的。话说micron的手册写的真非常好,图也好看…在Cyclone iv FPGA中,只有位于TOP和BOTTOM BANK的DQ可以跑到150兆,用右侧的BANK只能跑到133兆,好在这个板子的DDR挂在BOTTOM。

  黄色框是一个LDO,这个LDO为FPGA内部模拟部分(PLL)供电,他的PSRR比较高可以提供比较干净的供电。蓝色框是一个128Bit的NOR FLASH,等效于EPCQ128,用于固化设计。草绿色的芯片是一个看门狗加上一个EEPROM,这个芯片可以提供上电复位和电源监控功能。


逆向

  观察板子发现,这个板子一共有4个连接器,每个连接器都是50x2P的,也就是拉了400个脚出来,全部测一遍工作量实在有些大。不过观察板子设计不难发现,设计者引出的全部都是差分对,如果我们一次能测得4个差分对,那么每跑一次就能得到8个pin。这里我采用的方法是让每个差分对的n输出一个特定频率的信号,利用频率分辨测得的4个管脚,这里手头刚还有一个之前做的选频表,这个东西本质是利用LTC1043制作的锁相放大器,刚好派上用场了。

在这里插入图片描述

  不得不说这个板子设计的还是比较到位的,一共8层,应该用的是S-G-S-V-G-V-S-G-S层叠,没用用特殊工艺(盲孔,盘中孔之类的)。FPGA的去耦相当到位用的0402,小体积的电容有更小的ESL,谐振点更高,能提供更好的去耦效果。这里去耦电容的大小一般设置有2种方法,第一种是经验法,为20~50倍的Cpd,这Cpd是器件的等效电容(含负载),第二种是PDN目标阻抗匹配法,需要使用电源完整性仿真工具做优化。bulk电容考虑到几乎要将全部管脚都扇出,所以放置距离较远。右侧是DDR,VTT的bulk太豪华了,有点过度设计,去耦同样也比较到位,

  这里有一个问题是如何确定时钟脚,观察晶振的位置在芯片上侧,凑巧的是在TOP SIDE只有唯一的两个时钟脚,于是成功迈出第一步。这里GXB_RX是瞎猜的,因为没用手段去测试它,只能大致确定差分对的位置,不过我应该用不到。经过3H的奋战,到凌晨基本已经走完了大半。

在这里插入图片描述


测试

  为了验证DDR的正确性,这里跑一个喜闻乐见的NIOS。

在这里插入图片描述

  这里最关键的是DDR Controller的配置。

在这里插入图片描述

  时钟给了150兆。

在这里插入图片描述

  这里没有46V32M16的模板,倒是有个16M16的,依葫芦画瓢改改列地址。

module NIOS_DDR1(input 				clk					,output		[1:0]	pio					,inout sdram_ck, sdram_ck_n, output sdram_cs, sdram_cke, sdram_ras, sdram_cas, sdram_we,output [12:0] sdram_addr,inout [15:0] sdram_dq,inout [1:0] sdram_dqs,output [1:0] sdram_dm,output [1:0] sdram_ba
);wire nrst;nios u0 (.reset_reset_n              (		nrst					),.clk_clk                    (		clk						),.pio_export                 (		pio						),.sdram_sysclk_clk           (								),.sdram_ex_local_refresh_ack (								),.sdram_ex_local_init_done   (								),.sdram_ex_reset_phy_clk_n   (								),.adram_mem_mem_clk          (		sdram_ck				),   .adram_mem_mem_clk_n        (		sdram_ck_n				), .adram_mem_mem_cs_n         (		sdram_cs				),  .adram_mem_mem_cke          (		sdram_cke				),   .adram_mem_mem_addr         (		sdram_addr				),  .adram_mem_mem_ba           (		sdram_ba				),    .adram_mem_mem_ras_n        (		sdram_ras				), .adram_mem_mem_cas_n        (		sdram_cas				), .adram_mem_mem_we_n         (		sdram_we				),  .adram_mem_mem_dq           (		sdram_dq				),    .adram_mem_mem_dqs          (		sdram_dqs				),   .adram_mem_mem_dm           (		sdram_dm				)     );assign nrst = (cnt == 4'b1110) ? 1'b0 : 1'b1;reg [3:0] cnt = 4'd0;always @(posedge clk) beginif(cnt != 4'b1111)cnt <= cnt + 1'b1;elsecnt <= cnt + 1'b0;endendmodule

  简单例化一下,然后写了一个小灯程序。

#include <io.h>
#include <unistd.h>
#include <system.h>
int main()
{IOWR(PIO_0_BASE,1,0x0003);while(1){IOWR(PIO_0_BASE,0, 0x0003);usleep(500000);  IOWR(PIO_0_BASE,0,0x0000);usleep(500000);}return 0;
}

  行云流水,一把跑通,香槟庆祝。目前没用想到特别有价值的应用,可能以后会画一个底板,或者给有缘人吧。

  板子后面有个彩蛋,一看英语课就在睡觉!Supply?Suplly!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/20337.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot集成MQTT

官网配置说明 MQTT Supporthttps://docs.spring.io/spring-integration/reference/html/mqtt.html#mqtt Spring integration交互逻辑 对于发布者&#xff1a; 消息通过消息网关发送出去&#xff0c;由 MessageChannel 的实例 DirectChannel 处理发送的细节。DirectChannel …

自动驾驶与智能网联场地测试一体化装备应用

自动化驾驶层级与结构 L1:能够辅助驾驶员玩车某些驾驶任务制动防抱死系统 (ABS),车身电子稳定系统 (ESP)等,这些配置就是L1级别的运用。 L2:部分自动化,在L2的级别里,必须要具备的是自适应巡航系统,主动车道保持系统自动刹车辅助系统以及自动泊车系统等系统。 L3:有条件…

【Android】从零搭建组件化项目

组件化系列文章介绍的内容稍微多了点&#xff0c;本着研究透这玩意的精神&#xff0c;从组件化的简介开始说起。 目录 简介组件化、模块化与插件化开始创建配置共享文件打包模式配置APT与JavaPoet 简介 什么是组件化&#xff1f; 将多个功能模板拆分、重组的过程。 为什么要使…

基于单片机智能衣柜 智能衣橱 换气除湿制系统紫外线消毒的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;液晶显示当前衣柜温湿度和柜门开启关闭状态&#xff1b;按键设置当前衣柜湿度上限值、衣柜门打开和关闭&#xff0c;杀菌消毒&#xff1b;当湿度超过设置上限&#xff0c;继电器闭合开启风扇进行除湿&#xff1b;进行杀菌消毒时&am…

量子近似优化算法(QAOA)入门(1):从量子绝热算法(QAA)角度的直观理解

文章目录 前言&#xff1a;量子计算的本质是测量一、基于量子逻辑电路的常用算法1.NISQ&#xff1a;Noisy Intermediate-Scale Quantum&#xff08;含噪声中等规模量子&#xff09; 二、量子绝热算法&#xff08;QAA&#xff1a;Quantum Adiabatic Algorithm&#xff09;1.QAA的…

爬虫入门07——requests中携带cookie信息

爬虫入门07——requests中携带cookie信息 对于需要登陆的网站如果不携带cookie是无法获取我们所需内容的就以查看我在CSDN中的订单为例&#xff0c;在登陆后可以查看到订单信息 而当我们使用Python代码发出请求时&#xff0c;是不携带cookie&#xff0c;因此无法拿到订单相关信…

查看某个三方依赖jar包是在哪个pom引入的(springboot+idea)

项目springboot1升级2版本&#xff0c;日志框架使用的是log4j&#xff0c;升级到springboot2版本某些依赖引入了logback依赖包&#xff0c;然后项目启动报错&#xff1a; 查看这个SLF4JLoggerContextFactory这个类是在哪个jar包下 使用idea的maven依赖图查看功能寻找是哪个p…

page_dewarp实现弯曲文本矫正

朋友们&#xff0c;如果你使用ocr&#xff0c;再识别的时候会遇到文本扭曲的问题&#xff0c;为了解决这个问题&#xff0c;需要进行弯曲文本矫正&#xff0c;这里推荐一个开源项目&#xff0c;可以使用上面的功能进行矫正&#xff0c;不过里面可能需要改动一些代码&#xff0c…

Go []uint8和string的爱恨情仇

先上代码&#xff1a; package mainimport "fmt"func main() {byteSlice : []uint8{52, 44, 51} // 示例字节切片str : string(byteSlice)fmt.Printf("byteSlice:%v\r\n", str) }// 执行-输出 byteSlice:4,3 干货&#xff1a; 在Go语言中&#xff0c;[]u…

【逻辑回归实例】

逻辑回归&#xff1a;从理论到实践 在本文中&#xff0c;我们将介绍一种被广泛用于二分类问题的机器学习模型——逻辑回归。我们将通过一个实例&#xff0c;深入解析如何在 Python 环境中实现逻辑回归。 源数据下载链接 1. 什么是逻辑回归&#xff1f; 逻辑回归是一种用于解…

怎么给pdf文件加密?pdf文档如何加密

在数字化时代&#xff0c;保护个人和机密信息的重要性越来越受到关注。PDF&#xff08;Portable Document Format&#xff09;是一种广泛使用的文件格式&#xff0c;用于共享和存储各种类型的文档。然而&#xff0c;由于其易于编辑和复制的特性&#xff0c;保护PDF文件中的敏感…

Django_自定义文件存储类并将图片上传到FastDFS

目录 将图片到FastDFS和浏览的流程图 使用自定义文件存储类 1、定义存储类 2、创建FastDFS的配置文件 3、修改settings.py配置 4、上传图片进行验证 4.1 定义一个包含ImageField字段的模型类 4.2 登录django的admin后台 4.3 上传图片 4.4 查看图片 源码等资料获取方…