共享总线是一种常见的总线结构,多个总线上的设备拥有共同的地址线和数据线。
当一个总线设备希望占据总线进行数据收发操作时,需要通过属于自己的areq信号向仲裁器发出申请,只有得到仲裁器的许可(对应的agnt置1 )时才能进行数据收发操作,没有得到许可的总线设备不能发起数据操作,否则将会出现多个设备同时驱动总线的错误。
下图是有两个总线设备的总线仲裁器电路,areqO 和areq1以及agnt0和agnt1分别是master1和master2的请求和确认信号,rid是仲裁方式选择信号。当多个总线设备同时发出请求时,仲裁器根据内部控制寄存器的值按照固定优先级( rid=1, master2拥有高优先级)或者循环判断( rid=0,从master1->master2->master1循环判断)两种机制给相应的总线设备发出确认信号。
设计代码
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Design Name:
// Module Name: Test1354
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
//
module Test1354(clk,reset,areq0,areq1,agnt0,agnt1,rid);
input clk,reset;
input areq0,areq1;
input rid;
output agnt0,agnt1;
reg [1:0] current_state,nx_state;
parameter idle=2'b00,master1=2'b01,master2=2'b10;
/
always @(posedge clk or posedge reset)
if(reset)
current_state<=idle;
else
current_state<=nx_state;
/
always @(current_state or areq0 or areq1 or rid)
begin
case(current_state)
idle:if(areq1==1 && areq0==0)
nx_state=master2;
else if(areq1==0 && areq0==1)
nx_state=master1;
else if(areq1==1 && areq0==1 && !rid)
nx_state=master1;
else if(areq1==1 && areq0==1 && rid)
nx_state=master2;
else nx_state=idle;
master1:if(areq1==1)
nx_state=master2;
else if(areq1==0 && areq0==0)
nx_state=idle;
else nx_state=master1;
master2:if(areq0==1)
nx_state=master1;
else if(areq1==0 && areq0==0)
nx_state=idle;
else nx_state=master2;
default:nx_state=idle;
endcase
end
assign agnt0=(current_state==master1)?1:0;
assign agnt1=(current_state==master2)?1:0;
endmodule
测试代码
`timescale 1ns / 1ps
module Test1023;
reg clk;
reg reset;
reg areq0,areq1;
reg rid;
wire agnt0,agnt1;
always begin
#10 clk=1;
#10 clk=0;
end
/
initial begin
clk=0;
reset=1;
areq0=0;
areq1=0;
rid=0;
#100;
reset=0;
//rid=0,路径1->2
repeat(1)@(posedge clk);
#2; areq0=1;areq1=1;
repeat(1)@(posedge clk);
#2; areq0=0;areq1=0;
repeat(1)@(posedge clk);
#2; areq0=1;areq1=1;
repeat(1)@(posedge clk);
#2; areq0=0;areq1=0;
//rid=0,路径4->3
repeat(1)@(posedge clk);
#2; areq0=0;areq1=1;rid=1;
repeat(1)@(posedge clk);
#2; areq0=0;areq1=0;
repeat(1)@(posedge clk);
#2; areq0=1;areq1=1;
repeat(1)@(posedge clk);
#2; areq0=0;areq1=0;
//路径1->5->6->2
repeat(4)@(posedge clk);
#2; areq0=1;areq1=0;
repeat(1)@(posedge clk);
#2; areq0=0;areq1=1;
repeat(1)@(posedge clk);
#2; areq0=1;areq1=0;
repeat(1)@(posedge clk);
#2; areq0=0;areq1=0;
end
Test1354 x1(
.clk (clk ),
.reset (reset ),
.areq0 (areq0 ),
.areq1 (areq1 ),
.agnt0 (agnt0 ),
.agnt1 (agnt1 ),
.rid (rid ));
endmodule
仿真波形
版权声明:本文为Hennys原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。