頂層文件/*
該設計是小澤的首個基于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
|