学习实战篇---通用卷积神经网络加速器的verilog实现(二)---axi-gpio实验

本文详细介绍了如何使用AXI-GPIO模块设计通过PS端控制4个LED的流水灯实验。内容涵盖AXI接口的读写通道实现,包括读地址、读数据、写地址、写数据的处理,以及地址和数据的同步问题。同时,提供了SDK代码示例,展示如何配置GPIO进行数据写入。整个流程展示了FPGA中AXI总线协议的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.axi-gpio模块设计(通过ps端控制4个led,实现流水灯实验)

在之前已经介绍了axi-lite的5个通道,分别是读地址,读数据,写地址,写数据,写响应,本模块AXI-GPIO相对于主机arm上的axi-master接口,要做一个与之对应的axi-slave接口,然后就是时钟,复位,右端就是双向的gpio
在这里插入图片描述

1.AR channel &Rd channel

//Rd channel
assign S_AXI_ARREADY=1'b1;
assign S_AXI_RRESP=2'b0;//设定读永远没有错
reg [32-1:0]rdata;
assign S_AXI_RDATA=rdata;
reg rvalid;
assign S_AXI_RVALID=rvalid;

always @(posedge S_AXI_ACLK or negedge S_AXI_ARESETN)
if(~S_AXI_ARESETN)
    begin rvalid<=1'b0;rdata<=32'b0;end
else
    if(S_AXI_ARVALID&S_AXI_ARREADY)
    begin
        rvalid<=1'b1;
        case(S_AXI_ARADDR[3:2])
            2'd0:rdata<={28'b0,reg0};
            2'd1:rdata<={28'b0,reg1};
            2'd2:rdata<={28'b0,reg2};
            2'd3:rdata<=0;
        endcase
    end
    else
        if(S_AXI_RVALID&S_AXI_RREADY)
            rvalid<=1'b0;

2.Wr channel

//Wr channel   接收数据不可以早于接收地址通道,也就是主机发送地址过来,要当前周期或者之后周期才可以接收数据

reg wphase;			//该寄存器表示是否有收到写地址,0:没有收到/写完成;1:收到了地址
always @(posedge S_AXI_ACLK or negedge S_AXI_ARESETN)
if(~S_AXI_ARESETN)
    wphase<=0;
else
    if(S_AXI_AWVALID&S_AXI_AWREADY)
        wphase<=1;
    else
        if(S_AXI_WVALID&S_AXI_WREADY)
            wphase<=0;

assign S_AXI_WREADY=wphase;

//主机只能访问reg0和reg1,访问的是高两位,如果写reg0就写0,如果写reg1就写4
always @(posedge S_AXI_ACLK or negedge S_AXI_ARESETN)
if(~S_AXI_ARESETN)
begin
    reg0<=0;
    reg1<=0;
end
else
    if(S_AXI_WVALID&S_AXI_WREADY)
    case(addr_word_w_comb)
        2'd0:begin if(S_AXI_WSTRB[0]) reg0<=S_AXI_WDATA[3:0];end//写的是reg0,如果写的低4bit有效,就把写数据(32bit)的低4bit写到reg0
        2'd1:begin if(S_AXI_WSTRB[0]) reg1<=S_AXI_WDATA[3:0];end//写的是reg1,如果写的低4bit有效,就把写数据(32bit)的低4bit写到reg1
    endcase

3.AW channel

//AW channel   这里有一个问题是写数据和写地址同时到的情况,addr_word_w表示的是寄存器暂存的值
reg [1:0]addr_word_w;
wire [1:0]addr_word_w_comb;		//这里的addr_word_w_comb解决的是-是否写命令和数据同时来
always @(posedge S_AXI_ACLK or negedge S_AXI_ARESETN)
if(~S_AXI_ARESETN)
    addr_word_w<=0;
else
    if(S_AXI_AWVALID&S_AXI_AWREADY)
        addr_word_w<=S_AXI_AWADDR[3:2];
        
assign addr_word_w_comb=(S_AXI_AWVALID&S_AXI_AWREADY)?S_AXI_AWADDR[3:2]:addr_word_w;
assign S_AXI_AWREADY=1'b1;

4.Wr Resp

//Wr Resp
assign S_AXI_BRESP=2'b0;//主机写了之后,从机要给主机返回一个结果,这里表示写成功的
reg axi_bvalid;			//当主机写成功了,就把bvalid拉高,当从机收到响应就拉低
assign S_AXI_BVALID=axi_bvalid;
always @(posedge S_AXI_ACLK or negedge S_AXI_ARESETN)
if(~S_AXI_ARESETN)
    axi_bvalid<=1'b0;
else
    if(S_AXI_WVALID&S_AXI_WREADY)
        axi_bvalid<=1'b1;
    else
        if(S_AXI_BREADY)
            axi_bvalid<=1'b0;

5.sdk 代码

#include <stdio.h>
#include platform.h
#include xil_printf.h
#include xparameters.h
#include sleep.h
int main()
{
init_platform();
print(Hello World\n\r);

//设置输入输出模式
(unsigned int)(XPAR_AXI_GPIO_MY_1_BASEADDR+4)=0xF;  //dev1.REG1 输出
int i = 1;
while(1){

*(unsigned int*)(XPAR_AXI_GPIO_MY_1_BASEADDR+0)=i;  //dev1.REG0 写数据
i = i <<1;
if(i==0x10) i = 1;
	sleep(1);
}
cleanup_platform();
return 0;

}

二.上板演示

在这里插入图片描述

<think>好的,我需要帮助用户了解RISC-V处理器的结构体系。首先,我需要回忆RISC-V的基本概念。根据提供的引用资料,RISC-V是一种指令集架构(ISA),而微架构是其具体硬件实现。引用[1]提到RISC-V的诞生和其作为开放标准的优势,引用[2]则介绍了玄铁RISC-V处理器的优化和应用领域。 接下来,我需要组织回答的结构。用户要求“结构体系详解”,应该包括核心设计理念、基本结构模块、玄铁处理器的特点以及应用场景。根据引用[1],RISC-V的模块化设计是关键,分为基础指令集和扩展指令集。基础指令集如RV32I,扩展指令集如乘除(M)、原子操作(A)等。这些都需要详细说明。 然后,处理器的微架构部分,需要解释流水线设计、内存子系统和外设接口。引用[2]提到玄铁处理器在流水线深度和分支预测上的优化,这里可以引用作为例子。内存子系统包括缓存层次结构和总线接口,外设如GPIO、UART等也是重要部分。 用户可能还想知道RISC-V的优势,比如开放性、可扩展性、低功耗等,这些在引用[1]和[2]中都有涉及。需要结合玄铁处理器的实际应用,如嵌入式系统和物联网设备,来说明其优势。 最后,生成相关问题需要考虑用户可能深入的方向,比如指令集扩展、微架构设计挑战、与其他架构的对比,以及玄铁处理器的具体应用案例。这些问题应覆盖理论知识和实际应用,帮助用户进一步学习。 需要确保所有数学公式和术语使用正确的LaTeX格式,如流水线阶段用$...$包裹,独立公式如性能公式用$$...$$。同时,检查引用标记是否正确添加,如玄铁处理器的优化部分引用[^2]。 现在将这些思路整合成结构清晰的中文回答,并附上相关问题。</think>### RISC-V处理器架构详解 RISC-V处理器是基于精简指令集(RISC)设计的开放架构,其核心设计理念包括 **模块化指令集** 和 **可扩展性**。以下从核心组件、微架构实现和典型设计三个层面展开说明。 --- #### 一、RISC-V核心设计理念 1. **模块化指令集** RISC-V将指令集分为 **基础指令集(Base ISA)** 和 **扩展指令集(Extensions)**: - 基础指令集(如RV32I/RV64I)提供整数运算、逻辑操作、内存访问等基本功能。例如,加法指令格式为: $$ \text{ADD \ rd, rs1, rs2} \rightarrow \text{rd = rs1 + rs2} $$ - 扩展指令集(如M/A/C/F/D)支持乘除、原子操作、压缩指令、浮点运算等[^1]。 2. **精简与高效** RISC-V通过固定长度指令(32位/16位压缩)和简化寻址模式降低硬件复杂度,例如: - 内存访问仅支持基址+偏移量模式:$ \text{LW \ rd, offset(rs1)} $ - 无条件跳转指令的偏移量计算为:$ \text{PC = PC + offset} $。 --- #### 、处理器微架构组成 典型的RISC-V处理器包含以下核心模块: 1. **流水线设计** 玄铁RISC-V采用 **5级流水线**(取指IF、译码ID、执行EX、访存MEM、写回WB),并通过分支预测和乱序执行优化性能。 $$ \text{吞吐量} = \frac{1}{\text{CPI} \times \text{时钟周期}} $$ 2. **内存子系统** - 缓存层次:L1指令/数据缓存(哈佛架构)+ 共享L2缓存 - 总线接口:支持AXI或TileLink协议,用于连接外设和内存控制器。 3. **外设与扩展** 通过内存映射I/O(MMIO)集成GPIO、UART、SPI等接口,例如: ```verilog // 内存地址映射示例 define UART_BASE 0x10000000 ``` --- #### 三、玄铁RISC-V的优化特点 1. **性能提升** - 动态分支预测器减少流水线停顿 - 支持向量扩展(V Extension)加速AI计算。 2. **低功耗设计** - 时钟门控技术关闭空闲模块 - 多电压域调节动态功耗。 --- #### 四、应用场景 1. **嵌入式系统**:实时控制(如机械臂) 2. **物联网设备**:低功耗传感器节点 3. **高性能计算**:多核集群支持AI推理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值