[an error occurred while processing this directive]
а чего?
(«Телесистемы»: Конференция «Программируемые логические схемы и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено KA 04 ноября 2003 г. 18:21
В ответ на: Ни у кого нет кода какого нибудь арбитра, буду очень признателен отправлено vitus_strom 04 ноября 2003 г. 17:45

// PCI Arbitrator
module arbitrator (nREQ, nRESET, CLK, nFRAME, nGNT, nIRDY);//, AD, C_nBE);

parameter [5:0]
MASTER1 = 6'b000001, MASTER2 = 6'b000010, MASTER3 = 6'b000100,
MASTER4 = 6'b001000,MASTER5 = 6'b010000,
IDLE = 6'b100000; // the States

parameter [1:5]
nGNTMST1 = 5'b01111, nGNTMST2 = 5'b10111, nGNTMST3 = 5'b11011,
nGNTMST4 = 5'b11101,nGNTMST5 = 5'b11110,
nGNTNONE = 5'b11111; // assert corresponding GNT line


input [1:5] nREQ; // nREQ line

input nRESET, CLK, nFRAME;
wire CLK, nRESET;
input nIRDY;
output [1:5] nGNT;
wire[1:5] nGNT;
//output [31:0] AD;
//reg [31:0] AD;
//output [3:0] C_nBE;
//reg [3:0] C_nBE;

wire BUSY;
reg [1:5] nGNT_SET,nGNT_SET_1;
reg [3:0] CLK_NUM;
reg [5:0] STATE;
reg [1:5] nR_REQ; // Registered nREQ
reg [1:5] nR_GNT; // Registered nGNT

assign BUSY = ~(nFRAME & nIRDY);

always @ (posedge CLK or negedge nRESET)
begin
if (~nRESET)
nR_REQ <= 5'b11111; // after reset, none REQ lines is asserted
else
nR_REQ <= nREQ;
end

assign nGNT = (~nRESET) ? 6'bzzzzzz : nR_GNT;

always @ (posedge CLK or negedge nRESET)
begin
if (~nRESET)
begin
nGNT_SET_1 <= nGNTNONE;
nR_GNT <= nGNTNONE;
end
else if (nREQ == 5'b11111) // none of REQ lines is active
nR_GNT <= nGNTNONE;
else if (BUSY & nGNT_SET != nGNTNONE) // Hidden bus arbitration
begin
nGNT_SET_1 <= nGNT_SET;
nR_GNT <= nGNT_SET_1;
end
else
nR_GNT <= nGNT_SET;
end

always @ (posedge CLK or negedge nRESET)
begin
if (!nRESET)
begin
STATE = IDLE;
// AD = 32'h0;
// C_nBE = 4'h0;
nGNT_SET= nGNTNONE;
end
else if (~BUSY | nGNT_SET == nGNTNONE | CLK_NUM == 4'hF)
begin
case (STATE) // rotational priority scheme
IDLE:
begin
casex (nR_REQ)
5'b0xxxx:
begin
STATE = MASTER1;
nGNT_SET = nGNTMST1;
end
5'b10xxx:
begin
STATE = MASTER2;
nGNT_SET = nGNTMST2;
end
5'b110xx:
begin
STATE = MASTER3;
nGNT_SET = nGNTMST3;
end
5'b1110x:
begin
STATE = MASTER4;
nGNT_SET = nGNTMST4;
end
5'b11110:
begin
STATE = MASTER5;
nGNT_SET = nGNTMST5;
end
default:
begin
STATE = IDLE;
nGNT_SET = nGNTNONE;
end
endcase
end
MASTER1: // Master 1 always has the highest priority
begin
casex (nR_REQ)
5'b0xxxx:
begin
STATE = MASTER1;
nGNT_SET = nGNTMST1;
end
5'b10xxx:
begin
STATE = MASTER2;
nGNT_SET = nGNTMST2;
end
5'b110xx:
begin
STATE = MASTER3;
nGNT_SET = nGNTMST3;
end
5'b1110x:
begin
STATE = MASTER4;
nGNT_SET = nGNTMST4;
end
5'b11110:
begin
STATE = MASTER5;
nGNT_SET = nGNTMST5;
end
default:
begin
STATE = MASTER1;
nGNT_SET = nGNTMST1;
end
endcase
end
MASTER2:
begin
casex (nR_REQ)
5'b0xxxx:
begin
STATE = MASTER1;
nGNT_SET = nGNTMST1;
end
5'b1x0xx:
begin
STATE = MASTER3;
nGNT_SET = nGNTMST3;
end
5'b1x10x:
begin
STATE = MASTER4;
nGNT_SET = nGNTMST4;
end
5'b1x110:
begin
STATE = MASTER5;
nGNT_SET = nGNTMST5;
end
default:
begin
STATE = MASTER2;
nGNT_SET = nGNTMST2;
end
endcase
end
MASTER3:
begin
casex (nR_REQ)
5'b0xxxx:
begin
STATE = MASTER1;
nGNT_SET = nGNTMST1;
end
5'b1xx0x:
begin
STATE = MASTER4;
nGNT_SET = nGNTMST4;
end
5'b1xx10:
begin
STATE = MASTER5;
nGNT_SET = nGNTMST5;
end
5'b10x11:
begin
STATE = MASTER2;
nGNT_SET = nGNTMST2;
end
default:
begin
STATE = MASTER3;
nGNT_SET = nGNTMST3;
end
endcase
end
MASTER4:
begin
casex (nR_REQ)
5'b0xxxx:
begin
STATE = MASTER1;
nGNT_SET = nGNTMST1;
end
5'b1xxx0:
begin
STATE = MASTER5;
nGNT_SET = nGNTMST5;
end
5'b10xx1:
begin
STATE = MASTER2;
nGNT_SET = nGNTMST2;
end
5'b110x1:
begin
STATE = MASTER3;
nGNT_SET = nGNTMST3;
end
default:
begin
STATE = MASTER4;
nGNT_SET = nGNTMST4;
end
endcase
end
MASTER5:
begin
casex (nR_REQ)
5'b0xxxx:
begin
STATE = MASTER1;
nGNT_SET = nGNTMST1;
end
5'b10xxx:
begin
STATE = MASTER2;
nGNT_SET = nGNTMST2;
end
5'b110xx:
begin
STATE = MASTER3;
nGNT_SET = nGNTMST3;
end
5'b1110x:
begin
STATE = MASTER4;
nGNT_SET = nGNTMST4;
end
default:
begin
STATE = MASTER5;
nGNT_SET = nGNTMST5;
end
endcase
end
default:
begin
STATE = IDLE;
nGNT_SET = nGNTNONE;
end
endcase
end
end
endmodule

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru