《从0开始设计和实现CPU》总线设计(二)之总线主控多路复用器的实现

该博客介绍了使用Verilog语言设计的一个总线主控多路复用器,允许四个不同的总线主控器共享一个公共的信号总线。Quartus和Modelsim工具用于开发和仿真,同时提到了开源工具Icarus Verilog和gtkwave。模块设计中,当任一主控器获得总线使用权时,其地址、地址选通、读/写信号和写入数据将被复用到共享总线上。若无主控器拥有总线,则设置默认值。
摘要由CSDN通过智能技术生成
1.开发工具
  • Quartus (Quartus Prime 18.1) Standard Edition
  • Modelsim SE-64 10.4
  • Icarus Verilog + gtkwave(开源)
2.总线框图

在这里插入图片描述

3.程序源码
`include "stddef.h"
`include "global_config.h"

`include "bus.h"

module bus_master_mux(      	  
       /****0号总线主控****/
	   input wire [`WordAddrBus]  m0_addr,    //地址
		input wire                 m0_as_,    //地址选通
      input wire                 m0_rw,     //读/写
      input wire [`WordDataBus]  m0_wr_data,//写入的数据
      input wire                 m0_grnt_,  //赋予总线
      
		  /****1号总线主控****/
	   input wire [`WordAddrBus]  m1_addr,    //地址
		input wire                 m1_as_,    //地址选通
      input wire                 m1_rw,     //读/写
      input wire [`WordDataBus]  m1_wr_data,//写入的数据
      input wire                 m1_grnt_,  //赋予总线
		
		  /****2号总线主控****/
	   input wire [`WordAddrBus]  m2_addr,    //地址
		input wire                 m2_as_,    //地址选通
      input wire                 m2_rw,    //读/写
      input wire [`WordDataBus]  m2_wr_data,//写入的数据
      input wire                 m2_grnt_,  //赋予总线
		
		  /****3号总线主控****/
	   input wire [`WordAddrBus]  m3_addr,   //地址
		input wire                 m3_as_,    //地址选通
      input wire                 m3_rw,     //读/写
      input wire [`WordDataBus]  m3_wr_data,//写入的数据
      input wire                 m3_grnt_,  //赋予总线
		
		  /****共享信号总线从属****/
		  
		output reg [`WordAddrBus]  s_addr,    //地址 29:0
		output reg                 s_as_,    //地址选通
      output reg                 s_rw,    //读/写
      output reg [`WordDataBus]  s_wr_data  //写入的数据 31:0	

);

     
	  /****总线主控多路复用器****/
   always@(*)begin
	  //选择使用具有总线使用权的主控
	  if(m0_grnt_ == `ENABLE_)begin
	    s_addr    = m0_addr;
		 s_as_     = m0_as_;
		 s_rw      = m0_rw;
		 s_wr_data = m0_wr_data;
	  end else if(m1_grnt_ == `ENABLE_) begin
	    s_addr    = m1_addr;
		 s_as_     = m1_as_;
		 s_rw      = m1_rw;
		 s_wr_data = m1_wr_data;
	  end else if(m2_grnt_ == `ENABLE_) begin
	    s_addr    = m2_addr;
		 s_as_     = m2_as_;
		 s_rw      = m2_rw;
		 s_wr_data = m2_wr_data;
	  end else if(m3_grnt_ == `ENABLE_) begin 
		 s_addr    = m3_addr;
		 s_as_     = m3_as_;
		 s_rw      = m3_rw;
		 s_wr_data = m3_wr_data;
	  end else begin   //如果都不是,就选默认值
	    s_addr    = `WORD_ADDR_W'h0;
		 s_as_     = `DISABLE_;
		 s_rw      = `READ;
		 s_wr_data = `WORD_DATA_W'h0;
	  end
	  
	end
	
endmodule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式历练者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值