[알고리즘]

[arbiter] 설계 방법

Neo Park 2013. 4. 10. 14:07

Arbiter는 실제 ASIC 디자인에서도 흔히 쓰이는 로직입니다.

제일 쉬운 방법으로 대강 3가지 정도로 디자인 할 수 있는데 아래와 같습니다. 물론 정답은 따로 없습니다. 잘돌면 장땡이죠.

1. 우선 순위 고정방식 (FIXED PRIORITY)

여러놈이 동시에 요구할때 우선순위는 고정되어 순번이 높은놈 한테 우선적으로 GNT를 주는 방식입니다. 로직이 제일 작게 들어가지만, 우선순위 높은 한놈이 계속 요구할 경우 다른 놈들이 GNT를 못받는 경우가 발생합니다. 하지만 REQ가 아주 빈번하지 않은 경우 무난히 돌아가며 실제로도 많이 사용됩니다.

2. ROUND ROBIN 방식 - I

3. ROUND ROBIN 방식 - II

GNT를 받은 놈은 우선순위를 가장 낮게 떨어뜨려, 다음 번에는 다른 놈들이 요구할 경우 순번이 돌아가도록 하는 방식입니다. 우선순위가 계속 돌아가며 바뀝니다. 구현 방법은 로직을 적게 들어가게 하려면, 순번 결정을 여러 사이클에 나누어서 하는 방식과, 한사이클에 바로 결정하는 방식이 있는데, 전자(I)는 로직이 작게 들어가며, 먼저 답변 쓰신 분이 디자인한 방식입니다. 후자(II)는 당연히 낭비되는 우선순위 결정 시간은 짧으나 로직이 많이 들어갑니다.

1, 3 에 대해서 디자인 한 소스는 아래와 같습니다.

// FIXED PRIORITY: 우선순위 gnt[0] > gnt[1] > gnt[2] > gnt[3]
module arbiter
(
reset,
clk,
req,
gnt
);
input reset;
input clk;

input [ 3: 0] req;
output [ 3: 0] gnt;

reg [ 3: 0] gnt;

always @(posedge clk or posedge reset) begin
if (reset)
gnt <= 4'b 0000;
else if (gnt == 4'b 0000) begin // 현재 gnt 를 받은 req가 없으면 req들을 조사
casex(req)
4'b xxx1: gnt <= 4'b 0001;
4'b xx10: gnt <= 4'b 0010;
4'b x100: gnt <= 4'b 0100;
4'b 1000: gnt <= 4'b 1000;
endcase
end
else if ((gnt & req) == 4'b 0000) // 이전에 gnt를 받은 req가 0 이 되었으면
gnt <= 4'b 0000; // 해당 gnt도 0 으로 떨어뜨린다
end

endmodule

// ROUND ROBIN: 1 CYCLE DECISION
module arbiter
(
 reset,
 clk,
 req,
 gnt
);
 input reset,
 input clk,

 input [ 3: 0] req;
 output [ 3: 0] gnt;

 

reg [ 3: 0] gnt;

reg [ 3: 0] priority_q0;
reg [ 3: 0] priority_q1;
reg [ 3: 0] priority_q2;
reg [ 3: 0] priority_q3;

 

// gnt 출력

always @(posedge clk or posedge reset)
begin
if (reset)
    gnt <= 4'b 0000;
else if (gnt == 4'b 0000)
    begin
    if (req & priority_q0)          // 가장 높은 순위의 req가 현재 1 이면
        gnt <= priority_q0;
    else if (req & priority_q1)     // 다음 높은 순위의 req가 현재 1 이면
        gnt <= priority_q1;
    else if (req & priority_q2)     // ...
        gnt <= priority_q2;
    else if (req & priority_q3)
        gnt <= priority_q3;
    end
 else if ((gnt & req) == 4'b 0000)
    gnt <= 4'b 0000;
 end

 

// 우선 순위 조정

// priority_qX 의 width를 2bit으로 줄이고 combinatorial logic 을 약간 추가하여

// 플립플롭을 줄일 수 있으나 이해를 쉽게 하기위해 그냥 4bit으로 하였습니다.

always @(posedge clk or posedge reset)
begin
if (reset)
    begin
    priority_q0 <= 4'b 0001;
    priority_q1 <= 4'b 0010;
    priority_q2 <= 4'b 0100;
    priority_q3 <= 4'b 1000;
    end
else if (gnt == 4'b 0000)
        begin
        if (req & priority_q0)
            begin
            priority_q0 <= priority_q1;
            priority_q1 <= priority_q2;
            priority_q2 <= priority_q3;
            priority_q3 <= priority_q0;
            end
        else if (req & priority_q1)
            begin
            priority_q1 <= priority_q2;
            priority_q2 <= priority_q3;
            priority_q3 <= priority_q1;
            end
        else if (req & priority_q2)
            begin
            priority_q2 <= priority_q3;
            priority_q3 <= priority_q2;
            end
        end
end

 

endmodule

 

 

**********************************************************************************************

다른 방법으로 설계 한 예

 

0

module arbitor (input reset_n,clk,
input req [NUM-1:0],
output gnt [NUM-1:0]);
localparam NUM=4;
typedef enum bit [2:0] { ST0=3'h0,ST1=3'h1,ST2=3'h2,ST3=3'h3,NULL=3'h7 } state_t;

state_t state;
state_t Round;
int i,j;

always @(posedge clk)
begin
if(~reset_n)
begin
state=NULL;
Round<=NULL;
for(i=0;i<4;i=i+1)

begin

gnt[i]=0;
end
if(req[0] && Round==ST0)
begin
gnt[0]=1;
state=ST0;
end
else if(req[1] && Round==ST1)
begin
gnt[1]=1;
state=ST1;
end
else if(req[2] && Round==ST2)
begin
gnt[2]=1;
state=ST2;
end
else if(req[3] && Round==ST3)
begin
gnt[3]=1;
state=ST3;
end
else if(req[0] && state==ST0)
begin end
else if(req[1] && state==ST1)
begin end
else if(req[2] && state==ST2)
begin end
else if(req[3] && state==ST3)
begin end
else
begin
state=NULL;
case(Round)
NULL: Round<=ST0;
ST0: Round<=ST1;
ST1: Round<=ST2;
ST2: Round<=ST3;
ST3: Round<=NULL;
default: Round<=NULL;
endcase
for(j=0;j<4;j=j+1)

begin

gnt[j]=0;

end
end
endmodule

 

 

 

 

참조 : http://kin.naver.com/qna/detail.nhn?d1id=11&dirId=1118&docId=55661860&qb=YXJiaXRlciDshKTqs4TrsKnrspU=&enc=utf8§ion=kin&rank=1&search_sort=0&spq=0&pid=RTgy9c5Y7uwssbkeoPwssssssth-038673&sid=UWTy9HJvLCwAAGbRiV4