总线仲裁器电路的设计与验证Verilog

共享总线是一种常见的总线结构,多个总线上的设备拥有共同的地址线和数据线。
当一个总线设备希望占据总线进行数据收发操作时,需要通过属于自己的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

仿真波形
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Hennys/article/details/107662757