assign mcu_xxx_addr = (rd_after_wr_reg || reg_valid_write_trans) ?
haddr_reg[ADDR_WIDTH+:] : haddr[ADDR_WIDTH+:];
assign mcu_xx_rd_n = rd_after_wr ? 'b1 : rd_after_wr_reg ? 1'b0 : ~valid_read_trans;
assign mcu_xxx_wr_n = ~(hready && reg_valid_write_trans);
assign mcu_xxx_dat = hwdata;
assign rd_after_wr = hready && valid_read_trans && reg_valid_write_trans;
----------------------------------------------------------------------------
assign hsize_error = BYTE_MASK ? ((hsize = SZ_DWORD) ||hsize[]) :
(hsize != SZ_WORD);
assign valid_trans = hready && hsel && htrans[] && !hsize_error;
assign error_trans = hready && hsel && htrans[] && hsieze_error;
assign valid_read_trans = valid_trans && !hwrite;
assign valid_write_trans = valid_trans && hwrite; -------------------------------------------------------------------------------
always@(posedge hclk or negedge hresetn)
begin
if(~hresetn)
begin
haddr_reg <=;
htrans_reg <= ;
hwrite_reg <= ;
hsize_reg <= ;
reg_valid_read_trans <=;
reg_valid_write_trans <= ;
end
else
begin
if(hready)
begin
haddr_reg <= haddr;
htrans_reg <= htrans;
hwrite_reg <= hwrite;
hsize_reg <= hsize;
reg_valid_read_trans <=valid_read_trans;
reg_valid_write_trans <= valid_write_trans;
end
end
end --------------------------------------------------------------------------------
always@(*)
begin
if(hready && reg_valid_write_trans)
begin
mcu_xxx_wr_en = 'b0;
case(hsize_reg)
SZ_BYTE:
case(haddr_reg[:])
'b00: mcu_xxx_wr_en[0] = 1'b1;
''b01: mcu_xxx_wr_en[] = 'b1;
'b10: mcu_xxxx_wr_en[2] = 1'b1;
'b11: mcu_xxx_wr_en [3] = 1'b1;
endcase SZ_HALF:
case(haddr_reg[])
'b0 : mcu_xxx_wr_en[1:0] = 2'b11;
'b1 : mcu_xxx_wr_en [3:2] = 2'b11;
endcase SZ_WORD:
mcu_xxx_wr_en = 'b1111; default:
mcu_xxx_wr_en = 'b1111; endcase
end
else
begin
mcu_xxx_wr_en = 'b0;
end
end

本code主要实现AHB时序转MEMORY接口时序:

由于,AHB总线读写都是2拍,在ready信号拉高时表示数据读写完成,并且下一拍地址传到总线上。

memory 读写时序,读时序也是2拍,所以可以直接使用AMB总线的读使能。但写时序不一样。对于memory读使能有效时,可以立即把写数据送到写总线上,不像AHB写时必须2拍。所以写时,需要把AHB的HWRITE相关信号寄存一拍。

          特别是,当先写后读时,要注意时序转换。即code中rd_after_wr。目前理解的是,整体把读使能也寄存了一拍。

最新文章

  1. cronolog分割Tomcat catalina.out日志
  2. label用js,jquery取值赋值,以及怎么在后台取值
  3. Senna.js – 速度极快的单页应用程序引擎
  4. 分布式入门之1:Lease机制
  5. hadoop小试
  6. Nodejs建站笔记-注册登录流程的简单实现
  7. WP8_定位新页面中listbox的某项
  8. 使用WebBrowser的记录
  9. Response.Redirect:无法在发送 HTTP 标头之后进行重定向
  10. LIB文件和DLL文件的作用
  11. Angular2 + Webpack项目搭建Demo
  12. js全选checkbox框
  13. 门控开关项目--整流桥分析,LED限流电阻选择
  14. 基于 socket.io 的 AI 服务 杂谈
  15. spring cloud 入门系列五:使用Feign 实现声明式服务调用
  16. SQLMap入门之在Windows上安装SQLMap
  17. Mybatis高级查询之一对一查询的四种方法
  18. 微信小程序地图报错——ret is not defined
  19. orocos_kdl学习(二):KDL Tree与机器人运动学
  20. Linux下mysql出错:ERROR 1045 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: NO)

热门文章

  1. nutzboot dubbo zookeeper简单使用
  2. 选择器 nth-child和 nth-of-type的区别
  3. Codeforces 1136E(转化+线段树维护)
  4. SSE练习:单精度浮点数组求和
  5. go语言的特点
  6. 087 Scramble String 扰乱字符串
  7. Gym - 101147J Whistle&#39;s New Car 树上差分
  8. 打包google浏览器插件到本地
  9. Javaoo学习数组
  10. Linux防火墙iptables配置开放某个端口