AHB_Lite协议介绍

部署运行你感兴趣的模型镜像
关注、星标公众号,精彩内容每日送达
来源:网络素材

一、AHB_Lite协议介绍

    AHB(Advanced High-performance Bus)高速总线,接高速master设备,APB(Advanced Peripheral Bus)外设总线,用来接低速slave,AHB主要用于高性能模块(如CPU、DMA和DSP等)之间的连接,一个master可以有多个slave,AHB和APB之间通过一个AHB2APB桥转接。这里是实现一个AHB_Lite协议,相较于AHB_APB总线协议,AHB_Lite只有单主机,且没有HBUSREQ和HGRANT信号,同时从设备信号接口也简单许多

二、系统框架介绍

    主设备Master0利用AHB-Lite总线协议通过AHB Bridge访问四个APB从设备Slave0、Slave、Slave2和Slave3。每个从设备的地址空间如下:

Slave0: 0x0000_0000 ~ 0x0000_00ff;

Slave1: 0x0000_0100 ~ 0x0000_01ff;

Slave2: 0x0000_0200 ~ 0x0000_02ff;

Slave3: 0x0000_0300 ~ 0x0000_03ff;

令从设备地址空间的下边界为其地址的基址,假设每个从设备中有可访问APB寄存器16个,位宽均为32比特,16个寄存器的访问地址计算方式为 基址 +寄存器编号左移2位(byte 偏移)

主设备接口的数据读写采用AHB-Lite总线协议,并遵循如下时序规范:

从设备读写遵循APB时序规范:

三、代码设计

模块里包含Master 、Slave、Bridge设计

代码如下:

//-------------------------

//File Name:AHB_APB.v

//Designer:Liang Genyuan

//-------------------------

module AHB_APB(

HCLK,

HRESETn,

HWRITE,

HADDR,

HWDATAin,

       HRDATA,

       PRDATAin,

PWDATA

       );

input HCLK;

input HRESETn;

input HWRITE;

input [31:0] HADDR;

input [31:0] HWDATAin;

input [31:0] PRDATAin;

output[31:0] HRDATA;

output[31:0] PWDATA;

reg          PCLK;

wire         PRESETn;

wire          PWRITE;

reg          PSEL;

reg          PENABLE;

wire[31:0]    PADDR; 

reg[31:0]    PWDATA;

reg[31:0] PRDATA;

reg[31:0]    HWDATA;

reg[31:0]    HRDATA;

reg         PSELS0;

reg         PSELS1;

reg         PSELS2;

reg         PSELS3;

reg[31:0] HADDR_Reg;

reg HWRITE_Reg;

reg[3:0]  HSEL_Reg;

reg[31:0] HWDATA_Reg;

reg[31:0] PRDATA_Reg;

reg HREADY;

reg   [3:0] state_c     ;

reg   [3:0] state_n     ;

parameter  IDLE = 4'b0000 ;

parameter  SETUP = 4'b0001;

parameter  ENABLE = 4'b0010 ;

//PCLK二分频

always @(posedge HCLK) begin

if(!HRESETn)begin

PCLK<=0;

end

    else if(HCLK==1'b1)begin

      PCLK<=~PCLK;

    end

end

//slave选择

`define S0BASE 4'b0000

`define S1BASE 4'b0001

`define S2BASE 4'b0010

`define S3BASE 4'b0011

wire[3:0] HSEL; 

assign HSEL = HADDR[11:8];

always  @(*)begin

    if(!HRESETn) begin

        PSELS0 = 1'b0;

        PSELS1 = 1'b0;

        PSELS2 = 1'b0;

        PSELS3 = 1'b0;

    end 

    case (HSEL)

        `S0BASE : 

          PSELS0 = 1'b1;

        `S1BASE :

          PSELS1 = 1'b1;    

        `S2BASE : 

          PSELS2 = 1'b1;

        `S3BASE : 

          PSELS3 = 1'b1;

    endcase 

end

//slave读写

wire[5:0]   reg_num;

reg [3:0]   PSELx;

assign reg_num= PADDR[7:2];

assign PRESETn=HRESETn;

assign PADDR=HADDR_Reg;

assign PWRITE=HWRITE_Reg;

always @(posedge PCLK or negedge PRESETn) begin

    if(!PRESETn)begin

PWDATA<=0;

PRDATA<=0;

end

else if(PWRITE)begin

if((state_c==SETUP)||(state_c==ENABLE))begin

PWDATA<=HWDATA_Reg;

end

else begin

PWDATA<=0;

end

end

else if(!PWRITE)begin

PRDATA<=PRDATAin;

end

else begin

PRDATA<=0;

end

end

//APB bridge状态机

wire  idle2setup_start  ;

wire  setup2enable_start;

wire  enable2idle_start ;

always@(posedge HCLK or negedge HRESETn)begin

if(!HRESETn)begin

PSELx<=0;

end

else if(state_c!=IDLE)begin

PSELx<=HSEL_Reg;

end

end

always @(posedge PCLK or negedge PRESETn) begin 

    if (!PRESETn) begin

        state_c <= IDLE ;

    end

    else begin

        state_c <= state_n;

    end

end

always @(*) begin 

    case(state_c)  

        IDLE :begin

            if(idle2setup_start) 

                state_n = SETUP ;

            else 

                state_n = state_c ;

        end

        SETUP :begin

            if(setup2enable_start) 

                state_n = ENABLE ;

            else 

                state_n = state_c ;

        end

        ENABLE :begin

            if(enable2idle_start) 

                state_n = IDLE ;

            else 

                state_n = state_c ;

        end

        default : state_n = IDLE ;

    endcase

end

always@(posedge PCLK or negedge PRESETn)begin

if(PRESETn==1'b0)begin

PENABLE<=0;

PSEL<=0;

end

else if(state_c==SETUP)begin

PSEL<=1;

PENABLE<=0;

end

else if(state_c==ENABLE)begin

PSEL<=1;

PENABLE<=1;

end

else begin

PSEL<=0;

PENABLE<=0;

end

end

assign idle2setup_start = (state_c==IDLE)&&(HADDR!=32'b0) ;

assign setup2enable_start = state_c==SETUP ;

assign enable2idle_start = state_c==ENABLE ;

//桥寄存

always @ (negedge HRESETn or posedge HCLK) begin

      if (!HRESETn)

        begin 

            HADDR_Reg  <= {32{1'b0}};

            HWRITE_Reg <= 1'b0;

        end

      else

        if (HREADY)begin

            HADDR_Reg  <= HADDR;

            HWRITE_Reg <= HWRITE;

        end  

    end

always  @(posedge HCLK or negedge HRESETn)begin

    if(HRESETn==1'b0)begin

        HSEL_Reg<=0;

    end

    else if(HREADY)begin

        HSEL_Reg<=HSEL;

    end

end

always  @(posedge HCLK or negedge HRESETn)begin

    if(HRESETn==1'b0)begin

        HWDATA_Reg<=0;

        PRDATA_Reg<=0;

    end

    else if(HWRITE==1)begin

        HWDATA_Reg<=HWDATA;

    end

    else begin

        PRDATA_Reg<=PRDATA;

    end

end

//master

//HREADY控制

always  @(posedge PCLK or negedge PRESETn)begin

    if(!PRESETn)begin

        HREADY<=0;

    end

    else if((state_c==IDLE)&&(HWDATA==0))begin

        HREADY<=1;

    end

else if(state_c==SETUP)begin

 HREADY<=0;

end

end

always  @(posedge HCLK or negedge HRESETn)begin

    if(HRESETn==1'b0)begin

        HWDATA<=32'b0;

        HRDATA<=32'b0;

    end

    else if(HWRITE==0)begin

        HRDATA<=PRDATA_Reg;

    end

    else if(HWRITE==1)begin

        HWDATA<=HWDATAin;

    end

end

endmodule

四、仿真测试

分别对读写时序进行两组测试:

1、写时序

a、

HADDR=32’b0000_0000_0000_0000_0000_0001_0000_0000

HWDATAin=32’b0000_0000_0000_0000_0000_0001_0000_0001

PSELx=1,reg_num=0

即选中了第一个从设备中第一个寄存器

b、

HADDR=32’b0000_0000_0000_0000_0000_0011_0000_1000;

HWDATAin=32’b0000_0000_0000_0000_0000_1111_0000_1111;

PSELx=3,reg_num=2

即选中了第三个从设备中第三个寄存器

2、读时序

a、

HADDR=32’b0000_0000_0000_0000_0000_0011_0000_1000

PRDATAin=32’b00000_0000_0000_0000_0000_1111_0000_1111

PSELx=3 reg_num=2

即第三个从设备第三个寄存器

b、

HADDR=32’b0000_0000_0000_0000_0000_0100_0000_1100

PRDATAin=32’b00000_0000_0000_0000_0000_1110_0000_1110

PSELx=4 reg_num=3

即第四个从设备第四个寄存器

原文链接:

https://blog.youkuaiyun.com/yueqiu693/article/details/119849052

(全文完)

声明:我们尊重原创,也注重分享;文字、图片版权归原作者所有。转载目的在于分享更多信息,不代表本号立场,如有侵犯您的权益请及时联系,我们将第一时间删除,谢谢!

图片

想要了解FPGA吗?这里有实例分享,ZYNQ设计,关注我们的公众号,探索

您可能感兴趣的与本文相关的镜像

GPT-SoVITS

GPT-SoVITS

AI应用

GPT-SoVITS 是一个开源的文本到语音(TTS)和语音转换模型,它结合了 GPT 的生成能力和 SoVITS 的语音转换技术。该项目以其强大的声音克隆能力而闻名,仅需少量语音样本(如5秒)即可实现高质量的即时语音合成,也可通过更长的音频(如1分钟)进行微调以获得更逼真的效果

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值