ZYNQ使用AXI4-HP接口总线读取DDR中的数据
创始人
2024-01-21 03:10:17

一、前言

最近笔者在做项目的时候需要使用zynq中的AXI4-HP总线在PL端读取DDR中的数据这种功能,但是网上很多历程对于这方面只是创建了一个官方提供的IP核用于测试,并且每次写入和读取的长度为4K字节。所以为了满足我自己的项目需求,笔者将官方提供的测试IP核上做修改,主要实现一下功能:

1、上升沿使能读取数据。

2、读使能后,IP核需要从基地址开始,突发读取X次(X数量可控)

3、内置一个同步FIFO将读出的数据暂存在FIFO中。

二、IP核修改过程

第一步:创建一个官方提供的带AXI4的IP核。

可得到两个文件。(创建过程略,网上有很多教程)

其中AXI4_v1_0.v是IP核的顶层文件,AXI4读写逻辑主要在AXI4_v1_0_M00_AXI.v文件中。 

创建完成后打开AXI4_v1_0_M00_AXI.v文件,输入的位置增加两个信号分别为

BURST_NUM突发总次数
RST_FIFOFIFO复位信号

其中BURST_NUM信号为上述的X数量即,读使能后需要突发读的总次数。

第二步:修改读取/写入总长度

官方生成IP核规定了读写最长为4K字节,我们如果需要大数据量的话就需要修改这个读写数据量的总长度。将 C_MASTER_LENGTH 参数修改为22,该参数意为读/写遍历长度的位宽。22bit位宽代表可寻址4194303字节。(在178行)

第三步:修改突发读计数完毕条件

在下图所示的always中修改(718行)

 以及最后的reads_done信号的使能条件(892行)

第四步:修改控制状态机

找到控制状态机的位置,修改状态机(737行)

1、 在IDLE状态中调整为触发后跳转至INIT_READ状态

2、INIT_READ状态中,将读取完毕后状态跳转为INIT_COMPARE即可

	  //implement master command interface state machine                                                        //状态机-控制接口                                                                                                     always @ ( posedge M_AXI_ACLK)                                                                            begin                                                                                                     if (M_AXI_ARESETN == 1'b0 )                                                                             begin                                                                                                 // reset condition                                                                                  // All the signals are assigned default values under reset condition                                mst_exec_state      <= IDLE;                                                                start_single_burst_write <= 1'b0;                                                                   start_single_burst_read  <= 1'b0;                                                                   compare_done      <= 1'b0;                                                                          ERROR <= 1'b0;   end                                                                                                   else                                                                                                    begin                                                                                                 // state transition                                                                                 case (mst_exec_state)                                                                               IDLE:                                                                                     // This state is responsible to wait for user defined C_M_START_COUNT                           // number of clock cycles.                                                                      if ( init_txn_pulse == 1'b1)            //===========上升沿触发一次事务                                          begin                                                                                         mst_exec_state  <= INIT_READ;      //触发后状态机跳转至读操作                                                        ERROR <= 1'b0;compare_done <= 1'b0;end                                                                                           else                                                                                            begin                                                                                         mst_exec_state  <= IDLE;                                                            end                                                                                           INIT_WRITE:                                                                                       // This state is responsible to issue start_single_write pulse to                               // initiate a write transaction. Write transactions will be                                     // issued until burst_write_active signal is asserted.                                          // write controller                                                                             if (writes_done)                                                                                begin                                                                                         mst_exec_state <= INIT_READ;//                                                              end                                                                                           else                                                                                            begin                                                                                         mst_exec_state  <= INIT_WRITE;                                                              if (~axi_awvalid && ~start_single_burst_write && ~burst_write_active)                       begin                                                                                     start_single_burst_write <= 1'b1;                                                       end                                                                                       else                                                                                        begin                                                                                     start_single_burst_write <= 1'b0; //Negate to generate a pulse                          end                                                                                       end                                                                                           INIT_READ:                                                                                        // This state is responsible to issue start_single_read pulse to                                // initiate a read transaction. Read transactions will be                                       // issued until burst_read_active signal is asserted.                                           // read controller                                                                              if (reads_done)        //==============读操作是否已经完成                                                                         begin                                                                                         mst_exec_state <= INIT_COMPARE;                                                             end                                                                                           else                                                                                            begin                                                                                         mst_exec_state  <= INIT_READ;                                                               if (~axi_arvalid && ~burst_read_active && ~start_single_burst_read)                         begin                                                                                     start_single_burst_read <= 1'b1;                                                        end                                                                                       else                                                                                         begin                                                                                      start_single_burst_read <= 1'b0; //Negate to generate a pulse                            end                                                                                        end                                                                                           INIT_COMPARE:                                                                                     // This state is responsible to issue the state of comparison                                   // of written data with the read data. If no error flags are set,                               // compare_done signal will be asseted to indicate success.                                     //if (~error_reg)                                                                               begin                                                                                           ERROR <= error_reg;mst_exec_state <= IDLE;                                                               compare_done <= ~compare_done;                                                                          end                                                                                             default :                                                                                         begin                                                                                           mst_exec_state  <= IDLE;                                                              end                                                                                             endcase                                                                                             end                                                                                                   end //MASTER_EXECUTION_PROC    

第五步:添加同步FIFO

打开AXI4_V1_0.文件即顶层文件,在文件中添加一个同步FIFO的IP核并使能data_count信号。FIFO核接线如图所示

 最后在顶层文件中添加以下接口

信号介绍
ext_rd_en输入,外部读FIFO使能
ext_rd_data输出,FIFO读数据
ext_count输出,FIFO中数据量
BURST_NUM输入,AXI4突发次数

最后

该IP核是为了解决笔者在项目中所遇到的问题,笔者水平有限如有错误欢迎指正。源文件以上传0积分下载仅供参考。

https://download.csdn.net/download/qq_24025329/87018990

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
进口奶粉的排名 荷兰奶粉十大排... 越来越乱的国内奶粉市场让很多宝妈宝爸都不知道该如何选择奶粉品牌,宝宝的安全是第一位,奶粉的质量以及口...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
不用扬鞭自奋蹄 乘势而上千帆竞... 思明区正全力向“两个进位”目标发起冲刺,努力为建设高素质高颜值现代化国际化的厦门作出“思明贡献”。(...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...