绿叶落秋风
生命漫长而又短暂,时间永恒而又瞬变。
</div><!--end: blogTitle 博客的标题和副标题 -->
<div id="navigator">
新随笔
- 联系
- 订阅
- 管理
<div class="blogStats"> <span id="stats_post_count">随笔 - 106 </span>
文章 - 4
评论 - 1
阅读 -
45099</div><!--end: blogStats --> </div><!--end: navigator 博客导航栏 -->
</h1> <div class="clear"></div> <div class="postBody"> <div id="cnblogs_post_body" class="blogpost-body blogpost-body-html"><a name="_labelTop"></a><div id="navCategory" style="color:#152e97;"><p style="font-size:18px;"><b>目录</b></p><ul><li><a href="#_label0">PS-AXI-PL流水灯设计(2)</a><ul><li><a href="#_label0_0">1、实验原理</a></li><li><a href="#_label0_1">2、实验操作</a></li><li><a href="#_label0_2">3、实验结果</a></li></ul></li></ul></div><p> </p><hr style="height:1px;border:none;border-top:1px dashed #0066CC;">
PS-AXI-PL流水灯设计(2)
1、实验原理
承接上一次的实验,这里对AXI的总线结构做出分析,将AXI的理论具体对应到设计上去。为后面自己设计AXI的发送和接受器做好准备。
2、实验操作
(1)AXI中的寄存器变量
在不了解具体的AXI协议的条件下,如果想完成基本的AXI4总线的IP核,就必须明白AXI4总线存储数据的位置。AXI总线的数据在寄存器中,所有的操作也是基于寄存器的。一个简单的AXI总线必须能够接受数据并且储存在对应的寄存器中。vivado中提供的的寄存器操作是已经做好了的。这里只需要对对应的寄存器构建相应的联系就可以挂在AXI总线上。前面选择了四个寄存器。这里实际上只需要2个。一个用于接受数据,一个用于发送数据。能不能改名字呢?理论上可以,但是这会使该寄存器没有从地址。换言之,改了名字的寄存器不能在通过AXI总线访问。已经知道每个寄存器32位宽,所以只要不超过该宽度,一律取一个寄存器。
(2)连接PL时对应的逻辑。
对于PL中需要挂在PS上的信号,都要使用寄存器变量(可以为同名的wire变量)。如果后面可以自己定义AXI协议,则可以自定义寄存器的名字。这里暂时使用系统命名。理论上AXI上的寄存器除了访问地址其他的功能都是一样的,所以输入还是输出都是自己定义的。如果是做接受AXI的数据的寄存器,就可以作为PL的输入。
(3)构建IP的原理图
这里出现了一个小问题,文件丢失。注意IP核创建完成后要综合一下再打包。然后就可以调用自己的IP核来挂在AXI上了。下一步就是利用PS测试AXI打包的IP核可不可以实现PS通信。这个在下一步实验中会设计,现在暂时只是完成AXI总线的基本使用类型。
(4)初步理解AXI总线
第一个模块是axi_awready,第二个模块是axi_awaddr,第三个模块是axi_wready,第四个是寄存器的写入和读出,第五个是写响应,第六个是axi_arread,第七个是axi_arvalid,第八个是读地址。一共八个模块构成了一个简单的lite AXI4协议的收发。
这里把注释截取下来方便后面的分析:
//--------------1---------------------------------------------------- // Implement axi_awready generation // axi_awready is asserted for one S_AXI_ACLK clock cycle when both // S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is // de-asserted when reset is low.
//------------------2---------------------------------------------------------
// Implement axi_awaddr latching
// This process is used to latch the address when both
// S_AXI_AWVALID and S_AXI_WVALID are valid.//------------------3----------------------------------------------------------
// Implement axi_wready generation
// axi_wready is asserted for one S_AXI_ACLK clock cycle when both
// S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is
// de-asserted when reset is low.
//------------------------4------------------------------------------------------------
// Implement memory mapped register select and write logic generation
// The write data is accepted and written to memory mapped registers when
// axi_awready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. Write strobes are used to
// select byte enables of slave registers while writing.
// These registers are cleared when reset (active low) is applied.
// Slave register write enable is asserted when valid address and data are available
// and the slave is ready to accept the write address and write data.//---------------5------------------------------------------------------------------
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Implement write response logic generation </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> The write response and response valid signals are asserted by the slave </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> when axi_wready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> This marks the acceptance of address and indicates the status of </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> write transaction.
//-------------------6-------------------------------------------------------------------
// Implement axi_arready generation
// axi_arready is asserted for one S_AXI_ACLK clock cycle when
// S_AXI_ARVALID is asserted. axi_awready is
// de-asserted when reset (active low) is asserted.
// The read address is also latched when S_AXI_ARVALID is
// asserted. axi_araddr is reset to zero on reset assertion.//------------------7----------------------------------------------------------------
// Implement axi_arvalid generation
// axi_rvalid is asserted for one S_AXI_ACLK clock cycle when both
// S_AXI_ARVALID and axi_arready are asserted. The slave registers
// data are available on the axi_rdata bus at this instance. The
// assertion of axi_rvalid marks the validity of read data on the
// bus and axi_rresp indicates the status of read transaction.axi_rvalid
// is deasserted on reset (active low). axi_rresp and axi_rdata are
// cleared to zero on reset (active low).
//--------------------------------8-------------------------------------------------
// Implement memory mapped register select and read logic generation
// Slave register read enable is asserted when valid address is available
// and the slave is ready to accept the read address.这里大致了解一下一个基本的AXI工作模块如何工作,后面会对这几个模块具体分析。为后面自定义AXI收发模块打下基础。
3、实验结果
这次实验简单地打包了一下自定义的PL的AXI的IP核,并且初步看了一下AXI的组成构件。后面的实验也将以这两条主线来展开。一方面连接AXI总线,一方面推进实验验证设计的合理性。最后,在测试平台完成后,就可以利用解构的AXI协议来得到自定义外设。
欢迎在下方评论、转发、分享。00<div class="clear"></div> <div id="post_next_prev"> <a href="https://www.cnblogs.com/electricdream/p/13190506.html" class="p_n_p_prefix">« </a> 上一篇: <a href="https://www.cnblogs.com/electricdream/p/13190506.html" title="发布于 2020-06-24 22:49">AXI-自定义IP-PS设计</a> <br> <a href="https://www.cnblogs.com/electricdream/p/13196849.html" class="p_n_p_prefix">» </a> 下一篇: <a href="https://www.cnblogs.com/electricdream/p/13196849.html" title="发布于 2020-06-26 23:36">proteus的C51仿真</a>
</div><!--end: topics 文章、评论容器-->
</div><!--end: forFlow --> </div><!--end: mainContent 主体内容容器--> <div id="sideBar"> <div id="sideBarMain">
< 2021年5月 > 日 一 二 三 四 五 六 25 26 27 28 29 30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 随笔分类
(106)
FPGA(74)</h3> <ul> <li data-category-list-item-visible="true" style="display: block">
电路(12)</li> <li data-category-list-item-visible="true" style="display: block">
其他(11)</li> <li data-category-list-item-visible="true" style="display: block">
英文(9)</li> <li data-category-list-item-visible="true" style="display: block">
</li> </ul> </div> <div id="sidebar_postarchive" class="catListPostArchive sidebar-block"> <h3 class="catListTitle">
随笔档案
(106)
2020年9月(10)</h3> <ul> <li data-category-list-item-visible="true" style="display: block">
2020年8月(10)</li> <li data-category-list-item-visible="true" style="display: block">
2020年7月(26)</li> <li data-category-list-item-visible="true" style="display: block">
2020年6月(26)</li> <li data-category-list-item-visible="true" style="display: block">
2020年5月(34)</li> <li data-category-list-item-visible="true" style="display: block">
</li> </ul> </div> <div id="sidebar_imagecategory" class="catListImageCategory sidebar-block"> <h3 class="catListTitle">
相册
(6)
版图草稿(4)</h3> <ul> <li data-category-list-item-visible="true" style="display: block">
博客互联(1)</li> <li data-category-list-item-visible="true" style="display: block">
图说操作(1)</li> <li data-category-list-item-visible="true" style="display: block">
</li> </ul> </div> <div id="sidebar_这是一个用于连接相应的知识模块的" class="catList这是一个用于连接相应的知识模块的 sidebar-block"> <h3 class="catListTitle">
知识连接
博客互联</h3> <ul> <li data-category-list-item-visible="true" style="display: block">
立创eda</li> <li data-category-list-item-visible="true" style="display: block">
</li> </ul> </div>