当前位置: 首页 > 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.zskr.cn/news/1527102.html

相关文章:

  • Cursor Pro完整功能破解指南:终极机器ID重置与配置管理技术
  • 会议录音总听不清整理不完?2026离线语音转文字选型可参考这些标准
  • 从一张图看懂副热带高压:Python绘制588线揭示的2023年夏季天气密码
  • 二战341分,从北京985调剂到安大:我的电子信息调剂邮件模板与简历打磨心得
  • 软考高项成本管理ITTO记不住?试试用这4个接地气的故事场景来搞定
  • 2026北京比较好的高分子温脱硝剂厂商排名 - 品牌排行榜
  • OpenPLC Editor:开源工业控制编程环境的深度解析与实践指南
  • 想进能源央企?除了刷题,你还需要知道这些:中海油/中石化/中石油校招深度解析
  • 如何用ComfyUI IPAdapter实现AI图像风格迁移:从安装到高级应用的完整指南
  • 【计算机毕业设计案例】基于 SpringBoot 的校园公告资讯共享系统的设计与实现(程序+文档+讲解+定制)
  • 廊坊黄金回收实时行情与商家对比指南 —— 靠谱推荐典典佳汇! - 诚鑫名品
  • Ubuntu新手避坑:arm-linux-gcc命令找不到?可能是你装错了架构(附交叉编译工具链安装指南)
  • 外贸 AI 写作工具 API 评测:7 款工具翻译、开发信生成接口集成对比(2026)
  • 2026年IEC60825检测服务商口碑分析:谁在激光安全与能效认证领域更具实力? - 优质品牌商家
  • Python开发进阶之路:自动化脚本编写技巧分享
  • 2026 合肥管道疏通与异味治理机构精选 5 家 马桶 / 厨卫下水 / 地漏除臭服务参考 - 宅安选房屋修缮
  • linux命令:lsof、uniq
  • 再也不用自己拍带货视频!Seedance 2.0+Coze工作流,真人口播自动生成,适合电商全品类!
  • 哈尔滨南岗区修发动机烧机油靠谱店 - 资讯速览
  • 2026年,探秘专业虾青素知名企业,究竟有何独特魅力?
  • 2026年南通管道清淤服务企业观察:从家庭疏通到市政管网,谁更值得选择? - 优质品牌商家
  • 变量、数据类型、表达式
  • 别只盯着驱动开发了!聊聊嵌入式+AI/异构计算这些年薪50W+的新岗位
  • 2026行业内好用的隧道防火涂料厂家推荐排行榜 - 品牌排行榜
  • 2026年安庆装修设计口碑观察:哪些公司经得起市场检验? - 优质品牌商家
  • AutoDock-Vina深度解析:5大进阶分子对接实战技巧
  • 【2026最新】汕头市汽车新能源轻改工厂排行榜,本地真实测评口碑TOP推荐 - 资讯速览
  • 2026年医院职工智能食堂系统服务商综合盘点与选择指南 - 品牌鉴赏官2026
  • 构建个人云游戏平台:Sunshine开源游戏串流深度实践指南
  • 2026 海南商标注册代办合规流程 + 商标知识产权海关备案代办流程 + 自贸港便利化政策解读 本土财税代办 TOP4 榜单 - 资讯速览