APB协议及APB_Slave设计

这篇具有很好参考价值的文章主要介绍了APB协议及APB_Slave设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、APB协议

原文:

APB协议及APB_Slave设计

翻译:

APB协议是一个低成本的接口,经过了优化,降低了功耗和接口复杂性。APB接口是简单同步无流水线的协议。每次传输花费至少两个周期完成。

APB接口设计是为了访问外围设备中的可编程控制寄存器。APB外设通常使用APB桥连接到内存系统。例如,AXI2APB桥可以用来连接一些APB外设到AXI内存系统。

APB传输是由APB桥发起。APB桥可以被认为是请求者。外设接口对于请求者响应。APB外设可以被认为是完成者。协议规范将需要请求者和完成者。

 二、APB接口信号

signal source width description
PCLK clock 1 PCLK is a clock signal. All APB signals are
timed against the rising edge of PCLK
PRSETn system bus reset 1

PRESETn is the reset signal and is active-LOW

PRESETn is normally connected directly to the
system bus reset signal

PADDR requester ADDR_WIDTH

PADDR is the APB address bus.

PADDR can be up to 32 bits wide

PSELx requester 1 The Requester generates a PSELx signal for each Completer. PSELx indicates that the Completer is selected and that a data transfer is required
PENABLE requester 1 PENABLE indicates the second and subsequent
cycles of an APB transfer
PWRITE requester 1 PWRITE indicates an APB write access when
HIGH and an APB read access when LOW
PWDATA requester DATA_WIDTH The PWDATA write data bus is driven by the
APB bridge Requester during write cycles when
PWRITE is HIGH.
PWDATA can be 8, 16, or 32 bits wide
PRDATA completer DATA_WIDTH The PRDATA read data bus is driven by the
selected Completer during read cycles when
PWRITE is LOW.
PRDATA can be 8, 16, or 32 bits wide
PREADY completer 1 PREADY is used to extend an APB transfer by
the Completer
PSLVERR completer 1 PSLVERR is an optional signal that can be
asserted HIGH by the Completer to indicate an
error condition on an APB transfer
PPROT requester 3 PPROT indicates the normal, privileged, or
secure protection level of the transaction and
whether the transaction is a data access or an
instruction access
PSTRB requester DATA_WIDTH/8

PSTRB indicates which byte lanes to update
during a write transfer. There is one write strobe
for each 8 bits of the write data bus.

PSTRB[n] corresponds to PWDATA[(8n + 7):(8n)].
PSTRB must not be active during a read transfer.

有些文章也将requester,completer说成master,slaver,意思是一样的。

  • APB2 :AMBA 2 APB
  • APB3 :AMBA 3 APB,比APB2多两个信号(PREADY,PSLVERR)
  • APB4 :AMBA 4 APB,比APB3多两个信号(PPROT,PSTRB)

特别说明:

APB协议及APB_Slave设计

写传输时,如果收到了错误信息,并不意味着外设中的寄存器没有被更新。

读传输时,如果收到了错误信号,数据是无效的。对于读到错误信号,不需要外设驱动数据总线置0。收到错误信号的主机仍然可以使用数据,从机不能依赖错误信号阻止对PRDATA的读取。

PPROT[2:0] 保护等级
[0]

1:私有传输

0:一般传输

[1]

1:不安全传输

0:安全传输

[2]

1:指令传输

0:数据传输

APB协议及APB_Slave设计

PSTRB 就是判断哪个字节有效的信号,手册上很专业的称为“稀疏数据传输” 。

三、传输

1、写传输无等待

APB协议及APB_Slave设计

2、写传输有等待

APB协议及APB_Slave设计

3、读传输无等待

APB协议及APB_Slave设计

4、读传输有等待

APB协议及APB_Slave设计

5、带有错误信号的写传输

APB协议及APB_Slave设计

6、带有错误信号的读传输

APB协议及APB_Slave设计

 平时几乎用到的都是APB3,很少用到PPROT和PSTRB。具体情况具体分析吧

四、apb_slave实现

1、代码如下:

module apb_slave(
    input wire pclk,
    input wire presetn,
    input wire pwrite,
    input wire psel,
    input wire penable,
    input wire [31:0] paddr,
    input wire [31:0] pwdata,

    output reg [31:0] prdata,
    output wire pready
    );

    parameter REG1_ADDR = 8'h00;
    parameter REG2_ADDR = 8'h04;
    parameter REG3_ADDR = 8'h08;

    reg [31:0] reg1;
    reg [31:0] reg2;
    reg [31:0] reg3;
    reg [31:0] invld_reg;

    wire apb_write_vld;
    wire apb_read_vld;

    assign pready = 1'b1;

    assign apb_write_vld = pwrite && psel && penable;
    assign apb_read_vld = (!pwrite) && psel && penable;

    always@(posedge pclk or negedge presetn)begin
        if(!presetn)begin
            reg1 <= 32'd0;
            reg2 <= 32'd0;
            reg3 <= 32'd0;
        end
        else if(apb_write_vld)begin
            case(paddr[7:0])
                REG1_ADDR : reg1 <= pwdata;
                REG2_ADDR : reg2 <= pwdata;
                REG3_ADDR : reg3 <= pwdata;
                default : invld_reg <= pwdata;
            endcase
        end
    end

    always@(*)begin
        if(apb_read_vld)begin
            case(paddr[7:0])
                REG1_ADDR : prdata <= reg1;
                REG2_ADDR : prdata <= reg2;
                REG3_ADDR : prdata <= reg3;
                default : prdata <= invld_reg;
            endcase
        end
        else
            prdata <= 32'd0;
    end
endmodule

2、testbench如下

`timescale 1ns/1ns;
module apb_slave_tb();
    reg pclk;
    reg presetn;
    reg pwrite;
    reg psel;
    reg penable;
    reg [31:0] paddr;
    reg [31:0] pwdata;

    wire pready;
    wire [31:0] prdata;

    reg [31:0] rdata;

    parameter REG1_ADDR = 8'h00;
    parameter REG2_ADDR = 8'h04;
    parameter REG3_ADDR = 8'h08;

    always #10 pclk = ~pclk;

    initial begin
        pclk = 1'b0;
        presetn <= 1'b0;
        pwrite <= 1'b0;
        psel <= 1'b0;
        penable <= 1'b0;
        paddr <= 32'd0;
        pwdata <= 32'd0;
        #123;
        presetn <= 1'b1;
        
        apb_write(REG1_ADDR,32'h33445566);
        apb_read(REG1_ADDR,rdata);
        #66;
        apb_write(REG2_ADDR,32'haabbccdd);
        apb_read(REG2_ADDR,rdata);
        #66;
        apb_write(REG3_ADDR,32'ha1b2c3d4);
        apb_read(REG3_ADDR,rdata);
        #1000;
        $finish;
    end

    task apb_write(input [7:0] addr,input [31:0] wdata);
        begin
            @(posedge pclk);
            
            pwrite <= 1'b1;
            psel <= 1'b1;
            penable <= 1'b0;
            paddr <= {24'd0,addr};
            pwdata <= wdata;

            @(posedge pclk);
            penable <= 1'b1;

            @(posedge pclk);
            pwrite <= 1'b0;
            psel <= 1'b0;
            penable <= 1'b0;
            paddr <= 32'd0;
            pwdata <= 32'd0;

            @(posedge pclk);
        end
    endtask

    task apb_read(input [7:0] addr,output [31:0] rdata);
        begin
            @(posedge pclk);
            pwrite <= 1'b0;
            psel <= 1'b1;
            penable <= 1'b0;
            paddr <= {24'd0,addr};

            @(posedge pclk);
            penable <= 1'b1;

            @(posedge pclk);
            rdata <= prdata;
            psel <= 1'b0;
            paddr <= 32'd0;

            @(posedge pclk);
        end
    endtask

apb_slave apb_slave_inst(
    .pclk           (pclk),
    .presetn        (presetn),
    .pwrite         (pwrite),
    .psel           (psel),
    .penable        (penable),
    .paddr          (paddr),
    .pwdata         (pwdata),

    .prdata         (prdata),
    .pready         (pready)
);

    initial begin
        $fsdbDumpfile("tb.fsdb");
        $fsdbDumpvars;
    end
endmodule

这里需要注意,时钟阻塞赋值,其他信号非阻塞赋值,这样才能保证时钟沿采样到的信号为上一刻的值。与设计思路相符合。

3、仿真结果

APB协议及APB_Slave设计 APB协议及APB_Slave设计文章来源地址https://www.toymoban.com/news/detail-447352.html

到了这里,关于APB协议及APB_Slave设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA-AMBA协议、APB协议、AHB规范、AXI4协议规范概述及它们之间的关系

    笔记记录,AMBA协议、APB协议、AHB规范、AXI4协议规范概述,只是概述描述,具体详细的协议地址传输、数据传输等内容将在下一章节详细说明。 AMBA(Advanced Microcontroller Bus Architecture)是一种由ARM公司提出的处理器总线架构,它定义了处理器、内存和外设之间的通信标准 。

    2024年02月04日
    浏览(34)
  • SPI协议的verilog实现(spi master slave联合实现)

    spi是serial peripheral interface的缩写,即串行扩展总线。SPI是单主设备通信,总线中只有一个主设备发起通信,能发起通信的设备称为主设备。当SPI主设备想读写从设备时,首先拉低对应从设备的ss线(低电平有效)。然后发送工作麦种到时钟线上,在相应的脉冲时间上,主设备

    2024年02月02日
    浏览(37)
  • Modbus通信协议介绍以及Modbus Poll、Slave软件使用介绍

    Modbus Slave是一个模拟Modbus协议从机的上位机软件,主要用于模拟测试跟其他主机设备通信的过程。与之成套存在的另一个软件--Modbus Poll,则是模拟Modbus协议主机的上位机软件。该软件内部封装Modbus协议,通过图形化界面使得操作更为简单。软件支持ModbusRTU、ASCII、TCP/IP协议。

    2024年02月09日
    浏览(44)
  • 【协议设计与实现】Linux环境下,如何从0开始设计并实现一个网络协议之一——需要考虑的因素

    🐚作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向) 🐳博客主页:花神庙码农 ,地址:https://blog.csdn.net/qxhgd 🌐系列专栏:TCP/IP协议 📰如觉得博主文章写的不错或对你有所帮助的话,还望大家三连支持一下呀!!! 👉关注✨、点赞👍、收藏📂、评论。

    2024年01月17日
    浏览(44)
  • 【AI选股】如何通过python调用通达信-小达实现AI选股(量化又多了一个选股工具,原文Chrome浏览器请改为Edge浏览器)

    ChatGPT火遍网络,那么有没有可以不用写公式就可以实现AI选股的方法?答案是有,今天我们就来试试通达信的小达,让小达按我们的要求去进行选股。 使用Chrome浏览器报错的请改为Edge浏览器,或者Firefox浏览器,参考如下文章: 【Python小技巧】browser_cookie3访问Chrome浏览器Co

    2024年02月11日
    浏览(100)
  • 粉丝提问:设计和实现一个TCP协议半连接的端口扫描程序

    某学生粉丝发来问题: 这个题目一看就知道这位同学是网络安全相关专业。 很多粉丝以为彭老师知识搞驱动的, 但是其实作为一个拥有多篇网络协议专利的老鸟, 网络知识还是比较擅长的! 应用层套接字、组网、网卡驱动都有所涉猎, 目前还缺Linux内核协议栈这块没深入

    2023年04月14日
    浏览(42)
  • Modbus RTU(Remote Terminal Unit)与RS-485协议(rs485)介绍(主站设备(Master)、从站设备(Slave))Modbus TCP、Modbus ASCII

    参考文章:ModBus协议 参考文章:一篇文章了解 RS485 和 MODBUS 的区别,它们有什么不同? Modbus RTU和RS-485是工业通信中常用的两种协议。Modbus RTU 是一种数据表示协议,而 RS-485 则是物理传输标准。尽管这两者有时被并列讨论,但它们在通信系统中的角色却大不相同。以下内容将

    2024年02月05日
    浏览(62)
  • 使用UDP协议实现—翻译服务器

    目录 前言 1.设计思路: 2.词库设计 3.设计客户端 4.设计服务端 5.编译客户端和服务端 6.测试结果 7.总结         上一篇文章中,我们使用UDP协议编码完成了一个简单的服务器,实现数据通信,服务器设计出来后目的不仅仅只是实现数据通信,而是根据客户端发过来的请求,

    2024年02月13日
    浏览(38)
  • 【如何训练一个中英翻译模型】LSTM机器翻译模型部署(三)

    【如何训练一个中英翻译模型】LSTM机器翻译seq2seq字符编码(一) 【如何训练一个中英翻译模型】LSTM机器翻译模型训练与保存(二) 【如何训练一个中英翻译模型】LSTM机器翻译模型部署(三) 【如何训练一个中英翻译模型】LSTM机器翻译模型部署之onnx(python)(四) 模型部

    2024年02月15日
    浏览(40)
  • 如何低成本的搭建一个真实的Kubernetes集群

    引言:kubernetes作为当前事实上的容器编排标准,其势头可谓是如日中天,然而,kubernetes一直以来被人诟病的就是其复杂的搭建成本,作为个人,除了用miniKube等工具在个人电脑上模拟一个集群,或者通过虚拟机模拟一个集群,但终归,真实集群和虚拟集群是不同的。我一直在

    2024年02月01日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包