首页 > 其他分享 >DMA数据发送模块实现

DMA数据发送模块实现

时间:2023-07-05 16:25:29浏览次数:30  
标签:DMA 模块 -- s2mm FIFO 发送 read 信号 axis

DMA数据发送模块实现

发送模块的数据接口

  • 发送模块使用AXI Stream接口与DMA控制器通信,AXI Stream是一种简单的点对点数据流协议,主要包含以下三个信号:
    • valid:表示发送方是否有有效的数据。
    • ready:表示接收方是否准备好接收数据。
    • data:表示数据本身,可以是任意位宽。
  • 另外,AXI Stream接口还有一个可选的信号:
    • last:表示当前的数据是否是一帧数据的最后一个字节,用于标识数据边界。
  • 发送方是FPGA(PL),接收方是DMA控制器(PS),因此valid和last信号由FPGA控制,ready信号由DMA控制器控制。
  • 只有当valid和ready信号同时为高时,才表示一次有效的数据传输。

image

graph TD A[发送读开始命令] --> B[主控模块跳转到读状态并拉高value信号] B --> C{PS端是否ready?} C --是--> D[产生FIFO读使能信号并从FIFO中读取数据] D --> E{是否发送完所有数据?} E --是--> F[拉高last信号并跳回idle状态] E --否--> D C --否--> B
  • FIFO的读使能信号(buffer_rd_en)
    • 需要用value和ready的与运算来产生,因为只有当两个信号都为高时,数据才能正常发送出去
    • 这里假设FIFO用的是fast forward模式,即读使能来了之后,数据马上就能出来,没有延时
  • last信号的产生
    • 需要用一个寄存器(register)来记录FIFO内部的数据量,在每次read start为高时更新这个值
    • 需要用一个计数器(counter)来记录已经发送的数据量,在每次FIFO读使能为高时加1,在value为0时清零
    • 当计数器的值等于寄存器的值减1时,就把last信号拉高
1. 当read start信号为高时,跳转到read状态,拉高value信号,表示数据有效
2. 当value和ready信号同时为高时,产生FIFO的读使能信号,从FIFO里读出数据,并用一个计数器记录读出的数据个数
3. 当计数器的值等于FIFO内部的实时数据量(data count)时,拉高last信号,表示最后一个数据
4. 当last信号为高时,产生read finish信号,表示读取数据完成,跳转回idle状态,清零计数器
 例子
- 假设FIFO里有1000个数据,data count为1000
- 发出read start信号,主控模块跳转到read状态,拉高value信号
- PS端给出ready信号,FIFO产生读使能信号,从FIFO里读出第一个数据,并把计数器加一
- 重复上述过程,直到计数器达到999时,拉高last信号,表示最后一个数据
- PS端收到last信号后,给出read finish信号,主控模块跳转回idle状态,清零计数器

代码清单:

stream_tx

module  stream_tx(
        // system siganls
        input                   sclk                    ,       
        input                   s_rst_n                 ,       
        //
        output  wire    [63:0]  s_axis_s2mm_tdata       ,       
        output  wire    [ 7:0]  s_axis_s2mm_tkeep       ,       
        output  wire            s_axis_s2mm_tvalid      ,       
        input                   s_axis_s2mm_tready      ,       
        output  reg             s_axis_s2mm_tlast       ,      
        // 
        output  wire            buffer_rd_en            ,       
        input           [63:0]  buffer_rd_data          ,
        input           [ 5:0]  state                   ,
        input           [12:0]  buffer_data_count       ,
        output  wire            read_finish                    
);

//========================================================================\
// =========== Define Parameter and Internal signals =========== 
//========================================================================/

reg     [12:0]                  tx_cnt                          ;       

//=============================================================================
//**************    Main Code   **************
//=============================================================================
assign  s_axis_s2mm_tvalid      =       state[2];
assign  s_axis_s2mm_tkeep       =       8'hff;
assign  buffer_rd_en            =       s_axis_s2mm_tvalid & s_axis_s2mm_tready;
assign  s_axis_s2mm_tdata       =       buffer_rd_data;
assign  read_finish             =       s_axis_s2mm_tlast;

always  @(posedge sclk or negedge s_rst_n) begin
        if(s_rst_n == 1'b0)
                tx_cnt  <=      'd0;
        else if(s_axis_s2mm_tvalid == 1'b0)
                tx_cnt  <=      'd0;    
        else if(buffer_rd_en == 1'b1)
                tx_cnt  <=      tx_cnt + 1'b1;
end

always  @(posedge sclk or negedge s_rst_n) begin
        if(s_rst_n == 1'b0)
                s_axis_s2mm_tlast       <=      1'b0;
        else if(s_axis_s2mm_tvalid == 1'b1 && tx_cnt == (data_count-2))
                s_axis_s2mm_tlast       <=      1'b1;
        else
                s_axis_s2mm_tlast       <=      1'b0;
end

endmodule

标签:DMA,模块,--,s2mm,FIFO,发送,read,信号,axis
From: https://www.cnblogs.com/LiamJacob/p/17528850.html

相关文章

  • 1 opencv-python图像读写模块
    这个分类记录自己学习opencv的随笔文档,方便以后查询和复习。python-opencv环境配置网上教程很多,此处就不做赘述了,该文档记录opencv最基础的图像读写和显示,工具是jupyternotebook。1opencv中,图像读取函数是imread(filename,flags=None)参数说明:filename:读取图像的路径,通常支......
  • 坚固型3DMAG™A31315LOLATR-XZ-S-AR-10、A31315LOLATR-XY-S-SE-10霍尔效应 线性,旋转位
    A313153D磁性位置传感器IC是完全集成的坚固型3DMAG™霍尔效应磁性位置传感器IC,主要用于支持汽车、工业和消费类应用中的各种非接触式旋转和线性位置测量。此传感器IC符合AEC-Q1000级的要求,并根据ISO26262进行开发。这些标准使A31315成为了要求严格的汽车安全系统的理想选择,适......
  • Apache HttpClient库来发送HTTP请求和接收响应
    ​ 要使用ApacheHttpClient库来发送HTTP请求和接收响应,你需要按照以下步骤进行操作:导入HttpClient库:首先,在你的Java项目中添加ApacheHttpClient库的依赖。如果你使用Maven作为项目构建工具,可以在pom.xml文件中添加以下依赖项:<dependencies> <dependency>  <grou......
  • Apache HttpClient库来发送HTTP请求和接收响应
    ​ 要使用ApacheHttpClient库来发送HTTP请求和接收响应,你需要按照以下步骤进行操作:导入HttpClient库:首先,在你的Java项目中添加ApacheHttpClient库的依赖。如果你使用Maven作为项目构建工具,可以在pom.xml文件中添加以下依赖项:<dependencies> <dependency>  <grou......
  • 让python的lxml模块的xpath支持正则表达式
    python的lxml模块是处理xml文档的比较好用的工具,其中的xpath函数可以检索指定的元素,但是它不支持正则表达式,比如某个属性的值是否匹配某个正则表达式,就没有办法实现.不过可以利用它的自定义函数扩展功能来实现,如下代码所示:importrefromlxmlimportetreefromlxm......
  • 使用loguru模块将日志写入不同的文件
    #encoding=utf-8importtimefromfunctoolsimportwrapsfromloguruimportloggerlogger.add("log1.log",filter=lambdarecord:record["extra"].get("name")=="a",enqueue=True,catch=True)logger.add("log2.lo......
  • 【雕爷学编程】Arduino动手做(152)---BMI160 六轴陀螺仪模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • random模块
    说明1.要知道什么是伪随机数?什么是随机数的种子?2.伪随机数random的学习:2.1生成一个伪随机数randomint(start,end)、random()    2.2对序列处理:洗牌(shuffle)、随机选1个(choice)、生成序列(randrange) 示例1'''2伪随机数random的学习3random模块生......
  • pytest + yaml 框架 -46.支持模块级别和用例级别参数化
    前言对parameters功能做了优化,支持模块级别和用例级别参数化config中parameters参数化,作用域是整个模块级别用例中parameters参数化,作用域只针对单个用例v1.3.7版本优化此功能模块级别参数化config中parameters参数化,作用域是整个模块级别,test_a.yaml文件示例......
  • 接口缓存、定时更新、异步发送短信
    目录一、接口缓存二、双写一致性之定时更新celery的定时任务代码celery_task/home_task.pycelery_task/celery.py启动worker、beta三、异步发送短信步骤视图函数user/views.py任务celery_task/user_task.py四、异步秒杀逻辑前后端4.1前端Sckill.vue4.2后端视图类路由任务:celery......