顶层文件/*
该设计是小泽的首个基于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
|