找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2661|回复: 0
打印 上一主题 下一主题
收起左侧

基于FPGA片上最小系统(xiaoze-soc)的总线设计

[复制链接]
跳转到指定楼层
楼主
ID:224778 发表于 2017-8-4 19:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
顶层文件/*
该设计是小泽的首个基于fpga片上最小系统(xiaoze——soc)的总线设计
by :mr小泽
QQ : 3280283157
from : 天津工业大学电气工程与自动化学院

//***********************************

总线主控——四路;                                                                           

总线从属——八路:                                   
0号——只读存储器rom
1号——暂存存储器spm
2号——计时器
3号——usrat
4号——gpio
5号——空
6号——空
7号——空

设计包括(由顶向下):
(1)xiaoze_bus(TOP)
(2)xiaoze_sover(总线主控仲裁&分配)
(3)xiaoze_wire(总线主控写入相应数据)
(4)xiaoze_dec(地址解码)
(5)xiaoze_read(总线从属读取数据)

//************************************
*/
module xiaoze_bus(
                    input  clk,
                                                  input  rst_n,
                                                
                    input  m0_ask, //总线主控0——请求
                                                  input  m1_ask, //总线主控1——请求
                                                  input  m2_ask, //总线主控2——请求
                                                  input  m3_ask, //总线主控3——请求
                                                  
                                                  input  m0_as, //m0总线控制选通信号
                                                  input  m0_rw, //m0总线控制“读/写”命令信号
                                                  input  m0_addr, //m0总线控制地址信号
                                                  input  m0_addr_data, //m0总控信号地址数据
                                                  
                                                  input  m1_as, //m1总线控制选通信号
                                                  input  m1_rw, //m1总线控制“读/写”命令信号
                                                  input  m1_addr, //m1总线控制地址信号
                                                  input  m1_addr_data, //m1总控信号地址数据
                                                  
                                                  input  m2_as, //m2总线控制选通信号
                                                  input  m2_rw, //m2总线控制“读/写”命令信号
                                                  input  m2_addr, //m2总线控制地址信号
                                                  input  m2_addr_data, //m2总控信号地址数据                                          
                                                  
                                                  input  m3_as, //m3总线控制选通信号
                                                  input  m3_rw, //m3总线控制“读/写”命令信号
                                                  input  m3_addr, //m3总线控制地址信号
                                                  input  m3_addr_data, //m3总控信号地址数据
                                                  
                                                  input [31:0] s0_data, //总线从属要读取的数据
                                   input [31:0] s1_data, //总线从属要读取的数据
                              input [31:0] s2_data, //总线从属要读取的数据
                                   input [31:0] s3_data, //总线从属要读取的数据
                    input [31:0] s4_data, //总线从属要读取的数据
                                   input [31:0] s5_data, //总线从属要读取的数据
                              input [31:0] s6_data, //总线从属要读取的数据
                                   input [31:0] s7_data, //总线从属要读取的数据
                                                  
                                                  input  s0_rdy, //总线从属0就绪
                                             input  s1_rdy, //总线从属1就绪
                                             input  s2_rdy, //总线从属2就绪
                                             input  s3_rdy, //总线从属3就绪
                                                  input  s4_rdy, //总线从属4就绪
                                             input  s5_rdy, //总线从属5就绪
                                             input  s6_rdy, //总线从属6就绪
                                             input  s7_rdy, //总线从属7就绪
                                                  
                                                  output wire s0_cs,
                                                  output wire s1_cs,
                                                  output wire s2_cs,
                                                  output wire s3_cs,
                                                  output wire s4_cs,
                                                  output wire s5_cs,
                                                  output wire s6_cs,
                                                  output wire s7_cs,        
                                                  
                                                  output wire  s_as, //总线控制选通信号——最终输出
                                                  output wire  s_rw, //总线控制“读/写”命令信号——最终输出
                                                  output wire [31:0] s_addr, //总线控制地址信号——最终输出
                                                  output wire [31:0] s_addr_data, //总控信号地址数据——最终输出
                                                  
                                                  output wire m_rdy, //总线从属0就绪——最终输出
                    output wire [31:0] m_data //总线从属将读取的数据输出——最终输出
                                                  
                  );
                                                
//******************************定义区********************************************
                    wire  m0_agree;
                                                  wire  m1_agree;
                                                  wire  m2_agree;
                                                  wire  m3_agree;                        
//*******************************************************************************                                                
xiaoze_sover      i1(
                   .clk(clk),
                                                 .rst_n(rst_n),
                                                
                   .m0_ask(m0_ask),
                                                 .m1_ask(m1_ask),
                                                 .m2_ask(m2_ask),
                                                 .m3_ask(m3_ask),
                                                
                                                 .m0_agree(m0_agree),
                                                 .m1_agree(m1_agree),
                                                 .m2_agree(m2_agree),
                                                 .m3_agree(m3_agree)  
                                                 );
//********************************************************************************
        
        
        
        
//********************************************************************************        
xiaoze_wire       i2(
                                                  .m0_agree(m0_agree),
                                                  .m1_agree(m1_agree),
                                                  .m2_agree(m2_agree),
                                                  .m3_agree(m3_agree),
                                                  
                                                  .m0_as(m0_as),
                                                  .m0_rw(m0_rw),
                                                  .m0_addr(m0_addr),
                                                  .m0_addr_data(m0_addr_data),
                                                  
                                                  .m1_as(m1_as),
                                                  .m1_rw(m1_rw),
                                                  .m1_addr(m1_addr),
                                                  .m1_addr_data(m1_addr_data),
                                                  
                                                  .m2_as(m2_as),
                                                  .m2_rw(m2_rw),
                                                  .m2_addr(m2_addr),
                                                  .m2_addr_data(m2_addr_data),                                          
                                                  
                                                  .m3_as(m3_as),
                                                  .m3_rw(m3_rw),
                                                  .m3_addr(m3_addr),
                                                  .m3_addr_data(m3_addr_data),
                                                  
                                                  
                                                  .s_as(s_as),
                                                  .s_rw(s_rw),
                                                  .s_addr(s_addr),
                                                  .s_addr_data(s_addr_data)
                                          );
//**********************************************************************************        




//**********************************************************************************        
xiaoze_dec       i3(
                  .s_addr(s_cs), //s总线控制地址信号
                                                
                                                .s0_cs(s0_cs),
                                                .s1_cs(s1_cs),
                                                .s2_cs(s2_cs),
                                                .s3_cs(s3_cs),
                                                .s4_cs(s4_cs),
                                                .s5_cs(s5_cs),
                                                .s6_cs(s6_cs),
                                                .s7_cs(s7_cs)                        
                  );
//***********************************************************************************                                                


//***********************************************************************************
xiaoze_read       i4(
                  .s0_cs(s0_cs),
                                                .s1_cs(s1_cs),
                                                .s2_cs(s2_cs),
                                                .s3_cs(s3_cs),
                                                .s4_cs(s4_cs),
                                                .s5_cs(s5_cs),
                                                .s6_cs(s6_cs),
                                                .s7_cs(s7_cs),        
                                                
                                                .s0_rdy(s0_rdy),
                                           .s1_rdy(s1_rdy),  
                                           .s2_rdy(s2_rdy),  
                                           .s3_rdy(s3_rdy),
                                                .s4_rdy(s4_rdy),
                                           .s5_rdy(s5_rdy),  
                                           .s6_rdy(s6_rdy),  
                                           .s7_rdy(s7_rdy),  
                                                   
                  .s0_data(s0_data),
                                 .s1_data(s1_data),
                            .s2_data(s2_data),
                                 .s3_data(s3_data),
                  .s4_data(s4_data),
                                 .s5_data(s5_data),
                            .s6_data(s6_data),
                                 .s7_data(s7_data),

                                                
                                                .m_rdy(m_rdy),
                  .m_data(m_data)
                                                   );
//***********************************************************************************
endmodule        



总线仲裁
//总线主控仲裁器


`include "xiaoze_bus.h"
`timescale 1 ns / 1 ps
module xiaoze_sover(
                   input  clk,
                                                 input  rst_n,
                                                
                   input  m0_ask, //总线主控0——请求
                                                 input  m1_ask, //总线主控1——请求
                                                 input  m2_ask, //总线主控2——请求
                                                 input  m3_ask, //总线主控3——请求
                                                
                                                 output reg m0_agree, //总线主控0——请求成功
                                                 output reg m1_agree, //总线主控0——请求成功
                                                 output reg m2_agree, //总线主控0——请求成功
                                                 output reg m3_agree  //总线主控0——请求成功
                                                 );
                                                
//******************************定义区******************************************

      reg [2:0] woner;

//*****************************************************************************






//***************************仲裁模块设计****************************************
     always@(posedge clk or negedge rst_n)
            if(!rst_n) woner <= #1 `M0_SOVER;
                 
                 else begin
                   case(woner)
                          `M0_SOVER : begin
                            if(m0_ask) woner <= #1 `M0_SOVER;
                                 else if(m1_ask) woner <= #1 `M1_SOVER;  
                            else if(m2_ask) woner <= #1 `M2_SOVER;  
             else if(m3_ask) woner <= #1 `M3_SOVER;
                          end
                          
                           `M1_SOVER : begin
                            if(m1_ask) woner <= #1 `M1_SOVER;
                                 else if(m2_ask) woner <= #1 `M2_SOVER;  
                            else if(m3_ask) woner <= #1 `M3_SOVER;  
             else if(m0_ask) woner <= #1 `M0_SOVER;
                          end
                          
                          `M2_SOVER : begin
                            if(m2_ask) woner <= #1 `M2_SOVER;
                                 else if(m3_ask) woner <= #1 `M3_SOVER;  
                            else if(m0_ask) woner <= #1 `M0_SOVER;  
             else if(m1_ask) woner <= #1 `M1_SOVER;
                          end
                          
                           `M3_SOVER : begin
                            if(m3_ask) woner <= #1 `M3_SOVER;
                                 else if(m0_ask) woner <= #1 `M0_SOVER;  
                            else if(m1_ask) woner <= #1 `M1_SOVER;  
             else if(m2_ask) woner <= #1 `M2_SOVER;
                          end
                          
                          default : woner <= #1 `M0_SOVER;
                        endcase
                 end
//******************************************************************************
                          
                          
                          
                          
                          
                          
//***********************总线主控赋值模块*****************************************
always@(*) begin   

    m0_agree <= 1'b 0;
         m1_agree <= 1'b 0;
         m2_agree <= 1'b 0;
         m3_agree <= 1'b 0;
        
    case(woner)
     `M0_SOVER : m0_agree <= 1'b 1;

          `M1_SOVER : m1_agree <= 1'b 1;

     `M2_SOVER : m2_agree <= 1'b 1;

          `M3_SOVER : m3_agree <= 1'b 1;
    endcase        
  end

//*****************************************************************************   

endmodule   



从从属读取数据
//总线从属读取数据


`include "xiaoze_bus.h"
`timescale 1 ns / 1 ps

module xiaoze_read(
                  input  s0_cs,
                                                input  s1_cs,
                                                input  s2_cs,
                                                input  s3_cs,
                                                input  s4_cs,
                                                input  s5_cs,
                                                input  s6_cs,
                                                input  s7_cs,
                                                
                                                input  s0_rdy, //总线从属0就绪
                                           input  s1_rdy, //总线从属1就绪
                                           input  s2_rdy, //总线从属2就绪
                                           input  s3_rdy, //总线从属3就绪
                                                input  s4_rdy, //总线从属4就绪
                                           input  s5_rdy, //总线从属5就绪
                                           input  s6_rdy, //总线从属6就绪
                                           input  s7_rdy, //总线从属7就绪
                                                   
                  input [31:0] s0_data, //总线从属要读取的数据
                                 input [31:0] s1_data, //总线从属要读取的数据
                            input [31:0] s2_data, //总线从属要读取的数据
                                 input [31:0] s3_data, //总线从属要读取的数据
                  input [31:0] s4_data, //总线从属要读取的数据
                                 input [31:0] s5_data, //总线从属要读取的数据
                            input [31:0] s6_data, //总线从属要读取的数据
                                 input [31:0] s7_data, //总线从属要读取的数据

                                                
                                                output reg m_rdy, //总线从属0就绪——最终输出
                  output reg [31:0] m_data //总线从属将读取的数据输出——最终输出
                                                   );
                                                        
                                                        
//*********************************************************
always@(*) begin

  if(s0_cs) begin
    m_rdy <= s0_rdy;
    m_data <= s0_data;
  end

  else if(s1_cs) begin
    m_rdy <= s1_rdy;
    m_data <= s1_data;
  end
            
  else if(s2_cs) begin
   m_rdy <= s2_rdy;
   m_data <= s2_data;
  end

  else if(s3_cs) begin
    m_rdy <= s3_rdy;
    m_data <= s3_data;
  end
            
  else if(s4_cs) begin
   m_rdy <= s4_rdy;
   m_data <= s4_data;
  end

   else if(s5_cs) begin
   m_rdy <= s5_rdy;
   m_data <= s5_data;
  end

  else if(s6_cs) begin
    m_rdy <= s6_rdy;
    m_data <= s6_data;
  end
            
  else if(s7_cs) begin
   m_rdy <= s7_rdy;
   m_data <= s7_data;
  end
end
//***********************************************************
endmodule

主控写数据
//总线从属读取数据


`include "xiaoze_bus.h"
`timescale 1 ns / 1 ps

module xiaoze_read(
                  input  s0_cs,
                                                input  s1_cs,
                                                input  s2_cs,
                                                input  s3_cs,
                                                input  s4_cs,
                                                input  s5_cs,
                                                input  s6_cs,
                                                input  s7_cs,
                                                
                                                input  s0_rdy, //总线从属0就绪
                                           input  s1_rdy, //总线从属1就绪
                                           input  s2_rdy, //总线从属2就绪
                                           input  s3_rdy, //总线从属3就绪
                                                input  s4_rdy, //总线从属4就绪
                                           input  s5_rdy, //总线从属5就绪
                                           input  s6_rdy, //总线从属6就绪
                                           input  s7_rdy, //总线从属7就绪
                                                   
                  input [31:0] s0_data, //总线从属要读取的数据
                                 input [31:0] s1_data, //总线从属要读取的数据
                            input [31:0] s2_data, //总线从属要读取的数据
                                 input [31:0] s3_data, //总线从属要读取的数据
                  input [31:0] s4_data, //总线从属要读取的数据
                                 input [31:0] s5_data, //总线从属要读取的数据
                            input [31:0] s6_data, //总线从属要读取的数据
                                 input [31:0] s7_data, //总线从属要读取的数据

                                                
                                                output reg m_rdy, //总线从属0就绪——最终输出
                  output reg [31:0] m_data //总线从属将读取的数据输出——最终输出
                                                   );
                                                        
                                                        
//*********************************************************
always@(*) begin

  if(s0_cs) begin
    m_rdy <= s0_rdy;
    m_data <= s0_data;
  end

  else if(s1_cs) begin
    m_rdy <= s1_rdy;
    m_data <= s1_data;
  end
            
  else if(s2_cs) begin
   m_rdy <= s2_rdy;
   m_data <= s2_data;
  end

  else if(s3_cs) begin
    m_rdy <= s3_rdy;
    m_data <= s3_data;
  end
            
  else if(s4_cs) begin
   m_rdy <= s4_rdy;
   m_data <= s4_data;
  end

   else if(s5_cs) begin
   m_rdy <= s5_rdy;
   m_data <= s5_data;
  end

  else if(s6_cs) begin
    m_rdy <= s6_rdy;
    m_data <= s6_data;
  end
            
  else if(s7_cs) begin
   m_rdy <= s7_rdy;
   m_data <= s7_data;
  end
end
//***********************************************************
endmodule




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表