標題: 基于FPGA片上最小系統(tǒng)(xiaoze-soc)的總線設(shè)計 [打印本頁]

作者: 1382070903    時間: 2017-8-4 19:01
標題: 基于FPGA片上最小系統(tǒng)(xiaoze-soc)的總線設(shè)計
頂層文件/*
該設(shè)計是小澤的首個基于fpga片上最小系統(tǒng)(xiaoze——soc)的總線設(shè)計
by :mr小澤
QQ : 3280283157
from : 天津工業(yè)大學(xué)電氣工程與自動化學(xué)院

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

總線主控——四路;                                                                           

總線從屬——八路:                                   
0號——只讀存儲器rom
1號——暫存存儲器spm
2號——計時器
3號——usrat
4號——gpio
5號——空
6號——空
7號——空

設(shè)計包括(由頂向下):
(1)xiaoze_bus(TOP)
(2)xiaoze_sover(總線主控仲裁&分配)
(3)xiaoze_wire(總線主控寫入相應(yīng)數(shù)據(jù))
(4)xiaoze_dec(地址解碼)
(5)xiaoze_read(總線從屬讀取數(shù)據(jù))

//************************************
*/
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總控信號地址數(shù)據(jù)
                                                  
                                                  input  m1_as, //m1總線控制選通信號
                                                  input  m1_rw, //m1總線控制“讀/寫”命令信號
                                                  input  m1_addr, //m1總線控制地址信號
                                                  input  m1_addr_data, //m1總控信號地址數(shù)據(jù)
                                                  
                                                  input  m2_as, //m2總線控制選通信號
                                                  input  m2_rw, //m2總線控制“讀/寫”命令信號
                                                  input  m2_addr, //m2總線控制地址信號
                                                  input  m2_addr_data, //m2總控信號地址數(shù)據(jù)                                          
                                                  
                                                  input  m3_as, //m3總線控制選通信號
                                                  input  m3_rw, //m3總線控制“讀/寫”命令信號
                                                  input  m3_addr, //m3總線控制地址信號
                                                  input  m3_addr_data, //m3總控信號地址數(shù)據(jù)
                                                  
                                                  input [31:0] s0_data, //總線從屬要讀取的數(shù)據(jù)
                                   input [31:0] s1_data, //總線從屬要讀取的數(shù)據(jù)
                              input [31:0] s2_data, //總線從屬要讀取的數(shù)據(jù)
                                   input [31:0] s3_data, //總線從屬要讀取的數(shù)據(jù)
                    input [31:0] s4_data, //總線從屬要讀取的數(shù)據(jù)
                                   input [31:0] s5_data, //總線從屬要讀取的數(shù)據(jù)
                              input [31:0] s6_data, //總線從屬要讀取的數(shù)據(jù)
                                   input [31:0] s7_data, //總線從屬要讀取的數(shù)據(jù)
                                                  
                                                  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, //總控信號地址數(shù)據(jù)——最終輸出
                                                  
                                                  output wire m_rdy, //總線從屬0就緒——最終輸出
                    output wire [31:0] m_data //總線從屬將讀取的數(shù)據(jù)輸出——最終輸出
                                                  
                  );
                                                
//******************************定義區(qū)********************************************
                    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——請求成功
                                                 );
                                                
//******************************定義區(qū)******************************************

      reg [2:0] woner;

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






//***************************仲裁模塊設(shè)計****************************************
     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   



從從屬讀取數(shù)據(jù)
//總線從屬讀取數(shù)據(jù)


`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, //總線從屬要讀取的數(shù)據(jù)
                                 input [31:0] s1_data, //總線從屬要讀取的數(shù)據(jù)
                            input [31:0] s2_data, //總線從屬要讀取的數(shù)據(jù)
                                 input [31:0] s3_data, //總線從屬要讀取的數(shù)據(jù)
                  input [31:0] s4_data, //總線從屬要讀取的數(shù)據(jù)
                                 input [31:0] s5_data, //總線從屬要讀取的數(shù)據(jù)
                            input [31:0] s6_data, //總線從屬要讀取的數(shù)據(jù)
                                 input [31:0] s7_data, //總線從屬要讀取的數(shù)據(jù)

                                                
                                                output reg m_rdy, //總線從屬0就緒——最終輸出
                  output reg [31:0] m_data //總線從屬將讀取的數(shù)據(jù)輸出——最終輸出
                                                   );
                                                        
                                                        
//*********************************************************
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

主控寫數(shù)據(jù)
//總線從屬讀取數(shù)據(jù)


`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, //總線從屬要讀取的數(shù)據(jù)
                                 input [31:0] s1_data, //總線從屬要讀取的數(shù)據(jù)
                            input [31:0] s2_data, //總線從屬要讀取的數(shù)據(jù)
                                 input [31:0] s3_data, //總線從屬要讀取的數(shù)據(jù)
                  input [31:0] s4_data, //總線從屬要讀取的數(shù)據(jù)
                                 input [31:0] s5_data, //總線從屬要讀取的數(shù)據(jù)
                            input [31:0] s6_data, //總線從屬要讀取的數(shù)據(jù)
                                 input [31:0] s7_data, //總線從屬要讀取的數(shù)據(jù)

                                                
                                                output reg m_rdy, //總線從屬0就緒——最終輸出
                  output reg [31:0] m_data //總線從屬將讀取的數(shù)據(jù)輸出——最終輸出
                                                   );
                                                        
                                                        
//*********************************************************
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









歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1