ZYNQ PS 通过 AXI_IIC 实现 EEPROM 数据高效存储与验证

vivado 中的一个三态问题(封装IIC的axi总线IP) 前几天一直在调自己写的AXI总线IIC IP核,本想着很简单的东西,硬是搞了好几天。主要是不太熟悉vivado的开发,具体就是三态的问题!!三态要放在最顶层的.v文件中,我的就是封装在IP里面,然后调试好久,打开综合后的文件才发现一直就是个OBUF,根本不是三态。建立了个新工程后调用了原装的AXI IIC后发现就是在最顶层中把信号接入IOBUF中,虽然不知道这样是什么原理,但想他这样写肯定有他的道理 阅读详情

1. 为什么选择 ZYNQ PS 的 AXI_IIC 来操作 EEPROM?

大家好,我是老张,在嵌入式这行摸爬滚打十几年了,从早期的单片机到现在的异构SoC,各种存储器件用得不少。今天想和大家聊聊一个非常经典且实用的场景:用 ZYNQ 处理系统(PS)里的 AXI_IIC 控制器,去高效、可靠地读写 EEPROM。你可能觉得,I2C读写EEPROM不是单片机时代就玩烂了的基础操作吗?没错,但当你把它放到 ZYNQ 这种“大杀器”上,特别是结合了AXI总线协议后,整个事情的玩法、稳定性和效率,就完全不一样了。

先说说我为什么推荐这个方案。在很多嵌入式项目里,比如工业控制器、智能网关或者一些需要掉电保存关键参数(校准数据、设备序列号、运行日志)的设备中,EEPROM(电可擦可编程只读存储器)依然是首选。它价格便宜、接口简单(通常就是I2C或SPI)、数据非易失。而 ZYNQ 芯片,它内部集成了双核ARM Cortex-A9处理器(这就是PS部分)和可编程逻辑(PL部分),功能强大。很多时候,我们完全可以用PS自带的硬核外设来干活,没必要去PL那边用逻辑资源“软核”模拟一个I2C控制器,既节省了宝贵的PL资源,又保证了性能和可靠性。PS端的这个I2C控制器,通过AXI总线与ARM内核通信,这就是 AXI_IIC IP核。它本质上是一个将标准的I2C控制器包装成符合AXI4-Lite总线协议的IP,让ARM可以像访问内存一样,通过读写寄存器来轻松控制I2C时序。

那么,这个方案“高效”在哪里呢?第一是开发效率高。Xilinx SDK(或现在的Vitis)提供了完善的驱动库(xiic.h, xiic.c),我们不需要从零开始写底层的时序波形,直接调用封装好的函数就行,大大降低了出错概率和调试时间。第二是运行效率高。AXI_IIC控制器内部有FIFO(先入先出缓冲区),支持中断和轮询两种模式。这意味着在进行连续读写时,ARM内核可以一次性发送一批数据到FIFO,然后由I2C控制器自动完成发送,期间CPU可以去处理其他任务,减少了CPU的占用率。对于需要频繁读写配置参数的实时系统,这点优势非常明显。

2. 动手之前:硬件连接与Vivado工程搭建

理论说再多,不如动手搭一遍。在开始写代码之前,我们必须把硬件环境和Vivado工程配置好。这里我以常用的ACZ702开发板(核心芯片是XC7Z020)为例,板子上通常自带一个AT24Cxx系列的EEPROM芯片,通过I2C总线连接到了ZYNQ PS的MIO引脚上。

第一步,检查原理图,确认连接。 这是最基础也最容易出错的一步。你需要找到开发板原理图,确认EEPROM的I2C信号线(SDA和SCL)具体连接到了ZYNQ PS的哪两个MIO引脚上。比如,我手头的板子可能是连接到MIO 14(SDA)和MIO 15(SCL)。同时记下EEPROM的7位I2C器件地址,AT24C02通常是0x50(二进制1010000,最后一位读写位由硬件控制)。这一步千万不能错,否则后面全是白忙活。

第二步,在Vivado中创建Block Design。 打开Vivado,新建工程后,创建Block Design(BD)。首先,从IP Catalog里添加ZYNQ7 Processing System核。双击配置它,在MIO Configuration -> I/O Peripherals -> I2C 0前面打勾,使其使能。然后在下方的MIO选项卡中,找到I2C 0,将其SDA和SCL信号分别分配到你在原理图上查到的具体MIO引脚号(比如14和15)。这里有个小坑要注意:ZYNQ PS的I2C控制器时钟需要配置。在Clock Configuration -> PL Fabric Clocks中,确保给FCLK_CLK0一个合适的时钟(比如50MHz或100MHz),这个时钟会作为AXI总线时钟。同时,在PS-PL Configuration -> General -> Enable Clock Resets中,确保FCLK_RESET0_N使能,我们后续的软复位可能会用到。

第三步,添加并配置AXI IIC控制器IP核。 光使能PS的I2C外设还不够,我们需要一个“翻译官”,把ARM的AXI总线访问“翻译”成对I2C控制器的寄存器操作。这个“翻译官”就是AXI IIC IP核。从IP Catalog搜索并添加AXI IIC到BD中。双击它进行配置,有几个关键参数:

  • IIC Frequency:这里设置的是你期望的I2C总线时钟频率,比如100 kHz。对于EEPROM,标准模式(100k)或快速模式(400k)都可以,具体要看你的EEPROM芯片手册支持的最高速率。
  • Ten bit address
ZYNQ PS 基于 AXI_IIC 的 EEPROM 读写 AXI_IIC 阅读详情

相关推荐

AXI_IIC读写操作

其实在之前调试过一次AXI_IIC,没调试通,碍于赶进度,就直接使用了zynq-PS侧的IIC,就一直搁置着了,这次抽空将这部分内容继续调试下去,这一次没花多少时间就调通了,现在将我的调试过程,经历,以及参考文档如下: 参考文档:pg090-axi-iic.pdf 参考链接:https://forums.xilinx.com/t5/Design-and-Debug-Techniques-Blog/IIC-Protocol-and-Programming-Sequence/ba-p/1072248 上面的这个

qq_32134427的博客 1万+

ZYNQ PS 基于 AXI_IIC 的 EEPROM 高效数据存储与验证方案

本文详细介绍了在ZYNQ PS端基于AXI_IIC IP核实现EEPROM高效数据存储与验证的完整方案。内容涵盖硬件连接、Vivado工程搭建、核心驱动函数封装,并重点阐述了包含智能分页写入、数据读回对比及错误处理的健壮验证流程,旨在帮助开发者构建可靠的非易失性存储系统。

weixin_29191669的博客 114

5分钟搞定ZYNQ的I2C通信:用AXI_IIC驱动24C02 EEPROM

本文提供了一份详尽的ZYNQ平台AXI_IIC驱动24C02 EEPROM的实战指南。内容涵盖从Vivado硬件工程创建、AXI_IIC IP核配置,到Vitis SDK中驱动层封装与应用测试的完整流程,并分享了关键的调试技巧与常见问题排查方法,旨在帮助开发者快速实现稳定的I2C通信与数据读写。

jenkins8butler的博客 299

使用Xilinx AXI I2C初始化 Si570的方法

通过写TX_FIFO的start 位,启动动态操作流程;在AXI I2C总线操作中,Master需要输出高电平时,直接将T置1,通过外部总线上拉输出高,只有需要输出低电平时,将T置0,内部输出配置0,驱动总线。5)根据3)如果是读,则开始从总线上获取数据,并按照配置的Counter递减,当减到0时,将CR TXAK置位,结束读操作;如果是写操作,在TX_FIFO中写入 I2C设备地址后,接下来在TX_FIFO中写入待发送数据;如果是读操作,在TX_FIFO中写入 I2C设备地址后,写入需要读取的数据长度;

inorisama的博客 2591

FPGA实战:AXI_IIC读写EEPROM避坑指南(附完整代码)

本文详细介绍了FPGA实战中AXI_IIC读写EEPROM的避坑指南,包括环境搭建、IP核配置、寄存器操作、单字节读写实战及调试技巧。特别针对时序问题和状态判断提供实测解决方案,帮助开发者快速实现可靠通信。附完整代码,适用于工业控制和传感器通信领域。

weixin_29172201的博客 419

ZYNQ配置IIC接口读取eeprom和iictool使用

1,对于pl_iic_original.v,读写地址WRITE_READ_ADDR,写数据WRITE_DATA是在程序中固定的读开始,写开始,这两个信号是从按键PL_KEY1,PL_KEY2获得,读数据直接以PL端LED来显示。其中slv_reg0,slv_reg1,slv_reg2,slv_reg3分别在SDK软件中设置读写地址,写数据,写开始,读开始信号,这些数据设置好之后送往 AXI 总线。pl_iic_original.v,iic.v是当前要打包成AXI4 IP的新文件。

wangjie36的博客 4531

MicroBlaze系列教程(6):AXI_IIC的使用(24C04 EEPROM)

AXI IIC IP核使用实例,基于MicroBlaze软核处理器,以驱动EEPROM AT24C04为例,实现数据的读写。

whik1194的博客 4002

MicroBlaze系列教程:AXI_IIC的应用实例

然后,我们通过XIic_LookupConfig函数获取AXI_IIC IP核的配置信息,并使用XIic_CfgInitialize函数初始化IIC设备。请注意,上述代码中的AXI_IIC_0_DEVICE_ID是根据您在Vivado中为AXI_IIC IP核分配的设备ID而定的。请注意,上述代码中的AXI_IIC_0_DEVICE_ID是根据您在Vivado中为AXI_IIC IP核分配的设备ID而定的。接下来,我们将通过一个简单的示例来演示如何使用AXI_IIC接口读取和写入I2C设备的数据。

CodeMaven的博客 2286

告别以太网瓶颈:手把手教你为AI训练集群搭建InfiniBand网络(以NVIDIA DGX A100/H100为例)

本文详细指导如何为AI训练集群搭建InfiniBand网络,解决以太网瓶颈问题,特别针对NVIDIA DGX A100/H100系统。通过硬件选型、网络架构设计和性能调优,显著提升多机多卡训练效率,适用于大规模模型训练场景。

weixin_30336061的博客 309

STM32G0——USB虚拟串口

STM32G0用cubeMX配置实现USB虚拟串口

阿昌 2320

新手也能搞定!用ADS 2023从零设计一个超宽带Wilkinson功分器(附完整版图)

本文详细介绍了如何使用ADS 2023从零开始设计超宽带Wilkinson功分器,涵盖介质板参数设置、微带线计算优化、版图生成验证等关键步骤。通过实例演示和常见问题排查,帮助射频工程新手快速掌握功分器设计技巧,提升设计效率。

weixin_42692935的博客 476

如何在VSCode中无缝集成Azure OpenAI GPT-5-codex?保姆级配置教程

本文详细介绍了在VSCode中无缝集成Azure OpenAI GPT-5-codex的完整配置教程,涵盖环境准备、Azure资源创建、本地配置、VSCode插件安装及高级定制。通过Codex CLI和config.toml文件配置,开发者可快速实现AI辅助编程,大幅提升代码生成、错误诊断和文档编写效率。

weixin_29268637的博客 555

FreeModbus源码详解

本篇按照FreeModbus协议栈的工作流程,对源代码进行总结解析;FreeModbus协议栈作为从机,等待主机传送的数据,当从机接收到一帧完整的报文后,对报文进行解析,然后响应主机,发送报文给主机,实现主机和从机之间的通信; 1:demo.c中三个函数,完成协议栈的准备工作; eMBInit()函数:(mb.c) /*函数功能: *1:实现RTU模式和ASCALL模式的协议栈初始化; *2

2万+

ESP8266-Arduino网络编程实例-异步TCP客户端

本次实例将使用ESPAsyncTCP库实现一个简单的客户端。

视觉与物联智能 1740

【ARM CoreLink 系列 5.3 -- CI-700 SLC memory 系统组件详细介绍】

在 CI-700 系统级缓存(SLC)内存系统中,HN-F 节点负责管理缓存一致性和数据传输。每个 HN-F 节点可以发送三种类型的 Snoop 请求,以确保系统中多核处理器和缓存之间的一致性。CI-700 中的系统级缓存(SLC)内存系统通过 HN-F 节点支持 TrustZone® 技术。以下是 CI-700 支持的 SN 类型以及配置方法的简要介绍。ARM CI-700 系统级缓存(SLC)是一个分布式、主要排他性(mostly exclusive) 的最后一级缓存,集成在 HN-F 节点内。

CodingCos的博客 897

TC3XX - MCAL知识点(三十五):Tasking编译器下,Tc3xx的MCAL代码如何使用多核,多核中断、多核任务、多核外设之间的MCAL配置与代码例程

文章用于记录在裸机情况下使用多核Tc387芯片,如何高效运行以及正确的代码、工程属性、链接文件配置等问题,相互结合、相互影响的地方,以示后续使用记录。

梦想技术家 960

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: 论文实证分析系列(六):工具变量法的实战陷阱与规避策略(附 Python 代码)
下一篇: 鼎捷T100开发实战:Genero BDL INPUT语句的10个高效用法(附代码示例)
tensorflowjs6
博客等级 码龄3年 154粉丝 1495原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值