news 2026/6/15 1:19:56

AXI_SLAVER代码问题求助!!!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AXI_SLAVER代码问题求助!!!

求问各位大佬,为什么这里在1处对arlen等信号赋值是赋不上值的???但axi_arready却可以赋值上,这是为什么,怎么解决这个问题呢!

如果使用2则会延后一拍,但这不是想要的效果。

//-------------------------------------------------------------------------------- // axi_slv //-------------------------------------------------------------------------------- `include "axi_define.v" module axi_slv ( // system signals input wire axi_aclk , input wire axi_arst_n , // AXI rd addr channel output reg axi_arready, input wire axi_arvalid, input wire [`AXI_ID_WIDTH -1:0] axi_arid , input wire [`AXI_ADDR_WIDTH -1:0] axi_araddr , input wire [`AXI_LEN_WIDTH -1:0] axi_arlen , input wire [`AXI_SIZE_WIDTH -1:0] axi_arsize , input wire [`AXI_BURST_WIDTH -1:0] axi_arburst, input wire axi_arlock , input wire [`AXI_CACHE_WIDTH -1:0] axi_arcache, input wire [`AXI_PROT_WIDTH -1:0] axi_arprot , input wire [`AXI_QOS_WIDTH -1:0] axi_arqos , // AXI rd data channel input wire axi_rready , output reg axi_rvalid , output reg [`AXI_ID_WIDTH -1:0] axi_rid , output reg [`AXI_DATA_WIDTH -1:0] axi_rdata , output wire [`AXI_RESP_WIDTH -1:0] axi_rresp , output wire axi_rlast , // User input wire enable ); //-------------------------------------------------------------------------------- // register and I/O //-------------------------------------------------------------------------------- reg [`AXI_ID_WIDTH -1:0] arid ; reg [`AXI_ADDR_WIDTH -1:0] araddr ; reg [`AXI_SIZE_WIDTH -1:0] arsize ; reg [`AXI_LEN_WIDTH -1:0] arlen ; reg [`AXI_BURST_WIDTH-1:0] arburst ; reg [`AXI_LEN_WIDTH -1:0] beat_cnt; reg [15:0] get_delay_cnt; reg [`AXI_DATA_WIDTH -1:0] data_mem [1023:0]; // Internal memory for data reg [5:0] curr_state, next_state; // Burst and resp type localparam AXI_BURST_FIXED = 2'b00; localparam AXI_BURST_INCR = 2'b01; localparam AXI_BURST_WRAP = 2'b10; localparam AXI_RESP_OKAY = 2'b00; localparam AXI_RESP_SLVERR = 2'b10; localparam AXI_RESP_DECERR = 2'b11; // Unified read/write FSM localparam ST_IDLE = 6'b00_0000; localparam ST_AR_HANDSHAKE = 6'b00_0001; localparam ST_R_HANDSHAKE = 6'b00_0010; // Loading data initial begin $readmemh("sine_wave.mem", data_mem); end assign axi_rlast = (axi_rvalid && axi_rready && (beat_cnt == arlen)) ? 1'b1 : 1'b0; assign axi_rresp = `AXI_RESP_OKAY; //-------------------------------------------------------------------------------- // FSM //-------------------------------------------------------------------------------- always @(posedge axi_aclk or negedge axi_arst_n) begin if (!axi_arst_n) begin curr_state <= ST_IDLE; end else begin curr_state <= next_state; end end always @(*) begin next_state = curr_state; case (curr_state) ST_IDLE:begin if (enable) begin next_state = ST_AR_HANDSHAKE; end else begin next_state = ST_IDLE; end end ST_AR_HANDSHAKE:begin if (axi_arvalid && axi_arready) begin next_state = ST_R_HANDSHAKE; end else begin next_state = ST_AR_HANDSHAKE; end end ST_R_HANDSHAKE:begin if (axi_rvalid && axi_rready && axi_rlast) begin next_state = ST_IDLE; end else begin next_state = ST_R_HANDSHAKE; end end default:begin next_state = ST_IDLE; end endcase end always @(posedge axi_aclk or negedge axi_arst_n) begin if (!axi_arst_n) begin axi_arready <= 1'b0; axi_rvalid <= 1'b0; axi_rid <= `AXI_ID_WIDTH'h0; axi_rdata <= `AXI_DATA_WIDTH'h0; araddr <= `AXI_ADDR_WIDTH'h0; arsize <= `AXI_SIZE_WIDTH'h0; arlen <= `AXI_LEN_WIDTH'h0 ; arburst <= `AXI_BURST_WIDTH'h0; beat_cnt <= `AXI_LEN_WIDTH'd0 ; get_delay_cnt <= 16'd0; end else begin case (curr_state) ST_IDLE:begin axi_arready <= 1'b0; axi_rvalid <= 1'b0; axi_rid <= `AXI_ID_WIDTH'h0; axi_rdata <= `AXI_DATA_WIDTH'h0; araddr <= `AXI_ADDR_WIDTH'h0; arsize <= `AXI_SIZE_WIDTH'h0; arlen <= `AXI_LEN_WIDTH'h0 ; arburst <= `AXI_BURST_WIDTH'h0; beat_cnt <= `AXI_LEN_WIDTH'd0 ; get_delay_cnt <= 16'd0; end ST_AR_HANDSHAKE:begin if (axi_arvalid && !axi_arready) begin axi_arready <= 1'b1; end else if (axi_arvalid && axi_arready) begin axi_arready <= 1'b0; // axi_rid <= axi_arid ; // araddr <= axi_araddr ; // arsize <= axi_arsize ; // arlen <= axi_arlen ; // arburst <= axi_arburst; end end ST_R_HANDSHAKE:begin araddr <= axi_araddr ; arsize <= axi_arsize ; arlen <= axi_arlen ; arburst <= axi_arburst; if (!axi_rvalid && !axi_rready) begin if (get_delay_cnt == `DATA_GET_DELAY) begin axi_rvalid <= 1'b1; get_delay_cnt <= 16'd0; end else begin axi_rvalid <= 1'b0; get_delay_cnt <= get_delay_cnt + 1'b1; end end else if (axi_rvalid && axi_rready) begin axi_rvalid <= 1'b0; axi_rid <= axi_arid ; axi_rdata <= data_mem[curr_addr]; beat_cnt <= beat_cnt + 1; curr_addr <= curr_addr + 1; end end default: ; endcase end end endmodule
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 1:17:55

从EPFL到Idiap:跟Sylvain Calinon学如何规划你的机器人学术生涯与开源项目

机器人学术生涯与开源项目的黄金路径&#xff1a;从理论创新到社区影响力在机器人研究领域&#xff0c;学术成就与工程实践的完美结合往往能塑造出最具影响力的学者。瑞士Idiap研究所高级研究员Sylvain Calinon的成长轨迹提供了一个教科书级的案例——他不仅在几何方法、最优控…

作者头像 李华
网站建设 2026/6/15 1:14:56

Windows 环境 SkyWalking 完整实操教程

一、SkyWalking 核心架构 SkyWalking有4大组件&#xff0c;零代码侵入监控Java微服务、链路追踪、指标监控、告警&#xff1a; Agent探针&#xff08;Java Agent&#xff09;&#xff1a;依附你的Java进程&#xff0c;字节码增强&#xff0c;自动采集接口、SQL、MQ、RPC调用耗…

作者头像 李华
网站建设 2026/6/15 1:14:54

ElasticsearchRestTemplate使用方法详解!!!

本文基于 SpringBoot 3 ES High Level Rest Client&#xff0c;详细介绍精确匹配、模糊检索、布尔多条件、范围、排序分页、聚合、高亮、批量操作的使用。 前置实体 1&#xff09;商品文档实体 GoodsDoc import lombok.Data; import org.springframework.data.annotation.Id; …

作者头像 李华
网站建设 2026/6/15 0:57:20

如何3分钟免费解锁Cursor Pro:终极AI编程助手破解方案

如何3分钟免费解锁Cursor Pro&#xff1a;终极AI编程助手破解方案 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your tri…

作者头像 李华