当前位置: 首页 > news >正文

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
http://www.jsqmd.com/news/1015278/

相关文章:

  • 会议录音总听不清整理不完?2026离线语音转文字选型可参考这些标准
  • 2026年新发布:如何联系专业高效的上海工程款清收律师团队 - 品牌鉴赏官2026
  • ElasticsearchRestTemplate使用方法详解!!!
  • 硬件面试官最爱问的10个模电/数电问题(附手绘电路图避坑指南)
  • 如何快速安装Realtek 8192FU无线网卡驱动:Linux系统完整指南
  • 软考高项成本管理ITTO记不住?试试用这4个接地气的故事场景来搞定
  • 二战341分,从北京985调剂到安大:我的电子信息调剂邮件模板与简历打磨心得
  • 2026北京比较好的高分子温脱硝剂厂商排名 - 品牌排行榜
  • 从一张图看懂副热带高压:Python绘制588线揭示的2023年夏季天气密码
  • 2026 温州管道疏通与异味治理机构精选 5 家 马桶 / 厨卫下水 / 地漏除臭服务参考 - 宅安选房屋修缮
  • 山东大学软件学院创新实训 个人博客(六)健康提醒系统的完整开发与优化
  • 广州佛山团建拓展优质企业
  • Kamailio 深度技术解析:构建电信级 SIP 信令核心
  • 2026乐山律师事务所选择指南:靠谱律所怎么找?多主体实力解析与收费参考 - 优质品牌商家
  • OpenPLC Editor:开源工业控制编程环境的深度解析与实践指南
  • 2026年膜结构体育看台选购指南:6家主流企业深度分析与实景案例参考 - 优质品牌商家
  • 复试逆袭指南:郑大网安院学长亲授,如何用一周时间搞定笔试、机试和面试
  • ISP Tuning新手到高手:我的三段式学习心法与实战避坑指南
  • 如何用ComfyUI IPAdapter实现AI图像风格迁移:从安装到高级应用的完整指南
  • 想进能源央企?除了刷题,你还需要知道这些:中海油/中石化/中石油校招深度解析
  • 2026崂山区空调移机联系电话及服务选择参考 - 品牌排行榜
  • 避坑指南:给IEEE TII/TITS/IoTJ投稿前,你必须知道的5个潜规则与应对策略
  • 如何将SillyTavern打造成你的专属AI聊天桌面应用?5分钟快速配置指南
  • 廊坊黄金回收实时行情与商家对比指南 —— 靠谱推荐典典佳汇! - 诚鑫名品
  • 2026北京薪酬设计|薪酬体系|薪酬改革|薪酬绩效|薪酬激励咨询公司专项评测:从体系搭建到国企改革的实战标杆 - 互联网科技品牌测评
  • 2026年南京婚姻情感心理咨询机构选择指南 - 品牌排行榜
  • 2026年新消息:温州法兰定做厂家可靠选择指南 - 品牌鉴赏官2026
  • 从面试官视角拆解K8s:那些藏在Deployment、Service和Ingress背后的真实生产考量
  • 电脑防泄密软件哪家好?6款超实用的电脑防泄密软件推荐,功能详解
  • 华为海思软开岗面经:三轮面试官都问了啥?我的项目经历被挖了个底朝天